What's Changed
- Scaffold Android project by @mapitman in #32
- Wire core libraries & DI by @mapitman in #33
- CI pipeline: build + unit tests + lint by @mapitman in #34
- App theme & design system by @mapitman in #35
- Room entities & DAOs by @mapitman in #36
- Repository layer by @mapitman in #37
- Settings store (DataStore) by @mapitman in #38
- Seed default feeds (OPML) by @mapitman in #39
- RSS/Atom/RDF parser by @mapitman in #40
- Feed fetch + HTML auto-discovery by @mapitman in #41
- First-image extraction & clean-up by @mapitman in #42
- Feed update engine by @mapitman in #43
- Feed list (home) screen by @mapitman in #44
- Add feed / import by @mapitman in #45
- Article list screen by @mapitman in #46
- Article reader by @mapitman in #47
- Settings screen by @mapitman in #48
- Feed properties & OPML export by @mapitman in #49
- Media3 playback service by @mapitman in #50
- In-article podcast player UI by @mapitman in #51
- Resume position, mark-read on completion, and auto-advance by @mapitman in #52
- Scheduled feed refresh via WorkManager by @mapitman in #53
- Background podcast downloads via WorkManager by @mapitman in #55
- Add home-screen widget with unread counts by @mapitman in #56
- Add optional notification for new items after refresh by @mapitman in #57
- Externalize UI strings and add DE/ES/FR/IT translations by @mapitman in #58
- Add empty/error states, accessibility fixes, and font-size wiring by @mapitman in #59
- Add branded launcher icon and splash screen by @mapitman in #61
- Add offline feed-directory search by @mapitman in #63
- Add persistent now-playing mini-player (issue #66) by @mapitman in #73
- Add Podcasts section (issue #65) by @mapitman in #74
- Fix reader progress bar to show saved resume position (issue #75) by @mapitman in #77
- Add pull-to-refresh to article list (issue #76) by @mapitman in #78
- "Next Up" playback queue (issue #67) by @mapitman in #85
- Auto-queue new episodes per feed, with a per-feed queue cap (issue #68) by @mapitman in #87
- Fix white flash in dark mode by @mapitman in #91
- Add OPML import from pasted text by @mapitman in #92
- Use "Unplayed" instead of "Unread" for podcast feeds by @mapitman in #96
- Don't mark podcast episodes read until playback finishes by @mapitman in #94
- Add variable playback speed, per feed by @mapitman in #98
- Add a full player to the reader, hide mini-player when viewing it by @mapitman in #111
- Restore last-playing episode, clean up state on completion (#107, #108) by @mapitman in #113
- Show current episode in Next Up and auto-advance the queue (#106) by @mapitman in #114
- Show elapsed/remaining time in the mini-player (#110, #80) by @mapitman in #115
- Animate mini-player transitions with shared elements (#112) by @mapitman in #117
- Remove categories: fixed Podcasts/Feeds lists (issue #118) by @mapitman in #119
- Show feed URL on Feed Properties screen (issue #104) by @mapitman in #121
- Show feed name in reader top bar (issue #105) by @mapitman in #122
- Truncate long feed descriptions in the list (issue #86) by @mapitman in #123
- Show app icon in media notification controls (issue #116) by @mapitman in #124
- Exempt queued items from feed item-count trim (issue #125) by @mapitman in #128
- Guard against double-advancing Next Up on episode end (issue #127) by @mapitman in #129
- Show Snackbar feedback when adding to Next Up (issue #126) by @mapitman in #130
- Exempt manually-queued episodes from auto-queue cap eviction (issue #125/#127) by @mapitman in #131
- Fall back to global max articles when a feed has no override (issue #82) by @mapitman in #132
- Show podcast/feed title in mini-player (issue #109) by @mapitman in #133
- Add swipe-to-toggle read/unread on article rows (issue #120) by @mapitman in #134
- Trigger auto-download/auto-queue from manual pull-to-refresh (issue #88) by @mapitman in #135
- Add select-all to article/episode multi-select (issue #72) by @mapitman in #136
- Default new podcast subscriptions to auto-queue, capped at 5 (issue #137) by @mapitman in #138
- Auto-delete finished podcast downloads (issue #71) by @mapitman in #139
- Add unified Downloads screen (issue #69) by @mapitman in #140
- Fix swipe-to-toggle-read background showing on every row (issue #120 follow-up) by @mapitman in #141
- Support podcast chapters (issue #95) by @mapitman in #142
- Use circular-arrow skip icons; add chapter nav to mini-player by @mapitman in #143
- Fix Next Up episodes dropping on feed refresh (issue #153) by @mapitman in #154
- Add to Next Up from episode view (issue #144) by @mapitman in #155
- Remove some playback speed options (issue #145) by @mapitman in #157
- Add cover thumbnail and date to Next Up list items (issue #146) by @mapitman in #164
- Use "episode" instead of "article" for podcasts (issue #147) by @mapitman in #165
- Add feed settings button to feed view (issue #148) by @mapitman in #167
- Upgrade http:// image URLs to https:// (issue #149) by @mapitman in #168
- Make MyFeeds a share target for URLs (issue #150) by @mapitman in #169
- Add ability to save OPML export to a file (issue #151) by @mapitman in #170
- Show Next Up player and list side by side in landscape (issue #158) by @mapitman in #172
- Fix dragged Next Up item clipping under app bar at top (issue #163) by @mapitman in #173
- Add per-feed auto-queue position: top or bottom (issue #166) by @mapitman in #174
- Turn Add to Next Up into a toggle in the reader (issue #160) by @mapitman in #175
- Freeze unread counts while a feed refresh is in progress (issue #152) by @mapitman in #176
- Add multiple selected episodes to Next Up at once (issue #159) by @mapitman in #178
- Dequeue an episode from Next Up when it starts playing (issue #171) by @mapitman in #181
- Advance to next Next Up episode from the service, not the UI (issue #179) by @mapitman in #182
- Duck/pause playback for other apps' audio focus (issue #180) by @mapitman in #183
- Make feed refresh concurrency user-configurable (issue #177) by @mapitman in #184
- Add speed control and enlarge player buttons (issue #185, #186) by @mapitman in #187
- Keep PlaybackController feed/item tracking in sync with the player (issue #179) by @mapitman in #188
- Don't clobber concurrent feed edits during a refresh (issue #189) by @mapitman in #192
- Requeue the episode when playback is explicitly stopped (issue #191) by @mapitman in #193
- Enlarge player buttons further and move speed/chapter nav row (issue #186) by @mapitman in #190
- Turn the player into a swipeable bottom-sheet drawer (issue #195) by @mapitman in #196
- Polish the player bottom sheet (issue #197) by @mapitman in #198
- Add per-podcast volume boost and start-of-episode skip (issue #199/#200) by @mapitman in #201
- Expose volume boost control directly in the player (issue #202) by @mapitman in #204
- Pause instead of duck for nav announcements (issue #180) by @mapitman in #205
- Hold a network wake lock during playback (issue #179) by @mapitman in #206
- Hold a wake lock across the STATE_ENDED-to-next-episode gap (issue #179) by @mapitman in #207
- Expand list content when player is minimized (issue #203) by @mapitman in #208
- Rework Next Up drag-to-reorder to fix visual bugs (issue #209) by @mapitman in #210
- Fix lintDebug errors in PlaybackService (issue #212) by @mapitman in #213
- Auto-scroll Next Up list when dragging near an edge (issue #211) by @mapitman in #214
- Fix ViewModel test teardown to quiesce before Dispatchers.resetMain (issue #54, #60) by @mapitman in #216
- Isolate the flaky addSelectedToQueue test into its own JVM fork (issue #215) by @mapitman in #217
- Show Snackbar feedback for OPML import (issue #218) by @mapitman in #220
- Backfill blank feed titles from the fetched feed (issue #219) by @mapitman in #224
- Recover missing article links from guid and untyped Atom links (issue #221) by @mapitman in #225
- Strip the extracted lead image from stored article body (issue #222) by @mapitman in #226
- Fix Atom content/summary selection to prefer by name, not order (issue #223) by @mapitman in #227
- Skip already-subscribed feeds on OPML import (issue #228) by @mapitman in #229
- Make Feed Properties screen scrollable (issue #232) by @mapitman in #233
- Cap stored article description length (issue #234) by @mapitman in #235
- Show a placeholder icon for feeds with no image (issue #236) by @mapitman in #237
- Keep article list feed title to one line (issue #238) by @mapitman in #239
- Validate and auto-refresh feeds during OPML import (issues #230, #231) by @mapitman in #240
- Hold advance wake lock until playback starts (issue #241) by @mapitman in #242
- Match Bluetooth FF/REW increments to in-app skip amounts (issue #244) by @mapitman in #246
- Pause playback when Bluetooth audio device disconnects (issue #243) by @mapitman in #245
- Fix Bluetooth forward/back skip handling for real (issue #244) by @mapitman in #247
- Fix Next Up not opening from the playing episode's reader page (issue #248) by @mapitman in #249
- Add per-feed max downloaded episodes to keep (issue #250) by @mapitman in #251
- Add automated tag-triggered release builds (issue #252) by @mapitman in #253
- Add script to generate the release signing keystore (issue #254) by @mapitman in #255
- Default alias/key password in set-release-secrets.sh (issue #256) by @mapitman in #257
- Rename package to com.bugzapperlabs.myfeeds; split debug applicationId (issue #258) by @mapitman in #259
- Remove default feed seeding on first run (issue #260) by @mapitman in #262
- Add onboarding hint pointing at add-feed FAB when feed list is empty (issue #263) by @mapitman in #265
- Fix crash tapping Next Up with no playback and empty queue (issue #264) by @mapitman in #266
- Improve OPML import feedback and auto-close on success (issue #267) by @mapitman in #268
- Isolate feeds from siblings' failures during concurrent refresh/import (issue #269) by @mapitman in #270
- Run OPML import in the background instead of blocking (issue #271) by @mapitman in #272
New Contributors
Full Changelog: https://github.com/mapitman/myfeeds-android/commits/v0.1.0