react-native-audio-browser 0.2.0-next.12 → 0.2.0-next.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +10 -0
- package/android/build.gradle +20 -1
- package/android/src/main/java/com/audiobrowser/AudioBrowser.kt +5 -1
- package/android/src/main/java/com/audiobrowser/browser/BrowserManager.kt +8 -0
- package/android/src/main/java/com/audiobrowser/browser/InertStyleDiagnostic.kt +267 -0
- package/android/src/main/java/com/audiobrowser/browser/JsonModels.kt +27 -9
- package/android/src/main/java/com/audiobrowser/browser/StyleResolver.kt +11 -0
- package/android/src/main/java/com/audiobrowser/extension/ResolvedTrackExt.kt +11 -1
- package/android/src/main/java/com/audiobrowser/model/PlayerUpdateOptions.kt +1 -1
- package/android/src/main/java/com/audiobrowser/player/PlaybackStateStore.kt +17 -2
- package/android/src/main/java/com/audiobrowser/player/Player.kt +3 -0
- package/android/src/main/java/com/audiobrowser/player/ShuffleOrderLedBy.kt +30 -0
- package/android/src/main/java/com/audiobrowser/util/StyleWire.kt +73 -0
- package/android/src/main/java/com/audiobrowser/util/TrackFactory.kt +8 -1
- package/android/src/test/java/com/audiobrowser/TestFixtures.kt +49 -3
- package/android/src/test/java/com/audiobrowser/browser/BrowserManagerTest.kt +3 -2
- package/android/src/test/java/com/audiobrowser/browser/InertStyleDiagnosticTest.kt +277 -0
- package/android/src/test/java/com/audiobrowser/browser/JsonStyleTest.kt +56 -0
- package/android/src/test/java/com/audiobrowser/browser/SectionScopeTest.kt +4 -4
- package/android/src/test/java/com/audiobrowser/browser/StyleResolverTest.kt +77 -10
- package/android/src/test/java/com/audiobrowser/player/PlaybackStateStoreTrackJsonTest.kt +2 -2
- package/android/src/test/java/com/audiobrowser/player/ShuffleOrderLedByTest.kt +79 -0
- package/android/src/test/java/com/audiobrowser/util/MediaExtrasBuilderTest.kt +8 -8
- package/ios/Browser/BrowserManager.swift +106 -45
- package/ios/Browser/InertStyleDiagnostic.swift +279 -0
- package/ios/Browser/JsonModels.swift +81 -10
- package/ios/Browser/SectionPresentation.swift +30 -0
- package/ios/Browser/StyleResolver.swift +11 -0
- package/ios/Browser/TabBarEntries.swift +7 -1
- package/ios/CarPlay/CarPlayController.swift +139 -35
- package/ios/CarPlay/CarPlayListItemFactory.swift +99 -27
- package/ios/Extension/UIApplication+ActiveScene.swift +27 -0
- package/ios/Http/HttpClient.swift +8 -2
- package/ios/HybridAudioBrowser.swift +54 -11
- package/ios/Model/NitroTypeStubs.swift +60 -0
- package/ios/Player/MediaIntentCriteria.swift +13 -5
- package/ios/Player/MediaLoader.swift +33 -9
- package/ios/Player/NowPlayingUpdater.swift +53 -5
- package/ios/Player/PlaybackCoordinator.swift +11 -4
- package/ios/Player/PlaybackTimer.swift +8 -2
- package/ios/Player/QueueManager.swift +36 -10
- package/ios/Player/ShuffleOrder.swift +23 -0
- package/ios/Player/SleepTimerHandling.swift +13 -0
- package/ios/RemoteCommand/RemoteCommandController.swift +53 -18
- package/ios/Tests/InertStyleDiagnosticTests.swift +200 -0
- package/ios/Tests/JsonModelsTests.swift +76 -1
- package/ios/Tests/QueueManagerTests.swift +72 -6
- package/ios/Tests/RemoteCommandControllerTests.swift +16 -0
- package/ios/Tests/SectionPresentationTests.swift +29 -0
- package/ios/Tests/StyleResolverTests.swift +60 -0
- package/ios/Tests/Support/TestTypes.swift +7 -0
- package/ios/TrackPlayer.swift +57 -34
- package/ios/Util/NetworkMonitor.swift +43 -26
- package/ios/Util/SFSymbolRenderer.swift +24 -2
- package/ios/Util/SVGProcessor.swift +9 -2
- package/lib/commonjs/features/playback/progress.js +2 -1
- package/lib/commonjs/features/playback/progress.js.map +1 -1
- package/lib/commonjs/features/playback/rate.js +8 -1
- package/lib/commonjs/features/playback/rate.js.map +1 -1
- package/lib/commonjs/web/TrackPlayer/QueueManager.js +14 -0
- package/lib/commonjs/web/TrackPlayer/QueueManager.js.map +1 -1
- package/lib/module/features/playback/progress.js +2 -1
- package/lib/module/features/playback/progress.js.map +1 -1
- package/lib/module/features/playback/rate.js +8 -1
- package/lib/module/features/playback/rate.js.map +1 -1
- package/lib/module/web/TrackPlayer/QueueManager.js +14 -0
- package/lib/module/web/TrackPlayer/QueueManager.js.map +1 -1
- package/lib/typescript/src/features/playback/progress.d.ts.map +1 -1
- package/lib/typescript/src/features/playback/rate.d.ts +8 -1
- package/lib/typescript/src/features/playback/rate.d.ts.map +1 -1
- package/lib/typescript/src/types/browser-nodes.d.ts +104 -2
- package/lib/typescript/src/types/browser-nodes.d.ts.map +1 -1
- package/nitrogen/generated/android/c++/JArtworkRequestConfig.hpp +4 -0
- package/nitrogen/generated/android/c++/JBrowseResult.hpp +6 -0
- package/nitrogen/generated/android/c++/JCardImage.hpp +58 -0
- package/nitrogen/generated/android/c++/JFavoriteChangedEvent.hpp +4 -0
- package/nitrogen/generated/android/c++/JFormatNowPlayingParams.hpp +4 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_RequestConfig___Track.hpp +4 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_NowPlayingUpdate____FormatNowPlayingParams.hpp +4 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__optional_std__string____Track.hpp +4 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_RequestConfig_____Track.hpp +4 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_std__vector_Track______SearchParams.hpp +4 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__shared_ptr_Promise_void_____TrackLoadEvent.hpp +4 -0
- package/nitrogen/generated/android/c++/JFunc_std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError__std__shared_ptr_Promise_std__variant_ResolvedTrack__BrowseError_______BrowserSourceCallbackParam.hpp +6 -0
- package/nitrogen/generated/android/c++/JFunc_void_FavoriteChangedEvent.hpp +4 -0
- package/nitrogen/generated/android/c++/JFunc_void_PlaybackActiveTrackChangedEvent.hpp +4 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__optional_ResolvedTrack_.hpp +6 -0
- package/nitrogen/generated/android/c++/JFunc_void_std__vector_Track_.hpp +4 -0
- package/nitrogen/generated/android/c++/JGridTile.hpp +61 -0
- package/nitrogen/generated/android/c++/JHybridAudioBrowserSpec.cpp +12 -0
- package/nitrogen/generated/android/c++/JImageShape.hpp +58 -0
- package/nitrogen/generated/android/c++/JMediaRequestConfig.hpp +4 -0
- package/nitrogen/generated/android/c++/JNativeBrowserConfiguration.hpp +6 -0
- package/nitrogen/generated/android/c++/JNativeRouteEntry.hpp +6 -0
- package/nitrogen/generated/android/c++/JNativeSetupPlayerOptions.hpp +4 -0
- package/nitrogen/generated/android/c++/JPlaybackActiveTrackChangedEvent.hpp +4 -0
- package/nitrogen/generated/android/c++/JResolvedTrack.hpp +6 -0
- package/nitrogen/generated/android/c++/JSection.hpp +6 -0
- package/nitrogen/generated/android/c++/JSectionStyle.hpp +30 -3
- package/nitrogen/generated/android/c++/JTrack.hpp +4 -0
- package/nitrogen/generated/android/c++/JTrackLoadEvent.hpp +4 -0
- package/nitrogen/generated/android/c++/JTrackStyle.hpp +24 -3
- package/nitrogen/generated/android/c++/JVariant_ResolvedTrack_BrowseError_Promise_BrowseResult_.hpp +6 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/CardImage.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/GridTile.kt +24 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/ImageShape.kt +23 -0
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/SectionStyle.kt +18 -3
- package/nitrogen/generated/android/kotlin/com/margelo/nitro/audiobrowser/TrackStyle.kt +15 -3
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Bridge.hpp +54 -0
- package/nitrogen/generated/ios/AudioBrowser-Swift-Cxx-Umbrella.hpp +9 -0
- package/nitrogen/generated/ios/c++/HybridAudioBrowserSpecSwift.hpp +9 -0
- package/nitrogen/generated/ios/swift/CardImage.swift +40 -0
- package/nitrogen/generated/ios/swift/GridTile.swift +44 -0
- package/nitrogen/generated/ios/swift/ImageShape.swift +40 -0
- package/nitrogen/generated/ios/swift/SectionStyle.swift +70 -1
- package/nitrogen/generated/ios/swift/TrackStyle.swift +59 -1
- package/nitrogen/generated/shared/c++/CardImage.hpp +76 -0
- package/nitrogen/generated/shared/c++/GridTile.hpp +80 -0
- package/nitrogen/generated/shared/c++/ImageShape.hpp +76 -0
- package/nitrogen/generated/shared/c++/SectionStyle.hpp +32 -2
- package/nitrogen/generated/shared/c++/TrackStyle.hpp +25 -2
- package/package.json +7 -2
- package/src/features/playback/progress.ts +2 -1
- package/src/features/playback/rate.ts +8 -1
- package/src/style-resolution.test.ts +72 -1
- package/src/types/browser-nodes.ts +112 -2
- package/src/web/TrackPlayer/QueueManager.test.ts +29 -0
- package/src/web/TrackPlayer/QueueManager.ts +14 -0
- package/website/guide/android-auto.md +114 -0
- package/website/guide/android-certificates.md +409 -0
- package/website/guide/artwork.md +255 -0
- package/website/guide/audio-output.md +135 -0
- package/website/guide/automotive.md +86 -0
- package/website/guide/basic-usage.md +151 -0
- package/website/guide/battery.md +115 -0
- package/website/guide/browser.md +581 -0
- package/website/guide/carplay.md +620 -0
- package/website/guide/configuration.md +173 -0
- package/website/guide/equalizer.md +231 -0
- package/website/guide/errors.md +310 -0
- package/website/guide/favorites.md +154 -0
- package/website/guide/gate.md +143 -0
- package/website/guide/getting-started.md +46 -0
- package/website/guide/hooks.md +238 -0
- package/website/guide/live-streams.md +125 -0
- package/website/guide/metadata.md +239 -0
- package/website/guide/migrating-from-track-player.md +244 -0
- package/website/guide/native-callback-fetch.md +127 -0
- package/website/guide/network.md +86 -0
- package/website/guide/now-playing.md +175 -0
- package/website/guide/playback.md +328 -0
- package/website/guide/queue.md +300 -0
- package/website/guide/remote-controls.md +256 -0
- package/website/guide/search.md +255 -0
- package/website/guide/sleep-timer.md +268 -0
- package/website/guide/track.md +246 -0
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
---
|
|
2
|
+
description: 'Detect the Android 12+ battery restrictions that block the foreground service the player needs, and prompt the listener to fix their settings.'
|
|
3
|
+
---
|
|
4
|
+
|
|
5
|
+
# Battery
|
|
6
|
+
|
|
7
|
+
On Android 12+, if the OS has put your app under battery restrictions, it
|
|
8
|
+
**blocks the foreground service** the player needs to start audio in the
|
|
9
|
+
background. So when a Bluetooth device or car head unit tries to resume playback
|
|
10
|
+
while your app is killed, nothing happens. This feature detects that block and
|
|
11
|
+
lets you prompt the user to fix their battery settings.
|
|
12
|
+
|
|
13
|
+
::: warning Android only
|
|
14
|
+
This is an **Android-only** concern (Android 12+ foreground-service limits).
|
|
15
|
+
On iOS every getter/hook here is inert: `getBatteryWarningPending()` is always
|
|
16
|
+
`false`, `getBatteryOptimizationStatus()` is always `'unrestricted'`, the events
|
|
17
|
+
never fire, and `dismissBatteryWarning()` / `openBatterySettings()` are no-ops.
|
|
18
|
+
So you can render the banner below unconditionally — it simply never shows on iOS.
|
|
19
|
+
:::
|
|
20
|
+
|
|
21
|
+
The UI snippet imports `View` / `Text` / `Button` from `react-native`; everything
|
|
22
|
+
else is from `react-native-audio-browser`.
|
|
23
|
+
|
|
24
|
+
## The warning banner
|
|
25
|
+
|
|
26
|
+
A warning becomes **pending** when a background resume is actually blocked. Show
|
|
27
|
+
a banner only while `pending` is true, offering to open settings or dismiss.
|
|
28
|
+
[`useBatteryWarning()`](/api/features/battery/#usebatterywarning) bundles
|
|
29
|
+
everything you need:
|
|
30
|
+
|
|
31
|
+
```tsx
|
|
32
|
+
import { View, Text, Button } from 'react-native'
|
|
33
|
+
import { useBatteryWarning } from 'react-native-audio-browser'
|
|
34
|
+
|
|
35
|
+
function BatteryWarningBanner() {
|
|
36
|
+
const { pending, status, dismiss, openSettings } = useBatteryWarning()
|
|
37
|
+
if (!pending) return null
|
|
38
|
+
|
|
39
|
+
return (
|
|
40
|
+
<View>
|
|
41
|
+
<Text>Playback was blocked by battery settings ({status}).</Text>
|
|
42
|
+
<Button title="Fix" onPress={openSettings} />
|
|
43
|
+
<Button title="Dismiss" onPress={dismiss} />
|
|
44
|
+
</View>
|
|
45
|
+
)
|
|
46
|
+
}
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
- `openSettings` ([`openBatterySettings`](/api/features/battery/#openbatterysettings))
|
|
50
|
+
opens this app's system battery settings. When the user returns having set the
|
|
51
|
+
app to unrestricted, the warning clears itself.
|
|
52
|
+
- `dismiss` ([`dismissBatteryWarning`](/api/features/battery/#dismissbatterywarning))
|
|
53
|
+
hides the warning without changing settings.
|
|
54
|
+
|
|
55
|
+
## When the warning clears
|
|
56
|
+
|
|
57
|
+
`pending` goes back to `false` when any of these happens — you don't clear it
|
|
58
|
+
manually:
|
|
59
|
+
|
|
60
|
+
- the user calls `dismiss`, or
|
|
61
|
+
- the battery status becomes `'unrestricted'` (e.g. they fixed it in settings).
|
|
62
|
+
|
|
63
|
+
## Battery optimization status
|
|
64
|
+
|
|
65
|
+
`status` is the device's current setting for your app:
|
|
66
|
+
|
|
67
|
+
| Status | Meaning |
|
|
68
|
+
| ---------------- | -------------------------------------------------------------------- |
|
|
69
|
+
| `'unrestricted'` | The user allowed the app to run freely in the background. |
|
|
70
|
+
| `'optimized'` | Default — the system may limit background work (Doze / App Standby). |
|
|
71
|
+
| `'restricted'` | Background work is severely limited; services are blocked. |
|
|
72
|
+
|
|
73
|
+
Background resume is reliable only when `'unrestricted'`, which is why the "Fix"
|
|
74
|
+
button sends users to settings to grant it.
|
|
75
|
+
|
|
76
|
+
## Reading state directly
|
|
77
|
+
|
|
78
|
+
If you don't want the bundled hook, the pieces are available individually:
|
|
79
|
+
|
|
80
|
+
```ts
|
|
81
|
+
import {
|
|
82
|
+
getBatteryWarningPending,
|
|
83
|
+
getBatteryOptimizationStatus,
|
|
84
|
+
onBatteryWarningPendingChanged,
|
|
85
|
+
onBatteryOptimizationStatusChanged
|
|
86
|
+
} from 'react-native-audio-browser'
|
|
87
|
+
|
|
88
|
+
getBatteryWarningPending() // boolean
|
|
89
|
+
getBatteryOptimizationStatus() // 'unrestricted' | 'optimized' | 'restricted'
|
|
90
|
+
|
|
91
|
+
const off = onBatteryWarningPendingChanged.addListener(({ pending }) => {})
|
|
92
|
+
const off2 = onBatteryOptimizationStatusChanged.addListener(({ status }) => {})
|
|
93
|
+
|
|
94
|
+
// each addListener returns an unsubscribe function:
|
|
95
|
+
off()
|
|
96
|
+
off2()
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
The reactive hooks [`useBatteryWarningPending()`](/api/features/battery/#usebatterywarningpending)
|
|
100
|
+
and [`useBatteryOptimizationStatus()`](/api/features/battery/#usebatteryoptimizationstatus)
|
|
101
|
+
wrap the getter+event pairs; `useBatteryWarning()` simply combines both with the
|
|
102
|
+
two actions.
|
|
103
|
+
|
|
104
|
+
## API summary
|
|
105
|
+
|
|
106
|
+
| API | Purpose |
|
|
107
|
+
| ----------------------------------------------------------------------- | ---------------------------------------------------------------------- |
|
|
108
|
+
| `useBatteryWarning()` | Everything for a banner: `{ pending, status, dismiss, openSettings }`. |
|
|
109
|
+
| `getBatteryWarningPending()` / `useBatteryWarningPending()` | Is a warning pending? (Android; `false` on iOS) |
|
|
110
|
+
| `getBatteryOptimizationStatus()` / `useBatteryOptimizationStatus()` | Current status (Android; `'unrestricted'` on iOS) |
|
|
111
|
+
| `onBatteryWarningPendingChanged` / `onBatteryOptimizationStatusChanged` | Subscribe outside React. |
|
|
112
|
+
| `openBatterySettings()` | Open the app's system battery settings (Android). |
|
|
113
|
+
| `dismissBatteryWarning()` | Dismiss the warning without changing settings (Android). |
|
|
114
|
+
|
|
115
|
+
All are **Android-only** — inert (`false` / `'unrestricted'` / no-op) on iOS.
|