Remove social subscribers

Fixes #20714

This removes social subribers from the detail screen of the Total Followers card and additionally, changes the endpoint for the "Total Followers" card from `/sites/$site/stats/summary/` → `stats/subscribers`.

Additionally, this PR removes `FollowerTotalsUseCase`, which was already unused. This card was being used only on the WordPress app but then we removed stats from WP, now it's fine to remove the usecase as well. I haven't removed `InsightType.FOLLOWER_TOTALS` from FLuxC for now because it may cause crashes on a case when upgraded from a very old version since selected insight cards are stored in the db.

|after|
|-|
|<img src="https://github.com/wordpress-mobile/WordPress-Android/assets/2471769/9219d5a5-e864-48c6-9dbd-3044bb7b895a" width=320>|

-----

## To Test:

<!-- Test instructions per dependency update: https://github.com/wordpress-mobile/WordPress-Android/blob/trunk/docs/test_instructions_per_dependency_update.md -->

1. Log in
2. Enable stats_traffic_subscribers_tab flag from "Me → Debug settings"
3. Navigate back.
4. Open the INSIGHTS tab from "My Site → Stats".
5. Tap the "VIEW MORE" button on the Total Followers card.

-----

## Regression Notes

1. Potential unintended areas of impact

    - None

2. What I did to test those areas of impact (or what existing automated tests I relied on)

    - N/A

3. What automated tests I added (or what prevented me from doing so)

    - Updated `FollowerTypesUseCaseTest` and `FollowerTotalsUseCaseTest`

-----

## PR Submission Checklist:

- [x] I have completed the Regression Notes.
- [x] I have considered adding accessibility improvements for my changes.
- [x] I have considered if this change warrants user-facing release notes and have added them to `RELEASE-NOTES.txt` if necessary.

-----

## Testing Checklist (strike-out the not-applying and unnecessary ones):

- [ ] ~WordPress.com sites and self-hosted Jetpack sites.~
- [ ] ~Portrait and landscape orientations.~
- [ ] ~Light and dark modes.~
- [ ] ~Fonts: Larger, smaller and bold text.~
- [ ] ~High contrast.~
- [ ] ~Talkback.~
- [ ] ~Languages with large words or with letters/accents not frequently used in English.~
- [ ] ~Right-to-left languages. (Even if translation isn’t complete, formatting should still respect the right-to-left layout)~
- [ ] ~Large and small screen sizes. (Tablet and smaller phones)~
- [ ] ~Multi-tasking: Split screen and Pop-up view. (Android 10 or higher)~

Stats Insights: Remove social (publicize) subscribers
Total Subscribers number on Insights is calculated by adding: wpcom + email + publicize (Jetpack social) subscribers. However, it's been removed from the web.

1. Update Total Subscribers card on Insights not to add publicize numbers
2. Update Total Subscribers -> Details to remove "Social" from Subscribers table

![image](https://github.com/wordpress-mobile/WordPress-Android/assets/4062343/55099f86-4682-4f17-beaf-64098ee727ba)

Thanks for reporting! 👍 <!-- generated_by_dangermattic -->

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index 70f9185bdb38..27b1202ae4ba 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -2,6 +2,7 @@

 24.9
 -----
+* [*] [Jetpack-only] Removed Social section from the detail screen of Total Followers card [https://github.com/wordpress-mobile/WordPress-Android/pull/20763]
 * [***] [Jetpack-only] Reorganized Stats to include updated Traffic and Insights tabs, along with a newly added Subscribers tab to improve subscriber metrics analysis [https://github.com/wordpress-mobile/WordPress-Android/pull/20756]

 24.8
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsModule.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsModule.kt
index e3ae9fd3c3a7..4f1e0b036ecc 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsModule.kt
+++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsModule.kt
@@ -46,7 +46,6 @@ import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.A
 import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.AnnualSiteStatsUseCase.AnnualSiteStatsUseCaseFactory
 import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.AuthorsCommentsUseCase
 import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.CommentsUseCase
-import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.FollowerTotalsUseCase
 import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.FollowerTypesUseCase
 import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.FollowersUseCase.FollowersUseCaseFactory
 import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.LatestPostSummaryUseCase
@@ -63,9 +62,9 @@ import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.T
 import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.TotalLikesUseCase.TotalLikesUseCaseFactory
 import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.ViewsAndVisitorsUseCase.ViewsAndVisitorsUseCaseFactory
 import org.wordpress.android.ui.stats.refresh.lists.sections.subscribers.usecases.EmailsUseCase.EmailsUseCaseFactory
-import org.wordpress.android.ui.stats.refresh.lists.sections.subscribers.usecases.TotalSubscribersUseCase.TotalSubscribersUseCaseFactory
 import org.wordpress.android.ui.stats.refresh.lists.sections.subscribers.usecases.SubscribersChartUseCase
 import org.wordpress.android.ui.stats.refresh.lists.sections.subscribers.usecases.SubscribersUseCase.SubscribersUseCaseFactory
+import org.wordpress.android.ui.stats.refresh.lists.sections.subscribers.usecases.TotalSubscribersUseCase.TotalSubscribersUseCaseFactory
 import org.wordpress.android.ui.stats.refresh.utils.SelectedTrafficGranularityManager
 import org.wordpress.android.ui.stats.refresh.utils.StatsSiteProvider
 import org.wordpress.android.util.config.StatsTrafficSubscribersTabFeatureConfig
@@ -123,7 +122,6 @@ class StatsModule {
         tagsAndCategoriesUseCaseFactory: TagsAndCategoriesUseCaseFactory,
         publicizeUseCaseFactory: PublicizeUseCaseFactory,
         postingActivityUseCase: PostingActivityUseCase,
-        followerTotalsUseCase: FollowerTotalsUseCase,
         totalLikesUseCaseFactory: TotalLikesUseCaseFactory,
         totalCommentsUseCaseFactory: TotalCommentsUseCaseFactory,
         totalFollowersUseCaseFactory: TotalFollowersUseCaseFactory,
@@ -143,8 +141,6 @@ class StatsModule {
             useCases.add(actionCardGrowUseCase)
             useCases.add(actionCardReminderUseCase)
             useCases.add(actionCardScheduleUseCase)
-        } else {
-            useCases.add(followerTotalsUseCase)
         }

         useCases.addAll(
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/management/InsightsManagementMapper.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/management/InsightsManagementMapper.kt
index 751490f87e08..c6b9bd8e4007 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/management/InsightsManagementMapper.kt
+++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/management/InsightsManagementMapper.kt
@@ -35,14 +35,8 @@ import org.wordpress.android.ui.utils.ListItemInteraction
 import javax.inject.Inject
 import javax.inject.Named

-private val POSTS_AND_PAGES_INSIGHTS = listOf(
-    LATEST_POST_SUMMARY, POSTING_ACTIVITY, TAGS_AND_CATEGORIES
-)
-private val ACTIVITY_INSIGHTS = mutableListOf(
-    FOLLOWERS,
-    FOLLOWER_TOTALS,
-    PUBLICIZE
-)
+private val POSTS_AND_PAGES_INSIGHTS = listOf(LATEST_POST_SUMMARY, POSTING_ACTIVITY, TAGS_AND_CATEGORIES)
+private val ACTIVITY_INSIGHTS = mutableListOf(FOLLOWERS, TOTAL_LIKES, TOTAL_COMMENTS, TOTAL_FOLLOWERS, PUBLICIZE)
 private val GENERAL_INSIGHTS = mutableListOf(
     ALL_TIME_STATS,
     MOST_POPULAR_DAY_AND_HOUR,
@@ -67,14 +61,6 @@ class InsightsManagementMapper @Inject constructor(@Named(BG_THREAD) private val
             }
             insightListItems += Header(R.string.stats_insights_management_activity)

-            if (ACTIVITY_INSIGHTS.contains(FOLLOWER_TOTALS)) {
-                // Replace FOLLOWER_TOTALS with Stats revamp v2 total insights
-                val followerTotalsIndex = ACTIVITY_INSIGHTS.indexOf(FOLLOWER_TOTALS)
-                ACTIVITY_INSIGHTS.remove(FOLLOWER_TOTALS)
-
-                val statsRevampV2TotalInsights = listOf(TOTAL_LIKES, TOTAL_COMMENTS, TOTAL_FOLLOWERS)
-                ACTIVITY_INSIGHTS.addAll(followerTotalsIndex, statsRevampV2TotalInsights)
-            }
             insightListItems += ACTIVITY_INSIGHTS.map { type ->
                 buildInsightModel(type, addedTypes, onClick)
             }
@@ -112,8 +98,6 @@ class InsightsManagementMapper @Inject constructor(@Named(BG_THREAD) private val
         TOTAL_FOLLOWERS -> R.string.stats_view_total_followers
         AUTHORS_COMMENTS -> R.string.stats_comments_authors
         POSTS_COMMENTS -> R.string.stats_comments_posts_and_pages
-        FOLLOWER_TOTALS -> R.string.stats_view_follower_totals
-        FOLLOWER_TYPES -> null
-        ACTION_REMINDER, ACTION_SCHEDULE, ACTION_GROW -> null
+        FOLLOWER_TYPES, ACTION_REMINDER, ACTION_SCHEDULE, ACTION_GROW, FOLLOWER_TOTALS -> null
     }
 }
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/usecases/FollowerTotalsUseCase.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/usecases/FollowerTotalsUseCase.kt
deleted file mode 100644
index 015acac27eff..000000000000
--- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/usecases/FollowerTotalsUseCase.kt
+++ /dev/null
@@ -1,176 +0,0 @@
-package org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases
-
-import android.view.View
-import kotlinx.coroutines.CoroutineDispatcher
-import kotlinx.coroutines.async
-import org.wordpress.android.R
-import org.wordpress.android.fluxc.model.stats.LimitMode
-import org.wordpress.android.fluxc.model.stats.PagedMode
-import org.wordpress.android.fluxc.store.StatsStore.InsightType.FOLLOWER_TOTALS
-import org.wordpress.android.fluxc.store.stats.insights.FollowersStore
-import org.wordpress.android.fluxc.store.stats.insights.PublicizeStore
-import org.wordpress.android.modules.BG_THREAD
-import org.wordpress.android.modules.UI_THREAD
-import org.wordpress.android.ui.stats.refresh.lists.sections.BaseStatsUseCase.StatelessUseCase
-import org.wordpress.android.ui.stats.refresh.lists.sections.BlockListItem
-import org.wordpress.android.ui.stats.refresh.lists.sections.BlockListItem.Empty
-import org.wordpress.android.ui.stats.refresh.lists.sections.BlockListItem.ListItemWithIcon
-import org.wordpress.android.ui.stats.refresh.lists.sections.BlockListItem.Title
-import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.FollowerTotalsUseCase.FollowerType
-import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.FollowerTotalsUseCase.FollowerType.EMAIL
-import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.FollowerTotalsUseCase.FollowerType.SOCIAL
-import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.FollowerTotalsUseCase.FollowerType.WP_COM
-import org.wordpress.android.ui.stats.refresh.utils.ContentDescriptionHelper
-import org.wordpress.android.ui.stats.refresh.utils.ItemPopupMenuHandler
-import org.wordpress.android.ui.stats.refresh.utils.StatsSiteProvider
-import org.wordpress.android.ui.stats.refresh.utils.StatsUtils
-import javax.inject.Inject
-import javax.inject.Named
-
-class FollowerTotalsUseCase
-@Inject constructor(
-    @Named(UI_THREAD) private val mainDispatcher: CoroutineDispatcher,
-    @Named(BG_THREAD) private val bgDispatcher: CoroutineDispatcher,
-    private val followersStore: FollowersStore,
-    private val publicizeStore: PublicizeStore,
-    private val statsSiteProvider: StatsSiteProvider,
-    private val contentDescriptionHelper: ContentDescriptionHelper,
-    private val statsUtils: StatsUtils,
-    private val popupMenuHandler: ItemPopupMenuHandler
-) : StatelessUseCase<Map<FollowerType, Int>>(FOLLOWER_TOTALS, mainDispatcher, bgDispatcher) {
-    override fun buildLoadingItem(): List<BlockListItem> = listOf(Title(R.string.stats_view_follower_totals))
-
-    override fun buildEmptyItem(): List<BlockListItem> {
-        return listOf(buildTitle(), Empty())
-    }
-
-    override suspend fun loadCachedData(): Map<FollowerType, Int>? {
-        val wpComFollowers = followersStore.getWpComFollowers(statsSiteProvider.siteModel, LimitMode.Top(0))
-        val emailFollowers = followersStore.getEmailFollowers(statsSiteProvider.siteModel, LimitMode.Top(0))
-        val publicizeServices = publicizeStore.getPublicizeData(statsSiteProvider.siteModel, LimitMode.All)
-        if (wpComFollowers != null && emailFollowers != null && publicizeServices != null) {
-            val socialFollowers = publicizeServices.services.sumOf { it.followers }
-            return buildDataModel(wpComFollowers.totalCount, emailFollowers.totalCount, socialFollowers)
-        }
-        return null
-    }
-
-    private fun buildDataModel(wpComTotals: Int?, emailTotals: Int?, socialTotals: Int?): Map<FollowerType, Int> {
-        val map = HashMap<FollowerType, Int>()
-        wpComTotals?.let {
-            if (it > 0) {
-                map[WP_COM] = it
-            }
-        }
-        emailTotals?.let {
-            if (it > 0) {
-                map[EMAIL] = it
-            }
-        }
-        socialTotals?.let {
-            if (it > 0) {
-                map[SOCIAL] = it
-            }
-        }
-        return map
-    }
-
-    override suspend fun fetchRemoteData(
-        forced: Boolean
-    ): State<Map<FollowerType, Int>> {
-        return fetchData(forced, PagedMode(0, false))
-    }
-
-    private suspend fun fetchData(
-        forced: Boolean,
-        fetchMode: PagedMode
-    ): State<Map<FollowerType, Int>> {
-        val deferredWpComResponse = async(bgDispatcher) {
-            followersStore.fetchWpComFollowers(
-                statsSiteProvider.siteModel,
-                fetchMode,
-                forced
-            )
-        }
-        val deferredEmailResponse = async(bgDispatcher) {
-            followersStore.fetchEmailFollowers(
-                statsSiteProvider.siteModel,
-                fetchMode,
-                forced
-            )
-        }
-        val deferredPublicizeResponse = async(bgDispatcher) {
-            publicizeStore.fetchPublicizeData(
-                statsSiteProvider.siteModel,
-                LimitMode.All,
-                forced
-            )
-        }
-
-        val wpComResponse = deferredWpComResponse.await()
-        val emailResponse = deferredEmailResponse.await()
-        val publicizeResponse = deferredPublicizeResponse.await()
-
-        val wpComModel = wpComResponse.model
-        val emailModel = emailResponse.model
-        val socialTotals = publicizeResponse.model?.services?.sumOf { it.followers }
-
-        val error = wpComResponse.error ?: emailResponse.error ?: publicizeResponse.error
-        val data = buildDataModel(wpComModel?.totalCount, emailModel?.totalCount, socialTotals)
-        return when {
-            error != null -> State.Error(error.message ?: error.type.name)
-            data.isNotEmpty() -> State.Data(data)
-            else -> State.Empty()
-        }
-    }
-
-    private fun getIcon(type: FollowerType): Int {
-        return when (type) {
-            WP_COM -> R.drawable.ic_wordpress_white_24dp
-            EMAIL -> R.drawable.ic_mail_white_24dp
-            SOCIAL -> R.drawable.ic_share_white_24dp
-        }
-    }
-
-    private fun getTitle(type: FollowerType): Int {
-        return when (type) {
-            WP_COM -> R.string.stats_followers_wordpress_com
-            EMAIL -> R.string.email
-            SOCIAL -> R.string.stats_insights_social
-        }
-    }
-
-    override fun buildUiModel(domainModel: Map<FollowerType, Int>): List<BlockListItem> {
-        val items = mutableListOf<BlockListItem>()
-        items.add(buildTitle())
-
-        if (domainModel.isNotEmpty()) {
-            domainModel.entries.forEach {
-                val title = getTitle(it.key)
-                items.add(
-                    ListItemWithIcon(
-                        icon = getIcon(it.key),
-                        textResource = title,
-                        value = statsUtils.toFormattedString(it.value),
-                        showDivider = domainModel.entries.indexOf(it) < domainModel.size - 1,
-                        contentDescription = contentDescriptionHelper.buildContentDescription(
-                            title,
-                            it.value
-                        )
-                    )
-                )
-            }
-        } else {
-            items.add(Empty())
-        }
-        return items
-    }
-
-    private fun buildTitle() = Title(R.string.stats_view_follower_totals, menuAction = this::onMenuClick)
-
-    private fun onMenuClick(view: View) {
-        popupMenuHandler.onMenuClick(view, type)
-    }
-
-    enum class FollowerType { WP_COM, EMAIL, SOCIAL }
-}
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/usecases/FollowerTypesUseCase.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/usecases/FollowerTypesUseCase.kt
index a9ee52437c8a..08e2d0d87a4d 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/usecases/FollowerTypesUseCase.kt
+++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/usecases/FollowerTypesUseCase.kt
@@ -7,7 +7,6 @@ import org.wordpress.android.fluxc.model.stats.LimitMode
 import org.wordpress.android.fluxc.model.stats.PagedMode
 import org.wordpress.android.fluxc.store.StatsStore.InsightType.FOLLOWER_TYPES
 import org.wordpress.android.fluxc.store.stats.insights.FollowersStore
-import org.wordpress.android.fluxc.store.stats.insights.PublicizeStore
 import org.wordpress.android.modules.BG_THREAD
 import org.wordpress.android.modules.UI_THREAD
 import org.wordpress.android.ui.stats.refresh.lists.sections.BaseStatsUseCase.StatelessUseCase
@@ -18,7 +17,6 @@ import org.wordpress.android.ui.stats.refresh.lists.sections.BlockListItem.PieCh
 import org.wordpress.android.ui.stats.refresh.lists.sections.BlockListItem.PieChartItem.Pie
 import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.FollowerTypesUseCase.FollowerType
 import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.FollowerTypesUseCase.FollowerType.EMAIL
-import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.FollowerTypesUseCase.FollowerType.SOCIAL
 import org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases.FollowerTypesUseCase.FollowerType.WP_COM
 import org.wordpress.android.ui.stats.refresh.utils.ContentDescriptionHelper
 import org.wordpress.android.ui.stats.refresh.utils.StatsSiteProvider
@@ -31,7 +29,6 @@ class FollowerTypesUseCase @Inject constructor(
     @Named(UI_THREAD) private val mainDispatcher: CoroutineDispatcher,
     @Named(BG_THREAD) private val bgDispatcher: CoroutineDispatcher,
     private val followersStore: FollowersStore,
-    private val publicizeStore: PublicizeStore,
     private val statsSiteProvider: StatsSiteProvider,
     private val contentDescriptionHelper: ContentDescriptionHelper,
     private val statsUtils: StatsUtils,
@@ -44,19 +41,16 @@ class FollowerTypesUseCase @Inject constructor(
     override suspend fun loadCachedData(): Map<FollowerType, Int>? {
         val wpComFollowers = followersStore.getWpComFollowers(statsSiteProvider.siteModel, LimitMode.Top(0))
         val emailFollowers = followersStore.getEmailFollowers(statsSiteProvider.siteModel, LimitMode.Top(0))
-        val publicizeServices = publicizeStore.getPublicizeData(statsSiteProvider.siteModel, LimitMode.All)
-        if (wpComFollowers != null && emailFollowers != null && publicizeServices != null) {
-            val socialFollowers = publicizeServices.services.sumOf { it.followers }
-            return buildDataModel(wpComFollowers.totalCount, emailFollowers.totalCount, socialFollowers)
+        if (wpComFollowers != null && emailFollowers != null) {
+            return buildDataModel(wpComFollowers.totalCount, emailFollowers.totalCount)
         }
         return null
     }

-    private fun buildDataModel(wpComTotals: Int?, emailTotals: Int?, socialTotals: Int?): Map<FollowerType, Int> {
+    private fun buildDataModel(wpComTotals: Int?, emailTotals: Int?): Map<FollowerType, Int> {
         val map = mutableMapOf<FollowerType, Int>()
         wpComTotals?.let { map[WP_COM] = it }
         emailTotals?.let { map[EMAIL] = it }
-        socialTotals?.let { map[SOCIAL] = it }
         return map
     }

@@ -69,20 +63,15 @@ class FollowerTypesUseCase @Inject constructor(
         val deferredEmailResponse = async(bgDispatcher) {
             followersStore.fetchEmailFollowers(statsSiteProvider.siteModel, fetchMode, forced)
         }
-        val deferredPublicizeResponse = async(bgDispatcher) {
-            publicizeStore.fetchPublicizeData(statsSiteProvider.siteModel, LimitMode.All, forced)
-        }

         val wpComResponse = deferredWpComResponse.await()
         val emailResponse = deferredEmailResponse.await()
-        val publicizeResponse = deferredPublicizeResponse.await()

         val wpComModel = wpComResponse.model
         val emailModel = emailResponse.model
-        val socialTotals = publicizeResponse.model?.services?.sumOf { it.followers }

-        val error = wpComResponse.error ?: emailResponse.error ?: publicizeResponse.error
-        val data = buildDataModel(wpComModel?.totalCount, emailModel?.totalCount, socialTotals)
+        val error = wpComResponse.error ?: emailResponse.error
+        val data = buildDataModel(wpComModel?.totalCount, emailModel?.totalCount)
         return when {
             error != null -> State.Error(error.message ?: error.type.name)
             data.isNotEmpty() -> State.Data(data)
@@ -93,7 +82,6 @@ class FollowerTypesUseCase @Inject constructor(
     private fun getTitle(type: FollowerType) = when (type) {
         WP_COM -> R.string.stats_followers_wordpress_com
         EMAIL -> R.string.email
-        SOCIAL -> R.string.stats_insights_social
     }

     override fun buildUiModel(domainModel: Map<FollowerType, Int>): List<BlockListItem> {
@@ -167,7 +155,7 @@ class FollowerTypesUseCase @Inject constructor(
             Pie(label, it.value)
         }

-    enum class FollowerType { WP_COM, EMAIL, SOCIAL }
+    enum class FollowerType { WP_COM, EMAIL }

     companion object {
         private const val PERCENT_HUNDRED = 100.0
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/usecases/TotalFollowersUseCase.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/usecases/TotalFollowersUseCase.kt
index 28deb93cc99c..562c70d38738 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/usecases/TotalFollowersUseCase.kt
+++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/usecases/TotalFollowersUseCase.kt
@@ -3,9 +3,12 @@ package org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases
 import kotlinx.coroutines.CoroutineDispatcher
 import org.wordpress.android.R
 import org.wordpress.android.analytics.AnalyticsTracker
+import org.wordpress.android.fluxc.model.stats.LimitMode
+import org.wordpress.android.fluxc.model.stats.subscribers.SubscribersModel
+import org.wordpress.android.fluxc.network.utils.StatsGranularity
 import org.wordpress.android.fluxc.store.StatsStore.InsightType
 import org.wordpress.android.fluxc.store.StatsStore.InsightType.TOTAL_FOLLOWERS
-import org.wordpress.android.fluxc.store.stats.insights.SummaryStore
+import org.wordpress.android.fluxc.store.stats.subscribers.SubscribersStore
 import org.wordpress.android.modules.BG_THREAD
 import org.wordpress.android.modules.UI_THREAD
 import org.wordpress.android.ui.stats.StatsViewType
@@ -32,7 +35,7 @@ import javax.inject.Named
 class TotalFollowersUseCase @Inject constructor(
     @Named(UI_THREAD) private val mainDispatcher: CoroutineDispatcher,
     @Named(BG_THREAD) private val bgDispatcher: CoroutineDispatcher,
-    private val summaryStore: SummaryStore,
+    private val subscribersStore: SubscribersStore,
     private val statsSiteProvider: StatsSiteProvider,
     private val resourceProvider: ResourceProvider,
     private val totalStatsMapper: TotalStatsMapper,
@@ -45,20 +48,37 @@ class TotalFollowersUseCase @Inject constructor(

     override fun buildEmptyItem() = buildUiModel(0)

-    override suspend fun loadCachedData() = summaryStore.getSummary(statsSiteProvider.siteModel)?.followers
+    override suspend fun loadCachedData(): Int {
+        val model = subscribersStore.getSubscribers(
+            statsSiteProvider.siteModel,
+            StatsGranularity.DAYS,
+            LimitMode.Top(1)
+        )
+        return getTotalSubscribersFromModel(model)
+    }

     override suspend fun fetchRemoteData(forced: Boolean): State<Int> {
-        val response = summaryStore.fetchSummary(statsSiteProvider.siteModel, forced)
-        val model = response.model?.followers
+        val response = subscribersStore.fetchSubscribers(
+            statsSiteProvider.siteModel,
+            StatsGranularity.DAYS,
+            LimitMode.Top(1),
+            forced
+        )
+        val model = response.model
         val error = response.error

         return when {
             error != null -> State.Error(error.message ?: error.type.name)
-            model != null -> State.Data(model)
+            model != null && model.dates.isNotEmpty() -> State.Data(getTotalSubscribersFromModel(model))
             else -> State.Empty()
         }
     }

+    private fun getTotalSubscribersFromModel(model: SubscribersModel?): Int {
+        val dates = model?.dates
+        return if (dates.isNullOrEmpty()) 0 else dates.first().subscribers.toInt()
+    }
+
     override fun buildUiModel(domainModel: Int): List<BlockListItem> {
         addActionCard(domainModel)
         val items = mutableListOf<BlockListItem>()
@@ -97,7 +117,7 @@ class TotalFollowersUseCase @Inject constructor(
     class TotalFollowersUseCaseFactory @Inject constructor(
         @Named(UI_THREAD) private val mainDispatcher: CoroutineDispatcher,
         @Named(BG_THREAD) private val backgroundDispatcher: CoroutineDispatcher,
-        private val summaryStore: SummaryStore,
+        private val subscribersStore: SubscribersStore,
         private val statsSiteProvider: StatsSiteProvider,
         private val resourceProvider: ResourceProvider,
         private val totalStatsMapper: TotalStatsMapper,
@@ -108,7 +128,7 @@ class TotalFollowersUseCase @Inject constructor(
         override fun build(useCaseMode: UseCaseMode) = TotalFollowersUseCase(
             mainDispatcher,
             backgroundDispatcher,
-            summaryStore,
+            subscribersStore,
             statsSiteProvider,
             resourceProvider,
             totalStatsMapper,
diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml
index f504750fa2ac..4d97e6aa8935 100644
--- a/WordPress/src/main/res/values/strings.xml
+++ b/WordPress/src/main/res/values/strings.xml
@@ -1323,7 +1323,6 @@
     <string name="stats_view_search_terms">Search Terms</string>
     <string name="stats_view_publicize">Jetpack Social Connections</string>
     <string name="stats_view_followers">Followers</string>
-    <string name="stats_view_follower_totals">Follower Totals</string>
     <string name="stats_view_total_likes">Total Likes</string>
     <string name="stats_view_total_comments">Total Comments</string>
     <string name="stats_view_total_followers">Total Followers</string>
@@ -1408,7 +1407,6 @@
     <string name="stats_insights_tumblr">Tumblr</string>
     <string name="stats_insights_google_plus">Google+</string>
     <string name="stats_insights_linkedin">LinkedIn</string>
-    <string name="stats_insights_social">Social</string>
     <string name="stats_insights_path">Path</string>
     <string name="stats_most_popular_percent_views">%1$s of views</string>
     <string name="stats_most_popular_percent_views_empty">Not enough activity. Check back later when your site\'s had more visitors!</string>

diff --git a/WordPress/src/test/java/org/wordpress/android/ui/stats/refresh/lists/UiModelMapperTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/stats/refresh/lists/UiModelMapperTest.kt
index 894c3855afd3..c04d853e861a 100644
--- a/WordPress/src/test/java/org/wordpress/android/ui/stats/refresh/lists/UiModelMapperTest.kt
+++ b/WordPress/src/test/java/org/wordpress/android/ui/stats/refresh/lists/UiModelMapperTest.kt
@@ -7,7 +7,7 @@ import org.junit.Test
 import org.mockito.Mock
 import org.wordpress.android.BaseUnitTest
 import org.wordpress.android.R
-import org.wordpress.android.fluxc.store.StatsStore.InsightType.FOLLOWER_TOTALS
+import org.wordpress.android.fluxc.store.StatsStore.InsightType.TOTAL_FOLLOWERS
 import org.wordpress.android.fluxc.store.StatsStore.ManagementType
 import org.wordpress.android.ui.stats.refresh.lists.StatsBlock.Success
 import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.UiModel
@@ -31,7 +31,7 @@ class UiModelMapperTest : BaseUnitTest() {
         var error: Int? = null
         val uiModel = mapper.mapInsights(
             listOf(
-                UseCaseModel(FOLLOWER_TOTALS, data = listOf(), state = SUCCESS),
+                UseCaseModel(TOTAL_FOLLOWERS, data = listOf(), state = SUCCESS),
                 UseCaseModel(ManagementType.CONTROL, data = listOf(), state = SUCCESS)
             )
         ) {
@@ -40,7 +40,7 @@ class UiModelMapperTest : BaseUnitTest() {

         val model = uiModel as UiModel.Success
         assertThat(model.data).hasSize(2)
-        assertThat((model.data[0] as Success).statsType).isEqualTo(FOLLOWER_TOTALS)
+        assertThat((model.data[0] as Success).statsType).isEqualTo(TOTAL_FOLLOWERS)
         assertThat(model.data[0].type).isEqualTo(StatsBlock.Type.SUCCESS)
         assertThat(model.data[0].data).isEmpty()
         assertThat((model.data[1] as Success).statsType).isEqualTo(ManagementType.CONTROL)
diff --git a/WordPress/src/test/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/usecases/FollowerTotalsUseCaseTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/usecases/FollowerTotalsUseCaseTest.kt
deleted file mode 100644
index 65e17d28a2df..000000000000
--- a/WordPress/src/test/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/usecases/FollowerTotalsUseCaseTest.kt
+++ /dev/null
@@ -1,145 +0,0 @@
-package org.wordpress.android.ui.stats.refresh.lists.sections.insights.usecases
-
-import kotlinx.coroutines.ExperimentalCoroutinesApi
-import org.assertj.core.api.Assertions.assertThat
-import org.junit.Before
-import org.junit.Test
-import org.mockito.Mock
-import org.mockito.kotlin.any
-import org.mockito.kotlin.whenever
-import org.wordpress.android.BaseUnitTest
-import org.wordpress.android.R
-import org.wordpress.android.fluxc.model.SiteModel
-import org.wordpress.android.fluxc.model.stats.FollowersModel
-import org.wordpress.android.fluxc.model.stats.LimitMode
-import org.wordpress.android.fluxc.model.stats.PagedMode
-import org.wordpress.android.fluxc.model.stats.PublicizeModel
-import org.wordpress.android.fluxc.model.stats.PublicizeModel.Service
-import org.wordpress.android.fluxc.store.StatsStore.OnStatsFetched
-import org.wordpress.android.fluxc.store.stats.insights.FollowersStore
-import org.wordpress.android.fluxc.store.stats.insights.PublicizeStore
-import org.wordpress.android.ui.stats.refresh.lists.sections.BaseStatsUseCase.UseCaseModel
-import org.wordpress.android.ui.stats.refresh.lists.sections.BaseStatsUseCase.UseCaseModel.UseCaseState.SUCCESS
-import org.wordpress.android.ui.stats.refresh.lists.sections.BlockListItem
-import org.wordpress.android.ui.stats.refresh.lists.sections.BlockListItem.ListItemWithIcon
-import org.wordpress.android.ui.stats.refresh.lists.sections.BlockListItem.Title
-import org.wordpress.android.ui.stats.refresh.lists.sections.BlockListItem.Type.LIST_ITEM_WITH_ICON
-import org.wordpress.android.ui.stats.refresh.lists.sections.BlockListItem.Type.TITLE
-import org.wordpress.android.ui.stats.refresh.utils.ContentDescriptionHelper
-import org.wordpress.android.ui.stats.refresh.utils.ItemPopupMenuHandler
-import org.wordpress.android.ui.stats.refresh.utils.StatsSiteProvider
-import org.wordpress.android.ui.stats.refresh.utils.StatsUtils
-
-@ExperimentalCoroutinesApi
-class FollowerTotalsUseCaseTest : BaseUnitTest() {
-    @Mock
-    lateinit var followersStore: FollowersStore
-
-    @Mock
-    lateinit var publicizeStore: PublicizeStore
-
-    @Mock
-    lateinit var statsSiteProvider: StatsSiteProvider
-
-    @Mock
-    lateinit var contentDescriptionHelper: ContentDescriptionHelper
-
-    @Mock
-    lateinit var popupMenuHandler: ItemPopupMenuHandler
-
-    @Mock
-    lateinit var statsUtils: StatsUtils
-
-    @Mock
-    lateinit var site: SiteModel
-    private lateinit var useCase: FollowerTotalsUseCase
-
-    private val emailModel = FollowersModel(7, emptyList(), false)
-    private val wpModel = FollowersModel(3, emptyList(), false)
-    private val socialModel = PublicizeModel(
-        listOf(
-            Service("Twitter", 10),
-            Service("FB", 5)
-        ),
-        false
-    )
-    private val contentDescription = "title, views"
-
-    @Before
-    fun setUp() {
-        useCase = FollowerTotalsUseCase(
-            testDispatcher(),
-            testDispatcher(),
-            followersStore,
-            publicizeStore,
-            statsSiteProvider,
-            contentDescriptionHelper,
-            statsUtils,
-            popupMenuHandler
-        )
-        whenever(statsSiteProvider.siteModel).thenReturn(site)
-
-        whenever(followersStore.getEmailFollowers(site, LimitMode.Top(0))).thenReturn(emailModel)
-        whenever(followersStore.getWpComFollowers(site, LimitMode.Top(0))).thenReturn(wpModel)
-        whenever(publicizeStore.getPublicizeData(site, LimitMode.All)).thenReturn(socialModel)
-        whenever(
-            contentDescriptionHelper.buildContentDescription(
-                any(),
-                any<Int>()
-            )
-        ).thenReturn(contentDescription)
-        whenever(statsUtils.toFormattedString(any<Int>(), any())).then { (it.arguments[0] as Int).toString() }
-    }
-
-    @Test
-    fun `maps follower totals to UI model`() = test {
-        val forced = false
-        val refresh = true
-
-        whenever(followersStore.fetchEmailFollowers(site, PagedMode(0))).thenReturn(OnStatsFetched(emailModel))
-        whenever(followersStore.fetchWpComFollowers(site, PagedMode(0))).thenReturn(OnStatsFetched(wpModel))
-        whenever(publicizeStore.fetchPublicizeData(site, LimitMode.All)).thenReturn(OnStatsFetched(socialModel))
-
-        val result = loadFollowerTotalsData(refresh, forced)
-
-        assertThat(result.state).isEqualTo(SUCCESS)
-        result.data!!.apply {
-            assertThat(this).hasSize(4)
-            assertTitle(this[0])
-
-            for (i in 1..3) {
-                assertThat(this[i].type).isEqualTo(LIST_ITEM_WITH_ICON)
-                assertItem(this[i] as ListItemWithIcon)
-            }
-        }
-    }
-
-    private fun assertItem(item: ListItemWithIcon) {
-        when (item.icon) {
-            R.drawable.ic_wordpress_white_24dp -> {
-                assertThat(item.value).isEqualTo(3.toString())
-            }
-            R.drawable.ic_mail_white_24dp -> {
-                assertThat(item.value).isEqualTo(7.toString())
-            }
-            R.drawable.ic_share_white_24dp -> {
-                assertThat(item.value).isEqualTo(15.toString())
-            }
-        }
-        assertThat(item.contentDescription).isEqualTo(contentDescription)
-    }
-
-    private fun assertTitle(item: BlockListItem) {
-        assertThat(item.type).isEqualTo(TITLE)
-        assertThat((item as Title).textResource).isEqualTo(R.string.stats_view_follower_totals)
-        assertThat(item.menuAction).isNotNull
-    }
-
-    private suspend fun loadFollowerTotalsData(refresh: Boolean, forced: Boolean): UseCaseModel {
-        var result: UseCaseModel? = null
-        useCase.liveData.observeForever { result = it }
-        useCase.fetch(refresh, forced)
-        advanceUntilIdle()
-        return checkNotNull(result)
-    }
-}
diff --git a/WordPress/src/test/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/usecases/FollowerTypesUseCaseTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/usecases/FollowerTypesUseCaseTest.kt
index 6e4462d9565b..65a733f3f16d 100644
--- a/WordPress/src/test/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/usecases/FollowerTypesUseCaseTest.kt
+++ b/WordPress/src/test/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/usecases/FollowerTypesUseCaseTest.kt
@@ -14,11 +14,8 @@ import org.wordpress.android.fluxc.model.SiteModel
 import org.wordpress.android.fluxc.model.stats.FollowersModel
 import org.wordpress.android.fluxc.model.stats.LimitMode
 import org.wordpress.android.fluxc.model.stats.PagedMode
-import org.wordpress.android.fluxc.model.stats.PublicizeModel
-import org.wordpress.android.fluxc.model.stats.PublicizeModel.Service
 import org.wordpress.android.fluxc.store.StatsStore.OnStatsFetched
 import org.wordpress.android.fluxc.store.stats.insights.FollowersStore
-import org.wordpress.android.fluxc.store.stats.insights.PublicizeStore
 import org.wordpress.android.ui.stats.refresh.lists.sections.BaseStatsUseCase.UseCaseModel
 import org.wordpress.android.ui.stats.refresh.lists.sections.BaseStatsUseCase.UseCaseModel.UseCaseState.SUCCESS
 import org.wordpress.android.ui.stats.refresh.lists.sections.BlockListItem.ListItem
@@ -34,9 +31,6 @@ class FollowerTypesUseCaseTest : BaseUnitTest() {
     @Mock
     lateinit var followersStore: FollowersStore

-    @Mock
-    lateinit var publicizeStore: PublicizeStore
-
     @Mock
     lateinit var statsSiteProvider: StatsSiteProvider

@@ -55,12 +49,8 @@ class FollowerTypesUseCaseTest : BaseUnitTest() {

     private val wpModel = FollowersModel(3, emptyList(), false)
     private val emailModel = FollowersModel(7, emptyList(), false)
-    private val socialModel = PublicizeModel(
-        listOf(Service("Twitter", 10), Service("FB", 5)), false
-    )
     private val wpComTitle = "WordPress"
     private val emailTitle = "Email"
-    private val socialTitle = "Social"
     private val totalLabel = "Totals"
     private val contentDescriptionValue = "value, percentage of total followers"
     private val contentDescription = "title: $contentDescriptionValue"
@@ -71,7 +61,6 @@ class FollowerTypesUseCaseTest : BaseUnitTest() {
             testDispatcher(),
             testDispatcher(),
             followersStore,
-            publicizeStore,
             statsSiteProvider,
             contentDescriptionHelper,
             statsUtils,
@@ -81,7 +70,6 @@ class FollowerTypesUseCaseTest : BaseUnitTest() {

         whenever(followersStore.getEmailFollowers(site, LimitMode.Top(0))).thenReturn(emailModel)
         whenever(followersStore.getWpComFollowers(site, LimitMode.Top(0))).thenReturn(wpModel)
-        whenever(publicizeStore.getPublicizeData(site, LimitMode.All)).thenReturn(socialModel)
         whenever(contentDescriptionHelper.buildContentDescription(any(), any())).thenReturn(contentDescription)
         whenever(statsUtils.toFormattedString(any<Int>(), any())).then { (it.arguments[0] as Int).toString() }
         whenever(
@@ -93,7 +81,6 @@ class FollowerTypesUseCaseTest : BaseUnitTest() {
         ).then { contentDescriptionValue }
         whenever(resourceProvider.getString(R.string.stats_followers_wordpress_com)).then { wpComTitle }
         whenever(resourceProvider.getString(R.string.email)).then { emailTitle }
-        whenever(resourceProvider.getString(R.string.stats_insights_social)).then { socialTitle }
         whenever(resourceProvider.getString(eq(R.string.stats_value_percent), any<String>(), any<String>()))
             .then { "${it.arguments[1]} (${it.arguments[2]}%)" }
         whenever(resourceProvider.getString(R.string.stats_follower_types_pie_chart_total_label)).then { totalLabel }
@@ -106,16 +93,15 @@ class FollowerTypesUseCaseTest : BaseUnitTest() {

         whenever(followersStore.fetchEmailFollowers(site, PagedMode(0))).thenReturn(OnStatsFetched(emailModel))
         whenever(followersStore.fetchWpComFollowers(site, PagedMode(0))).thenReturn(OnStatsFetched(wpModel))
-        whenever(publicizeStore.fetchPublicizeData(site, LimitMode.All)).thenReturn(OnStatsFetched(socialModel))

         val result = loadFollowerTypesData(refresh, forced)

         assertThat(result.state).isEqualTo(SUCCESS)
         result.data!!.apply {
-            assertThat(this).hasSize(4)
+            assertThat(this).hasSize(3)
             assertThat(this[0].type).isEqualTo(PIE_CHART)

-            for (i in 1..3) {
+            for (i in 1..2) {
                 assertThat(this[i].type).isEqualTo(LIST_ITEM)
                 assertItem(this[i] as ListItem)
             }
@@ -124,9 +110,8 @@ class FollowerTypesUseCaseTest : BaseUnitTest() {

     private fun assertItem(item: ListItem) {
         when (item.text) {
-            wpComTitle -> assertThat(item.value).isEqualTo("3 (12%)")
-            emailTitle -> assertThat(item.value).isEqualTo("7 (28%)")
-            socialTitle -> assertThat(item.value).isEqualTo("15 (60%)")
+            wpComTitle -> assertThat(item.value).isEqualTo("3 (30%)")
+            emailTitle -> assertThat(item.value).isEqualTo("7 (70%)")
         }
         assertThat(item.contentDescription).isEqualTo(contentDescription)
     }
diff --git a/WordPress/src/test/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/usecases/TotalFollowersUseCaseTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/usecases/TotalFollowersUseCaseTest.kt
index 93165d577ace..69a4b88caf9d 100644
--- a/WordPress/src/test/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/usecases/TotalFollowersUseCaseTest.kt
+++ b/WordPress/src/test/java/org/wordpress/android/ui/stats/refresh/lists/sections/insights/usecases/TotalFollowersUseCaseTest.kt
@@ -10,11 +10,13 @@ import org.mockito.kotlin.whenever
 import org.wordpress.android.BaseUnitTest
 import org.wordpress.android.R
 import org.wordpress.android.fluxc.model.SiteModel
-import org.wordpress.android.fluxc.model.stats.SummaryModel
+import org.wordpress.android.fluxc.model.stats.LimitMode
+import org.wordpress.android.fluxc.model.stats.subscribers.SubscribersModel
+import org.wordpress.android.fluxc.network.utils.StatsGranularity
 import org.wordpress.android.fluxc.store.StatsStore.OnStatsFetched
 import org.wordpress.android.fluxc.store.StatsStore.StatsError
 import org.wordpress.android.fluxc.store.StatsStore.StatsErrorType.GENERIC_ERROR
-import org.wordpress.android.fluxc.store.stats.insights.SummaryStore
+import org.wordpress.android.fluxc.store.stats.subscribers.SubscribersStore
 import org.wordpress.android.ui.stats.refresh.lists.sections.BaseStatsUseCase.UseCaseMode
 import org.wordpress.android.ui.stats.refresh.lists.sections.BaseStatsUseCase.UseCaseModel
 import org.wordpress.android.ui.stats.refresh.lists.sections.BaseStatsUseCase.UseCaseModel.UseCaseState
@@ -32,7 +34,7 @@ import org.wordpress.android.viewmodel.ResourceProvider
 @ExperimentalCoroutinesApi
 class TotalFollowersUseCaseTest : BaseUnitTest() {
     @Mock
-    lateinit var insightsStore: SummaryStore
+    lateinit var subscribersStore: SubscribersStore

     @Mock
     lateinit var statsSiteProvider: StatsSiteProvider
@@ -58,14 +60,14 @@ class TotalFollowersUseCaseTest : BaseUnitTest() {
     @Mock
     lateinit var actionCardHandler: ActionCardHandler
     private lateinit var useCase: TotalFollowersUseCase
-    private val followers = 100
+    private val subscribers = 10L

     @Before
     fun setUp() {
         useCase = TotalFollowersUseCase(
             testDispatcher(),
             testDispatcher(),
-            insightsStore,
+            subscribersStore,
             statsSiteProvider,
             resourceProvider,
             totalStatsMapper,
@@ -82,9 +84,12 @@ class TotalFollowersUseCaseTest : BaseUnitTest() {
     fun `maps summary to UI model`() = test {
         val forced = false
         val refresh = true
-        val model = SummaryModel(0, 0, followers)
-        whenever(insightsStore.getSummary(site)).thenReturn(model)
-        whenever(insightsStore.fetchSummary(site, forced)).thenReturn(OnStatsFetched(model))
+        val periodData = SubscribersModel.PeriodData("2024-04-24", subscribers)
+        val modelPeriod = "2024-05-03"
+        val model = SubscribersModel(modelPeriod, listOf(periodData))
+        whenever(subscribersStore.getSubscribers(site, StatsGranularity.DAYS, LimitMode.Top(1))).thenReturn(model)
+        whenever(subscribersStore.fetchSubscribers(site, StatsGranularity.DAYS, LimitMode.Top(1)))
+            .thenReturn(OnStatsFetched(model))

         val result = loadSummary(refresh, forced)

@@ -101,9 +106,8 @@ class TotalFollowersUseCaseTest : BaseUnitTest() {
         val forced = false
         val refresh = true
         val message = "Generic error"
-        whenever(insightsStore.fetchSummary(site, forced)).thenReturn(
-            OnStatsFetched(StatsError(GENERIC_ERROR, message))
-        )
+        whenever(subscribersStore.fetchSubscribers(site, StatsGranularity.DAYS, LimitMode.Top(1), forced))
+            .thenReturn(OnStatsFetched(StatsError(GENERIC_ERROR, message)))

         val result = loadSummary(refresh, forced)

@@ -118,7 +122,7 @@ class TotalFollowersUseCaseTest : BaseUnitTest() {
     private fun assertValue(blockListItem: BlockListItem) {
         assertThat(blockListItem.type).isEqualTo(VALUE_WITH_CHART_ITEM)
         val item = blockListItem as ValueWithChartItem
-        assertThat(item.value).isEqualTo(followers.toString())
+        assertThat(item.value).isEqualTo(subscribers.toString())
     }

     private suspend fun loadSummary(refresh: Boolean, forced: Boolean): UseCaseModel {


"stats/subscribers" deeplink

Fixes #20691

This makes `site` parameter optional in the stats deeplink and adds support for "jetpack://stats/subscribers" deeplink.

|deeplink|description|
|-|-|
|jetpack://stats|opens the latest tab from stats|
|jetpack://stats/insights|opens the INSIGHTS tab|
|jetpack://stats/day|opens the TRAFFIC tab and Days granularity|
|jetpack://stats/week|opens the TRAFFIC tab and Weeks granularity|
|jetpack://stats/month|opens the TRAFFIC tab and Months granularity|
|jetpack://stats/year|opens the TRAFFIC tab and Years granularity|
|jetpack://stats/irfanotest.wordpress.com|if you add /{siteAdress} to any deeplink, it opens stats for that site|

https://github.com/wordpress-mobile/WordPress-Android/assets/2471769/7f379c4e-5608-4473-9ff5-8b51ef9ded75

-----

## To Test:

<!-- Test instructions per dependency update: https://github.com/wordpress-mobile/WordPress-Android/blob/trunk/docs/test_instructions_per_dependency_update.md -->

You can use an online HTML editor or any other method you prefer to test deeplinks.

-----

## Regression Notes

1. Potential unintended areas of impact

    - None

2. What I did to test those areas of impact (or what existing automated tests I relied on)

    - N/A

3. What automated tests I added (or what prevented me from doing so)

    - Updated `StatsLinkHandlerTest`

-----

## PR Submission Checklist:

- [x] I have completed the Regression Notes.
- [x] I have considered adding accessibility improvements for my changes.
- [x] I have considered if this change warrants user-facing release notes and have added them to `RELEASE-NOTES.txt` if necessary.

-----

## Testing Checklist (strike-out the not-applying and unnecessary ones):

- [ ] ~WordPress.com sites and self-hosted Jetpack sites.~
- [ ] ~Portrait and landscape orientations.~
- [ ] ~Light and dark modes.~
- [ ] ~Fonts: Larger, smaller and bold text.~
- [ ] ~High contrast.~
- [ ] ~Talkback.~
- [ ] ~Languages with large words or with letters/accents not frequently used in English.~
- [ ] ~Right-to-left languages. (Even if translation isn’t complete, formatting should still respect the right-to-left layout)~
- [ ] ~Large and small screen sizes. (Tablet and smaller phones)~
- [ ] ~Multi-tasking: Split screen and Pop-up view. (Android 10 or higher)~

Deep link support

Deep link support
Full Scope: https://github.com/Automattic/wordpress-mobile/issues/47
Design: [IqhXWz3Iir7RMb5XH5gGfZ-fi-883%3A4006](https://href.li/?https://www.figma.com/file/IqhXWz3Iir7RMb5XH5gGfZ/?node-id=883%3A4006)

- Deep link to Subscribers tab
- Deep link to Traffic tab with appropriate granularity selected

diff --git a/RELEASE-NOTES.txt b/RELEASE-NOTES.txt
index ca376cca8b49..70f9185bdb38 100644
--- a/RELEASE-NOTES.txt
+++ b/RELEASE-NOTES.txt
@@ -2,7 +2,7 @@

 24.9
 -----
-
+* [***] [Jetpack-only] Reorganized Stats to include updated Traffic and Insights tabs, along with a newly added Subscribers tab to improve subscriber metrics analysis [https://github.com/wordpress-mobile/WordPress-Android/pull/20756]

 24.8
 -----
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/deeplinks/handlers/StatsLinkHandler.kt b/WordPress/src/main/java/org/wordpress/android/ui/deeplinks/handlers/StatsLinkHandler.kt
index ceed1dbb5b12..c083f900c464 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/deeplinks/handlers/StatsLinkHandler.kt
+++ b/WordPress/src/main/java/org/wordpress/android/ui/deeplinks/handlers/StatsLinkHandler.kt
@@ -2,11 +2,11 @@ package org.wordpress.android.ui.deeplinks.handlers

 import org.wordpress.android.fluxc.model.SiteModel
 import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction
+import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.OpenJetpackStaticPosterView
 import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.OpenStats
 import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.OpenStatsForSite
 import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.OpenStatsForSiteAndTimeframe
 import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.OpenStatsForTimeframe
-import org.wordpress.android.ui.deeplinks.DeepLinkNavigator.NavigateAction.OpenJetpackStaticPosterView
 import org.wordpress.android.ui.deeplinks.DeepLinkUriUtils
 import org.wordpress.android.ui.deeplinks.DeepLinkingIntentReceiverViewModel.Companion.APPLINK_SCHEME
 import org.wordpress.android.ui.deeplinks.DeepLinkingIntentReceiverViewModel.Companion.HOST_WORDPRESS_COM
@@ -32,7 +32,8 @@ class StatsLinkHandler
         val pathSegments = uri.pathSegments
         val length = pathSegments.size
         val site = pathSegments.getOrNull(length - 1)?.toSite()
-        val statsTimeframe = pathSegments.getOrNull(length - 2)?.toStatsTimeframe()
+        val timeframeIndex = if (site == null) (length - 1) else (length - 2)
+        val statsTimeframe = pathSegments.getOrNull(timeframeIndex)?.toStatsTimeframe()
         return when {
             jetpackFeatureRemovalPhaseHelper.shouldShowStaticPage() -> OpenJetpackStaticPosterView
             site != null && statsTimeframe != null -> {
@@ -98,6 +99,7 @@ class StatsLinkHandler
             "month" -> StatsTimeframe.MONTH
             "year" -> StatsTimeframe.YEAR
             "insights" -> StatsTimeframe.INSIGHTS
+            "subscribers" -> StatsTimeframe.SUBSCRIBERS
             else -> null
         }
     }
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsFragment.kt b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsFragment.kt
index 915d8637eb93..faabf6c0f856 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsFragment.kt
+++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/refresh/StatsFragment.kt
@@ -19,6 +19,7 @@ import dagger.hilt.android.AndroidEntryPoint
 import org.wordpress.android.R
 import org.wordpress.android.WordPress
 import org.wordpress.android.databinding.StatsFragmentBinding
+import org.wordpress.android.models.JetpackPoweredScreen
 import org.wordpress.android.ui.ScrollableViewInitializedListener
 import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureFullScreenOverlayFragment
 import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalOverlayUtil.JetpackFeatureOverlayScreenType
@@ -38,13 +39,12 @@ import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.StatsSect
 import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.StatsSection.TOTAL_COMMENTS_DETAIL
 import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.StatsSection.TOTAL_FOLLOWERS_DETAIL
 import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.StatsSection.TOTAL_LIKES_DETAIL
+import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.StatsSection.TRAFFIC
 import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.StatsSection.WEEKS
 import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.StatsSection.YEARS
 import org.wordpress.android.ui.stats.refresh.utils.StatsSiteProvider.SiteUpdateResult
 import org.wordpress.android.ui.utils.UiHelpers
 import org.wordpress.android.util.JetpackBrandingUtils
-import org.wordpress.android.models.JetpackPoweredScreen
-import org.wordpress.android.ui.stats.refresh.lists.StatsListViewModel.StatsSection.TRAFFIC
 import org.wordpress.android.util.WPSwipeToRefreshHelper
 import org.wordpress.android.util.config.StatsTrafficSubscribersTabFeatureConfig
 import org.wordpress.android.util.helpers.SwipeToRefreshHelper
@@ -224,10 +224,7 @@ class StatsFragment : Fragment(R.layout.stats_fragment), ScrollableViewInitializ
         }
     }

-    @Suppress("MagicNumber")
-    private fun StatsFragmentBinding.handleSelectedSectionWithTrafficTab(
-        selectedSection: StatsSection
-    ) {
+    private fun StatsFragmentBinding.handleSelectedSectionWithTrafficTab(selectedSection: StatsSection) {
         val position = when (selectedSection) {
             TRAFFIC -> 0
             INSIGHTS -> 1
@@ -243,16 +240,14 @@ class StatsFragment : Fragment(R.layout.stats_fragment), ScrollableViewInitializ
         position?.let {
             if (statsPager.currentItem != position) {
                 tabLayout.removeOnTabSelectedListener(selectedTabListener)
-                statsPager.setCurrentItem(position, false)
+                statsPager.currentItem = position
                 tabLayout.addOnTabSelectedListener(selectedTabListener)
             }
         }
     }

     @Suppress("MagicNumber")
-    private fun StatsFragmentBinding.handleSelectedSection(
-        selectedSection: StatsSection
-    ) {
+    private fun StatsFragmentBinding.handleSelectedSection(selectedSection: StatsSection) {
         val position = when (selectedSection) {
             INSIGHTS -> 0
             DAYS -> 1
@@ -270,7 +265,7 @@ class StatsFragment : Fragment(R.layout.stats_fragment), ScrollableViewInitializ
         position?.let {
             if (statsPager.currentItem != position) {
                 tabLayout.removeOnTabSelectedListener(selectedTabListener)
-                statsPager.setCurrentItem(position, false)
+                statsPager.currentItem = position
                 tabLayout.addOnTabSelectedListener(selectedTabListener)
             }
         }

diff --git a/WordPress/src/test/java/org/wordpress/android/ui/deeplinks/handlers/StatsLinkHandlerTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/deeplinks/handlers/StatsLinkHandlerTest.kt
index 1c6984ff5c9d..35fa892d67c7 100644
--- a/WordPress/src/test/java/org/wordpress/android/ui/deeplinks/handlers/StatsLinkHandlerTest.kt
+++ b/WordPress/src/test/java/org/wordpress/android/ui/deeplinks/handlers/StatsLinkHandlerTest.kt
@@ -15,6 +15,7 @@ import org.wordpress.android.ui.jetpackoverlay.JetpackFeatureRemovalPhaseHelper
 import org.wordpress.android.ui.stats.StatsTimeframe.DAY
 import org.wordpress.android.ui.stats.StatsTimeframe.INSIGHTS
 import org.wordpress.android.ui.stats.StatsTimeframe.MONTH
+import org.wordpress.android.ui.stats.StatsTimeframe.SUBSCRIBERS
 import org.wordpress.android.ui.stats.StatsTimeframe.WEEK
 import org.wordpress.android.ui.stats.StatsTimeframe.YEAR

@@ -108,7 +109,8 @@ class StatsLinkHandlerTest {
             "week" to WEEK,
             "month" to MONTH,
             "year" to YEAR,
-            "insights" to INSIGHTS
+            "insights" to INSIGHTS,
+            "subscribers" to SUBSCRIBERS
         )
         timeframes.forEach { (key, timeframe) ->
             val uri = buildUri(host = null, "stats", key, siteUrl)
@@ -125,6 +127,25 @@ class StatsLinkHandlerTest {
         }
     }

+    @Test
+    fun `opens stats screen for a stats timeframe and no site present in URL`() {
+        val timeframes = mapOf(
+            "day" to DAY,
+            "week" to WEEK,
+            "month" to MONTH,
+            "year" to YEAR,
+            "insights" to INSIGHTS,
+            "subscribers" to SUBSCRIBERS
+        )
+        timeframes.forEach { (key, timeframe) ->
+            val uri = buildUri(host = null, "stats", key)
+
+            val buildNavigateAction = statsLinkHandler.buildNavigateAction(uri)
+
+            assertThat(buildNavigateAction).isEqualTo(NavigateAction.OpenStatsForTimeframe(timeframe))
+        }
+    }
+
     @Test
     fun `opens stats screen for a site when timeframe not valid`() {
         val siteUrl = "example.com"


Fix: PublishSettingsViewModel NPE on create date

Fixes #18615

This PR adjusts `onAddToCalendar()` to handle scenarios where the `EditPostRepository.dateCreated` may be empty. Previously, the method would attempt to process the calendar event without considering the possibility of an empty dateCreated. This could potentially lead to null return from `DateTimeUtils.dateFromIso8601()`, then a subsequent attempt to access `time` on a null object would throw an NPE.

In this PR, I've introduced a null check using ?.let { } to ensure that the time is only accessed when `dateFromIso8601` returns a value that is not null. A toast message is shown if  we are unable to get the time properly.

It's important to note that while val dateCreated: String get() = post!!.dateCreated cannot be null due to its definition, it's possible for it to be empty.

-----

## To Test:
I was unable to create this scenario using the app.
Please ensure the code looks good and the unit tests pass.
If you are feeling extra adventurous, you can download the branch and modify the `onAddToCalendar()` to pass an empty string to `DateTimeUtils.dateFromIso8601` and then run the app.

-----

## Regression Notes

1. Potential unintended areas of impact
The app still crashes when dateCreated is empty

2. What I did to test those areas of impact (or what existing automated tests I relied on)
New unit test in `EditPostPublishSettingsViewModelTest`

3. What automated tests I added (or what prevented me from doing so)
N/A

-----

## PR Submission Checklist:
- [X] I have completed the Regression Notes.
- [X] I have considered adding accessibility improvements for my changes.
- [X] I have considered if this change warrants user-facing release notes and have added them to `RELEASE-NOTES.txt` if necessary.

-----

## Testing Checklist (strike-out the not-applying and unnecessary ones): N/A

NullPointerException: Attempt to invoke virtual method 'long java.util.Date.getTime()' on a null object reference
Sentry Issue: [JETPACK-ANDROID-7TE](https://a8c.sentry.io/issues/4259423167/?referrer=github_integration)

```
NullPointerException: Attempt to invoke virtual method 'long java.util.Date.getTime()' on a null object reference
    at java.util.Calendar.setTime(Calendar.java:1749)
    at org.wordpress.android.ui.posts.PublishSettingsViewModel.getCurrentPublishDateAsCalendar(PublishSettingsViewModel.kt:208)
    at org.wordpress.android.ui.posts.PublishSettingsViewModel.start(PublishSettingsViewModel.kt:70)
    at org.wordpress.android.ui.posts.EditPostPublishSettingsViewModel.start(EditPostPublishSettingsViewModel.kt:40)
    at org.wordpress.android.ui.posts.EditPostSettingsFragment.refreshViews(EditPostSettingsFragment.java:508)
...
(66 additional frame(s) were not displayed)
```

This looks like it is coming from [an unannotated nullable in the Java utility code](https://github.com/wordpress-mobile/WordPress-Utils-Android/blob/20c490bdf3def25600c76b8cb9796eeccb14edc6/WordPressUtils/src/main/java/org/wordpress/android/util/DateTimeUtils.java#L63). If content loss is possible from this, it may be worth bumping to high priority.

diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/PublishSettingsViewModel.kt b/WordPress/src/main/java/org/wordpress/android/ui/posts/PublishSettingsViewModel.kt
index 0c3a87edcbef..d8672ec395f5 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/posts/PublishSettingsViewModel.kt
+++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/PublishSettingsViewModel.kt
@@ -188,21 +188,23 @@ constructor(
     }

     fun onAddToCalendar(postRepository: EditPostRepository) {
-        val startTime = DateTimeUtils.dateFromIso8601(postRepository.dateCreated).time
-        val site = siteStore.getSiteByLocalId(postRepository.localSiteId)
-        val title = resourceProvider.getString(
-            R.string.calendar_scheduled_post_title,
-            postRepository.title
-        )
-        val appName = resourceProvider.getString(R.string.app_name)
-        val description = resourceProvider.getString(
-            R.string.calendar_scheduled_post_description,
-            postRepository.title,
-            site?.name ?: site?.url ?: "",
-            appName,
-            postRepository.link
-        )
-        _onAddToCalendar.value = Event(CalendarEvent(title, description, startTime))
+        DateTimeUtils.dateFromIso8601(postRepository.dateCreated)?.let {
+            val startTime = it.time
+            val site = siteStore.getSiteByLocalId(postRepository.localSiteId)
+            val title = resourceProvider.getString(
+                R.string.calendar_scheduled_post_title,
+                postRepository.title
+            )
+            val appName = resourceProvider.getString(R.string.app_name)
+            val description = resourceProvider.getString(
+                R.string.calendar_scheduled_post_description,
+                postRepository.title,
+                site?.name ?: site?.url ?: "",
+                appName,
+                postRepository.link
+            )
+            _onAddToCalendar.value = Event(CalendarEvent(title, description, startTime))
+        } ?: _onToast.postValue(Event(resourceProvider.getString(R.string.post_settings_add_to_calendar_error)))
     }

     private fun getCurrentPublishDateAsCalendar(postRepository: EditPostRepository): Calendar {
diff --git a/WordPress/src/main/res/values/strings.xml b/WordPress/src/main/res/values/strings.xml
index f0f385ac490a..27a2cb7163a6 100644
--- a/WordPress/src/main/res/values/strings.xml
+++ b/WordPress/src/main/res/values/strings.xml
@@ -1796,6 +1796,7 @@
     <string name="post_settings_notification">Notification</string>
     <string name="post_settings_add_to_calendar">Add to calendar</string>
     <string name="post_settings_no_calendar_app_exists">No app found to handle the request to add to calendar</string>
+    <string name="post_settings_add_to_calendar_error">Unable to add to calendar</string>
     <string name="post_settings_jetpack_social_header">Social Sharing</string>
     <string name="post_settings_jetpack_social_connect_social_profiles_message">Increase your traffic by auto-sharing your posts with your friends on social media.</string>
     <string name="post_settings_jetpack_social_connect_social_profiles_button">Connect accounts</string>

diff --git a/WordPress/src/test/java/org/wordpress/android/ui/posts/EditPostPublishSettingsViewModelTest.kt b/WordPress/src/test/java/org/wordpress/android/ui/posts/EditPostPublishSettingsViewModelTest.kt
index ecd6b449465b..3e6582489b32 100644
--- a/WordPress/src/test/java/org/wordpress/android/ui/posts/EditPostPublishSettingsViewModelTest.kt
+++ b/WordPress/src/test/java/org/wordpress/android/ui/posts/EditPostPublishSettingsViewModelTest.kt
@@ -472,4 +472,22 @@ class EditPostPublishSettingsViewModelTest : BaseUnitTest() {

         assertThat(uiModel!!.publishDateLabel).isEqualTo("Immediately")
     }
+
+    @Test
+    fun `given dateCreated is empty, when onAddToCalendar, then a toast is shown`() {
+        whenever(editPostRepository.dateCreated).thenReturn("")
+        val expectedToastMessage = ""
+        whenever(resourceProvider.getString(R.string.post_settings_add_to_calendar_error)).thenReturn(
+            expectedToastMessage
+        )
+
+        var toastMessage: String? = null
+        viewModel.onToast.observeForever {
+            toastMessage = it?.getContentIfNotHandled()
+        }
+
+        viewModel.onAddToCalendar(editPostRepository)
+
+        assertThat(toastMessage).isEqualTo(expectedToastMessage)
+    }
 }