3345 Commits
Author SHA1 Message Date
birdbird 4846b754f7 Merge branch 'weblate-ultrasonic-app' into 'develop'
Translations update from Hosted Weblate

See merge request ultrasonic/ultrasonic!1450
2026-10-17 12:24:28 +00:00
Weblate b3e5e7eef2 Translations update from Hosted Weblate 2026-10-17 12:24:27 +00:00
birdbird cbe486c3d6 Merge branch 'renovate/media3' into 'develop'
Update media3 to v1.11.1

See merge request ultrasonic/ultrasonic!1395
2026-10-17 12:07:38 +00:00
Renovate Bot cfff06f545 Update media3 to v1.11.1 2026-10-17 12:07:38 +00:00
birdbird 1ec3a1b49d Merge branch 'feature/podcast-cover-art' into 'develop'
feat(podcasts): show cover art on podcast channel list

See merge request ultrasonic/ultrasonic!1442
2026-10-17 12:05:34 +00:00
Sam Mingo 5030bd47fa feat(podcasts): show cover art on podcast channel list 2026-10-17 12:05:34 +00:00
birdbird ea914c688f Merge branch 'renovate/apachecodecs' into 'develop'
Update dependency commons-codec:commons-codec to v1.23.0

See merge request ultrasonic/ultrasonic!1451
2026-10-17 12:03:07 +00:00
birdbird 87250fb2ee Merge branch 'renovate/kotlin-monorepo' into 'develop'
Update kotlin monorepo to v2.4.21

See merge request ultrasonic/ultrasonic!1449
2026-10-17 12:02:38 +00:00
birdbird ae1ae82184 Merge branch 'renovate/gradle-9.x' into 'develop'
Update Gradle to v9.8.1

See merge request ultrasonic/ultrasonic!1448
2026-10-17 12:02:30 +00:00
Renovate Bot aac6c3fba4 Update dependency commons-codec:commons-codec to v1.23.0 2026-10-11 16:33:02 +00:00
Renovate Bot 62b5f19749 Update kotlin monorepo to v2.4.21 2026-10-08 08:38:11 +00:00
Renovate Bot 710ca6e456 Update Gradle to v9.8.1 2026-10-07 20:33:52 +00:00
birdbird 17b86b218c Merge branch 'bugfixes' into 'develop'
Bugfixes

See merge request ultrasonic/ultrasonic!1447
2026-10-07 07:52:55 +00:00
birdbird b0351e55d9 Merge branch 'cleanup' into 'develop'
Remove unused prefs and functions

See merge request ultrasonic/ultrasonic!1446
2026-10-07 07:10:12 +00:00
birdbird 7a59840d22 Remove unused prefs and functions 2026-10-07 07:10:12 +00:00
birdbird eda39a3e76 Preserve queue deduplication for shared legacy cache paths 2026-10-07 09:04:48 +02:00
birdbird ce64dde74e Reset cached data source state between opens 2026-10-07 09:04:48 +02:00
birdbird 910006f708 Bind downloads to their source server 2026-10-07 09:04:48 +02:00
birdbird dd95c554b7 Own metadata databases by server ID 2026-10-07 09:04:47 +02:00
birdbird 0a3d5b1c02 Order active server edits before client invalidation 2026-10-07 09:04:47 +02:00
birdbird e20d344b89 Merge branch 'settings' into 'develop'
Fix for bug when  deleting server

See merge request ultrasonic/ultrasonic!1445
2026-10-05 20:05:56 +00:00
birdbird 2cf910b3d9 Fix bug in metadata database deletion for selected server 2026-10-05 21:47:22 +02:00
birdbird 28ecb70528 Fix Robolectric test Sdk 2026-10-05 21:46:31 +02:00
birdbird a7e4905372 Merge branch 'feature/fix-play-next-shuffle' into 'develop'
Fix Play Next ignoring shuffle order (#1222)

Closes #1222

See merge request ultrasonic/ultrasonic!1417
2026-10-05 15:58:06 +00:00
Sam Mingo 37b6ad2271 Fix Play Next ignoring shuffle order (#1222) 2026-10-05 15:58:05 +00:00
birdbird bd39b61f02 Merge branch 'moretests' into 'develop'
Add more tests

See merge request ultrasonic/ultrasonic!1444
2026-10-05 12:09:00 +00:00
birdbird f47bd3d24b Add more tests 2026-10-05 12:09:00 +00:00
birdbird 7c6ec1f49c Merge branch 'genericlistcleanup' into 'develop'
Stop exposing Application context from GenericListModel, also use Flow

See merge request ultrasonic/ultrasonic!1443
2026-10-05 11:28:48 +00:00
birdbird b502b6de65 refactor: move GenericListModel from LiveData to StateFlow
Unify the async models: GenericListModel now exposes musicFolders and
isRefreshing as StateFlow like PlayerViewModel does, and the observing
fragments (MultiListFragment, EntryListFragment) collect the flows under
repeatOnLifecycle(STARTED) instead of LiveData observe.
2026-10-05 11:22:52 +00:00
birdbird 37d5b5fab0 refactor: stop exposing Application context from GenericListModel
GenericListModel extended AndroidViewModel and exposed context by reaching
into the Application. Replace it with a plain ViewModel that receives the
application context via constructor injection, keeping the model testable
and decoupled from the Application class. Subclasses (list models and
DownloadListModel) now take a Context instead of an Application; Koin
already registers the Android context, so no DI changes were needed.
2026-10-04 18:38:55 +00:00
birdbird 003c8580b2 Merge branch 'feature/auto-bookmark-on-pause' into 'develop'
feat(bookmark): auto-save bookmark on pause for cross-client resume

See merge request ultrasonic/ultrasonic!1378
2026-10-04 17:56:22 +00:00
Sam Mingo 90ceb6d2e0 feat(bookmark): auto-save bookmark on pause for cross-client resume 2026-10-04 17:56:22 +00:00
birdbird bac2296991 Merge branch 'unthemedalertfix' into 'develop'
Fix MaterialAlertDialogBuilder crash with unthemed application context

See merge request ultrasonic/ultrasonic!1440
2026-10-04 17:45:02 +00:00
birdbird 0c7c553ed4 Fix MaterialAlertDialogBuilder crash with unthemed application context 2026-10-04 17:45:02 +00:00
birdbird 2d49ea0435 Merge branch 'cleanviewmodelboundary' into 'develop'
Clean MVC boundary transgressions

See merge request ultrasonic/ultrasonic!1441
2026-10-04 17:39:43 +00:00
birdbird 2efdba5f36 Clean MVC boundary transgressions 2026-10-04 17:39:42 +00:00
birdbird 402e1c4b24 Merge branch 'downloaduifix' into 'develop'
Apply the bind-time download state directly to the track row

See merge request ultrasonic/ultrasonic!1439
2026-10-04 17:31:23 +00:00
birdbird 8ffc97b7d2 Apply the bind-time download state directly to the track row 2026-10-04 17:31:22 +00:00
birdbird eb1d0450af Merge branch 'download' into 'develop'
Fix bugs in download handling and restructure service.

See merge request ultrasonic/ultrasonic!1438
2026-10-02 11:51:58 +00:00
birdbird 048923d674 Fix DownloadService manifest label
The DownloadService was labeled 'Ultrasonic Media Player Service' (copied
from PlaybackService); it now says 'Ultrasonic Download Service'.
2026-10-02 13:46:47 +02:00
birdbird 615a330b62 Extract injectable DownloadManager from the DownloadService companion
All queue management and download state moves from the static DownloadService
companion into an injectable DownloadManager singleton (Koin): the queue,
active downloads, failed list, LiveData, state callbacks and retry loop now
live there. DownloadService becomes a thin lifecycle shell that attaches to
the manager on create and detaches on destroy, keeping only the foreground
notification, Wi-Fi lock and storage monitor. Service start/stop is isolated
in a DownloadServiceController so the manager has no Android context handling.

Also included, needed to make the extracted logic correct and testable:

- removeDownloadedTracksFromList and setSaveFlagForTracks now gate on
  Storage.isPathExists instead of getFromPath; with the default java.io
  storage root getFromPath returns a wrapper for nonexistent paths, which
  wrongly filtered out every track (silently disabling preload downloads).
- downloadStateChangedCallback requeues a RETRYING item before triggering
  processNextTracks, so a retry is immediately eligible instead of waiting
  for the next callback.
- processNextTracks guards against a detached service (null scope/host),
  fixing a potential crash when a task callback fires after destruction.

All former DownloadService.xxx call sites (PlaybackService, NavigationActivity,
SettingsFragment, TrackViewHolder/TrackViewBinder, DownloadUtil, TrackCollectionModel,
DownloadListModel and the Koin modules) now use the injected manager.

Adds DownloadManagerTest (Robolectric) covering enqueue/dedup, downloaded-track
filtering, state reporting, clearDownloads, empty-queue draining, retry
requeuing, failure tracking + delete, and post-detach callback safety.
2026-10-02 13:46:47 +02:00
birdbird 2c0ce5bb28 Fix failedList removal in deleteAsync and narrow task exception handler
- deleteAsync removed a failedList entry from the downloadQueue (a no-op:
  failed items were already polled out of the queue), leaving stale FAILED
  state for deleted tracks. Remove the entry from failedList instead.
- The DownloadTask CoroutineExceptionHandler deleted the complete and
  pinned files on any uncaught exception. Those files may already hold a
  finalized download (exceptions can occur in post-rename steps such as
  the catalog write), so this destroyed finished data. Only the partial
  file is deleted now: retries do not append to a possibly untrustworthy
  stream, while finalized downloads and cancelled (resumable) downloads
  are left untouched.
2026-10-02 11:21:28 +00:00
birdbird bac11ad2c4 Clamp download progress to 0-100 percent
The metadata size may differ from the bytes actually transferred
(transcoded streams) or from the resumed total, so the raw progress
calculation could leave the 0..100 range. Coerce the reported value
into the valid range.
2026-10-02 11:20:41 +00:00
birdbird de5c89f0a3 Remove no-op let { null } blocks in setSaveFlagForTracks
These discarded null expressions did nothing; the filtering they were
originally meant to perform is handled by the rename blocks and by
DownloadTask.checkIfExists. Removes the misleading dead code.
2026-10-02 11:20:08 +00:00
birdbird cd30bcfd2f Merge branch 'jukeboxstart' into 'develop'
fix: jukebox fails to send start action when starting playback with empty queue

Closes #1266

See merge request ultrasonic/ultrasonic!1437
2026-10-01 22:10:17 +00:00
birdbird e63dfa13e8 fix: jukebox fails to send start action when starting playback with empty queue 2026-10-01 22:10:16 +00:00
birdbird 71f505da76 Merge branch 'coverrace' into 'develop'
Fix infinite preload setting and race condition in imageloader

See merge request ultrasonic/ultrasonic!1436
2026-10-01 21:48:46 +00:00
birdbird 0420a2bf7b Fix infinite preload setting and race condition in imageloader 2026-10-01 21:48:46 +00:00
birdbird c4febfc371 Merge branch 'feature/auto-genres' into 'develop'
feat(auto): add Genres browsing to Android Auto

See merge request ultrasonic/ultrasonic!1382
2026-10-01 21:44:19 +00:00
Sam Mingo 71b50770b6 feat(auto): add Genres browsing to Android Auto 2026-10-01 21:44:19 +00:00