Make RingtoneManager and Ringtone class support VolumeShaper

Bug: 120789399
Test: When finish the whole change, flash into a dev phone to test first.
Change-Id: I4620fac5f1c34d37b3b33565cebbea2c091a5d08
This commit is contained in:
Yiwen Chen
2018-12-12 12:35:43 -08:00
parent 609b669506
commit 301b5bf50c
2 changed files with 65 additions and 1 deletions

View File

@@ -16,6 +16,7 @@
package android.media;
import android.annotation.Nullable;
import android.annotation.UnsupportedAppUsage;
import android.content.ContentProvider;
import android.content.ContentResolver;
@@ -60,6 +61,8 @@ public class Ringtone {
private final Context mContext;
private final AudioManager mAudioManager;
private VolumeShaper.Configuration mVolumeShaperConfig;
private VolumeShaper mVolumeShaper;
/**
* Flag indicating if we're allowed to fall back to remote playback using
@@ -302,6 +305,18 @@ public class Ringtone {
*/
@UnsupportedAppUsage
public void setUri(Uri uri) {
setUri(uri, null);
}
/**
* Set {@link Uri} to be used for ringtone playback. Attempts to open
* locally, otherwise will delegate playback to remote
* {@link IRingtonePlayer}. Add {@link VolumeShaper} if required.
*
* @hide
*/
public void setUri(Uri uri, @Nullable VolumeShaper.Configuration volumeShaperConfig) {
mVolumeShaperConfig = volumeShaperConfig;
destroyLocalPlayer();
mUri = uri;
@@ -319,6 +334,9 @@ public class Ringtone {
synchronized (mPlaybackSettingsLock) {
applyPlaybackProperties_sync();
}
if (mVolumeShaperConfig != null) {
mVolumeShaper = mLocalPlayer.createVolumeShaper(mVolumeShaperConfig);
}
mLocalPlayer.prepare();
} catch (SecurityException | IOException e) {
@@ -412,6 +430,9 @@ public class Ringtone {
}
mLocalPlayer.setOnCompletionListener(mCompletionListener);
mLocalPlayer.start();
if (mVolumeShaper != null) {
mVolumeShaper.apply(VolumeShaper.Operation.PLAY);
}
}
/**
@@ -458,6 +479,9 @@ public class Ringtone {
synchronized (mPlaybackSettingsLock) {
applyPlaybackProperties_sync();
}
if (mVolumeShaperConfig != null) {
mVolumeShaper = mLocalPlayer.createVolumeShaper(mVolumeShaperConfig);
}
mLocalPlayer.prepare();
startLocalPlayer();
afd.close();

View File

@@ -694,6 +694,27 @@ public class RingtoneManager {
return getRingtone(context, ringtoneUri, -1);
}
/**
* Returns a {@link Ringtone} with {@link VolumeShaper} if required for a given sound URI.
* <p>
* If the given URI cannot be opened for any reason, this method will
* attempt to fallback on another sound. If it cannot find any, it will
* return null.
*
* @param context A context used to query.
* @param ringtoneUri The {@link Uri} of a sound or ringtone.
* @param volumeShaperConfig config for volume shaper of the ringtone if applied.
* @return A {@link Ringtone} for the given URI, or null.
*
* @hide
*/
public static Ringtone getRingtone(
final Context context, Uri ringtoneUri,
@Nullable VolumeShaper.Configuration volumeShaperConfig) {
// Don't set the stream type
return getRingtone(context, ringtoneUri, -1 /* streamType */, volumeShaperConfig);
}
//FIXME bypass the notion of stream types within the class
/**
* Returns a {@link Ringtone} for a given sound URI on the given stream
@@ -707,13 +728,32 @@ public class RingtoneManager {
*/
@UnsupportedAppUsage
private static Ringtone getRingtone(final Context context, Uri ringtoneUri, int streamType) {
return getRingtone(context, ringtoneUri, streamType, null /* volumeShaperConfig */);
}
//FIXME bypass the notion of stream types within the class
/**
* Returns a {@link Ringtone} with {@link VolumeShaper} if required for a given sound URI on
* the given stream type. Normally, if you change the stream type on the returned
* {@link Ringtone}, it will re-create the {@link MediaPlayer}. This is just
* an optimized route to avoid that.
*
* @param streamType The stream type for the ringtone, or -1 if it should
* not be set (and the default used instead).
* @param volumeShaperConfig config for volume shaper of the ringtone if applied.
* @see #getRingtone(Context, Uri)
*/
@UnsupportedAppUsage
private static Ringtone getRingtone(
final Context context, Uri ringtoneUri, int streamType,
@Nullable VolumeShaper.Configuration volumeShaperConfig) {
try {
final Ringtone r = new Ringtone(context, true);
if (streamType >= 0) {
//FIXME deprecated call
r.setStreamType(streamType);
}
r.setUri(ringtoneUri);
r.setUri(ringtoneUri, volumeShaperConfig);
return r;
} catch (Exception ex) {
Log.e(TAG, "Failed to open ringtone " + ringtoneUri + ": " + ex);