andyshon

AbukPlayerService

Feb 14th, 2019
184
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 7.33 KB | None | 0 0
  1. package com.abuk.abook.player
  2.  
  3.  
  4. import android.app.PendingIntent
  5. import android.app.TaskStackBuilder
  6. import android.content.*
  7. import android.os.Bundle
  8. import android.support.v4.media.MediaBrowserCompat
  9. import android.support.v4.media.MediaBrowserServiceCompat
  10. import android.support.v4.media.session.MediaButtonReceiver
  11. import android.support.v4.media.session.MediaSessionCompat
  12. import android.text.TextUtils
  13. import com.abuk.abook.R
  14. import android.support.v4.media.MediaMetadataCompat
  15. import android.support.v4.media.session.PlaybackStateCompat
  16. import com.abuk.abook.event.NewQueueEvent
  17. import org.greenrobot.eventbus.EventBus
  18. import org.greenrobot.eventbus.Subscribe
  19. import org.greenrobot.eventbus.ThreadMode
  20. import android.content.Intent
  21. import android.util.Log
  22. import com.abuk.abook.Prefs
  23. import com.abuk.abook.data.model.Book
  24. import com.abuk.abook.event.NewBufferEvent
  25. import com.abuk.abook.event.UpdateQueueItem
  26. import com.abuk.abook.view.activity.PlayerActivity
  27. import android.app.ActivityManager
  28. import com.abuk.abook.ToastLogger
  29. import com.raizlabs.android.dbflow.kotlinextensions.from
  30. import com.raizlabs.android.dbflow.kotlinextensions.list
  31. import com.raizlabs.android.dbflow.kotlinextensions.select
  32.  
  33.  
  34. class PlayerService : MediaBrowserServiceCompat(),PlaybackManager.PlaybackServiceCallback {
  35.  
  36.     private lateinit var mediaSessionCompat: MediaSessionCompat
  37.    
  38.     private lateinit var playback: Playback
  39.  
  40.     private lateinit var queueManager: QueueManager
  41.     lateinit var playbackManager: PlaybackManager
  42.  
  43.     private var notificationManager:NotificationManager? = null
  44.  
  45.  
  46.  
  47.     override fun onCreate() {
  48.         super.onCreate()
  49.         playback = ExoPlayback(this)
  50.         queueManager = QueueManager(this.applicationContext, object : QueueManager.MetadataUpdateListener {
  51.             override fun onMetadataChanged(metadata: MediaMetadataCompat) {
  52.                 mediaSessionCompat.setMetadata(metadata)
  53.             }
  54.  
  55.             override fun onMetadataRetrieveError() {
  56.  
  57.             }
  58.  
  59.             override fun onCurrentQueueIndexUpdated(queueIndex: Int) {
  60.                 playbackManager.handlePlayRequest(true)
  61.  
  62.             }
  63.  
  64.             override fun onQueueUpdated(title: String, newQueue: List<MediaSessionCompat.QueueItem>) {
  65.                 mediaSessionCompat.setQueue(newQueue)
  66.                 mediaSessionCompat.setQueueTitle(title)
  67.             }
  68.         })
  69.         playbackManager = PlaybackManager(this, queueManager, playback,this)
  70.         initMediaSession()
  71.         setMediaPlaybackState(PlaybackStateCompat.STATE_PAUSED)
  72.         try {
  73.             notificationManager = NotificationManager(this)
  74.         } catch (e: Exception) {
  75.             throw IllegalStateException("Could not create a MediaNotificationManager", e)
  76.         }
  77. //        val book = EventBus.getDefault().getStickyEvent(Book::class.java)
  78.         try {
  79.             val book = (select from Book::class).list[0]
  80.             book.chapters = book.localChapters
  81. //        book.authors = book.localAuthors
  82.             if (book != null){
  83.                 queueManager.setCurrentQueue(book)
  84.                 val pr = Prefs(this)
  85.                 if (pr.isFirstPlay()) {
  86.                     playbackManager.handlePlayRequest(true,resetStop = true)
  87.                     pr.setFirstPlay()
  88.                 }else{
  89.                     playbackManager.handlePlayRequest(false,resetStop = true)
  90.                 }
  91.  
  92.             }
  93.         } catch (e: Exception) {
  94.         }
  95.         EventBus.getDefault().register(this)
  96.         ToastLogger.log("create")
  97.     }
  98.  
  99.     override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
  100.         MediaButtonReceiver.handleIntent(mediaSessionCompat,intent)
  101.         ToastLogger.log("action" )
  102.         return super.onStartCommand(intent, flags, startId)
  103.     }
  104.  
  105.  
  106.     private fun initMediaSession() {
  107.         val mediaButtonReceiver = ComponentName(applicationContext, MediaButtonReceiver::class.java)
  108.         mediaSessionCompat = MediaSessionCompat(applicationContext, "Tag", mediaButtonReceiver, null)
  109.         mediaSessionCompat.setCallback(playbackManager.mediaSessionCallback)
  110.         mediaSessionCompat.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS or MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS)
  111.         val mediaButtonIntent = Intent(Intent.ACTION_MEDIA_BUTTON)
  112.         mediaButtonIntent.setClass(this, MediaButtonReceiver::class.java)
  113.         val pendingIntent = PendingIntent.getBroadcast(this, 0, mediaButtonIntent, 0)
  114.         mediaSessionCompat.setMediaButtonReceiver(pendingIntent)
  115.         val intent = Intent(this, PlayerActivity::class.java)
  116.         val stackBuilder = TaskStackBuilder.create(this)
  117.         stackBuilder.addNextIntentWithParentStack(intent)
  118.         val pi = stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT)
  119.         mediaSessionCompat.setSessionActivity(pi)
  120.         mediaSessionCompat.isActive = true
  121.         sessionToken = mediaSessionCompat.sessionToken
  122.     }
  123.  
  124.     private fun setMediaPlaybackState(state: Int) {
  125.         val playbackstateBuilder = PlaybackStateCompat.Builder()
  126.         if (state == PlaybackStateCompat.STATE_PLAYING) {
  127.             playbackstateBuilder.setActions(PlaybackStateCompat.ACTION_PLAY_PAUSE or PlaybackStateCompat.ACTION_PAUSE)
  128.         } else {
  129.             playbackstateBuilder.setActions(PlaybackStateCompat.ACTION_PLAY_PAUSE or PlaybackStateCompat.ACTION_PLAY)
  130.         }
  131.         playbackstateBuilder.setState(state, PlaybackStateCompat.PLAYBACK_POSITION_UNKNOWN, 0f)
  132.         mediaSessionCompat.setPlaybackState(playbackstateBuilder.build())
  133.     }
  134.  
  135.     override fun onDestroy() {
  136.         ToastLogger.log("destroy")
  137.         super.onDestroy()
  138.         playback.release()
  139.         mediaSessionCompat.release()
  140.         notificationManager?.stopNotification()
  141.         EventBus.getDefault().unregister(this)
  142.     }
  143.  
  144.     override fun onTaskRemoved(rootIntent: Intent?) {
  145.         super.onTaskRemoved(rootIntent)
  146.         stopPlayer()
  147.     }
  148.  
  149.  
  150.     fun stopPlayer(){
  151.         if (notificationManager?.foreground != true)stopSelf()
  152.     }
  153.  
  154.     override fun onNotificationRequired() {
  155.         notificationManager?.startNotification()
  156.  
  157.     }
  158.  
  159.     override fun onPlaybackStateUpdated(newState: PlaybackStateCompat) {
  160.         mediaSessionCompat.setPlaybackState(newState)
  161.     }
  162.  
  163.     @Subscribe(threadMode = ThreadMode.MAIN)
  164.     fun onQueueChange(queue: NewQueueEvent) {
  165. //        queueManager.setCurrentQueue(queue.title,queue.queue,queue.startItem.toString())
  166. //        queueManager.updateMetadata()
  167. //        playbackManager.handlePlayRequest(false)
  168.     }
  169.     @Subscribe(threadMode = ThreadMode.MAIN)
  170.     fun onQueueChange(update: UpdateQueueItem) {
  171.         queueManager.updateItem(update.item)
  172.     }
  173.     @Subscribe(threadMode = ThreadMode.MAIN)
  174.     fun onBuf(buffering: NewBufferEvent) {
  175.         (playback as? ExoPlayback)?.bufferListener = buffering.onBufferingUpdateListener
  176.     }
  177.  
  178.  
  179.     override fun onLoadChildren(parentId: String, result: Result<MutableList<MediaBrowserCompat.MediaItem>>) {
  180.         result.sendResult(null)
  181.     }
  182.  
  183.     override fun onGetRoot(clientPackageName: String, clientUid: Int, rootHints: Bundle?): BrowserRoot? {
  184.         return if (TextUtils.equals(clientPackageName, packageName)) {
  185.             MediaBrowserServiceCompat.BrowserRoot(getString(R.string.app_name), null)
  186.         } else null
  187.     }
  188. }
Advertisement
Add Comment
Please, Sign In to add comment