Reorganize PlaybackService
The old organization reflected a mystical thread barrier that does not really exist. The new organization is more typical of the other classes
This commit is contained in:
parent
8231667d19
commit
ce7c5000db
@ -68,70 +68,34 @@ public class PlaybackService extends Service implements Runnable, MediaPlayer.On
|
|||||||
public static final int WHEN_PLAYING = 1;
|
public static final int WHEN_PLAYING = 1;
|
||||||
public static final int ALWAYS = 2;
|
public static final int ALWAYS = 2;
|
||||||
|
|
||||||
|
private boolean mHeadsetPause;
|
||||||
|
private boolean mHeadsetOnly;
|
||||||
|
private boolean mScrobble;
|
||||||
|
private int mNotificationMode;
|
||||||
|
|
||||||
|
private Handler mHandler;
|
||||||
|
private MediaPlayer mMediaPlayer;
|
||||||
|
private boolean mMediaPlayerInitialized;
|
||||||
|
private PowerManager.WakeLock mWakeLock;
|
||||||
|
private Notification mNotification;
|
||||||
|
private SharedPreferences mSettings;
|
||||||
|
private AudioManager mAudioManager;
|
||||||
|
private NotificationManager mNotificationManager;
|
||||||
|
|
||||||
|
private ArrayList<Song> mSongTimeline;
|
||||||
|
private int mCurrentSong;
|
||||||
|
private int mQueuePos;
|
||||||
|
private int mState = 0x80;
|
||||||
|
private Object mStateLock = new Object();
|
||||||
|
private boolean mPlayingBeforeCall;
|
||||||
|
private int mPendingSeek;
|
||||||
private int mPendingGo = -1;
|
private int mPendingGo = -1;
|
||||||
|
private Song mLastSongBroadcast;
|
||||||
|
private boolean mPlugged;
|
||||||
|
|
||||||
public IPlaybackService.Stub mBinder = new IPlaybackService.Stub() {
|
private Method mIsWiredHeadsetOn;
|
||||||
public boolean isLoaded()
|
private Method mStartForeground;
|
||||||
{
|
private Method mStopForeground;
|
||||||
return mHandler != null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Song getSong(int delta)
|
|
||||||
{
|
|
||||||
return PlaybackService.this.getSong(delta);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getState()
|
|
||||||
{
|
|
||||||
synchronized (mStateLock) {
|
|
||||||
return mState;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getPosition()
|
|
||||||
{
|
|
||||||
if (mMediaPlayer == null)
|
|
||||||
return 0;
|
|
||||||
synchronized (mMediaPlayer) {
|
|
||||||
return mMediaPlayer.getCurrentPosition();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getDuration()
|
|
||||||
{
|
|
||||||
if (mMediaPlayer == null)
|
|
||||||
return 0;
|
|
||||||
synchronized (mMediaPlayer) {
|
|
||||||
return mMediaPlayer.getDuration();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setCurrentSong(int delta)
|
|
||||||
{
|
|
||||||
PlaybackService.this.setCurrentSong(delta);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void toggleFlag(int flag)
|
|
||||||
{
|
|
||||||
PlaybackService.this.toggleFlag(flag);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void seekToProgress(int progress)
|
|
||||||
{
|
|
||||||
if (mMediaPlayer == null)
|
|
||||||
return;
|
|
||||||
synchronized (mMediaPlayer) {
|
|
||||||
long position = (long)mMediaPlayer.getDuration() * progress / 1000;
|
|
||||||
mMediaPlayer.seekTo((int)position);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IBinder onBind(Intent intent)
|
|
||||||
{
|
|
||||||
return mBinder;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onCreate()
|
public void onCreate()
|
||||||
@ -178,8 +142,6 @@ public class PlaybackService extends Service implements Runnable, MediaPlayer.On
|
|||||||
{
|
{
|
||||||
super.onDestroy();
|
super.onDestroy();
|
||||||
|
|
||||||
Log.d("VanillaMusic", "destroy");
|
|
||||||
|
|
||||||
if (mSongTimeline != null)
|
if (mSongTimeline != null)
|
||||||
saveState(true);
|
saveState(true);
|
||||||
|
|
||||||
@ -234,85 +196,6 @@ public class PlaybackService extends Service implements Runnable, MediaPlayer.On
|
|||||||
mNotificationManager.cancel(NOTIFICATION_ID);
|
mNotificationManager.cancel(NOTIFICATION_ID);
|
||||||
}
|
}
|
||||||
|
|
||||||
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
|
|
||||||
@Override
|
|
||||||
public void onReceive(Context content, Intent intent)
|
|
||||||
{
|
|
||||||
String action = intent.getAction();
|
|
||||||
if (Intent.ACTION_HEADSET_PLUG.equals(action) && mHandler != null) {
|
|
||||||
boolean oldPlugged = mPlugged;
|
|
||||||
mPlugged = intent.getIntExtra("state", 0) != 0;
|
|
||||||
if (mPlugged != oldPlugged && (mHeadsetPause && !mPlugged || mHeadsetOnly && !isSpeakerOn()))
|
|
||||||
unsetFlag(FLAG_PLAYING);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
private PhoneStateListener mCallListener = new PhoneStateListener() {
|
|
||||||
@Override
|
|
||||||
public void onCallStateChanged(int state, String incomingNumber)
|
|
||||||
{
|
|
||||||
int inCall = -1;
|
|
||||||
|
|
||||||
switch (state) {
|
|
||||||
case TelephonyManager.CALL_STATE_RINGING:
|
|
||||||
case TelephonyManager.CALL_STATE_OFFHOOK:
|
|
||||||
inCall = 1;
|
|
||||||
break;
|
|
||||||
case TelephonyManager.CALL_STATE_IDLE:
|
|
||||||
inCall = 0;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mHandler != null)
|
|
||||||
mHandler.sendMessage(mHandler.obtainMessage(CALL, inCall, 0));
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
public void onSharedPreferenceChanged(SharedPreferences settings, String key)
|
|
||||||
{
|
|
||||||
if (mHandler != null)
|
|
||||||
mHandler.sendMessage(mHandler.obtainMessage(PREF_CHANGED, key));
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean mHeadsetPause;
|
|
||||||
private boolean mHeadsetOnly;
|
|
||||||
private boolean mScrobble;
|
|
||||||
private int mNotificationMode;
|
|
||||||
|
|
||||||
private Handler mHandler;
|
|
||||||
private MediaPlayer mMediaPlayer;
|
|
||||||
private boolean mMediaPlayerInitialized;
|
|
||||||
private PowerManager.WakeLock mWakeLock;
|
|
||||||
private Notification mNotification;
|
|
||||||
private SharedPreferences mSettings;
|
|
||||||
private AudioManager mAudioManager;
|
|
||||||
private NotificationManager mNotificationManager;
|
|
||||||
|
|
||||||
private ArrayList<Song> mSongTimeline;
|
|
||||||
private int mCurrentSong;
|
|
||||||
private int mQueuePos;
|
|
||||||
private int mState = 0x80;
|
|
||||||
private Object mStateLock = new Object();
|
|
||||||
private boolean mPlayingBeforeCall;
|
|
||||||
private int mPendingSeek;
|
|
||||||
private Song mLastSongBroadcast;
|
|
||||||
private boolean mPlugged;
|
|
||||||
|
|
||||||
private Method mIsWiredHeadsetOn;
|
|
||||||
private Method mStartForeground;
|
|
||||||
private Method mStopForeground;
|
|
||||||
|
|
||||||
private static final int GO = 0;
|
|
||||||
private static final int POST_CREATE = 1;
|
|
||||||
private static final int PREF_CHANGED = 3;
|
|
||||||
private static final int DO_ITEM = 4;
|
|
||||||
private static final int TRACK_CHANGED = 5;
|
|
||||||
private static final int RELEASE_WAKE_LOCK = 6;
|
|
||||||
private static final int CALL = 10;
|
|
||||||
private static final int SAVE_STATE = 12;
|
|
||||||
private static final int PROCESS_SONG = 13;
|
|
||||||
|
|
||||||
public void run()
|
public void run()
|
||||||
{
|
{
|
||||||
Looper.prepare();
|
Looper.prepare();
|
||||||
@ -397,7 +280,6 @@ public class PlaybackService extends Service implements Runnable, MediaPlayer.On
|
|||||||
mHeadsetPause = mSettings.getBoolean("headset_pause", true);
|
mHeadsetPause = mSettings.getBoolean("headset_pause", true);
|
||||||
} else if ("headset_only".equals(key)) {
|
} else if ("headset_only".equals(key)) {
|
||||||
mHeadsetOnly = mSettings.getBoolean(key, false);
|
mHeadsetOnly = mSettings.getBoolean(key, false);
|
||||||
Log.d("VanillaMusic", "mp: " + mMediaPlayer);
|
|
||||||
if (mHeadsetOnly && isSpeakerOn())
|
if (mHeadsetOnly && isSpeakerOn())
|
||||||
unsetFlag(FLAG_PLAYING);
|
unsetFlag(FLAG_PLAYING);
|
||||||
} else if ("remote_player".equals(key)) {
|
} else if ("remote_player".equals(key)) {
|
||||||
@ -613,14 +495,58 @@ public class PlaybackService extends Service implements Runnable, MediaPlayer.On
|
|||||||
PlaybackServiceState.saveState(this, mSongTimeline, mCurrentSong, savePosition && mMediaPlayer != null ? mMediaPlayer.getCurrentPosition() : 0);
|
PlaybackServiceState.saveState(this, mSongTimeline, mCurrentSong, savePosition && mMediaPlayer != null ? mMediaPlayer.getCurrentPosition() : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private BroadcastReceiver mReceiver = new BroadcastReceiver() {
|
||||||
|
@Override
|
||||||
|
public void onReceive(Context content, Intent intent)
|
||||||
|
{
|
||||||
|
String action = intent.getAction();
|
||||||
|
if (Intent.ACTION_HEADSET_PLUG.equals(action) && mHandler != null) {
|
||||||
|
boolean oldPlugged = mPlugged;
|
||||||
|
mPlugged = intent.getIntExtra("state", 0) != 0;
|
||||||
|
if (mPlugged != oldPlugged && (mHeadsetPause && !mPlugged || mHeadsetOnly && !isSpeakerOn()))
|
||||||
|
unsetFlag(FLAG_PLAYING);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
private PhoneStateListener mCallListener = new PhoneStateListener() {
|
||||||
|
@Override
|
||||||
|
public void onCallStateChanged(int state, String incomingNumber)
|
||||||
|
{
|
||||||
|
switch (state) {
|
||||||
|
case TelephonyManager.CALL_STATE_RINGING:
|
||||||
|
case TelephonyManager.CALL_STATE_OFFHOOK:
|
||||||
|
if (!mPlayingBeforeCall)
|
||||||
|
mPlayingBeforeCall = unsetFlag(FLAG_PLAYING);
|
||||||
|
break;
|
||||||
|
case TelephonyManager.CALL_STATE_IDLE:
|
||||||
|
if (mPlayingBeforeCall) {
|
||||||
|
setFlag(FLAG_PLAYING);
|
||||||
|
mPlayingBeforeCall = false;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
public void onSharedPreferenceChanged(SharedPreferences settings, String key)
|
||||||
|
{
|
||||||
|
loadPreference(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final int GO = 0;
|
||||||
|
private static final int POST_CREATE = 1;
|
||||||
|
private static final int DO_ITEM = 4;
|
||||||
|
private static final int TRACK_CHANGED = 5;
|
||||||
|
private static final int RELEASE_WAKE_LOCK = 6;
|
||||||
|
private static final int SAVE_STATE = 12;
|
||||||
|
private static final int PROCESS_SONG = 13;
|
||||||
|
|
||||||
private class MusicHandler extends Handler {
|
private class MusicHandler extends Handler {
|
||||||
@Override
|
@Override
|
||||||
public void handleMessage(Message message)
|
public void handleMessage(Message message)
|
||||||
{
|
{
|
||||||
switch (message.what) {
|
switch (message.what) {
|
||||||
case PREF_CHANGED:
|
|
||||||
loadPreference((String)message.obj);
|
|
||||||
break;
|
|
||||||
case DO_ITEM:
|
case DO_ITEM:
|
||||||
Intent intent = (Intent)message.obj;
|
Intent intent = (Intent)message.obj;
|
||||||
long id = message.obj == null ? -1 : intent.getLongExtra("id", -1);
|
long id = message.obj == null ? -1 : intent.getLongExtra("id", -1);
|
||||||
@ -694,14 +620,6 @@ public class PlaybackService extends Service implements Runnable, MediaPlayer.On
|
|||||||
if (mWakeLock != null && mWakeLock.isHeld())
|
if (mWakeLock != null && mWakeLock.isHeld())
|
||||||
mWakeLock.release();
|
mWakeLock.release();
|
||||||
break;
|
break;
|
||||||
case CALL:
|
|
||||||
boolean inCall = message.arg1 == 1;
|
|
||||||
if (inCall) {
|
|
||||||
mPlayingBeforeCall = unsetFlag(FLAG_PLAYING);
|
|
||||||
} else if (mPlayingBeforeCall) {
|
|
||||||
setFlag(FLAG_PLAYING);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case GO:
|
case GO:
|
||||||
if (message.arg1 == 0)
|
if (message.arg1 == 0)
|
||||||
toggleFlag(FLAG_PLAYING);
|
toggleFlag(FLAG_PLAYING);
|
||||||
@ -739,4 +657,67 @@ public class PlaybackService extends Service implements Runnable, MediaPlayer.On
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public IPlaybackService.Stub mBinder = new IPlaybackService.Stub() {
|
||||||
|
public boolean isLoaded()
|
||||||
|
{
|
||||||
|
return mHandler != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Song getSong(int delta)
|
||||||
|
{
|
||||||
|
return PlaybackService.this.getSong(delta);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getState()
|
||||||
|
{
|
||||||
|
synchronized (mStateLock) {
|
||||||
|
return mState;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getPosition()
|
||||||
|
{
|
||||||
|
if (mMediaPlayer == null)
|
||||||
|
return 0;
|
||||||
|
synchronized (mMediaPlayer) {
|
||||||
|
return mMediaPlayer.getCurrentPosition();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getDuration()
|
||||||
|
{
|
||||||
|
if (mMediaPlayer == null)
|
||||||
|
return 0;
|
||||||
|
synchronized (mMediaPlayer) {
|
||||||
|
return mMediaPlayer.getDuration();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCurrentSong(int delta)
|
||||||
|
{
|
||||||
|
PlaybackService.this.setCurrentSong(delta);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void toggleFlag(int flag)
|
||||||
|
{
|
||||||
|
PlaybackService.this.toggleFlag(flag);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void seekToProgress(int progress)
|
||||||
|
{
|
||||||
|
if (mMediaPlayer == null)
|
||||||
|
return;
|
||||||
|
synchronized (mMediaPlayer) {
|
||||||
|
long position = (long)mMediaPlayer.getDuration() * progress / 1000;
|
||||||
|
mMediaPlayer.seekTo((int)position);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IBinder onBind(Intent intent)
|
||||||
|
{
|
||||||
|
return mBinder;
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user