/** Called by the providers when the details of a song have been updated. */
  @Override
  public void onSongUpdate(ProviderIdentifier provider, final Song s) throws RemoteException {
    if (s == null) {
      Log.w(TAG, "Provider " + provider.mName + " sent in a null songUpdate");
      return;
    }

    try {
      Song cached = mCache.getSong(s.getRef());
      boolean wasLoaded = false;
      boolean changed = false;

      if (cached == null) {
        mCache.putSong(provider, s);
        changed = true;
        cached = s;
      } else {
        wasLoaded = cached.isLoaded();
        if (s.isLoaded() && !cached.isIdentical(s)) {
          cached.setAlbum(s.getAlbum());
          cached.setArtist(s.getArtist());
          cached.setSourceLogo(s.getLogo());
          cached.setDuration(s.getDuration());
          cached.setTitle(s.getTitle());
          cached.setYear(s.getYear());
          cached.setOfflineStatus(s.getOfflineStatus());
          cached.setAvailable(s.isAvailable());
          cached.setIsLoaded(s.isLoaded());
          changed = true;
        }
      }

      if (!wasLoaded && cached.isLoaded()) {
        // Match the album with the artist
        Artist artist = mCache.getArtist(s.getArtist());
        if (artist == null && s.getArtist() != null) {
          artist = retrieveArtist(s.getArtist(), provider);
        }

        if (artist != null) {
          Album album = mCache.getAlbum(s.getAlbum());
          if (album == null && s.getAlbum() != null) {
            album = retrieveAlbum(s.getAlbum(), provider);
          }

          if (album != null) {
            artist.addAlbum(album.getRef());
          }
        }
      }

      if (changed) {
        postSongForUpdate(cached);
      }
    } catch (Exception e) {
      Log.e(TAG, "Exception while updating song data", e);
    }
  }
  private void updatePlaybackStatus() {
    int state = PlaybackProxy.getState();

    switch (state) {
      case PlaybackService.STATE_STOPPED:
      case PlaybackService.STATE_PAUSED:
        mPlayDrawable.setShape(PlayPauseDrawable.SHAPE_PLAY);
        mPlayDrawable.setBuffering(false);
        break;

      case PlaybackService.STATE_BUFFERING:
        mPlayDrawable.setShape(PlayPauseDrawable.SHAPE_PAUSE);
        mPlayDrawable.setBuffering(true);
        break;

      case PlaybackService.STATE_PAUSING:
        mPlayDrawable.setShape(PlayPauseDrawable.SHAPE_PAUSE);
        mPlayDrawable.setBuffering(true);
        break;

      case PlaybackService.STATE_PLAYING:
        mPlayDrawable.setShape(PlayPauseDrawable.SHAPE_PAUSE);
        mPlayDrawable.setBuffering(false);
        break;
    }

    Song currentTrack = PlaybackProxy.getCurrentTrack();

    if (currentTrack != null && currentTrack.isLoaded()) {
      final ProviderAggregator aggregator = ProviderAggregator.getDefault();

      mTvTitle.setText(currentTrack.getTitle());

      if (currentTrack.getArtist() != null) {
        Artist artist =
            aggregator.retrieveArtist(currentTrack.getArtist(), currentTrack.getProvider());

        if (artist != null && artist.getName() != null && !artist.getName().isEmpty()) {
          mTvArtist.setText(artist.getName());
        } else if (artist != null && !artist.isLoaded()) {
          mTvArtist.setText(R.string.loading);
        } else {
          mTvArtist.setText(null);
        }
      } else {
        mTvArtist.setText(null);
      }

      if (currentTrack.getAlbum() != null) {
        Album album = aggregator.retrieveAlbum(currentTrack.getAlbum(), currentTrack.getProvider());

        if (album != null && album.getName() != null && !album.getName().isEmpty()) {
          mTvAlbum.setText(album.getName());
        } else if (album != null && !album.isLoaded()) {
          mTvAlbum.setText(R.string.loading);
        } else {
          mTvAlbum.setText(null);
        }
      } else {
        mTvAlbum.setText(null);
      }

      mIvAlbumArt.loadArtForSong(currentTrack);
      mSeek.setMax(currentTrack.getDuration());
    } else if (currentTrack != null) {
      mTvTitle.setText(R.string.loading);
      mTvArtist.setText(null);
      mIvAlbumArt.setDefaultArt();
    } else {
      // TODO: No song playing
    }
  }