@javascriptcommon/react-native-track-player 1.2.9 → 1.2.23
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/android/build.gradle +61 -4
- package/android/src/main/AndroidManifest.xml +2 -4
- package/android/src/main/ic_home-playstore.png +0 -0
- package/android/src/main/ic_repeat-playstore.png +0 -0
- package/android/src/main/ic_repeat_50-playstore.png +0 -0
- package/android/src/main/ic_shuffle-playstore.png +0 -0
- package/android/src/main/ic_shuffle_50-playstore.png +0 -0
- package/android/src/main/ic_shuffle_sm-playstore.png +0 -0
- package/android/src/main/ic_stop-playstore.png +0 -0
- package/android/src/main/ic_test-playstore.png +0 -0
- package/android/src/main/java/com/guichaguri/trackplayer/{service/HeadlessJsMediaService.java → HeadlessJsMediaService.java} +84 -33
- package/android/src/main/java/com/guichaguri/trackplayer/TrackPlayer.kt +25 -0
- package/android/src/main/java/com/guichaguri/trackplayer/extensions/AudioPlayerStateExt.kt +19 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/event/EventHolder.kt +30 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/event/NotificationEventHolder.kt +20 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/event/PlayerEventHolder.kt +111 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/AAMediaSessionCallback.kt +10 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/AudioContentType.kt +10 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/AudioItem.kt +66 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/AudioItemTransitionReason.kt +33 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/AudioPlayerState.kt +30 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/BufferConfig.kt +8 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/CacheConfig.kt +17 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/Capability.kt +19 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/FocusChangeData.kt +3 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/MediaSessionCallback.kt +17 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/NotificationConfig.kt +43 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/NotificationMetadata.kt +8 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/NotificationState.kt +8 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/PlayWhenReadyChangeData.kt +5 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/PlaybackEndedReason.kt +5 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/PlaybackError.kt +6 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/PlaybackMetadata.kt +200 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/PlayerConfig.kt +33 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/PlayerOptions.kt +9 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/PositionChangedReason.kt +39 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/QueuedPlayerOptions.kt +49 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/notification/NotificationManager.kt +678 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/players/AudioPlayer.kt +10 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/players/BaseAudioPlayer.kt +864 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/players/QueuedAudioPlayer.kt +269 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/players/components/MediaSourceExt.kt +35 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/players/components/PlayerCache.kt +26 -0
- package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/utils/Utils.kt +12 -0
- package/android/src/main/java/com/guichaguri/trackplayer/model/MetadataAdapter.kt +224 -0
- package/android/src/main/java/com/guichaguri/trackplayer/model/State.kt +13 -0
- package/android/src/main/java/com/guichaguri/trackplayer/model/Track.kt +120 -0
- package/android/src/main/java/com/guichaguri/trackplayer/model/TrackAudioItem.kt +19 -0
- package/android/src/main/java/com/guichaguri/trackplayer/model/TrackType.kt +11 -0
- package/android/src/main/java/com/guichaguri/trackplayer/module/AutoConnectionDetector.kt +151 -0
- package/android/src/main/java/com/guichaguri/trackplayer/module/MusicEvents.kt +66 -0
- package/android/src/main/java/com/guichaguri/trackplayer/module/MusicModule.kt +1177 -0
- package/android/src/main/java/com/guichaguri/trackplayer/service/BundleUtils.kt +117 -0
- package/android/src/main/java/com/guichaguri/trackplayer/service/MusicBinder.kt +31 -0
- package/android/src/main/java/com/guichaguri/trackplayer/service/MusicManager.kt +347 -0
- package/android/src/main/java/com/guichaguri/trackplayer/service/MusicService.kt +1254 -0
- package/android/src/main/java/com/guichaguri/trackplayer/service/Utils.kt +228 -0
- package/android/src/main/java/com/guichaguri/trackplayer/service/metadata/ButtonEvents.kt +141 -0
- package/android/src/main/java/com/guichaguri/trackplayer/service/metadata/MetadataManager.kt +396 -0
- package/android/src/main/res/drawable-hdpi/ic_home.png +0 -0
- package/android/src/main/res/drawable-mdpi/ic_home.png +0 -0
- package/android/src/main/res/drawable-xhdpi/ic_home.png +0 -0
- package/android/src/main/res/drawable-xxhdpi/ic_home.png +0 -0
- package/android/src/main/res/drawable-xxxhdpi/ic_home.png +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_arrow_down_circle_foreground.png +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_clock_now_foreground.png +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_close_foreground.png +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_heart_foreground.png +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_heart_outlined_foreground.png +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_repeat_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_repeat_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_shuffle_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-hdpi/ic_shuffle_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_arrow_down_circle_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_clock_now_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_close_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_heart_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_heart_outlined_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_repeat_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_repeat_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_shuffle_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-mdpi/ic_shuffle_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_arrow_down_circle_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_clock_now_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_close_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_heart_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_heart_outlined_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_repeat_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_repeat_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_shuffle_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-xhdpi/ic_shuffle_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_arrow_down_circle_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_clock_now_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_close_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_heart_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_heart_outlined_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_repeat_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_repeat_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_shuffle_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxhdpi/ic_shuffle_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_arrow_down_circle_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_clock_now_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_close_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_heart_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_heart_outlined_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_repeat_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_repeat_on_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_shuffle_off_foreground.png +0 -0
- package/android/src/main/res/mipmap-xxxhdpi/ic_shuffle_on_foreground.png +0 -0
- package/android/src/main/res/raw/silent_5_seconds.mp3 +0 -0
- package/android/src/main/res/strings.xml +6 -0
- package/android/src/main/res/values/strings.xml +6 -0
- package/index.d.ts +62 -1
- package/lib/index.js +10 -9
- package/package.json +1 -1
- package/android/src/main/java/com/guichaguri/trackplayer/TrackPlayer.java +0 -28
- package/android/src/main/java/com/guichaguri/trackplayer/module/MusicEvents.java +0 -55
- package/android/src/main/java/com/guichaguri/trackplayer/module/MusicModule.java +0 -298
- package/android/src/main/java/com/guichaguri/trackplayer/service/MusicBinder.java +0 -47
- package/android/src/main/java/com/guichaguri/trackplayer/service/MusicManager.java +0 -383
- package/android/src/main/java/com/guichaguri/trackplayer/service/MusicService.java +0 -271
- package/android/src/main/java/com/guichaguri/trackplayer/service/Utils.java +0 -243
- package/android/src/main/java/com/guichaguri/trackplayer/service/metadata/ButtonEvents.java +0 -148
- package/android/src/main/java/com/guichaguri/trackplayer/service/metadata/MetadataManager.java +0 -379
- package/android/src/main/java/com/guichaguri/trackplayer/service/models/Track.java +0 -141
- package/android/src/main/java/com/guichaguri/trackplayer/service/models/TrackType.java +0 -35
- package/android/src/main/res/drawable-hdpi/ic_logo.png +0 -0
- package/android/src/main/res/drawable-mdpi/ic_logo.png +0 -0
- package/android/src/main/res/drawable-xhdpi/ic_logo.png +0 -0
- package/android/src/main/res/drawable-xxhdpi/ic_logo.png +0 -0
- package/android/src/main/res/drawable-xxxhdpi/ic_logo.png +0 -0
package/lib/index.js
CHANGED
|
@@ -47,14 +47,6 @@ function setNowPlaying(track) {
|
|
|
47
47
|
return TrackPlayer.setNowPlaying(track);
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
function remove(tracks) {
|
|
51
|
-
if(!Array.isArray(tracks)) {
|
|
52
|
-
tracks = [tracks];
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
return TrackPlayer.remove(tracks);
|
|
56
|
-
}
|
|
57
|
-
|
|
58
50
|
function registerPlaybackService(serviceFactory) {
|
|
59
51
|
if (Platform.OS === 'android' && !registeredHeadlessTask) {
|
|
60
52
|
// Registers the headless task
|
|
@@ -161,9 +153,18 @@ module.exports.addEventListener = addEventListener;
|
|
|
161
153
|
|
|
162
154
|
// Player Queue Commands
|
|
163
155
|
module.exports.setNowPlaying = setNowPlaying;
|
|
164
|
-
module.exports.updateMetadataForTrack = TrackPlayer.updateMetadataForTrack;
|
|
165
156
|
module.exports.updatePlayback = TrackPlayer.updatePlayback;
|
|
166
157
|
module.exports.reset = TrackPlayer.reset;
|
|
158
|
+
module.exports.clear = TrackPlayer.clear;
|
|
159
|
+
module.exports.removeNotifications = TrackPlayer.removeNotifications;
|
|
160
|
+
|
|
161
|
+
// Android Auto
|
|
162
|
+
module.exports.setBrowseTree = TrackPlayer.setBrowseTree;
|
|
163
|
+
module.exports.updateBrowseTree = TrackPlayer.updateBrowseTree;
|
|
164
|
+
module.exports.setAndroidAutoPlayerTracks = TrackPlayer.setAndroidAutoPlayerTracks;
|
|
165
|
+
module.exports.updateAndroidAutoPlayerOptions = TrackPlayer.updateAndroidAutoPlayerOptions;
|
|
166
|
+
module.exports.setSearchResult = TrackPlayer.setSearchResult;
|
|
167
|
+
module.exports.setIsAndroidTv = TrackPlayer.setIsAndroidTv;
|
|
167
168
|
|
|
168
169
|
// Player Event Types
|
|
169
170
|
module.exports.TrackPlayerEvents = require('./eventTypes');
|
package/package.json
CHANGED
|
@@ -1,28 +0,0 @@
|
|
|
1
|
-
package com.guichaguri.trackplayer;
|
|
2
|
-
|
|
3
|
-
import com.facebook.react.ReactPackage;
|
|
4
|
-
import com.facebook.react.bridge.NativeModule;
|
|
5
|
-
import com.facebook.react.bridge.ReactApplicationContext;
|
|
6
|
-
import com.facebook.react.uimanager.ViewManager;
|
|
7
|
-
import com.guichaguri.trackplayer.module.MusicModule;
|
|
8
|
-
import java.util.Collections;
|
|
9
|
-
import java.util.List;
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* TrackPlayer
|
|
13
|
-
* https://github.com/react-native-kit/react-native-track-player
|
|
14
|
-
* @author Guichaguri
|
|
15
|
-
*/
|
|
16
|
-
public class TrackPlayer implements ReactPackage {
|
|
17
|
-
|
|
18
|
-
@Override
|
|
19
|
-
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
|
|
20
|
-
return Collections.singletonList(new MusicModule(reactContext));
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
@Override
|
|
24
|
-
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
|
|
25
|
-
return Collections.emptyList();
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
package com.guichaguri.trackplayer.module;
|
|
2
|
-
|
|
3
|
-
import android.content.BroadcastReceiver;
|
|
4
|
-
import android.content.Context;
|
|
5
|
-
import android.content.Intent;
|
|
6
|
-
import android.os.Bundle;
|
|
7
|
-
import com.facebook.react.bridge.Arguments;
|
|
8
|
-
import com.facebook.react.bridge.ReactContext;
|
|
9
|
-
import com.facebook.react.bridge.WritableMap;
|
|
10
|
-
import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter;
|
|
11
|
-
|
|
12
|
-
/**
|
|
13
|
-
* @author Guichaguri
|
|
14
|
-
*/
|
|
15
|
-
public class MusicEvents extends BroadcastReceiver {
|
|
16
|
-
|
|
17
|
-
// Media Control Events
|
|
18
|
-
public static final String BUTTON_PLAY = "remote-play";
|
|
19
|
-
public static final String BUTTON_PLAY_FROM_ID = "remote-play-id";
|
|
20
|
-
public static final String BUTTON_PLAY_FROM_SEARCH = "remote-play-search";
|
|
21
|
-
public static final String BUTTON_PAUSE = "remote-pause";
|
|
22
|
-
public static final String BUTTON_STOP = "remote-stop";
|
|
23
|
-
public static final String BUTTON_SKIP = "remote-skip";
|
|
24
|
-
public static final String BUTTON_SKIP_NEXT = "remote-next";
|
|
25
|
-
public static final String BUTTON_SKIP_PREVIOUS = "remote-previous";
|
|
26
|
-
public static final String BUTTON_SEEK_TO = "remote-seek";
|
|
27
|
-
public static final String BUTTON_SET_RATING = "remote-set-rating";
|
|
28
|
-
public static final String BUTTON_JUMP_FORWARD = "remote-jump-forward";
|
|
29
|
-
public static final String BUTTON_JUMP_BACKWARD = "remote-jump-backward";
|
|
30
|
-
public static final String BUTTON_DUCK = "remote-duck";
|
|
31
|
-
|
|
32
|
-
// Playback Events
|
|
33
|
-
public static final String PLAYBACK_STATE = "playback-state";
|
|
34
|
-
public static final String PLAYBACK_TRACK_CHANGED = "playback-track-changed";
|
|
35
|
-
public static final String PLAYBACK_QUEUE_ENDED = "playback-queue-ended";
|
|
36
|
-
public static final String PLAYBACK_METADATA = "playback-metadata-received";
|
|
37
|
-
public static final String PLAYBACK_ERROR = "playback-error";
|
|
38
|
-
|
|
39
|
-
private final ReactContext reactContext;
|
|
40
|
-
|
|
41
|
-
public MusicEvents(ReactContext reactContext) {
|
|
42
|
-
this.reactContext = reactContext;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
@Override
|
|
46
|
-
public void onReceive(Context context, Intent intent) {
|
|
47
|
-
String event = intent.getStringExtra("event");
|
|
48
|
-
Bundle data = intent.getBundleExtra("data");
|
|
49
|
-
|
|
50
|
-
WritableMap map = data != null ? Arguments.fromBundle(data) : null;
|
|
51
|
-
|
|
52
|
-
reactContext.getJSModule(RCTDeviceEventEmitter.class).emit(event, map);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
}
|
|
@@ -1,298 +0,0 @@
|
|
|
1
|
-
package com.guichaguri.trackplayer.module;
|
|
2
|
-
|
|
3
|
-
import android.app.AlarmManager;
|
|
4
|
-
import android.app.PendingIntent;
|
|
5
|
-
import android.app.Service;
|
|
6
|
-
import android.content.ComponentName;
|
|
7
|
-
import android.content.Context;
|
|
8
|
-
import android.content.Intent;
|
|
9
|
-
import android.content.IntentFilter;
|
|
10
|
-
import android.content.ServiceConnection;
|
|
11
|
-
import android.os.Build;
|
|
12
|
-
import android.os.Bundle;
|
|
13
|
-
import android.os.IBinder;
|
|
14
|
-
import android.support.v4.media.RatingCompat;
|
|
15
|
-
import android.support.v4.media.session.PlaybackStateCompat;
|
|
16
|
-
import android.util.Log;
|
|
17
|
-
import androidx.localbroadcastmanager.content.LocalBroadcastManager;
|
|
18
|
-
import com.facebook.react.bridge.*;
|
|
19
|
-
import com.guichaguri.trackplayer.service.MusicBinder;
|
|
20
|
-
import com.guichaguri.trackplayer.service.MusicService;
|
|
21
|
-
import com.guichaguri.trackplayer.service.Utils;
|
|
22
|
-
import com.guichaguri.trackplayer.service.models.Track;
|
|
23
|
-
|
|
24
|
-
import javax.annotation.Nonnull;
|
|
25
|
-
import javax.annotation.Nullable;
|
|
26
|
-
import java.util.*;
|
|
27
|
-
|
|
28
|
-
/**
|
|
29
|
-
* @author Guichaguri
|
|
30
|
-
*/
|
|
31
|
-
public class MusicModule extends ReactContextBaseJavaModule implements ServiceConnection {
|
|
32
|
-
|
|
33
|
-
private MusicBinder binder;
|
|
34
|
-
private MusicEvents eventHandler;
|
|
35
|
-
private ArrayDeque<Runnable> initCallbacks = new ArrayDeque<>();
|
|
36
|
-
private boolean connecting = false;
|
|
37
|
-
private Bundle options;
|
|
38
|
-
|
|
39
|
-
public MusicModule(ReactApplicationContext reactContext) {
|
|
40
|
-
super(reactContext);
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
@Override
|
|
44
|
-
@Nonnull
|
|
45
|
-
public String getName() {
|
|
46
|
-
return "TrackPlayerModule";
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
@Override
|
|
50
|
-
public void initialize() {
|
|
51
|
-
ReactContext context = getReactApplicationContext();
|
|
52
|
-
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(context);
|
|
53
|
-
|
|
54
|
-
eventHandler = new MusicEvents(context);
|
|
55
|
-
manager.registerReceiver(eventHandler, new IntentFilter(Utils.EVENT_INTENT));
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
@Override
|
|
59
|
-
public void onCatalystInstanceDestroy() {
|
|
60
|
-
ReactContext context = getReactApplicationContext();
|
|
61
|
-
|
|
62
|
-
if(eventHandler != null) {
|
|
63
|
-
LocalBroadcastManager manager = LocalBroadcastManager.getInstance(context);
|
|
64
|
-
|
|
65
|
-
manager.unregisterReceiver(eventHandler);
|
|
66
|
-
eventHandler = null;
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
|
|
70
|
-
@Override
|
|
71
|
-
public void onServiceConnected(ComponentName name, IBinder service) {
|
|
72
|
-
binder = (MusicBinder)service;
|
|
73
|
-
connecting = false;
|
|
74
|
-
|
|
75
|
-
// Reapply options that user set before with updateOptions
|
|
76
|
-
if (options != null) {
|
|
77
|
-
binder.updateOptions(options);
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// Triggers all callbacks
|
|
81
|
-
while(!initCallbacks.isEmpty()) {
|
|
82
|
-
binder.post(initCallbacks.remove());
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
@Override
|
|
87
|
-
public void onServiceDisconnected(ComponentName name) {
|
|
88
|
-
binder = null;
|
|
89
|
-
connecting = false;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
/**
|
|
93
|
-
* Waits for a connection to the service and/or runs the {@link Runnable} in the player thread
|
|
94
|
-
*/
|
|
95
|
-
private void waitForConnection(Runnable r) {
|
|
96
|
-
if(binder != null) {
|
|
97
|
-
binder.post(r);
|
|
98
|
-
return;
|
|
99
|
-
} else {
|
|
100
|
-
initCallbacks.add(r);
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
if(connecting) return;
|
|
104
|
-
|
|
105
|
-
ReactApplicationContext context = getReactApplicationContext();
|
|
106
|
-
|
|
107
|
-
// Binds the service to get a MediaWrapper instance
|
|
108
|
-
Intent intent = new Intent(context, MusicService.class);
|
|
109
|
-
//context.startService(intent);
|
|
110
|
-
try {
|
|
111
|
-
if (Build.VERSION.SDK_INT >= 26) {
|
|
112
|
-
context.startForegroundService(intent);
|
|
113
|
-
} else {
|
|
114
|
-
context.startService(intent);
|
|
115
|
-
}
|
|
116
|
-
}catch(Exception ex){
|
|
117
|
-
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
|
|
118
|
-
AlarmManager mgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
|
|
119
|
-
Intent i = new Intent(context, MusicService.class);
|
|
120
|
-
PendingIntent pi = PendingIntent.getForegroundService(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
|
|
121
|
-
Calendar calendar = Calendar.getInstance();
|
|
122
|
-
calendar.setTimeInMillis(System.currentTimeMillis());
|
|
123
|
-
calendar.add(Calendar.MILLISECOND, 200);
|
|
124
|
-
mgr.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pi);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
intent.setAction(Utils.CONNECT_INTENT);
|
|
128
|
-
context.bindService(intent, this, 0);
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
connecting = true;
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
/* ****************************** API ****************************** */
|
|
136
|
-
|
|
137
|
-
@Nullable
|
|
138
|
-
@Override
|
|
139
|
-
public Map<String, Object> getConstants() {
|
|
140
|
-
Map<String, Object> constants = new HashMap<>();
|
|
141
|
-
|
|
142
|
-
// Capabilities
|
|
143
|
-
constants.put("CAPABILITY_PLAY", PlaybackStateCompat.ACTION_PLAY);
|
|
144
|
-
constants.put("CAPABILITY_PLAY_FROM_ID", PlaybackStateCompat.ACTION_PLAY_FROM_MEDIA_ID);
|
|
145
|
-
constants.put("CAPABILITY_PLAY_FROM_SEARCH", PlaybackStateCompat.ACTION_PLAY_FROM_SEARCH);
|
|
146
|
-
constants.put("CAPABILITY_PAUSE", PlaybackStateCompat.ACTION_PAUSE);
|
|
147
|
-
constants.put("CAPABILITY_STOP", PlaybackStateCompat.ACTION_STOP);
|
|
148
|
-
constants.put("CAPABILITY_SEEK_TO", PlaybackStateCompat.ACTION_SEEK_TO);
|
|
149
|
-
constants.put("CAPABILITY_SKIP", PlaybackStateCompat.ACTION_SKIP_TO_QUEUE_ITEM);
|
|
150
|
-
constants.put("CAPABILITY_SKIP_TO_NEXT", PlaybackStateCompat.ACTION_SKIP_TO_NEXT);
|
|
151
|
-
constants.put("CAPABILITY_SKIP_TO_PREVIOUS", PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS);
|
|
152
|
-
constants.put("CAPABILITY_SET_RATING", PlaybackStateCompat.ACTION_SET_RATING);
|
|
153
|
-
constants.put("CAPABILITY_JUMP_FORWARD", PlaybackStateCompat.ACTION_FAST_FORWARD);
|
|
154
|
-
constants.put("CAPABILITY_JUMP_BACKWARD", PlaybackStateCompat.ACTION_REWIND);
|
|
155
|
-
|
|
156
|
-
// States
|
|
157
|
-
constants.put("STATE_NONE", PlaybackStateCompat.STATE_NONE);
|
|
158
|
-
constants.put("STATE_READY", PlaybackStateCompat.STATE_PAUSED);
|
|
159
|
-
constants.put("STATE_PLAYING", PlaybackStateCompat.STATE_PLAYING);
|
|
160
|
-
constants.put("STATE_PAUSED", PlaybackStateCompat.STATE_PAUSED);
|
|
161
|
-
constants.put("STATE_STOPPED", PlaybackStateCompat.STATE_STOPPED);
|
|
162
|
-
constants.put("STATE_BUFFERING", PlaybackStateCompat.STATE_BUFFERING);
|
|
163
|
-
constants.put("STATE_CONNECTING", PlaybackStateCompat.STATE_CONNECTING);
|
|
164
|
-
|
|
165
|
-
// Rating Types
|
|
166
|
-
constants.put("RATING_HEART", RatingCompat.RATING_HEART);
|
|
167
|
-
constants.put("RATING_THUMBS_UP_DOWN", RatingCompat.RATING_THUMB_UP_DOWN);
|
|
168
|
-
constants.put("RATING_3_STARS", RatingCompat.RATING_3_STARS);
|
|
169
|
-
constants.put("RATING_4_STARS", RatingCompat.RATING_4_STARS);
|
|
170
|
-
constants.put("RATING_5_STARS", RatingCompat.RATING_5_STARS);
|
|
171
|
-
constants.put("RATING_PERCENTAGE", RatingCompat.RATING_PERCENTAGE);
|
|
172
|
-
|
|
173
|
-
return constants;
|
|
174
|
-
}
|
|
175
|
-
|
|
176
|
-
@ReactMethod
|
|
177
|
-
public void destroy() {
|
|
178
|
-
// Ignore if it was already destroyed
|
|
179
|
-
if (binder == null && !connecting) return;
|
|
180
|
-
|
|
181
|
-
try {
|
|
182
|
-
if(binder != null) {
|
|
183
|
-
binder.destroy();
|
|
184
|
-
binder = null;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
ReactContext context = getReactApplicationContext();
|
|
188
|
-
if(context != null) context.unbindService(this);
|
|
189
|
-
} catch(Exception ex) {
|
|
190
|
-
// This method shouldn't be throwing unhandled errors even if something goes wrong.
|
|
191
|
-
Log.e(Utils.LOG, "An error occurred while destroying the service", ex);
|
|
192
|
-
}
|
|
193
|
-
}
|
|
194
|
-
|
|
195
|
-
@ReactMethod
|
|
196
|
-
public void updateOptions(ReadableMap data, final Promise callback) {
|
|
197
|
-
// keep options as we may need them for correct MetadataManager reinitialization later
|
|
198
|
-
options = Arguments.toBundle(data);
|
|
199
|
-
|
|
200
|
-
waitForConnection(() -> {
|
|
201
|
-
if(binder != null)
|
|
202
|
-
binder.updateOptions(options);
|
|
203
|
-
callback.resolve(null);
|
|
204
|
-
});
|
|
205
|
-
}
|
|
206
|
-
|
|
207
|
-
@ReactMethod
|
|
208
|
-
public void setNowPlaying(ReadableMap trackMap, final Promise callback) {
|
|
209
|
-
final Bundle bundle = Arguments.toBundle(trackMap);
|
|
210
|
-
|
|
211
|
-
waitForConnection(() -> {
|
|
212
|
-
try {
|
|
213
|
-
int state = trackMap.hasKey("state") ? trackMap.getInt("state") : 0;
|
|
214
|
-
|
|
215
|
-
long elapsedTime = -1;
|
|
216
|
-
|
|
217
|
-
if(trackMap.hasKey("elapsedTime")) {
|
|
218
|
-
try {
|
|
219
|
-
elapsedTime = Utils.toMillis(trackMap.getDouble("elapsedTime"));
|
|
220
|
-
|
|
221
|
-
}
|
|
222
|
-
catch(Exception ex){
|
|
223
|
-
elapsedTime = Utils.toMillis((long)trackMap.getInt("elapsedTime"));
|
|
224
|
-
}
|
|
225
|
-
}
|
|
226
|
-
|
|
227
|
-
Track track = new Track(getReactApplicationContext(), bundle, binder.getRatingType());
|
|
228
|
-
binder.getManager().setCurrentTrack(track);
|
|
229
|
-
binder.getManager().getMetadata().updateMetadata(track);
|
|
230
|
-
binder.getManager().setState(state, elapsedTime);
|
|
231
|
-
} catch(Exception ex) {
|
|
232
|
-
callback.reject("invalid_track_object", ex);
|
|
233
|
-
return;
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
if(binder != null && binder.getManager() != null && binder.getManager().getCurrentTrack() == null)
|
|
237
|
-
callback.reject("invalid_track_object", "Track is missing a required key");
|
|
238
|
-
|
|
239
|
-
callback.resolve(null);
|
|
240
|
-
});
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
@ReactMethod
|
|
244
|
-
public void updatePlayback(ReadableMap trackMap, final Promise callback) {
|
|
245
|
-
final Bundle bundle = Arguments.toBundle(trackMap);
|
|
246
|
-
|
|
247
|
-
waitForConnection(() -> {
|
|
248
|
-
try {
|
|
249
|
-
int state = trackMap.hasKey("state") ? trackMap.getInt("state") : 0;
|
|
250
|
-
long elapsedTime = -1;
|
|
251
|
-
|
|
252
|
-
if(trackMap.hasKey("elapsedTime")) {
|
|
253
|
-
try {
|
|
254
|
-
elapsedTime = Utils.toMillis((long)trackMap.getInt("elapsedTime"));
|
|
255
|
-
}
|
|
256
|
-
catch(Exception ex){
|
|
257
|
-
elapsedTime = Utils.toMillis(trackMap.getDouble("elapsedTime"));
|
|
258
|
-
}
|
|
259
|
-
}
|
|
260
|
-
|
|
261
|
-
long duration = -1;
|
|
262
|
-
|
|
263
|
-
if(trackMap.hasKey("duration")) {
|
|
264
|
-
try {
|
|
265
|
-
duration = Utils.toMillis((long)trackMap.getInt("duration"));
|
|
266
|
-
}
|
|
267
|
-
catch(Exception ex){
|
|
268
|
-
duration = Utils.toMillis(trackMap.getDouble("duration"));
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
//update current track duration
|
|
272
|
-
Track currentTrack = binder.getManager().getCurrentTrack();
|
|
273
|
-
if(currentTrack != null && duration > -1)
|
|
274
|
-
{
|
|
275
|
-
currentTrack.duration = duration;
|
|
276
|
-
binder.getManager().getMetadata().updateMetadata(currentTrack);
|
|
277
|
-
}
|
|
278
|
-
|
|
279
|
-
binder.getManager().setState(state, elapsedTime);
|
|
280
|
-
} catch (Exception ex) {
|
|
281
|
-
callback.reject("invalid_track_object", ex);
|
|
282
|
-
return;
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
if (binder != null && binder.getManager() != null && binder.getManager().getCurrentTrack() == null)
|
|
286
|
-
callback.reject("invalid_track_object", "Track is missing a required key");
|
|
287
|
-
});
|
|
288
|
-
}
|
|
289
|
-
@ReactMethod
|
|
290
|
-
public void reset(final Promise callback) {
|
|
291
|
-
waitForConnection(() -> {
|
|
292
|
-
if(binder != null && binder.getManager() != null) {
|
|
293
|
-
binder.getManager().onReset();
|
|
294
|
-
callback.resolve(null);
|
|
295
|
-
}
|
|
296
|
-
});
|
|
297
|
-
}
|
|
298
|
-
}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
package com.guichaguri.trackplayer.service;
|
|
2
|
-
|
|
3
|
-
import android.os.Binder;
|
|
4
|
-
import android.os.Bundle;
|
|
5
|
-
import android.os.Handler;
|
|
6
|
-
|
|
7
|
-
/**
|
|
8
|
-
* @author Guichaguri
|
|
9
|
-
*/
|
|
10
|
-
public class MusicBinder extends Binder {
|
|
11
|
-
|
|
12
|
-
private final MusicService service;
|
|
13
|
-
private final MusicManager manager;
|
|
14
|
-
|
|
15
|
-
public MusicBinder(MusicService service, MusicManager manager) {
|
|
16
|
-
this.service = service;
|
|
17
|
-
this.manager = manager;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
public void post(Runnable r) {
|
|
21
|
-
if(service == null)
|
|
22
|
-
return;
|
|
23
|
-
|
|
24
|
-
if(service.handler == null)
|
|
25
|
-
service.handler = new Handler();
|
|
26
|
-
|
|
27
|
-
service.handler.post(r);
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
public MusicManager getManager(){ return this.manager; }
|
|
31
|
-
|
|
32
|
-
public void updateOptions(Bundle bundle) {
|
|
33
|
-
manager.setStopWithApp(bundle.getBoolean("stopWithApp", false));
|
|
34
|
-
manager.setAlwaysPauseOnInterruption(bundle.getBoolean("alwaysPauseOnInterruption", false));
|
|
35
|
-
manager.getMetadata().updateOptions(bundle);
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
public int getRatingType() {
|
|
39
|
-
return manager.getMetadata().getRatingType();
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
public void destroy() {
|
|
43
|
-
service.destroy(true);
|
|
44
|
-
service.stopSelf();
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
}
|