package com.wigwamlabs.spotify;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.graphics.Bitmap;
import android.support.v4.app.NotificationCompat;
class PlayerNotification extends ForegroundNotification implements Player.Callback, ImageProvider.Callback {
private final Service mService;
private final Player mPlayer;
private final ImageProvider mImageProvider;
private final PendingIntent mPauseIntent;
private final PendingIntent mResumeIntent;
private final PendingIntent mNextIntent;
private PendingIntent mIntent;
private String mArtists;
private String mTrackName;
private String mTrackImageLink;
private Bitmap mTrackImage;
private int mState;
PlayerNotification(Service service, ForegroundNotificationManager manager, Session session, PendingIntent pauseIntent, PendingIntent resumeIntent, PendingIntent nextIntent) {
super(manager);
mService = service;
mPlayer = session.getPlayer();
mImageProvider = session.getImageProvider();
mPauseIntent = pauseIntent;
mResumeIntent = resumeIntent;
mNextIntent = nextIntent;
mPlayer.addCallback(this, false);
}
@Override
void destroy() {
super.destroy();
mPlayer.removeCallback(this);
}
@Override
int getNotificationId() {
return R.id.notificationPlayer;
}
void setIntent(PendingIntent intent) {
mIntent = intent;
}
@Override
Notification getNotification() {
final NotificationCompat.Builder builder = new NotificationCompat.Builder(mService)
.setSmallIcon(R.drawable.ic_stat_player)
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setOngoing(isForeground())
.setContentTitle(mArtists)
.setContentText(mTrackName)
.setContentIntent(mIntent);
resetTrackImageIfRecycled();
if (mTrackImage != null) {
builder.setLargeIcon(mTrackImage);
}
switch (mState) {
case Player.STATE_PLAYING:
builder.addAction(R.drawable.ic_notification_action_pause, mService.getString(R.string.notification_action_pause), mPauseIntent);
builder.addAction(R.drawable.ic_notification_action_next, mService.getString(R.string.notification_action_next), mNextIntent);
break;
case Player.STATE_PAUSED_USER:
case Player.STATE_PAUSED_AUDIOFOCUS:
case Player.STATE_PAUSED_NOISY:
builder.addAction(R.drawable.ic_notification_action_resume, mService.getString(R.string.notification_action_resume), mResumeIntent);
builder.addAction(R.drawable.ic_notification_action_next, mService.getString(R.string.notification_action_next), mNextIntent);
break;
}
return builder.build();
}
@Override
public void onCurrentTrackUpdated(Track track) {
mArtists = track.getArtistsString();
mTrackName = track.getName();
mTrackImageLink = track.getImageLink(ImageProvider.SIZE_NORMAL);
if (mTrackImageLink == null) {
mTrackImage = null;
} else {
mTrackImage = mImageProvider.get(mTrackImageLink);
resetTrackImageIfRecycled();
if (mTrackImage == null) {
mImageProvider.load(mTrackImageLink, this, true);
}
}
onNotificationUpdated();
}
@Override
public void onStateChanged(int state) {
mState = state;
switch (state) {
case Player.STATE_PLAYING:
setForeground(true);
break;
case Player.STATE_STARTED:
case Player.STATE_PAUSED_USER:
case Player.STATE_PAUSED_AUDIOFOCUS:
case Player.STATE_PAUSED_NOISY:
case Player.STATE_STOPPED:
setForeground(false);
break;
}
}
@Override
public void onTrackProgress(int secondsPlayed, int secondsDuration) {
}
@Override
public void onImageImageLoaded(String imageLink, Bitmap image) {
if (imageLink.equals(mTrackImageLink)) {
mTrackImage = image;
onNotificationUpdated();
}
}
private void resetTrackImageIfRecycled() {
if (mTrackImage != null && mTrackImage.isRecycled()) {
mTrackImage = null;
}
}
}