Skip to content

Gate New Stats behind remote feature flag#22996

Open
adalpari wants to merge 8 commits into
trunkfrom
feat/new-stats-remote-flag
Open

Gate New Stats behind remote feature flag#22996
adalpari wants to merge 8 commits into
trunkfrom
feat/new-stats-remote-flag

Conversation

@adalpari

@adalpari adalpari commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

Description

The New Stats experience was previously gated by a local experimental
feature flag (ExperimentalFeatures.Feature.NEW_STATS), toggled both from the
experimental-features settings screen and from in-app "Try new stats" /
"Disable new stats" controls.

This PR replaces that local flag with a new remote feature flag,
android_new_stats, so the rollout can be controlled server-side. The remote
flag is the single source of truth for routing (which Stats screen opens by
default) and defaults to false when the remote value is unavailable (offline /
not yet fetched).

The in-app switch controls are kept so users can move between the classic
and new experiences, with one rule tied to the remote flag: when
android_new_stats is on, the new experience is the rollout default and the
user is locked into it (no "Disable new stats" action). When the flag is
off, both directions are available. The controls are now plain navigation —
they no longer persist any local flag, so the remote flag remains the routing
source of truth.

Changes

  • New remote flag: added NewStatsFeatureConfig (@Feature("android_new_stats", false))
    and the NEW_STATS buildConfigField. The @Feature annotation auto-registers
    the default in the KSP-generated RemoteFeatureConfigDefaults.
  • Gating read swapped: ListItemActionHandler now decides new vs. classic
    Stats via newStatsFeatureConfig.isEnabled() (test updated accordingly).
  • Local flag removed: dropped the NEW_STATS entry from ExperimentalFeatures
    (it disappears from the experimental-features settings screen automatically).
  • "Try new stats" kept on the classic screen: the toolbar menu
    (res/menu/stats_toolbar_menu.xml) and the "new Stats experience" suggestion
    dialog in StatsFragment remain. Selecting them now simply launches
    NewStatsActivity (no local flag write).
  • "Disable new stats" kept on the new screen, gated on the remote flag: the
    overflow action in NewStatsActivity is shown only when
    newStatsFeatureConfig.isEnabled() is false. When the remote flag is true
    the action is hidden, so users on the rollout cannot switch back. Selecting it
    launches the classic StatsActivity (no local flag write).
  • Retained the supporting suggestion prefs (AppPrefs/AppPrefsWrapper), base
    English strings, and the STATS_NEW_STATS_ENABLED/STATS_NEW_STATS_DISABLED
    analytics events used by these controls.

Testing instructions

1. The experimental flag is gone

  1. Build & install the Jetpack debug app.
  2. Open Me → App Settings → Experimental Features.
  • Verify "New Stats" is no longer listed (it's now a remote flag, not a local experimental toggle).

2. a8c user → New Stats is presented

  1. Log in with an a8c (Automattic) account, which is segmented into the rollout (android_new_stats resolves to on).
  2. Open My Site → Stats.
  • Verify the new Stats screen opens directly.
  • Verify the overflow "Disable new stats" action is NOT shown — the user is locked into New Stats while the flag is on.

3. Random (non-a8c) user → ~90% see classic Stats, and can switch both ways

  1. Log in with a regular WordPress.com / Jetpack-connected account. With the rollout at 10%, there's a ~90% chance the flag resolves to off.
  2. Open My Site → Stats.
  • Verify the classic Stats screen opens (expected for the ~90% with the flag off).
  • Verify the "Try new stats" toolbar menu item is present, and the "A new Stats experience" suggestion dialog appears on first eligible launch.
  • Tap "Try new stats" (or "Try it out") → verify the new Stats screen opens.
  • In the new Stats screen, verify the overflow "Disable new stats" action is present and returns you to the classic Stats screen.
  • (If you happen to land in the ~10% with the flag on, you'll see the new screen with no "Disable" action — same as scenario 2.)

Tip: to force a specific path locally regardless of segmentation, set NEW_STATS to "true"/"false" in WordPress/build.gradle (the build flag overrides the remote value) and rebuild.

Replace the local NEW_STATS experimental flag with a server-controlled
remote feature flag so the New Stats rollout can be managed remotely.
Because the remote flag is read-only, the manual opt-in/opt-out toggles
are removed and the flag is now the single source of truth.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@dangermattic

dangermattic commented Jun 17, 2026

Copy link
Copy Markdown
Collaborator
1 Warning
⚠️ PR is not assigned to a milestone.

Generated by 🚫 Danger

@wpmobilebot

wpmobilebot commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

App Icon📲 You can test the changes from this Pull Request in Jetpack Android by scanning the QR code below to install the corresponding build.

App NameJetpack Android
Build TypeDebug
Versionpr22996-43d3a1f
Build Number1497
Application IDcom.jetpack.android.prealpha
Commit43d3a1f
Installation URL4cg45q3vlo0e8
Automatticians: You can use our internal self-serve MC tool to give yourself access to those builds if needed.

@wpmobilebot

wpmobilebot commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

App Icon📲 You can test the changes from this Pull Request in WordPress Android by scanning the QR code below to install the corresponding build.

App NameWordPress Android
Build TypeDebug
Versionpr22996-43d3a1f
Build Number1497
Application IDorg.wordpress.android.prealpha
Commit43d3a1f
Installation URL2fjcb3ts0tnk0
Automatticians: You can use our internal self-serve MC tool to give yourself access to those builds if needed.

@wpmobilebot

Copy link
Copy Markdown
Contributor

🤖 Build Failure Analysis

This build has failures. Claude has analyzed them - check the build annotations for details.

adalpari and others added 2 commits June 17, 2026 12:44
…rrors

The previous commit removed the New Stats opt-in/opt-out strings from the
default locale but left them in the translation files, causing 204
ExtraTranslation lint errors. Remove the orphaned translations.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@codecov

codecov Bot commented Jun 17, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 41.17647% with 10 lines in your changes missing coverage. Please review.
✅ Project coverage is 37.42%. Comparing base (400d4d2) to head (43d3a1f).

Files with missing lines Patch % Lines
.../wordpress/android/ui/newstats/NewStatsActivity.kt 0.00% 5 Missing ⚠️
.../java/org/wordpress/android/ui/prefs/AppPrefs.java 0.00% 3 Missing ⚠️
.../org/wordpress/android/ui/prefs/AppPrefsWrapper.kt 0.00% 2 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##            trunk   #22996      +/-   ##
==========================================
- Coverage   37.42%   37.42%   -0.01%     
==========================================
  Files        2325     2326       +1     
  Lines      125399   125408       +9     
  Branches    17205    17207       +2     
==========================================
+ Hits        46929    46930       +1     
- Misses      74656    74664       +8     
  Partials     3814     3814              

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

adalpari and others added 3 commits June 17, 2026 17:53
Re-add the "Try new stats" toolbar menu and suggestion dialog on the
classic Stats screen, and the "Disable new stats" overflow on the new
Stats screen. The latter is shown only when the android_new_stats remote
flag is off, so users on the rollout cannot switch back. Controls are
plain navigation now; the remote flag remains the routing source of truth
(no local ExperimentalFeatures flag is reintroduced).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
…o companion

The previous cleanup removed translations for eight New Stats string keys, but
only two (experimental_new_stats, experimental_new_stats_description) are
actually orphaned. The other six are still rendered by the kept controls
(stats_try_new_stats, stats_switch_to_old_stats, and the four
stats_new_stats_suggestion_* strings), so deleting their translations made
non-English users see English text. Restore those six across all locales while
keeping the two genuinely-orphaned experimental keys removed.

Also move NEW_STATS_REMOTE_FIELD into a companion object const referenced from
@feature, matching the convention used by the other FeatureConfig classes.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@adalpari adalpari requested a review from nbradbury June 18, 2026 12:59
adalpari and others added 2 commits June 19, 2026 10:36
Show New Stats when the remote feature flag is on or the user has opted
in locally. Opting in via the old Stats screen sets the preference, and
switching back to old Stats clears it.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@adalpari adalpari marked this pull request as ready for review June 19, 2026 09:09
@adalpari adalpari requested a review from a team as a code owner June 19, 2026 09:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants