@Override
 public void onSongChanged(Song song) {
   mHandler.removeTargettedMessages(CHANGES_COMPLETE_INTERNAL);
   if (shouldHandleMessage(SONG_CHANGED)) {
     mPlugin.onSongChanged(song);
   } else {
     mHandler.obtainTargettedMessage(SONG_CHANGED, song).sendToTarget();
   }
   mHandler.sendTargettedEmptyMessage(CHANGES_COMPLETE_INTERNAL);
 }
 @Override
 public void onPendingIntentChanged(PendingIntent pending) {
   mHandler.removeTargettedMessages(CHANGES_COMPLETE_INTERNAL);
   if (shouldHandleMessage(INTENT_CHANGED)) {
     mPlugin.onPendingIntentChanged(pending);
   } else {
     mHandler.obtainTargettedMessage(INTENT_CHANGED, pending).sendToTarget();
   }
   mHandler.sendTargettedEmptyMessage(CHANGES_COMPLETE_INTERNAL);
 }
 @Override
 public void onPlayerHaterLoaded(Context context, PlayerHater playerHater) {
   if (shouldHandleMessage(PLAYER_HATER_LOADED)) {
     mPlugin.onPlayerHaterLoaded(context, playerHater);
   } else {
     mHandler
         .obtainTargettedMessage(PLAYER_HATER_LOADED, new LoadedObject(context, playerHater))
         .sendToTarget();
   }
 }
 @Override
 public void onSongFinished(Song song, int reason) {
   mHandler.removeTargettedMessages(CHANGES_COMPLETE_INTERNAL);
   if (shouldHandleMessage(SONG_FINISHED)) {
     mPlugin.onSongFinished(song, reason);
   } else {
     mHandler.obtainTargettedMessage(SONG_FINISHED, reason, 0, song).sendToTarget();
   }
   mHandler.sendTargettedEmptyMessage(CHANGES_COMPLETE_INTERNAL);
 }
 @Override
 public void onNextSongAvailable(Song nextTrack) {
   mHandler.removeTargettedMessages(CHANGES_COMPLETE_INTERNAL);
   if (shouldHandleMessage(NEXT_TRACK_AVAILABLE)) {
     mPlugin.onNextSongAvailable(nextTrack);
   } else {
     mHandler.obtainTargettedMessage(NEXT_TRACK_AVAILABLE, nextTrack).sendToTarget();
   }
   mHandler.sendTargettedEmptyMessage(CHANGES_COMPLETE_INTERNAL);
 }
 @Override
 public void onAlbumArtChanged(Uri url) {
   mHandler.removeTargettedMessages(CHANGES_COMPLETE_INTERNAL);
   if (shouldHandleMessage(ART_CHANGED_URI)) {
     mPlugin.onAlbumArtChanged(url);
   } else {
     mHandler.obtainTargettedMessage(ART_CHANGED_URI, url).sendToTarget();
   }
   mHandler.sendTargettedEmptyMessage(CHANGES_COMPLETE_INTERNAL);
 }
 @Override
 public void onArtistChanged(String artist) {
   mHandler.removeTargettedMessages(CHANGES_COMPLETE_INTERNAL);
   if (shouldHandleMessage(ARTIST_CHANGED)) {
     mPlugin.onArtistChanged(artist);
   } else {
     mHandler.obtainTargettedMessage(ARTIST_CHANGED, artist).sendToTarget();
   }
   mHandler.sendTargettedEmptyMessage(CHANGES_COMPLETE_INTERNAL);
 }
 @Override
 public void onAlbumTitleChanged(String title) {
   mHandler.removeTargettedMessages(CHANGES_COMPLETE_INTERNAL);
   if (shouldHandleMessage(ALBUM_CHANGED)) {
     mPlugin.onAlbumTitleChanged(title);
   } else {
     mHandler.obtainTargettedMessage(ALBUM_CHANGED, title).sendToTarget();
   }
   mHandler.sendTargettedEmptyMessage(CHANGES_COMPLETE_INTERNAL);
 }
 @Override
 public void onDurationChanged(int duration) {
   mHandler.removeTargettedMessages(CHANGES_COMPLETE_INTERNAL);
   if (shouldHandleMessage(DURATION_CHANGED)) {
     mPlugin.onDurationChanged(duration);
   } else {
     mHandler.obtainTargettedMessage(DURATION_CHANGED, duration).sendToTarget();
   }
   mHandler.sendTargettedEmptyMessage(CHANGES_COMPLETE_INTERNAL);
 }
 @Override
 public void onTransportControlFlagsChanged(int transportControlFlags) {
   mHandler.removeTargettedMessages(CHANGES_COMPLETE_INTERNAL);
   if (shouldHandleMessage(TRANSPORT_CONTROL_FLAGS_CHANGED)) {
     mPlugin.onTransportControlFlagsChanged(transportControlFlags);
   } else {
     mHandler
         .obtainTargettedMessage(TRANSPORT_CONTROL_FLAGS_CHANGED, transportControlFlags, 0)
         .sendToTarget();
   }
   mHandler.sendTargettedEmptyMessage(CHANGES_COMPLETE_INTERNAL);
 }