Made the media player illegalstate secure

This commit is contained in:
Karim Abou Zeid 2015-07-07 03:58:01 +02:00
commit b5f160dd89
2 changed files with 77 additions and 31 deletions

View file

@ -13,7 +13,6 @@ import android.widget.Toast;
import com.kabouzeid.gramophone.R;
import com.kabouzeid.gramophone.util.PreferenceUtils;
import java.io.IOException;
import java.lang.ref.WeakReference;
/**
@ -26,7 +25,6 @@ public class MultiPlayer implements MediaPlayer.OnErrorListener,
private final WeakReference<MusicService> mService;
private MediaPlayer mCurrentMediaPlayer = new MediaPlayer();
private MediaPlayer mNextMediaPlayer;
private Handler mHandler;
@ -38,7 +36,7 @@ public class MultiPlayer implements MediaPlayer.OnErrorListener,
*/
public MultiPlayer(final MusicService service) {
mService = new WeakReference<>(service);
mCurrentMediaPlayer.setWakeMode(mService.get(), PowerManager.PARTIAL_WAKE_LOCK);
mCurrentMediaPlayer.setWakeMode(service, PowerManager.PARTIAL_WAKE_LOCK);
}
/**
@ -64,28 +62,30 @@ public class MultiPlayer implements MediaPlayer.OnErrorListener,
* ready to play, false otherwise
*/
private boolean setDataSourceImpl(final MediaPlayer player, final String path) {
MusicService service = mService.get();
if (service == null) {
return false;
}
try {
player.reset();
player.setOnPreparedListener(null);
if (path.startsWith("content://")) {
player.setDataSource(mService.get(), Uri.parse(path));
player.setDataSource(service, Uri.parse(path));
} else {
player.setDataSource(path);
}
player.setAudioStreamType(AudioManager.STREAM_MUSIC);
player.prepare();
} catch (final IOException e) {
return false;
} catch (final IllegalArgumentException e) {
} catch (Exception e) {
return false;
}
player.setOnCompletionListener(this);
player.setOnErrorListener(this);
final Intent intent = new Intent(AudioEffect.ACTION_OPEN_AUDIO_EFFECT_CONTROL_SESSION);
intent.putExtra(AudioEffect.EXTRA_AUDIO_SESSION, getAudioSessionId());
intent.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, mService.get().getPackageName());
intent.putExtra(AudioEffect.EXTRA_PACKAGE_NAME, service.getPackageName());
intent.putExtra(AudioEffect.EXTRA_CONTENT_TYPE, AudioEffect.CONTENT_TYPE_MUSIC);
mService.get().sendBroadcast(intent);
service.sendBroadcast(intent);
return true;
}
@ -96,6 +96,10 @@ public class MultiPlayer implements MediaPlayer.OnErrorListener,
* you want to play
*/
public void setNextDataSource(final String path) {
MusicService service = mService.get();
if (service == null) {
return;
}
try {
mCurrentMediaPlayer.setNextMediaPlayer(null);
} catch (IllegalArgumentException e) {
@ -116,7 +120,15 @@ public class MultiPlayer implements MediaPlayer.OnErrorListener,
mNextMediaPlayer.setWakeMode(mService.get(), PowerManager.PARTIAL_WAKE_LOCK);
mNextMediaPlayer.setAudioSessionId(getAudioSessionId());
if (setDataSourceImpl(mNextMediaPlayer, path)) {
try {
mCurrentMediaPlayer.setNextMediaPlayer(mNextMediaPlayer);
} catch (IllegalArgumentException | IllegalStateException e) {
Log.e(TAG, "setNextDataSource: setNextMediaPlayer()", e);
if (mNextMediaPlayer != null) {
mNextMediaPlayer.release();
mNextMediaPlayer = null;
}
}
} else {
if (mNextMediaPlayer != null) {
mNextMediaPlayer.release();
@ -145,8 +157,13 @@ public class MultiPlayer implements MediaPlayer.OnErrorListener,
/**
* Starts or resumes playback.
*/
public void start() {
public boolean start() {
try {
mCurrentMediaPlayer.start();
return true;
} catch (IllegalStateException e) {
return false;
}
}
/**
@ -163,13 +180,21 @@ public class MultiPlayer implements MediaPlayer.OnErrorListener,
public void release() {
stop();
mCurrentMediaPlayer.release();
if (mNextMediaPlayer != null) {
mNextMediaPlayer.release();
}
}
/**
* Pauses playback. Call start() to resume.
*/
public void pause() {
public boolean pause() {
try {
mCurrentMediaPlayer.pause();
return true;
} catch (IllegalStateException e) {
return false;
}
}
/**
@ -185,7 +210,11 @@ public class MultiPlayer implements MediaPlayer.OnErrorListener,
* @return The duration in milliseconds
*/
public int duration() {
try {
return mCurrentMediaPlayer.getDuration();
} catch (IllegalStateException e) {
return -1;
}
}
/**
@ -194,7 +223,11 @@ public class MultiPlayer implements MediaPlayer.OnErrorListener,
* @return The current position in milliseconds
*/
public int position() {
try {
return mCurrentMediaPlayer.getCurrentPosition();
} catch (IllegalStateException e) {
return -1;
}
}
/**
@ -203,18 +236,22 @@ public class MultiPlayer implements MediaPlayer.OnErrorListener,
* @param whereto The offset in milliseconds from the start to seek to
* @return The offset in milliseconds from the start to seek to
*/
public long seek(final long whereto) {
mCurrentMediaPlayer.seekTo((int) whereto);
public int seek(final int whereto) {
try {
mCurrentMediaPlayer.seekTo(whereto);
return whereto;
} catch (IllegalStateException e) {
return -1;
}
}
/**
* Sets the volume on this player.
*
* @param vol Left and right volume scalar
*/
public void setVolume(final float vol) {
public boolean setVolume(final float vol) {
try {
mCurrentMediaPlayer.setVolume(vol, vol);
return true;
} catch (IllegalStateException e) {
return false;
}
}
/**
@ -222,8 +259,13 @@ public class MultiPlayer implements MediaPlayer.OnErrorListener,
*
* @param sessionId The audio session ID
*/
public void setAudioSessionId(final int sessionId) {
public boolean setAudioSessionId(final int sessionId) {
try {
mCurrentMediaPlayer.setAudioSessionId(sessionId);
return true;
} catch (IllegalArgumentException | IllegalStateException e) {
return false;
}
}
/**
@ -253,6 +295,10 @@ public class MultiPlayer implements MediaPlayer.OnErrorListener,
*/
@Override
public void onCompletion(final MediaPlayer mp) {
MusicService service = mService.get();
if (service == null) {
return;
}
if (mp == mCurrentMediaPlayer && mNextMediaPlayer != null) {
mIsInitialized = false;
mCurrentMediaPlayer.release();
@ -261,7 +307,7 @@ public class MultiPlayer implements MediaPlayer.OnErrorListener,
mNextMediaPlayer = null;
mHandler.sendEmptyMessage(MusicService.TRACK_WENT_TO_NEXT);
} else {
mService.get().acquireWakeLock(30000);
service.acquireWakeLock(30000);
mHandler.sendEmptyMessage(MusicService.TRACK_ENDED);
mHandler.sendEmptyMessage(MusicService.RELEASE_WAKELOCK);
}

View file

@ -731,11 +731,11 @@ public class MusicService extends Service {
}
public int getSongProgressMillis() {
return player.isInitialized() ? player.position() : 0;
return player.position();
}
public int getSongDurationMillis() {
return player.isInitialized() ? player.duration() : 0;
return player.duration();
}
public void seek(int millis) {