package com.simplecity.amp_library.playback;
import android.media.AudioManager;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.util.Log;
import java.lang.ref.WeakReference;
final class MediaPlayerHandler extends Handler {
private static final String TAG = "MediaPlayerHandler";
private final WeakReference<MusicService> mService;
private float mCurrentVolume = 1.0f;
MediaPlayerHandler(final MusicService service, final Looper looper) {
super(looper);
mService = new WeakReference<>(service);
}
@Override
public void handleMessage(Message msg) {
final MusicService service = mService.get();
if (service == null) {
return;
}
switch (msg.what) {
case MusicService.PlayerHandler.FADE_DOWN:
mCurrentVolume -= .05f;
if (mCurrentVolume > .2f) {
sendEmptyMessageDelayed(MusicService.PlayerHandler.FADE_DOWN, 10);
} else {
mCurrentVolume = .2f;
}
service.player.setVolume(mCurrentVolume);
break;
case MusicService.PlayerHandler.FADE_UP:
mCurrentVolume += .01f;
if (mCurrentVolume < 1.0f) {
sendEmptyMessageDelayed(MusicService.PlayerHandler.FADE_UP, 10);
} else {
mCurrentVolume = 1.0f;
}
if (service.player != null) {
service.player.setVolume(mCurrentVolume);
}
break;
case MusicService.PlayerHandler.SERVER_DIED:
if (service.isPlaying()) {
service.gotoNext(true);
} else {
service.openCurrentAndNext();
}
break;
case MusicService.PlayerHandler.TRACK_WENT_TO_NEXT:
service.notifyChange(MusicService.InternalIntents.TRACK_ENDING);
service.playPos = service.nextPlayPos;
if (service.playPos >= 0 && !service.getCurrentPlaylist().isEmpty()) {
service.currentSong = service.getCurrentPlaylist().get(service.playPos);
}
service.notifyChange(MusicService.InternalIntents.META_CHANGED);
service.updateNotification();
service.setNextTrack();
break;
case MusicService.PlayerHandler.TRACK_ENDED:
service.notifyChange(MusicService.InternalIntents.TRACK_ENDING);
if (service.repeatMode == MusicService.RepeatMode.ONE) {
service.seekTo(0);
service.play();
} else {
service.gotoNext(false);
}
break;
case MusicService.PlayerHandler.RELEASE_WAKELOCK:
service.mWakeLock.release();
break;
case MusicService.PlayerHandler.FOCUS_CHANGE:
// This code is here so we can better synchronize it with
// the code that handles fade-in
switch (msg.arg1) {
case AudioManager.AUDIOFOCUS_LOSS:
if (service.isPlaying()) {
service.pausedByTransientLossOfFocus = false;
}
service.pause();
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
removeMessages(MusicService.PlayerHandler.FADE_UP);
sendEmptyMessage(MusicService.PlayerHandler.FADE_DOWN);
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
if (service.isPlaying()) {
service.pausedByTransientLossOfFocus = true;
}
service.pause();
break;
case AudioManager.AUDIOFOCUS_GAIN:
if (!service.isPlaying()
&& service.pausedByTransientLossOfFocus) {
service.pausedByTransientLossOfFocus = false;
mCurrentVolume = 0f;
service.player.setVolume(mCurrentVolume);
service.play(); // also queues a fade-in
} else {
removeMessages(MusicService.PlayerHandler.FADE_DOWN);
sendEmptyMessage(MusicService.PlayerHandler.FADE_UP);
}
break;
default:
Log.e(TAG, "Unknown audio focus change code");
}
break;
case MusicService.PlayerHandler.FADE_DOWN_STOP:
mCurrentVolume -= .05f;
if (mCurrentVolume > 0f) {
sendEmptyMessageDelayed(MusicService.PlayerHandler.FADE_DOWN_STOP, 200);
} else {
service.pause();
}
service.player.setVolume(mCurrentVolume);
break;
case MusicService.PlayerHandler.GO_TO_NEXT:
service.gotoNext(true);
break;
case MusicService.PlayerHandler.GO_TO_PREV:
service.previous();
break;
case MusicService.PlayerHandler.SHUFFLE_ALL:
service.playAutoShuffleList();
break;
}
}
}