@javascriptcommon/react-native-track-player 1.2.9 → 1.2.24
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} +83 -32
- 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 +1192 -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 +1268 -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/android/src/main/java/com/guichaguri/trackplayer/service/metadata/MetadataManager.java
DELETED
|
@@ -1,379 +0,0 @@
|
|
|
1
|
-
package com.guichaguri.trackplayer.service.metadata;
|
|
2
|
-
|
|
3
|
-
import static androidx.core.app.NotificationCompat.PRIORITY_MAX;
|
|
4
|
-
|
|
5
|
-
import android.app.AlarmManager;
|
|
6
|
-
import android.app.Notification;
|
|
7
|
-
import android.app.NotificationChannel;
|
|
8
|
-
import android.app.NotificationManager;
|
|
9
|
-
import android.app.PendingIntent;
|
|
10
|
-
import android.content.ComponentName;
|
|
11
|
-
import android.content.Context;
|
|
12
|
-
import android.content.Intent;
|
|
13
|
-
import android.content.pm.ServiceInfo;
|
|
14
|
-
import android.graphics.Bitmap;
|
|
15
|
-
import android.graphics.BitmapFactory;
|
|
16
|
-
import android.net.Uri;
|
|
17
|
-
import android.os.Build;
|
|
18
|
-
import android.os.Bundle;
|
|
19
|
-
import androidx.core.app.NotificationCompat;
|
|
20
|
-
import androidx.core.app.NotificationCompat.Action;
|
|
21
|
-
import android.support.v4.media.MediaMetadataCompat;
|
|
22
|
-
import android.support.v4.media.RatingCompat;
|
|
23
|
-
|
|
24
|
-
import androidx.core.app.NotificationManagerCompat;
|
|
25
|
-
import androidx.media.app.NotificationCompat.MediaStyle;
|
|
26
|
-
import androidx.media.session.MediaButtonReceiver;
|
|
27
|
-
import android.support.v4.media.session.MediaSessionCompat;
|
|
28
|
-
import android.support.v4.media.session.PlaybackStateCompat;
|
|
29
|
-
import com.bumptech.glide.Glide;
|
|
30
|
-
import com.bumptech.glide.RequestManager;
|
|
31
|
-
import com.bumptech.glide.request.target.SimpleTarget;
|
|
32
|
-
import com.bumptech.glide.request.transition.Transition;
|
|
33
|
-
import com.facebook.react.bridge.ReactContext;
|
|
34
|
-
import com.facebook.react.views.imagehelper.ResourceDrawableIdHelper;
|
|
35
|
-
import com.guichaguri.trackplayer.R;
|
|
36
|
-
import com.guichaguri.trackplayer.service.MusicManager;
|
|
37
|
-
import com.guichaguri.trackplayer.service.MusicService;
|
|
38
|
-
import com.guichaguri.trackplayer.service.Utils;
|
|
39
|
-
import com.guichaguri.trackplayer.service.models.Track;
|
|
40
|
-
import java.util.ArrayList;
|
|
41
|
-
import java.util.Calendar;
|
|
42
|
-
import java.util.List;
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* @author Guichaguri
|
|
46
|
-
*/
|
|
47
|
-
public class MetadataManager {
|
|
48
|
-
|
|
49
|
-
private final MusicService service;
|
|
50
|
-
private final MusicManager manager;
|
|
51
|
-
private final MediaSessionCompat session;
|
|
52
|
-
|
|
53
|
-
private int ratingType = RatingCompat.RATING_NONE;
|
|
54
|
-
private int jumpInterval = 15;
|
|
55
|
-
private long actions = 0;
|
|
56
|
-
private long compactActions = 0;
|
|
57
|
-
private SimpleTarget<Bitmap> artworkTarget;
|
|
58
|
-
private NotificationCompat.Builder builder;
|
|
59
|
-
private Bundle optionsBundle = null;
|
|
60
|
-
|
|
61
|
-
private boolean hideArtworkLockScreenBackground;
|
|
62
|
-
|
|
63
|
-
private Action previousAction, rewindAction, playAction, pauseAction, stopAction, forwardAction, nextAction;
|
|
64
|
-
|
|
65
|
-
public MetadataManager(MusicService service, MusicManager manager) {
|
|
66
|
-
this.service = service;
|
|
67
|
-
this.manager = manager;
|
|
68
|
-
|
|
69
|
-
String channel = Utils.getNotificationChannel((Context) service);
|
|
70
|
-
this.builder = new NotificationCompat.Builder(service, channel);
|
|
71
|
-
this.session = new MediaSessionCompat(service, "TrackPlayer", null, null);
|
|
72
|
-
|
|
73
|
-
session.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS | MediaSessionCompat.FLAG_HANDLES_QUEUE_COMMANDS);
|
|
74
|
-
session.setCallback(new ButtonEvents(service, manager));
|
|
75
|
-
|
|
76
|
-
Context context = service.getApplicationContext();
|
|
77
|
-
String packageName = context.getPackageName();
|
|
78
|
-
Intent openApp = context.getPackageManager().getLaunchIntentForPackage(packageName);
|
|
79
|
-
|
|
80
|
-
if (openApp == null) {
|
|
81
|
-
openApp = new Intent();
|
|
82
|
-
openApp.setPackage(packageName);
|
|
83
|
-
openApp.addCategory(Intent.CATEGORY_LAUNCHER);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
// Prevent the app from launching a new instance
|
|
87
|
-
openApp.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
|
|
88
|
-
|
|
89
|
-
// Add the Uri data so apps can identify that it was a notification click
|
|
90
|
-
openApp.setAction(Intent.ACTION_VIEW);
|
|
91
|
-
openApp.setData(Uri.parse("trackplayer://notification.click"));
|
|
92
|
-
|
|
93
|
-
int flags = Build.VERSION.SDK_INT >= Build.VERSION_CODES.M ? PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE : PendingIntent.FLAG_UPDATE_CURRENT;
|
|
94
|
-
|
|
95
|
-
builder.setContentIntent(PendingIntent.getActivity(context, 0, openApp, flags));
|
|
96
|
-
|
|
97
|
-
builder.setSmallIcon(R.drawable.ic_logo);
|
|
98
|
-
builder.setCategory(NotificationCompat.CATEGORY_TRANSPORT);
|
|
99
|
-
|
|
100
|
-
// Stops the playback when the notification is swiped away
|
|
101
|
-
builder.setDeleteIntent(MediaButtonReceiver.buildMediaButtonPendingIntent(service, PlaybackStateCompat.ACTION_STOP));
|
|
102
|
-
|
|
103
|
-
// Make it visible in the lockscreen
|
|
104
|
-
builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
|
|
105
|
-
}
|
|
106
|
-
|
|
107
|
-
public MediaSessionCompat getSession() {
|
|
108
|
-
return session;
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
/**
|
|
112
|
-
* Updates the metadata options
|
|
113
|
-
* @param options The options
|
|
114
|
-
*/
|
|
115
|
-
public void updateOptions(Bundle options) {
|
|
116
|
-
optionsBundle = options;
|
|
117
|
-
List<Integer> capabilities = options.getIntegerArrayList("capabilities");
|
|
118
|
-
List<Integer> notification = options.getIntegerArrayList("notificationCapabilities");
|
|
119
|
-
List<Integer> compact = options.getIntegerArrayList("compactCapabilities");
|
|
120
|
-
|
|
121
|
-
hideArtworkLockScreenBackground = options.getBoolean("hideArtworkLockScreenBackground");
|
|
122
|
-
|
|
123
|
-
actions = 0;
|
|
124
|
-
compactActions = 0;
|
|
125
|
-
|
|
126
|
-
if(capabilities != null) {
|
|
127
|
-
// Create the actions mask
|
|
128
|
-
for(int cap : capabilities) actions |= cap;
|
|
129
|
-
|
|
130
|
-
// If there is no notification capabilities defined, we'll show all capabilities available
|
|
131
|
-
if(notification == null) notification = capabilities;
|
|
132
|
-
|
|
133
|
-
// Initialize all actions based on the options
|
|
134
|
-
|
|
135
|
-
previousAction = createAction(notification, PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS, "Previous",
|
|
136
|
-
getIcon(options, "previousIcon", R.drawable.ic_previous));
|
|
137
|
-
rewindAction = createAction(notification, PlaybackStateCompat.ACTION_REWIND, "Rewind",
|
|
138
|
-
getIcon(options, "rewindIcon", R.drawable.ic_rewind));
|
|
139
|
-
playAction = createAction(notification, PlaybackStateCompat.ACTION_PLAY, "Play",
|
|
140
|
-
getIcon(options, "playIcon", R.drawable.ic_play));
|
|
141
|
-
pauseAction = createAction(notification, PlaybackStateCompat.ACTION_PAUSE, "Pause",
|
|
142
|
-
getIcon(options, "pauseIcon", R.drawable.ic_pause));
|
|
143
|
-
stopAction = createAction(notification, PlaybackStateCompat.ACTION_STOP, "Stop",
|
|
144
|
-
getIcon(options, "stopIcon", R.drawable.ic_stop));
|
|
145
|
-
forwardAction = createAction(notification, PlaybackStateCompat.ACTION_FAST_FORWARD, "Forward",
|
|
146
|
-
getIcon(options, "forwardIcon", R.drawable.ic_forward));
|
|
147
|
-
nextAction = createAction(notification, PlaybackStateCompat.ACTION_SKIP_TO_NEXT, "Next",
|
|
148
|
-
getIcon(options, "nextIcon", R.drawable.ic_next));
|
|
149
|
-
|
|
150
|
-
// Update the action mask for the compact view
|
|
151
|
-
if(compact != null) {
|
|
152
|
-
for(int cap : compact) compactActions |= cap;
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
// Update the color
|
|
157
|
-
builder.setColor(Utils.getInt(options, "color", NotificationCompat.COLOR_DEFAULT));
|
|
158
|
-
|
|
159
|
-
// Update the icon
|
|
160
|
-
builder.setSmallIcon(getIcon(options, "icon", R.drawable.ic_logo));
|
|
161
|
-
|
|
162
|
-
// Update the jump interval
|
|
163
|
-
jumpInterval = Utils.getInt(options, "jumpInterval", 15);
|
|
164
|
-
|
|
165
|
-
// Update the rating type
|
|
166
|
-
ratingType = Utils.getInt(options, "ratingType", RatingCompat.RATING_NONE);
|
|
167
|
-
session.setRatingType(ratingType);
|
|
168
|
-
|
|
169
|
-
updateNotification();
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
public Bundle getOptionsBundle() { return optionsBundle; }
|
|
173
|
-
|
|
174
|
-
public int getRatingType() {
|
|
175
|
-
return ratingType;
|
|
176
|
-
}
|
|
177
|
-
|
|
178
|
-
public int getJumpInterval() {
|
|
179
|
-
return jumpInterval;
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
public void removeNotifications() {
|
|
183
|
-
String ns = Context.NOTIFICATION_SERVICE;
|
|
184
|
-
Context context = service.getApplicationContext();
|
|
185
|
-
NotificationManager manager = (NotificationManager) context.getSystemService(ns);
|
|
186
|
-
manager.cancelAll();
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
/**
|
|
190
|
-
* Updates the artwork
|
|
191
|
-
* @param bitmap The new artwork
|
|
192
|
-
*/
|
|
193
|
-
protected void updateArtwork(Bitmap bitmap) {
|
|
194
|
-
Track track = manager.getCurrentTrack();
|
|
195
|
-
if(track == null) return;
|
|
196
|
-
|
|
197
|
-
MediaMetadataCompat.Builder metadata = track.toMediaMetadata();
|
|
198
|
-
|
|
199
|
-
metadata.putBitmap(hideArtworkLockScreenBackground ? MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON : MediaMetadataCompat.METADATA_KEY_ART, bitmap);
|
|
200
|
-
builder.setLargeIcon(bitmap);
|
|
201
|
-
|
|
202
|
-
session.setMetadata(metadata.build());
|
|
203
|
-
updateNotification();
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
/**
|
|
207
|
-
* Updates the current track
|
|
208
|
-
* @param track The new track
|
|
209
|
-
*/
|
|
210
|
-
public void updateMetadata(Track track) {
|
|
211
|
-
MediaMetadataCompat.Builder metadata = track.toMediaMetadata();
|
|
212
|
-
|
|
213
|
-
RequestManager rm = Glide.with(service.getApplicationContext());
|
|
214
|
-
if(artworkTarget != null) rm.clear(artworkTarget);
|
|
215
|
-
|
|
216
|
-
if(track.artwork != null) {
|
|
217
|
-
artworkTarget = rm.asBitmap()
|
|
218
|
-
.load(track.artwork)
|
|
219
|
-
.into(new SimpleTarget<Bitmap>() {
|
|
220
|
-
@Override
|
|
221
|
-
public void onResourceReady(Bitmap resource, Transition<? super Bitmap> transition) {
|
|
222
|
-
try {
|
|
223
|
-
metadata.putBitmap(hideArtworkLockScreenBackground ? MediaMetadataCompat.METADATA_KEY_DISPLAY_ICON :
|
|
224
|
-
MediaMetadataCompat.METADATA_KEY_ART, resource);
|
|
225
|
-
builder.setLargeIcon(resource);
|
|
226
|
-
|
|
227
|
-
session.setMetadata(metadata.build());
|
|
228
|
-
updateNotification();
|
|
229
|
-
}catch(Exception ex){}
|
|
230
|
-
artworkTarget = null;
|
|
231
|
-
}
|
|
232
|
-
});
|
|
233
|
-
}
|
|
234
|
-
|
|
235
|
-
builder.setContentTitle(track.title);
|
|
236
|
-
builder.setContentText(track.artist);
|
|
237
|
-
builder.setSubText(track.album);
|
|
238
|
-
|
|
239
|
-
session.setMetadata(metadata.build());
|
|
240
|
-
updateNotification();
|
|
241
|
-
}
|
|
242
|
-
|
|
243
|
-
/**
|
|
244
|
-
* Updates the playback state
|
|
245
|
-
* @param state The player
|
|
246
|
-
*/
|
|
247
|
-
public void updatePlayback(int state, long position, long bufferedPosition, int rate) {
|
|
248
|
-
boolean playing = Utils.isPlaying(state);
|
|
249
|
-
List<Integer> compact = new ArrayList<>();
|
|
250
|
-
builder.mActions.clear();
|
|
251
|
-
|
|
252
|
-
// Adds the media buttons to the notification
|
|
253
|
-
|
|
254
|
-
addAction(previousAction, PlaybackStateCompat.ACTION_SKIP_TO_PREVIOUS, compact);
|
|
255
|
-
addAction(rewindAction, PlaybackStateCompat.ACTION_REWIND, compact);
|
|
256
|
-
|
|
257
|
-
if(playing) {
|
|
258
|
-
addAction(pauseAction, PlaybackStateCompat.ACTION_PAUSE, compact);
|
|
259
|
-
} else {
|
|
260
|
-
addAction(playAction, PlaybackStateCompat.ACTION_PLAY, compact);
|
|
261
|
-
}
|
|
262
|
-
|
|
263
|
-
addAction(stopAction, PlaybackStateCompat.ACTION_STOP, compact);
|
|
264
|
-
addAction(forwardAction, PlaybackStateCompat.ACTION_FAST_FORWARD, compact);
|
|
265
|
-
addAction(nextAction, PlaybackStateCompat.ACTION_SKIP_TO_NEXT, compact);
|
|
266
|
-
|
|
267
|
-
// Prevent the media style from being used in older Huawei devices that don't support custom styles
|
|
268
|
-
if(!Build.MANUFACTURER.toLowerCase().contains("huawei") || Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
|
|
269
|
-
|
|
270
|
-
MediaStyle style = new MediaStyle();
|
|
271
|
-
|
|
272
|
-
if(playing) {
|
|
273
|
-
style.setShowCancelButton(false);
|
|
274
|
-
} else {
|
|
275
|
-
// Shows the cancel button on pre-lollipop versions due to a bug
|
|
276
|
-
style.setShowCancelButton(true);
|
|
277
|
-
style.setCancelButtonIntent(MediaButtonReceiver.buildMediaButtonPendingIntent(service,
|
|
278
|
-
PlaybackStateCompat.ACTION_STOP));
|
|
279
|
-
}
|
|
280
|
-
|
|
281
|
-
// Links the media session
|
|
282
|
-
style.setMediaSession(session.getSessionToken());
|
|
283
|
-
|
|
284
|
-
// Updates the compact media buttons for the notification
|
|
285
|
-
if (!compact.isEmpty()) {
|
|
286
|
-
int[] compactIndexes = new int[compact.size()];
|
|
287
|
-
|
|
288
|
-
for (int i = 0; i < compact.size(); i++) compactIndexes[i] = compact.get(i);
|
|
289
|
-
|
|
290
|
-
style.setShowActionsInCompactView(compactIndexes);
|
|
291
|
-
}
|
|
292
|
-
|
|
293
|
-
builder.setStyle(style);
|
|
294
|
-
|
|
295
|
-
}
|
|
296
|
-
|
|
297
|
-
// Updates the media session state
|
|
298
|
-
PlaybackStateCompat.Builder pb = new PlaybackStateCompat.Builder();
|
|
299
|
-
pb.setActions(actions);
|
|
300
|
-
pb.setState(state, position, rate);
|
|
301
|
-
pb.setBufferedPosition(bufferedPosition);
|
|
302
|
-
|
|
303
|
-
session.setPlaybackState(pb.build());
|
|
304
|
-
updateNotification();
|
|
305
|
-
}
|
|
306
|
-
|
|
307
|
-
public void setActive(boolean active) {
|
|
308
|
-
this.session.setActive(active);
|
|
309
|
-
|
|
310
|
-
updateNotification();
|
|
311
|
-
}
|
|
312
|
-
|
|
313
|
-
public void destroy(Boolean intentToStop) {
|
|
314
|
-
service.stopForeground(false);
|
|
315
|
-
|
|
316
|
-
if (!intentToStop) {
|
|
317
|
-
updateNotification();
|
|
318
|
-
} else {
|
|
319
|
-
session.setActive(false);
|
|
320
|
-
session.release();
|
|
321
|
-
}
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
private void updateNotification() {
|
|
325
|
-
try {
|
|
326
|
-
if(session.isActive()) {
|
|
327
|
-
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
|
|
328
|
-
service.startForeground(1, builder
|
|
329
|
-
.setForegroundServiceBehavior(Notification.FOREGROUND_SERVICE_IMMEDIATE)
|
|
330
|
-
.setPriority(PRIORITY_MAX)
|
|
331
|
-
.build(), ServiceInfo.FOREGROUND_SERVICE_TYPE_MEDIA_PLAYBACK);
|
|
332
|
-
}else{
|
|
333
|
-
service.startForeground(1, builder
|
|
334
|
-
.setForegroundServiceBehavior(Notification.FOREGROUND_SERVICE_IMMEDIATE)
|
|
335
|
-
.setPriority(PRIORITY_MAX)
|
|
336
|
-
.build());
|
|
337
|
-
}
|
|
338
|
-
}
|
|
339
|
-
}catch(Exception ex){
|
|
340
|
-
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
|
|
341
|
-
Context context = service.getApplicationContext();
|
|
342
|
-
AlarmManager mgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
|
|
343
|
-
Intent i = new Intent(context, MusicService.class);
|
|
344
|
-
PendingIntent pi = PendingIntent.getForegroundService(context, 0, i, PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE);
|
|
345
|
-
Calendar calendar = Calendar.getInstance();
|
|
346
|
-
calendar.setTimeInMillis(System.currentTimeMillis());
|
|
347
|
-
calendar.add(Calendar.MILLISECOND, 200);
|
|
348
|
-
mgr.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pi);
|
|
349
|
-
}
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
private int getIcon(Bundle options, String propertyName, int defaultIcon) {
|
|
354
|
-
if(!options.containsKey(propertyName)) return defaultIcon;
|
|
355
|
-
|
|
356
|
-
Bundle bundle = options.getBundle(propertyName);
|
|
357
|
-
if(bundle == null) return defaultIcon;
|
|
358
|
-
|
|
359
|
-
ResourceDrawableIdHelper helper = ResourceDrawableIdHelper.getInstance();
|
|
360
|
-
int icon = helper.getResourceDrawableId(service, bundle.getString("uri"));
|
|
361
|
-
if(icon == 0) return defaultIcon;
|
|
362
|
-
|
|
363
|
-
return icon;
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
private Action createAction(List<Integer> caps, long action, String title, int icon) {
|
|
367
|
-
if(!caps.contains((int)action)) return null;
|
|
368
|
-
|
|
369
|
-
return new Action(icon, title, MediaButtonReceiver.buildMediaButtonPendingIntent(service, action));
|
|
370
|
-
}
|
|
371
|
-
|
|
372
|
-
private void addAction(Action action, long id, List<Integer> compact) {
|
|
373
|
-
if(action == null) return;
|
|
374
|
-
|
|
375
|
-
if((compactActions & id) != 0) compact.add(builder.mActions.size());
|
|
376
|
-
builder.mActions.add(action);
|
|
377
|
-
}
|
|
378
|
-
|
|
379
|
-
}
|
|
@@ -1,141 +0,0 @@
|
|
|
1
|
-
package com.guichaguri.trackplayer.service.models;
|
|
2
|
-
|
|
3
|
-
import android.content.Context;
|
|
4
|
-
import android.net.Uri;
|
|
5
|
-
import android.os.Bundle;
|
|
6
|
-
import android.support.v4.media.MediaDescriptionCompat;
|
|
7
|
-
import android.support.v4.media.MediaMetadataCompat;
|
|
8
|
-
import android.support.v4.media.RatingCompat;
|
|
9
|
-
import android.support.v4.media.session.MediaSessionCompat.QueueItem;
|
|
10
|
-
import com.guichaguri.trackplayer.service.Utils;
|
|
11
|
-
|
|
12
|
-
import org.json.JSONObject;
|
|
13
|
-
|
|
14
|
-
import java.io.IOException;
|
|
15
|
-
import java.util.ArrayList;
|
|
16
|
-
import java.util.HashMap;
|
|
17
|
-
import java.util.List;
|
|
18
|
-
import java.util.Map;
|
|
19
|
-
|
|
20
|
-
import static android.support.v4.media.MediaMetadataCompat.*;
|
|
21
|
-
import static com.guichaguri.trackplayer.service.Utils.bundleToJson;
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* @author Guichaguri
|
|
25
|
-
*/
|
|
26
|
-
public class Track {
|
|
27
|
-
public String id;
|
|
28
|
-
public int resourceId;
|
|
29
|
-
|
|
30
|
-
public TrackType type = TrackType.DEFAULT;
|
|
31
|
-
|
|
32
|
-
public String contentType;
|
|
33
|
-
public String userAgent;
|
|
34
|
-
|
|
35
|
-
public Uri artwork;
|
|
36
|
-
|
|
37
|
-
public String title;
|
|
38
|
-
public String artist;
|
|
39
|
-
public String album;
|
|
40
|
-
public String date;
|
|
41
|
-
public String genre;
|
|
42
|
-
public long duration;
|
|
43
|
-
public Bundle originalItem;
|
|
44
|
-
public JSONObject json;
|
|
45
|
-
|
|
46
|
-
public RatingCompat rating;
|
|
47
|
-
|
|
48
|
-
public Map<String, String> headers;
|
|
49
|
-
|
|
50
|
-
public final long queueId;
|
|
51
|
-
|
|
52
|
-
public Track(Context context, Bundle bundle, int ratingType) {
|
|
53
|
-
id = bundle.getString("id");
|
|
54
|
-
|
|
55
|
-
String trackType = bundle.getString("type", "default");
|
|
56
|
-
|
|
57
|
-
for(TrackType t : TrackType.values()) {
|
|
58
|
-
if(t.name.equalsIgnoreCase(trackType)) {
|
|
59
|
-
type = t;
|
|
60
|
-
break;
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
contentType = bundle.getString("contentType");
|
|
65
|
-
userAgent = bundle.getString("userAgent");
|
|
66
|
-
|
|
67
|
-
Bundle httpHeaders = bundle.getBundle("headers");
|
|
68
|
-
if(httpHeaders != null) {
|
|
69
|
-
headers = new HashMap<>();
|
|
70
|
-
for(String header : httpHeaders.keySet()) {
|
|
71
|
-
headers.put(header, httpHeaders.getString(header));
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
setMetadata(context, bundle, ratingType);
|
|
76
|
-
|
|
77
|
-
queueId = System.currentTimeMillis();
|
|
78
|
-
json = bundleToJson(bundle);
|
|
79
|
-
originalItem = bundle;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
public void setMetadata(Context context, Bundle bundle, int ratingType) {
|
|
83
|
-
artwork = Utils.getUri(context, bundle, "artwork");
|
|
84
|
-
|
|
85
|
-
title = bundle.getString("title");
|
|
86
|
-
artist = bundle.getString("artist");
|
|
87
|
-
album = bundle.getString("album");
|
|
88
|
-
date = bundle.getString("date");
|
|
89
|
-
genre = bundle.getString("genre");
|
|
90
|
-
try {
|
|
91
|
-
duration = Utils.toMillis(bundle.getDouble("duration", 0));
|
|
92
|
-
|
|
93
|
-
}catch(Exception ex){
|
|
94
|
-
int durationInt = bundle.getInt("duration", 0);
|
|
95
|
-
duration = Utils.toMillis((long)durationInt);
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
rating = Utils.getRating(bundle, "rating", ratingType);
|
|
99
|
-
|
|
100
|
-
if (originalItem != null && originalItem != bundle)
|
|
101
|
-
originalItem.putAll(bundle);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
public MediaMetadataCompat.Builder toMediaMetadata() {
|
|
105
|
-
MediaMetadataCompat.Builder builder = new MediaMetadataCompat.Builder();
|
|
106
|
-
|
|
107
|
-
builder.putString(METADATA_KEY_TITLE, title);
|
|
108
|
-
builder.putString(METADATA_KEY_ARTIST, artist);
|
|
109
|
-
builder.putString(METADATA_KEY_ALBUM, album);
|
|
110
|
-
builder.putString(METADATA_KEY_DATE, date);
|
|
111
|
-
builder.putString(METADATA_KEY_GENRE, genre);
|
|
112
|
-
//builder.putString(METADATA_KEY_MEDIA_URI, uri.toString());
|
|
113
|
-
builder.putString(METADATA_KEY_MEDIA_ID, id);
|
|
114
|
-
|
|
115
|
-
if (duration > 0) {
|
|
116
|
-
builder.putLong(METADATA_KEY_DURATION, duration);
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
if (artwork != null) {
|
|
120
|
-
builder.putString(METADATA_KEY_ART_URI, artwork.toString());
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
if (rating != null) {
|
|
124
|
-
builder.putRating(METADATA_KEY_RATING, rating);
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
return builder;
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
public QueueItem toQueueItem() {
|
|
131
|
-
MediaDescriptionCompat descr = new MediaDescriptionCompat.Builder()
|
|
132
|
-
.setTitle(title)
|
|
133
|
-
.setSubtitle(artist)
|
|
134
|
-
.setMediaId(id)
|
|
135
|
-
//.setMediaUri(uri)
|
|
136
|
-
.setIconUri(artwork)
|
|
137
|
-
.build();
|
|
138
|
-
|
|
139
|
-
return new QueueItem(descr, queueId);
|
|
140
|
-
}
|
|
141
|
-
}
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
package com.guichaguri.trackplayer.service.models;
|
|
2
|
-
|
|
3
|
-
/**
|
|
4
|
-
* @author Guichaguri
|
|
5
|
-
*/
|
|
6
|
-
public enum TrackType {
|
|
7
|
-
|
|
8
|
-
/**
|
|
9
|
-
* The default media type. Should be used for streams over HTTP or files
|
|
10
|
-
*/
|
|
11
|
-
DEFAULT("default"),
|
|
12
|
-
|
|
13
|
-
/**
|
|
14
|
-
* The DASH media type for adaptive streams. Should be used with DASH manifests
|
|
15
|
-
*/
|
|
16
|
-
DASH("dash"),
|
|
17
|
-
|
|
18
|
-
/**
|
|
19
|
-
* The HLS media type for adaptive streams. Should be used with HLS playlists
|
|
20
|
-
*/
|
|
21
|
-
HLS("hls"),
|
|
22
|
-
|
|
23
|
-
/**
|
|
24
|
-
* The SmoothStreaming media type for adaptive streams. Should be used with SmoothStreaming manifests
|
|
25
|
-
*/
|
|
26
|
-
SMOOTH_STREAMING("smoothstreaming");
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
public final String name;
|
|
30
|
-
|
|
31
|
-
TrackType(String name) {
|
|
32
|
-
this.name = name;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
}
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|