Merge "Ringtone: keep a reference until playback completion." into mnc-dev

This commit is contained in:
Eric Laurent
2015-06-04 19:13:46 +00:00
committed by Android (Google) Code Review

View File

@@ -21,6 +21,7 @@ import android.content.Context;
import android.content.res.AssetFileDescriptor; import android.content.res.AssetFileDescriptor;
import android.content.res.Resources.NotFoundException; import android.content.res.Resources.NotFoundException;
import android.database.Cursor; import android.database.Cursor;
import android.media.MediaPlayer.OnCompletionListener;
import android.net.Uri; import android.net.Uri;
import android.os.Binder; import android.os.Binder;
import android.os.RemoteException; import android.os.RemoteException;
@@ -29,6 +30,7 @@ import android.provider.Settings;
import android.util.Log; import android.util.Log;
import java.io.IOException; import java.io.IOException;
import java.util.ArrayList;
/** /**
* Ringtone provides a quick method for playing a ringtone, notification, or * Ringtone provides a quick method for playing a ringtone, notification, or
@@ -49,6 +51,9 @@ public class Ringtone {
MediaStore.Audio.Media.TITLE MediaStore.Audio.Media.TITLE
}; };
// keep references on active Ringtones until stopped or completion listener called.
private static final ArrayList<Ringtone> sActiveRingtones = new ArrayList<Ringtone>();
private final Context mContext; private final Context mContext;
private final AudioManager mAudioManager; private final AudioManager mAudioManager;
@@ -62,6 +67,7 @@ public class Ringtone {
private final Binder mRemoteToken; private final Binder mRemoteToken;
private MediaPlayer mLocalPlayer; private MediaPlayer mLocalPlayer;
private final MyOnCompletionListener mCompletionListener = new MyOnCompletionListener();
private Uri mUri; private Uri mUri;
private String mTitle; private String mTitle;
@@ -247,7 +253,7 @@ public class Ringtone {
// (typically because ringer mode is silent). // (typically because ringer mode is silent).
if (mAudioManager.getStreamVolume( if (mAudioManager.getStreamVolume(
AudioAttributes.toLegacyStreamType(mAudioAttributes)) != 0) { AudioAttributes.toLegacyStreamType(mAudioAttributes)) != 0) {
mLocalPlayer.start(); startLocalPlayer();
} }
} else if (mAllowRemote && (mRemotePlayer != null)) { } else if (mAllowRemote && (mRemotePlayer != null)) {
final Uri canonicalUri = mUri.getCanonicalUri(); final Uri canonicalUri = mUri.getCanonicalUri();
@@ -285,8 +291,22 @@ public class Ringtone {
mLocalPlayer.reset(); mLocalPlayer.reset();
mLocalPlayer.release(); mLocalPlayer.release();
mLocalPlayer = null; mLocalPlayer = null;
synchronized (sActiveRingtones) {
sActiveRingtones.remove(this);
} }
} }
}
private void startLocalPlayer() {
if (mLocalPlayer == null) {
return;
}
synchronized (sActiveRingtones) {
sActiveRingtones.add(this);
}
mLocalPlayer.setOnCompletionListener(mCompletionListener);
mLocalPlayer.start();
}
/** /**
* Whether this ringtone is currently playing. * Whether this ringtone is currently playing.
@@ -330,7 +350,7 @@ public class Ringtone {
} }
mLocalPlayer.setAudioAttributes(mAudioAttributes); mLocalPlayer.setAudioAttributes(mAudioAttributes);
mLocalPlayer.prepare(); mLocalPlayer.prepare();
mLocalPlayer.start(); startLocalPlayer();
afd.close(); afd.close();
return true; return true;
} else { } else {
@@ -352,4 +372,20 @@ public class Ringtone {
void setTitle(String title) { void setTitle(String title) {
mTitle = title; mTitle = title;
} }
@Override
protected void finalize() {
if (mLocalPlayer != null) {
mLocalPlayer.release();
}
}
class MyOnCompletionListener implements MediaPlayer.OnCompletionListener {
public void onCompletion(MediaPlayer mp)
{
synchronized (sActiveRingtones) {
sActiveRingtones.remove(Ringtone.this);
}
}
}
} }