Skip to content

Network Discovery: the network page and the podcast page link - #5861

Merged
geekygecko merged 5 commits into
mainfrom
philip/networks-podcast-page
Sep 7, 2026
Merged

Network Discovery: the network page and the podcast page link#5861
geekygecko merged 5 commits into
mainfrom
philip/networks-podcast-page

Conversation

@geekygecko

@geekygecko geekygecko commented Sep 5, 2026

Copy link
Copy Markdown
Member

Description

Podcast networks are now reachable in the app. Tapping the author name on a podcast's page opens that network's own page, showing the network's logo, name, description and all of its shows, each with a follow button.

Fixes PCDROID-756
Fixes PCDROID-761

Testing Instructions

The happy path

  1. Search for Analog(ue) and open its podcast page, expanding the header if it is collapsed.
  2. Check the author Relay is tinted with the podcast's colour and looks tappable, then tap it.
  3. Check the network page opens showing the Relay banner, the circular logo overlapping it, an uppercase NETWORK label, the title Relay, its description, and a two-column grid of its podcasts.
  4. Tap a podcast in the grid and check its podcast page opens. Go back, tap a + button and check it follows the podcast.
  5. Tap share in the nav bar and check it shares the network's list URL.

Loading and errors

  1. Turn on airplane mode and open the network page again. Check an in-page error with a Retry button appears.
  2. Turn airplane mode off and tap Retry. Check the page loads.
  3. Load the page successfully, then turn on airplane mode and rotate the device. Check the already-loaded shows stay on screen rather than being replaced by the error.

Regressions to watch

  1. Open Discover → Staff Picks. Check it looks and behaves exactly as before, now with a brief spinner while it loads.
  2. Open a podcast that is not in a network. Check the category · author line is unchanged: the author is not tinted and not tappable, and the category link still works.
  3. Turn the Network Discovery flag off and reopen Analog(ue). Check the author line is unchanged.
  4. Check the explicit badge still renders on a podcast marked explicit.

Analytics

  1. Tap the author link and check podcast_screen_network_tapped fires once, carrying podcast_uuid and list_id.

Screenshots or Screencast

Screen.Recording.2026-09-05.at.2.23.23.pm.mov
Light Dark
Screenshot_20260905_142419 Screenshot_20260905_142435
Screenshot_20260905_142424 Screenshot_20260905_142439

Checklist

  • If this is a user-facing change, I have added an entry in CHANGELOG.md
  • Ensure the linter passes (./gradlew spotlessApply to automatically apply formatting/linting)
  • I have considered whether it makes sense to add tests for my changes
  • All strings that need to be localized are in modules/services/localization/src/main/res/values/strings.xml
  • Any jetpack compose components I added or changed are covered by compose previews
  • I have updated (or requested that someone edit) the Event Horizon schema to reflect any new or changed analytics.

I have tested any UI changes...

  • with different themes
  • with a landscape orientation
  • with the device set to have a large display and font size
  • for accessibility with TalkBack

@claude

claude Bot commented Sep 5, 2026

Copy link
Copy Markdown
Contributor

Claude finished @geekygecko's task in 9m 55s —— View job


Review

Reusing the collection screen rather than forking a Compose one is the right call, and the isNetworkPage branches are contained enough that the non-network paths read as unchanged — I traced the subtitle colour, web-link row, headshot and share-item branches and each leaves curated collections on their existing behaviour. The loading/error state machine holds up under the cases the description claims: rotation with a failing reload keeps content because ListLoaded is redelivered to the new viewLifecycleOwner before the queued postValue(Error) runs, and feedDisposable?.dispose() in load() also closes a pre-existing duplicate-subscription leak on every return to the page. The layout rewrite is only a FrameLayout wrapper plus the error/spinner siblings — the row_divider View stays inside headerLayout and the RecyclerView stays a sibling of it, so the header geometry is untouched. No blocking findings.

Non-blocking

  • modules/features/discover/src/main/java/au/com/shiftyjelly/pocketcasts/discover/view/PodcastGridListFragment.kt:160entrySourceView is never read and ARG_SOURCE_VIEW is never written by the Discover-row bundle, so it will read UNKNOWN if the follow-up starts using it as-is; wire it in or drop it. thread
  • modules/services/ui/src/main/java/au/com/shiftyjelly/pocketcasts/ui/helper/FragmentHostListener.kt:27SourceView is now in modules/services/ui's public ABI but reaches it only transitively via api(repositories); declare api(projects.modules.services.analytics) so buildHealth stays clean. thread

Nits

  • modules/services/localization/src/main/res/values/strings.xml:2042 — add a translator comment to discover_network; a bare "Network" is ambiguous across languages. thread

Two things I checked and am deliberately not raising: state.postValue from the Rx chain can land after a dispose() and briefly replace the spinner with the cancelled request's content on Retry/rotation, but it is the same URL so the only effect is a redundant render, and postValue is required there because addPlaybackStateToList's combineLatest can emit off the main thread. And retry() no-ops when lastLoad is null, but that needs sourceUrl == null, which neither newInstanceBundle overload can produce.
· branch philip/networks-podcast-page

@dangermattic

dangermattic commented Sep 5, 2026

Copy link
Copy Markdown
Collaborator
1 Warning
⚠️ This PR is larger than 500 lines of changes. Please consider splitting it into smaller PRs for easier and faster reviews.

Generated by 🚫 Danger

@wpmobilebot

wpmobilebot commented Sep 5, 2026

Copy link
Copy Markdown
Collaborator

Project dependencies changes

list
! Upgraded Dependencies
com.automattic:eventhorizon:pocket-casts-2026-09-04_05-35-13, (changed from pocket-casts-2026-08-31_18-53-21)
tree
 +--- project ':modules:features:account'
 |    \--- project ':modules:features:search'
 |         \--- project ':modules:services:analytics'
-|              +--- com.automattic:eventhorizon:pocket-casts-2026-08-31_18-53-21
+|              +--- com.automattic:eventhorizon:pocket-casts-2026-09-04_05-35-13
 |              +--- project ':modules:services:model'
-|              |    +--- com.automattic:eventhorizon:pocket-casts-2026-08-31_18-53-21 (*)
+|              |    +--- com.automattic:eventhorizon:pocket-casts-2026-09-04_05-35-13 (*)
 |              |    \--- project ':modules:services:utils'
 |              |         \--- project ':modules:services:payment'
-|              |              \--- com.automattic:eventhorizon:pocket-casts-2026-08-31_18-53-21 (*)
+|              |              \--- com.automattic:eventhorizon:pocket-casts-2026-09-04_05-35-13 (*)
 |              \--- project ':modules:services:preferences'
-|                   \--- com.automattic:eventhorizon:pocket-casts-2026-08-31_18-53-21 (*)
+|                   \--- com.automattic:eventhorizon:pocket-casts-2026-09-04_05-35-13 (*)
+|         \--- project ':modules:services:ui'
+|              \--- project ':modules:services:analytics' (*)
 \--- project ':modules:features:discover'
      \--- project ':modules:features:podcasts'
           \--- project ':modules:features:player'
                \--- project ':modules:features:transcripts'
                     \--- project ':modules:services:sharing'
-                         \--- com.automattic:eventhorizon:pocket-casts-2026-08-31_18-53-21 (*)
+                         \--- com.automattic:eventhorizon:pocket-casts-2026-09-04_05-35-13 (*)

Comment thread modules/features/discover/src/main/res/layout/podcast_grid_fragment.xml Dismissed
Comment thread modules/features/discover/src/main/res/layout/podcast_grid_fragment.xml Dismissed
Comment thread modules/features/discover/src/main/res/layout/podcast_grid_fragment.xml Dismissed
Comment thread modules/features/discover/src/main/res/layout/podcast_grid_fragment.xml Dismissed
Comment thread modules/features/discover/src/main/res/layout/podcast_grid_fragment.xml Dismissed
Comment thread modules/features/discover/src/main/res/layout/podcast_grid_fragment.xml Dismissed
Comment thread modules/services/localization/src/main/res/values/strings.xml
@geekygecko
geekygecko marked this pull request as ready for review September 6, 2026 22:50
@geekygecko
geekygecko requested a review from a team as a code owner September 6, 2026 22:50
@geekygecko
geekygecko requested review from sztomek and removed request for a team September 6, 2026 22:50
@claude

claude Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

Claude Code is working…

I'll analyze this and get back to you.

View job run

@geekygecko
geekygecko force-pushed the philip/networks-podcast-page branch from 2d5c019 to 9fd7ed0 Compare September 6, 2026 22:50
@claude

claude Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

Claude finished @geekygecko's task in 55s —— View job


Review

Reviewed the three commits since my last pass (83003fa, 9fd7ed0). All three earlier findings are addressed — ARG_SOURCE_VIEW is now written on the Discover-row path, modules/services/ui declares api(projects.modules.services.analytics) (no cycle: analytics does not depend on ui), and discover_network has a translator comment. The only behaviour change is unhiding the web-link row on network pages; the header's row_divider is constrained below linkLayout, so the header grows rather than overlapping the grid. Nothing new, nothing open.

· branch philip/networks-podcast-page ·

@geekygecko
geekygecko force-pushed the philip/networks-podcast-page branch from 9fd7ed0 to 8382961 Compare September 6, 2026 22:59
@claude

claude Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

Claude finished @geekygecko's task in 1m 38s —— View job


Review

The branch was force-pushed as a rebase — every commit has a new SHA (1d2ff7d, 54a4eb8, 6b54c94, 8382961) but the diff against philip/networks-db is byte-for-byte what I reviewed at 22:51 UTC: same 20 files, same 636/195, and 8382961 still contains only the two-line web-link unhide. Nothing new to review and nothing open from the earlier passes.
· branch philip/networks-podcast-page

@sztomek sztomek left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

comments are a bit verbose but the app worked as described

Base automatically changed from philip/networks-db to main September 7, 2026 21:40
…, add translator comment

PCDROID-756

SourceView is part of modules/services/ui's public ABI now that
FragmentHostListener.openNetworkPage takes one, so declare the analytics
module directly rather than relying on it arriving via api(repositories).

The Discover-row bundle did not write ARG_SOURCE_VIEW, so entrySourceView
would have read UNKNOWN on that path.
@geekygecko
geekygecko force-pushed the philip/networks-podcast-page branch from 8382961 to 4a4b2d8 Compare September 7, 2026 21:40
@claude

claude Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Claude finished @geekygecko's task in 1m 25s —— View job


Review

The branch was force-pushed as a rebase onto main now that #5860 has landed: all four commits were re-committed at 21:40 UTC with new SHAs (3cc7d3d, 6dae492, 6736bd8, 4a4b2d8) but unchanged authored dates, and the diff against origin/main is still 20 files / 636 additions / 195 deletions. I re-read the whole diff and it matches what I reviewed at 23:00 in every detail, down to 4a4b2d8 being only the two-line web-link unhide. Nothing new to review and nothing open from the earlier passes.

· branch philip/networks-podcast-page ·

@claude

claude Bot commented Sep 7, 2026

Copy link
Copy Markdown
Contributor

Claude finished @geekygecko's task in 26s —— View job


Review

One new commit since my last pass (cd05eab), applying both of @sztomek's nits: opensPodcastGridusePodcastGrid and the entrySourceView KDoc removed. The rename is complete — the only three references in the repo are the declaration and the two DiscoverFragment call sites, and the now-unused ExpandedStyle import it dropped has no other use in that file. Nothing new to raise and nothing open from earlier passes.

· branch philip/networks-podcast-page ·

@geekygecko
geekygecko merged commit 2e48232 into main Sep 7, 2026
24 checks passed
@geekygecko
geekygecko deleted the philip/networks-podcast-page branch September 7, 2026 22:05
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.

5 participants