Give feed rows an artwork placeholder instead of a prepared first frame
Maintainers usually reply within 1 day
Nobody has claimed this yet.
Assessment
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Newbie friendliness
- 28/100
- Issue type
- Documentation
- Clarity
- Mostly clear
- Activity status
- Quiet
- Domain
- documentation, mobile
Research direction
Start with PlayerPool (#12) and the demo's FeedScreen, which allocates a player per visible row, and with MediaRequest.artworkUri in the core model. Read ADR-0006 rule 2 before deciding where anything goes, since the issue rules out an image loader in superplayer-core. The work is a written recipe for a pooled feed row, and whether a superplayer-ui composable is needed is still open, so confirm the scope with a maintainer first. Done means the recipe states the decoder and network cost of a prepared row and non-playing rows show artworkUri.
Written by the indexing model from the issue text.
Description
Parent
Part of #1. Follows #12, which built the pool this is about.
The gap
PlayerPool (#12) bounds how many players a feed may hold, but says nothing about what a row shows
when it has no player — and the demo's FeedScreen currently answers that question the expensive
way on purpose, which is not the answer a production feed should copy.
Media3 settles half of this already: a paused, prepared player shows the first decoded video
frame, never artwork. PlayerView's artwork path is gated on hasSelectedVideoTrack() /
hasSelectedImageTrack() being false, so setUseArtwork and setDefaultArtwork do nothing for
video content whatever the playback state. Artwork in PlayerView is for audio-only media.
A real feed therefore does not use players for its non-playing rows at all. In YouTube's feed, the
active row has a player — video frame, captions, mute and CC controls, a progress bar — and every
other row is an ImageView showing the uploader's designed thumbnail: title text baked in, a
duration badge, a chosen frame. The difference in cost is an order of magnitude:
| Artwork row | Prepared-and-paused row | |
|---|---|---|
| Network | one cached image fetch | manifest + init segment + first media segment |
| Decoder | none | one of a device's scarce concurrent instances |
| Picture | the image the uploader chose | frame zero, usually a fade or a slate |
And it is spent on rows the viewer may scroll straight past.
What to build
A documented, production-shaped recipe for a pooled feed row, and whatever library support it turns
out to need:
- The active row plays; its immediate neighbours may be prepared and paused so a scroll starts
instantly; every other row showsMediaRequest.artworkUri. MediaRequestalready carriesartworkUriand documents it as what everything outside the app
displays — this is the first consumer of it inside the app.- SuperPlayer should almost certainly not load images itself. An image loader is a consumer's
choice, and a playback library that picked Coil or Glide for them would be choosing a dependency
the way ADR-0006 rule 2 says it must not choose storage. The likely shape is documentation plus,
if anything, asuperplayer-uicomposable that pairs a pooled player with a caller-supplied
placeholder slot — which puts it in phase 6, not phase 1.
Why the demo is not simply fixed
FeedScreen takes a player per visible row deliberately: that is what drives the pool to its bound
where a viewer can watch the counter stop, and a feed built the right way would never show that.
Whether the demo gains a second, production-shaped feed screen or the existing one is converted is
part of this issue. Converting it needs an image loader as a demo dependency, with its
THIRD_PARTY.md row.
Acceptance criteria
- The recipe is written down where a consumer will find it, with the decoder and network cost
of a prepared row stated -
MediaRequest.artworkUriis what a non-playing row displays - Any library support added carries no image-loading dependency into
superplayer-core -
FeedScreen's KDoc no longer needs to explain that it is deliberately greedier than a real feed
- Dominant language
- Kotlin
- Stars
- 1
- Forks
- 0
- Avg merge
- 1h 20m
- Merged PRs (30d)
- 172
Getting set up
- No Dockerfile or Docker Compose file
- No pull request template
- Read the contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from ramesh130/superplayer
-
bug need-device
Difficulty 2/5 1-3 hours Newbie friendliness 64/100
ramesh130/superplayer#495 ·
Maintainers usually reply within 1 day
-
Flakes (Android): AudioCapabilityChangeTest reselect wait and DownloadConditionsTest metered stopOpenready-for-agent
Difficulty 4/5 1-2 days Newbie friendliness 28/100
ramesh130/superplayer#526 ·
Maintainers usually reply within 1 day
-
ios ready-for-agent
Difficulty 4/5 3-5 days Newbie friendliness 28/100
ramesh130/superplayer#518 ·
Maintainers usually reply within 1 day
-
ready-for-agent
Difficulty 4/5 1-2 days Newbie friendliness 58/100
ramesh130/superplayer#501 ·
Maintainers usually reply within 1 day
-
ready-for-agent
Difficulty 4/5 3-5 days Newbie friendliness 48/100
ramesh130/superplayer#500 ·
Maintainers usually reply within 1 day
All issues in ramesh130/superplayer
Similar issues
-
bug follow-up
Difficulty 2/5 1-3 hours Newbie friendliness 68/100
Maintainers usually reply within 1 day
-
binding:web core docs p3
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
RunanywhereAI/runanywhere-sdks#1123 ·
Maintainers usually reply within 1 day
-
StepExamBenchmarkTest runs a loop and prints a timing but asserts nothingPossibly taken A pull request linked to this issue is open or already merged. Openjules
Difficulty 1/5 Under an hour Newbie friendliness 82/100
open-learning-exchange/myplanet#18199 · 1 comment ·
Maintainers usually reply within 4 days
-
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
auth0/Auth0.Android#1095 · 1 comment ·
Maintainers usually reply within 1 day
-
Scheme-less stream URLs throw NullPointerException instead of URISyntaxExceptionPossibly taken @blihio claimed this today. Open
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
pedroSG94/RootEncoder#2218 ·
Maintainers usually reply within 3 days