A Save still running with the app in the background now posts a progress notice — how many files, the one it is on, a bar, Stop all and Open — and takes it down when the queue empties. It sits on its own low-importance channel so it can be silenced without silencing the player's card, and rides its own dataSync foreground service rather than the media one: a mediaPlayback service stops itself when the bar empties, a download is not playback, and nothing else was keeping the process alive for a Save with nothing playing — which is how the first real Save died, four tracks in. Stop all goes through the same cancel(id) a row's tap takes, and Transfers grew the matching button beside Clear finished. The walk pushes two rows straight into the transfer store and reads the real notification back out of `dumpsys notification`, without fetching anything.
19 lines
934 B
XML
19 lines
934 B
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
|
|
<!-- the foreground service that carries the downloads while the app is
|
|
in the background; a fetch is dataSync, not playback -->
|
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
|
|
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
|
|
<!-- the notice is a notification; asked for at runtime on Android 13+ -->
|
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
|
|
|
<application>
|
|
<!-- no intent filter: the notice's own buttons come back as
|
|
onStartCommand intents on this very service -->
|
|
<service
|
|
android:name="com.soulstream.transfernotice.TransferService"
|
|
android:exported="false"
|
|
android:foregroundServiceType="dataSync" />
|
|
</application>
|
|
</manifest>
|