Merge "Ringtone: keep a reference until playback completion." into mnc-dev
This commit is contained in:
@@ -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,9 +291,23 @@ 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user