@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
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
package com.guichaguri.trackplayer.service
|
|
2
|
+
|
|
3
|
+
import android.app.NotificationChannel
|
|
4
|
+
import android.app.NotificationManager
|
|
5
|
+
import android.content.ContentResolver
|
|
6
|
+
import android.content.Context
|
|
7
|
+
import android.net.Uri
|
|
8
|
+
import android.os.Build
|
|
9
|
+
import android.os.Bundle
|
|
10
|
+
import android.support.v4.media.RatingCompat
|
|
11
|
+
import android.support.v4.media.session.PlaybackStateCompat
|
|
12
|
+
import android.util.Log
|
|
13
|
+
import com.facebook.react.bridge.Promise
|
|
14
|
+
import com.facebook.react.views.imagehelper.ResourceDrawableIdHelper
|
|
15
|
+
import org.json.JSONException
|
|
16
|
+
import org.json.JSONObject
|
|
17
|
+
import java.util.*
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* @author Guichaguri
|
|
21
|
+
*/
|
|
22
|
+
object Utils {
|
|
23
|
+
const val EVENT_INTENT = "com.guichaguri.trackplayer.event"
|
|
24
|
+
const val CONNECT_INTENT = "com.guichaguri.trackplayer.connect"
|
|
25
|
+
const val NOTIFICATION_CHANNEL = "com.guichaguri.trackplayer"
|
|
26
|
+
const val LOG = "RNTrackPlayer"
|
|
27
|
+
fun toRunnable(promise: Promise): Runnable {
|
|
28
|
+
return Runnable { promise.resolve(null) }
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
fun toMillis(seconds: Double): Long {
|
|
32
|
+
return (seconds * 1000).toLong()
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
fun toSeconds(millis: Long): Double {
|
|
36
|
+
return millis / 1000.0
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
fun isLocal(uri: Uri?): Boolean {
|
|
40
|
+
if (uri == null) return false
|
|
41
|
+
val scheme = uri.scheme
|
|
42
|
+
val host = uri.host
|
|
43
|
+
return (scheme == null || scheme == ContentResolver.SCHEME_FILE ||
|
|
44
|
+
scheme == ContentResolver.SCHEME_ANDROID_RESOURCE ||
|
|
45
|
+
scheme == ContentResolver.SCHEME_CONTENT || scheme == "res" ||
|
|
46
|
+
host == null || host == "localhost" || host == "127.0.0.1" ||
|
|
47
|
+
host == "[::1]")
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
fun getUri(context: Context, data: Bundle, key: String?): Uri? {
|
|
51
|
+
if (!data.containsKey(key)) return null
|
|
52
|
+
// val obj = data[key]
|
|
53
|
+
var obj : String = data[key] as String
|
|
54
|
+
if (obj.endsWith(".mp3", ignoreCase = true) || obj.trim { it <= ' ' }.isEmpty()) {
|
|
55
|
+
obj = if (data["sourceData"] != null) {
|
|
56
|
+
data["sourceData"] as String
|
|
57
|
+
} else {
|
|
58
|
+
"https://dl.espressif.com/dl/audio/ff-16b-2c-44100hz.mp3"
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
Log.d("setPlayer uri pre: ", obj)
|
|
62
|
+
if (obj is String) {
|
|
63
|
+
// Remote or Local Uri
|
|
64
|
+
if (obj.trim { it <= ' ' }.isEmpty()) throw RuntimeException("The URL cannot be empty")
|
|
65
|
+
return Uri.parse(obj as String?)
|
|
66
|
+
}
|
|
67
|
+
/* else if (obj is Bundle) {
|
|
68
|
+
// require/import
|
|
69
|
+
val uri = obj.getString("uri")
|
|
70
|
+
val helper = ResourceDrawableIdHelper.getInstance()
|
|
71
|
+
val id = helper.getResourceDrawableId(context, uri)
|
|
72
|
+
return if (id > 0) {
|
|
73
|
+
// In production, we can obtain the resource uri
|
|
74
|
+
val res = context.resources
|
|
75
|
+
Uri.Builder()
|
|
76
|
+
.scheme(ContentResolver.SCHEME_ANDROID_RESOURCE)
|
|
77
|
+
.authority(res.getResourcePackageName(id))
|
|
78
|
+
.appendPath(res.getResourceTypeName(id))
|
|
79
|
+
.appendPath(res.getResourceEntryName(id))
|
|
80
|
+
.build()
|
|
81
|
+
} else {
|
|
82
|
+
// During development, the resources might come directly from the metro server
|
|
83
|
+
Uri.parse(uri)
|
|
84
|
+
}
|
|
85
|
+
}*/
|
|
86
|
+
return null
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
fun getRawResourceId(context: Context, data: Bundle, key: String?): Int {
|
|
90
|
+
if (!data.containsKey(key)) return 0
|
|
91
|
+
val obj = data[key] as? Bundle ?: return 0
|
|
92
|
+
var name = obj.getString("uri")
|
|
93
|
+
if (name == null || name.isEmpty()) return 0
|
|
94
|
+
name = name.lowercase(Locale.getDefault()).replace("-", "_")
|
|
95
|
+
return try {
|
|
96
|
+
name.toInt()
|
|
97
|
+
} catch (ex: NumberFormatException) {
|
|
98
|
+
context.resources.getIdentifier(name, "raw", context.packageName)
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
fun isPlaying(state: Int): Boolean {
|
|
103
|
+
return state == PlaybackStateCompat.STATE_PLAYING || state == PlaybackStateCompat.STATE_BUFFERING
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
fun isPaused(state: Int): Boolean {
|
|
107
|
+
return state == PlaybackStateCompat.STATE_PAUSED || state == PlaybackStateCompat.STATE_CONNECTING
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
fun isStopped(state: Int): Boolean {
|
|
111
|
+
return state == PlaybackStateCompat.STATE_NONE || state == PlaybackStateCompat.STATE_STOPPED
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
fun getRating(data: Bundle, key: String?, ratingType: Int): RatingCompat {
|
|
115
|
+
Log.d("convertedMediaItems", "convertedMediaItems setNowPlaying getRating")
|
|
116
|
+
return if (!data.containsKey(key) || ratingType == RatingCompat.RATING_NONE) {
|
|
117
|
+
Log.d("convertedMediaItems", "convertedMediaItems setNowPlaying getRating ratingType: " + ratingType)
|
|
118
|
+
Log.d("convertedMediaItems", "convertedMediaItems setNowPlaying getRating rating: " + RatingCompat.newUnratedRating(ratingType))
|
|
119
|
+
RatingCompat.newUnratedRating(RatingCompat.RATING_HEART)
|
|
120
|
+
} else if (ratingType == RatingCompat.RATING_HEART) {
|
|
121
|
+
RatingCompat.newHeartRating(data.getBoolean(key, true))
|
|
122
|
+
} else if (ratingType == RatingCompat.RATING_THUMB_UP_DOWN) {
|
|
123
|
+
RatingCompat.newThumbRating(data.getBoolean(key, true))
|
|
124
|
+
} else if (ratingType == RatingCompat.RATING_PERCENTAGE) {
|
|
125
|
+
RatingCompat.newPercentageRating(data.getFloat(key, 0f))
|
|
126
|
+
} else {
|
|
127
|
+
RatingCompat.newStarRating(ratingType, data.getFloat(key, 0f))
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
fun setRating(data: Bundle, key: String?, rating: RatingCompat) {
|
|
132
|
+
if (!rating.isRated) return
|
|
133
|
+
val ratingType = rating.ratingStyle
|
|
134
|
+
if (ratingType == RatingCompat.RATING_HEART) {
|
|
135
|
+
data.putBoolean(key, rating.hasHeart())
|
|
136
|
+
} else if (ratingType == RatingCompat.RATING_THUMB_UP_DOWN) {
|
|
137
|
+
data.putBoolean(key, rating.isThumbUp)
|
|
138
|
+
} else if (ratingType == RatingCompat.RATING_PERCENTAGE) {
|
|
139
|
+
data.putDouble(key, rating.percentRating.toDouble())
|
|
140
|
+
} else {
|
|
141
|
+
data.putDouble(key, rating.starRating.toDouble())
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
fun getInt(data: Bundle, key: String?, defaultValue: Int): Int {
|
|
146
|
+
val value = data[key]
|
|
147
|
+
return if (value is Number) {
|
|
148
|
+
value.toInt()
|
|
149
|
+
} else defaultValue
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
fun getNotificationChannel(context: Context): String {
|
|
153
|
+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
154
|
+
val channel = NotificationChannel(
|
|
155
|
+
NOTIFICATION_CHANNEL,
|
|
156
|
+
"MusicService",
|
|
157
|
+
NotificationManager.IMPORTANCE_DEFAULT
|
|
158
|
+
)
|
|
159
|
+
channel.setShowBadge(false)
|
|
160
|
+
channel.setSound(null, null)
|
|
161
|
+
(context.getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager).createNotificationChannel(
|
|
162
|
+
channel
|
|
163
|
+
)
|
|
164
|
+
}
|
|
165
|
+
return NOTIFICATION_CHANNEL
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
fun bundleToJson(bundle: Bundle): JSONObject {
|
|
169
|
+
val json = JSONObject()
|
|
170
|
+
val keys = bundle.keySet()
|
|
171
|
+
for (key in keys) {
|
|
172
|
+
try {
|
|
173
|
+
// json.put(key, bundle.get(key)); see edit below
|
|
174
|
+
json.put(key, JSONObject.wrap(bundle[key]))
|
|
175
|
+
} catch (e: JSONException) {
|
|
176
|
+
//Handle exception here
|
|
177
|
+
Log.d(LOG, "bundleToJson: Something went wrong, creating json")
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
return json
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
fun jsonStringToBundle(jsonString: String): Bundle? {
|
|
184
|
+
try {
|
|
185
|
+
val jsonObject = toJsonObject(jsonString)
|
|
186
|
+
return jsonToBundle(jsonObject)
|
|
187
|
+
} catch (ignored: JSONException) {
|
|
188
|
+
}
|
|
189
|
+
return null
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
@Throws(JSONException::class)
|
|
193
|
+
private fun toJsonObject(jsonString: String): JSONObject {
|
|
194
|
+
return JSONObject(jsonString)
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
@Throws(JSONException::class)
|
|
198
|
+
private fun jsonToBundle(jsonObject: JSONObject): Bundle {
|
|
199
|
+
val bundle = Bundle()
|
|
200
|
+
val iter: Iterator<*> = jsonObject.keys()
|
|
201
|
+
while (iter.hasNext()) {
|
|
202
|
+
val key = iter.next() as String
|
|
203
|
+
if (key == "capabilities" || key == "compactCapabilities") {
|
|
204
|
+
// this check should be more generic but is functional for now.
|
|
205
|
+
val value = ArrayList<Int>()
|
|
206
|
+
val jsonArray = jsonObject.getJSONArray(key)
|
|
207
|
+
val len = jsonArray.length()
|
|
208
|
+
for (i in 0 until len) {
|
|
209
|
+
value.add(jsonArray.getInt(i))
|
|
210
|
+
}
|
|
211
|
+
bundle.putIntegerArrayList(key, value)
|
|
212
|
+
} else if (key == "duration") {
|
|
213
|
+
// this check should be in Track
|
|
214
|
+
try {
|
|
215
|
+
val value = jsonObject.getInt(key)
|
|
216
|
+
bundle.putInt(key, value)
|
|
217
|
+
} catch (ex: Exception) {
|
|
218
|
+
val value = jsonObject.getDouble(key)
|
|
219
|
+
bundle.putDouble(key, value)
|
|
220
|
+
}
|
|
221
|
+
} else {
|
|
222
|
+
val value = jsonObject.getString(key)
|
|
223
|
+
bundle.putString(key, value)
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return bundle
|
|
227
|
+
}
|
|
228
|
+
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
package com.guichaguri.trackplayer.service.metadata
|
|
2
|
+
|
|
3
|
+
import android.annotation.SuppressLint
|
|
4
|
+
import android.os.Bundle
|
|
5
|
+
import android.provider.MediaStore
|
|
6
|
+
import android.support.v4.media.RatingCompat
|
|
7
|
+
import android.support.v4.media.session.MediaSessionCompat
|
|
8
|
+
import android.support.v4.media.session.PlaybackStateCompat
|
|
9
|
+
import com.guichaguri.trackplayer.module.MusicEvents
|
|
10
|
+
import com.guichaguri.trackplayer.service.MusicManager
|
|
11
|
+
import com.guichaguri.trackplayer.service.MusicService
|
|
12
|
+
import com.guichaguri.trackplayer.service.Utils
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @author Guichaguri
|
|
16
|
+
*/
|
|
17
|
+
class ButtonEvents(service: MusicService, manager: MusicManager) : MediaSessionCompat.Callback() {
|
|
18
|
+
private val service: MusicService
|
|
19
|
+
private val manager: MusicManager
|
|
20
|
+
|
|
21
|
+
init {
|
|
22
|
+
this.service = service
|
|
23
|
+
this.manager = manager
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
override fun onPlay() {
|
|
27
|
+
manager.onPlay()
|
|
28
|
+
manager.setState(PlaybackStateCompat.STATE_PLAYING, -1)
|
|
29
|
+
service.emit(MusicEvents.BUTTON_PLAY, null)
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
override fun onPause() {
|
|
33
|
+
manager.onPause()
|
|
34
|
+
manager.setState(PlaybackStateCompat.STATE_PAUSED, -1)
|
|
35
|
+
service.emit(MusicEvents.BUTTON_PAUSE, null)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
override fun onStop() {
|
|
39
|
+
manager.onStop()
|
|
40
|
+
manager.setState(PlaybackStateCompat.STATE_STOPPED, -1)
|
|
41
|
+
service.emit(MusicEvents.BUTTON_STOP, null)
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
override fun onPlayFromMediaId(mediaId: String, extras: Bundle) {
|
|
45
|
+
val bundle = Bundle()
|
|
46
|
+
bundle.putString("id", mediaId)
|
|
47
|
+
service.emit(MusicEvents.BUTTON_PLAY_FROM_ID, bundle)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
@SuppressLint("InlinedApi")
|
|
51
|
+
override fun onPlayFromSearch(query: String, extras: Bundle) {
|
|
52
|
+
val bundle = Bundle()
|
|
53
|
+
bundle.putString("query", query)
|
|
54
|
+
if (extras.containsKey(MediaStore.EXTRA_MEDIA_FOCUS)) {
|
|
55
|
+
var focus = extras.getString(MediaStore.EXTRA_MEDIA_FOCUS)
|
|
56
|
+
if (MediaStore.Audio.Artists.ENTRY_CONTENT_TYPE == focus) {
|
|
57
|
+
focus = "artist"
|
|
58
|
+
} else if (MediaStore.Audio.Albums.ENTRY_CONTENT_TYPE == focus) {
|
|
59
|
+
focus = "album"
|
|
60
|
+
} else if (MediaStore.Audio.Playlists.ENTRY_CONTENT_TYPE == focus) {
|
|
61
|
+
focus = "playlist"
|
|
62
|
+
} else if (MediaStore.Audio.Genres.ENTRY_CONTENT_TYPE == focus) {
|
|
63
|
+
focus = "genre"
|
|
64
|
+
} else if (MediaStore.Audio.Media.ENTRY_CONTENT_TYPE == focus) {
|
|
65
|
+
focus = "title"
|
|
66
|
+
}
|
|
67
|
+
bundle.putString("focus", focus)
|
|
68
|
+
}
|
|
69
|
+
if (extras.containsKey(MediaStore.EXTRA_MEDIA_TITLE)) bundle.putString(
|
|
70
|
+
"title", extras.getString(
|
|
71
|
+
MediaStore.EXTRA_MEDIA_TITLE
|
|
72
|
+
)
|
|
73
|
+
)
|
|
74
|
+
if (extras.containsKey(MediaStore.EXTRA_MEDIA_ARTIST)) bundle.putString(
|
|
75
|
+
"artist", extras.getString(
|
|
76
|
+
MediaStore.EXTRA_MEDIA_ARTIST
|
|
77
|
+
)
|
|
78
|
+
)
|
|
79
|
+
if (extras.containsKey(MediaStore.EXTRA_MEDIA_ALBUM)) bundle.putString(
|
|
80
|
+
"album", extras.getString(
|
|
81
|
+
MediaStore.EXTRA_MEDIA_ALBUM
|
|
82
|
+
)
|
|
83
|
+
)
|
|
84
|
+
if (extras.containsKey(MediaStore.EXTRA_MEDIA_GENRE)) bundle.putString(
|
|
85
|
+
"genre", extras.getString(
|
|
86
|
+
MediaStore.EXTRA_MEDIA_GENRE
|
|
87
|
+
)
|
|
88
|
+
)
|
|
89
|
+
if (extras.containsKey(MediaStore.EXTRA_MEDIA_PLAYLIST)) bundle.putString(
|
|
90
|
+
"playlist", extras.getString(
|
|
91
|
+
MediaStore.EXTRA_MEDIA_PLAYLIST
|
|
92
|
+
)
|
|
93
|
+
)
|
|
94
|
+
service.emit(MusicEvents.BUTTON_PLAY_FROM_SEARCH, bundle)
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
override fun onSkipToQueueItem(id: Long) {
|
|
98
|
+
/*List<Track> tracks = manager.getPlayback().getQueue();
|
|
99
|
+
|
|
100
|
+
for(Track track : tracks) {
|
|
101
|
+
if(track.queueId != id) continue;
|
|
102
|
+
|
|
103
|
+
Bundle bundle = new Bundle();
|
|
104
|
+
bundle.putString("id", track.id);
|
|
105
|
+
service.emit(MusicEvents.BUTTON_SKIP, bundle);
|
|
106
|
+
break;
|
|
107
|
+
}*/
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
override fun onSkipToPrevious() {
|
|
111
|
+
service.emit(MusicEvents.BUTTON_SKIP_PREVIOUS, null)
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
override fun onSkipToNext() {
|
|
115
|
+
service.emit(MusicEvents.BUTTON_SKIP_NEXT, null)
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
override fun onRewind() {
|
|
119
|
+
val bundle = Bundle()
|
|
120
|
+
bundle.putInt("interval", manager.metadata.jumpInterval)
|
|
121
|
+
service.emit(MusicEvents.BUTTON_JUMP_BACKWARD, bundle)
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
override fun onFastForward() {
|
|
125
|
+
val bundle = Bundle()
|
|
126
|
+
bundle.putInt("interval", manager.metadata.jumpInterval)
|
|
127
|
+
service.emit(MusicEvents.BUTTON_JUMP_FORWARD, bundle)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
override fun onSeekTo(pos: Long) {
|
|
131
|
+
val bundle = Bundle()
|
|
132
|
+
bundle.putDouble("position", Utils.toSeconds(pos))
|
|
133
|
+
service.emit(MusicEvents.BUTTON_SEEK_TO, bundle)
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
override fun onSetRating(rating: RatingCompat) {
|
|
137
|
+
val bundle = Bundle()
|
|
138
|
+
Utils.setRating(bundle, "rating", rating)
|
|
139
|
+
service.emit(MusicEvents.BUTTON_SET_RATING, bundle)
|
|
140
|
+
}
|
|
141
|
+
}
|