@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.
Files changed (131) hide show
  1. package/android/build.gradle +61 -4
  2. package/android/src/main/AndroidManifest.xml +2 -4
  3. package/android/src/main/ic_home-playstore.png +0 -0
  4. package/android/src/main/ic_repeat-playstore.png +0 -0
  5. package/android/src/main/ic_repeat_50-playstore.png +0 -0
  6. package/android/src/main/ic_shuffle-playstore.png +0 -0
  7. package/android/src/main/ic_shuffle_50-playstore.png +0 -0
  8. package/android/src/main/ic_shuffle_sm-playstore.png +0 -0
  9. package/android/src/main/ic_stop-playstore.png +0 -0
  10. package/android/src/main/ic_test-playstore.png +0 -0
  11. package/android/src/main/java/com/guichaguri/trackplayer/{service/HeadlessJsMediaService.java → HeadlessJsMediaService.java} +83 -32
  12. package/android/src/main/java/com/guichaguri/trackplayer/TrackPlayer.kt +25 -0
  13. package/android/src/main/java/com/guichaguri/trackplayer/extensions/AudioPlayerStateExt.kt +19 -0
  14. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/event/EventHolder.kt +30 -0
  15. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/event/NotificationEventHolder.kt +20 -0
  16. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/event/PlayerEventHolder.kt +111 -0
  17. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/AAMediaSessionCallback.kt +10 -0
  18. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/AudioContentType.kt +10 -0
  19. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/AudioItem.kt +66 -0
  20. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/AudioItemTransitionReason.kt +33 -0
  21. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/AudioPlayerState.kt +30 -0
  22. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/BufferConfig.kt +8 -0
  23. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/CacheConfig.kt +17 -0
  24. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/Capability.kt +19 -0
  25. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/FocusChangeData.kt +3 -0
  26. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/MediaSessionCallback.kt +17 -0
  27. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/NotificationConfig.kt +43 -0
  28. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/NotificationMetadata.kt +8 -0
  29. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/NotificationState.kt +8 -0
  30. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/PlayWhenReadyChangeData.kt +5 -0
  31. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/PlaybackEndedReason.kt +5 -0
  32. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/PlaybackError.kt +6 -0
  33. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/PlaybackMetadata.kt +200 -0
  34. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/PlayerConfig.kt +33 -0
  35. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/PlayerOptions.kt +9 -0
  36. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/PositionChangedReason.kt +39 -0
  37. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/models/QueuedPlayerOptions.kt +49 -0
  38. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/notification/NotificationManager.kt +678 -0
  39. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/players/AudioPlayer.kt +10 -0
  40. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/players/BaseAudioPlayer.kt +864 -0
  41. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/players/QueuedAudioPlayer.kt +269 -0
  42. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/players/components/MediaSourceExt.kt +35 -0
  43. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/players/components/PlayerCache.kt +26 -0
  44. package/android/src/main/java/com/guichaguri/trackplayer/kotlinaudio/utils/Utils.kt +12 -0
  45. package/android/src/main/java/com/guichaguri/trackplayer/model/MetadataAdapter.kt +224 -0
  46. package/android/src/main/java/com/guichaguri/trackplayer/model/State.kt +13 -0
  47. package/android/src/main/java/com/guichaguri/trackplayer/model/Track.kt +120 -0
  48. package/android/src/main/java/com/guichaguri/trackplayer/model/TrackAudioItem.kt +19 -0
  49. package/android/src/main/java/com/guichaguri/trackplayer/model/TrackType.kt +11 -0
  50. package/android/src/main/java/com/guichaguri/trackplayer/module/AutoConnectionDetector.kt +151 -0
  51. package/android/src/main/java/com/guichaguri/trackplayer/module/MusicEvents.kt +66 -0
  52. package/android/src/main/java/com/guichaguri/trackplayer/module/MusicModule.kt +1192 -0
  53. package/android/src/main/java/com/guichaguri/trackplayer/service/BundleUtils.kt +117 -0
  54. package/android/src/main/java/com/guichaguri/trackplayer/service/MusicBinder.kt +31 -0
  55. package/android/src/main/java/com/guichaguri/trackplayer/service/MusicManager.kt +347 -0
  56. package/android/src/main/java/com/guichaguri/trackplayer/service/MusicService.kt +1268 -0
  57. package/android/src/main/java/com/guichaguri/trackplayer/service/Utils.kt +228 -0
  58. package/android/src/main/java/com/guichaguri/trackplayer/service/metadata/ButtonEvents.kt +141 -0
  59. package/android/src/main/java/com/guichaguri/trackplayer/service/metadata/MetadataManager.kt +396 -0
  60. package/android/src/main/res/drawable-hdpi/ic_home.png +0 -0
  61. package/android/src/main/res/drawable-mdpi/ic_home.png +0 -0
  62. package/android/src/main/res/drawable-xhdpi/ic_home.png +0 -0
  63. package/android/src/main/res/drawable-xxhdpi/ic_home.png +0 -0
  64. package/android/src/main/res/drawable-xxxhdpi/ic_home.png +0 -0
  65. package/android/src/main/res/mipmap-hdpi/ic_arrow_down_circle_foreground.png +0 -0
  66. package/android/src/main/res/mipmap-hdpi/ic_clock_now_foreground.png +0 -0
  67. package/android/src/main/res/mipmap-hdpi/ic_close_foreground.png +0 -0
  68. package/android/src/main/res/mipmap-hdpi/ic_heart_foreground.png +0 -0
  69. package/android/src/main/res/mipmap-hdpi/ic_heart_outlined_foreground.png +0 -0
  70. package/android/src/main/res/mipmap-hdpi/ic_repeat_off_foreground.png +0 -0
  71. package/android/src/main/res/mipmap-hdpi/ic_repeat_on_foreground.png +0 -0
  72. package/android/src/main/res/mipmap-hdpi/ic_shuffle_off_foreground.png +0 -0
  73. package/android/src/main/res/mipmap-hdpi/ic_shuffle_on_foreground.png +0 -0
  74. package/android/src/main/res/mipmap-mdpi/ic_arrow_down_circle_foreground.png +0 -0
  75. package/android/src/main/res/mipmap-mdpi/ic_clock_now_foreground.png +0 -0
  76. package/android/src/main/res/mipmap-mdpi/ic_close_foreground.png +0 -0
  77. package/android/src/main/res/mipmap-mdpi/ic_heart_foreground.png +0 -0
  78. package/android/src/main/res/mipmap-mdpi/ic_heart_outlined_foreground.png +0 -0
  79. package/android/src/main/res/mipmap-mdpi/ic_repeat_off_foreground.png +0 -0
  80. package/android/src/main/res/mipmap-mdpi/ic_repeat_on_foreground.png +0 -0
  81. package/android/src/main/res/mipmap-mdpi/ic_shuffle_off_foreground.png +0 -0
  82. package/android/src/main/res/mipmap-mdpi/ic_shuffle_on_foreground.png +0 -0
  83. package/android/src/main/res/mipmap-xhdpi/ic_arrow_down_circle_foreground.png +0 -0
  84. package/android/src/main/res/mipmap-xhdpi/ic_clock_now_foreground.png +0 -0
  85. package/android/src/main/res/mipmap-xhdpi/ic_close_foreground.png +0 -0
  86. package/android/src/main/res/mipmap-xhdpi/ic_heart_foreground.png +0 -0
  87. package/android/src/main/res/mipmap-xhdpi/ic_heart_outlined_foreground.png +0 -0
  88. package/android/src/main/res/mipmap-xhdpi/ic_repeat_off_foreground.png +0 -0
  89. package/android/src/main/res/mipmap-xhdpi/ic_repeat_on_foreground.png +0 -0
  90. package/android/src/main/res/mipmap-xhdpi/ic_shuffle_off_foreground.png +0 -0
  91. package/android/src/main/res/mipmap-xhdpi/ic_shuffle_on_foreground.png +0 -0
  92. package/android/src/main/res/mipmap-xxhdpi/ic_arrow_down_circle_foreground.png +0 -0
  93. package/android/src/main/res/mipmap-xxhdpi/ic_clock_now_foreground.png +0 -0
  94. package/android/src/main/res/mipmap-xxhdpi/ic_close_foreground.png +0 -0
  95. package/android/src/main/res/mipmap-xxhdpi/ic_heart_foreground.png +0 -0
  96. package/android/src/main/res/mipmap-xxhdpi/ic_heart_outlined_foreground.png +0 -0
  97. package/android/src/main/res/mipmap-xxhdpi/ic_repeat_off_foreground.png +0 -0
  98. package/android/src/main/res/mipmap-xxhdpi/ic_repeat_on_foreground.png +0 -0
  99. package/android/src/main/res/mipmap-xxhdpi/ic_shuffle_off_foreground.png +0 -0
  100. package/android/src/main/res/mipmap-xxhdpi/ic_shuffle_on_foreground.png +0 -0
  101. package/android/src/main/res/mipmap-xxxhdpi/ic_arrow_down_circle_foreground.png +0 -0
  102. package/android/src/main/res/mipmap-xxxhdpi/ic_clock_now_foreground.png +0 -0
  103. package/android/src/main/res/mipmap-xxxhdpi/ic_close_foreground.png +0 -0
  104. package/android/src/main/res/mipmap-xxxhdpi/ic_heart_foreground.png +0 -0
  105. package/android/src/main/res/mipmap-xxxhdpi/ic_heart_outlined_foreground.png +0 -0
  106. package/android/src/main/res/mipmap-xxxhdpi/ic_repeat_off_foreground.png +0 -0
  107. package/android/src/main/res/mipmap-xxxhdpi/ic_repeat_on_foreground.png +0 -0
  108. package/android/src/main/res/mipmap-xxxhdpi/ic_shuffle_off_foreground.png +0 -0
  109. package/android/src/main/res/mipmap-xxxhdpi/ic_shuffle_on_foreground.png +0 -0
  110. package/android/src/main/res/raw/silent_5_seconds.mp3 +0 -0
  111. package/android/src/main/res/strings.xml +6 -0
  112. package/android/src/main/res/values/strings.xml +6 -0
  113. package/index.d.ts +62 -1
  114. package/lib/index.js +10 -9
  115. package/package.json +1 -1
  116. package/android/src/main/java/com/guichaguri/trackplayer/TrackPlayer.java +0 -28
  117. package/android/src/main/java/com/guichaguri/trackplayer/module/MusicEvents.java +0 -55
  118. package/android/src/main/java/com/guichaguri/trackplayer/module/MusicModule.java +0 -298
  119. package/android/src/main/java/com/guichaguri/trackplayer/service/MusicBinder.java +0 -47
  120. package/android/src/main/java/com/guichaguri/trackplayer/service/MusicManager.java +0 -383
  121. package/android/src/main/java/com/guichaguri/trackplayer/service/MusicService.java +0 -271
  122. package/android/src/main/java/com/guichaguri/trackplayer/service/Utils.java +0 -243
  123. package/android/src/main/java/com/guichaguri/trackplayer/service/metadata/ButtonEvents.java +0 -148
  124. package/android/src/main/java/com/guichaguri/trackplayer/service/metadata/MetadataManager.java +0 -379
  125. package/android/src/main/java/com/guichaguri/trackplayer/service/models/Track.java +0 -141
  126. package/android/src/main/java/com/guichaguri/trackplayer/service/models/TrackType.java +0 -35
  127. package/android/src/main/res/drawable-hdpi/ic_logo.png +0 -0
  128. package/android/src/main/res/drawable-mdpi/ic_logo.png +0 -0
  129. package/android/src/main/res/drawable-xhdpi/ic_logo.png +0 -0
  130. package/android/src/main/res/drawable-xxhdpi/ic_logo.png +0 -0
  131. 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
+ }