Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a75567ae authored by Simon Bowden's avatar Simon Bowden
Browse files

Create a Builder for Ringtone, add unit tests.

Currently hidden until the full new API is ready, but convert private
factory methods from RingtoneManager to use it. This moves towards
making the Ringtone class less mutable, and particularly for all required
media player properties (esp AudioAttributes) being available for the
initial construction.

Adds an initial unit test covering basic properties and fallback, and
"documenting" what happens when the uri is null, which was unclear before.

Bug: Bug: 261571543
Test: manual, presubmit
Change-Id: I81d512e9b21b64a2cca0450cb85c52d8a2125865
parent abcf9857
Loading
Loading
Loading
Loading
+14 −8
Original line number Diff line number Diff line
@@ -42,18 +42,22 @@ public class LocalRingtonePlayer

    private final MediaPlayer mMediaPlayer;
    private final AudioAttributes mAudioAttributes;
    private final Ringtone.Injectables mInjectables;
    private final AudioManager mAudioManager;
    private final VolumeShaper mVolumeShaper;
    private HapticGenerator mHapticGenerator;

    private LocalRingtonePlayer(@NonNull MediaPlayer mediaPlayer,
            @NonNull AudioAttributes audioAttributes, @NonNull AudioManager audioManager,
            @Nullable HapticGenerator hapticGenerator, @Nullable VolumeShaper volumeShaper) {
            @NonNull AudioAttributes audioAttributes, @NonNull Ringtone.Injectables injectables,
            @NonNull AudioManager audioManager, @Nullable HapticGenerator hapticGenerator,
            @Nullable VolumeShaper volumeShaper) {
        Objects.requireNonNull(mediaPlayer);
        Objects.requireNonNull(audioAttributes);
        Objects.requireNonNull(injectables);
        Objects.requireNonNull(audioManager);
        mMediaPlayer = mediaPlayer;
        mAudioAttributes = audioAttributes;
        mInjectables = injectables;
        mAudioManager = audioManager;
        mVolumeShaper = volumeShaper;
        mHapticGenerator = hapticGenerator;
@@ -67,6 +71,7 @@ public class LocalRingtonePlayer
    static LocalRingtonePlayer create(@NonNull Context context,
            @NonNull AudioManager audioManager, @NonNull Uri soundUri,
            @NonNull AudioAttributes audioAttributes,
            @NonNull Ringtone.Injectables injectables,
            @Nullable VolumeShaper.Configuration volumeShaperConfig,
            @Nullable AudioDeviceInfo preferredDevice, boolean initialHapticGeneratorEnabled,
            boolean initialLooping, float initialVolume) {
@@ -74,7 +79,7 @@ public class LocalRingtonePlayer
        Objects.requireNonNull(soundUri);
        Objects.requireNonNull(audioAttributes);
        Trace.beginSection("createLocalMediaPlayer");
        MediaPlayer mediaPlayer = new MediaPlayer();
        MediaPlayer mediaPlayer = injectables.newMediaPlayer();
        HapticGenerator hapticGenerator = null;
        try {
            mediaPlayer.setDataSource(context, soundUri);
@@ -83,7 +88,7 @@ public class LocalRingtonePlayer
            mediaPlayer.setLooping(initialLooping);
            mediaPlayer.setVolume(initialVolume);
            if (initialHapticGeneratorEnabled) {
                hapticGenerator = HapticGenerator.create(mediaPlayer.getAudioSessionId());
                hapticGenerator = injectables.createHapticGenerator(mediaPlayer);
                hapticGenerator.setEnabled(true);
            }
            VolumeShaper volumeShaper = null;
@@ -91,7 +96,7 @@ public class LocalRingtonePlayer
                volumeShaper = mediaPlayer.createVolumeShaper(volumeShaperConfig);
            }
            mediaPlayer.prepare();
            return new LocalRingtonePlayer(mediaPlayer, audioAttributes, audioManager,
            return new LocalRingtonePlayer(mediaPlayer, audioAttributes, injectables, audioManager,
                    hapticGenerator, volumeShaper);
        } catch (SecurityException | IOException e) {
            if (hapticGenerator != null) {
@@ -113,6 +118,7 @@ public class LocalRingtonePlayer
    static LocalRingtonePlayer createForFallback(
            @NonNull AudioManager audioManager, @NonNull AssetFileDescriptor afd,
            @NonNull AudioAttributes audioAttributes,
            @NonNull Ringtone.Injectables injectables,
            @Nullable VolumeShaper.Configuration volumeShaperConfig,
            @Nullable AudioDeviceInfo preferredDevice,
            boolean initialLooping, float initialVolume) {
@@ -122,7 +128,7 @@ public class LocalRingtonePlayer
        Objects.requireNonNull(audioAttributes);
        Trace.beginSection("createFallbackLocalMediaPlayer");

        MediaPlayer mediaPlayer = new MediaPlayer();
        MediaPlayer mediaPlayer = injectables.newMediaPlayer();
        try {
            if (afd.getDeclaredLength() < 0) {
                mediaPlayer.setDataSource(afd.getFileDescriptor());
@@ -140,7 +146,7 @@ public class LocalRingtonePlayer
                volumeShaper = mediaPlayer.createVolumeShaper(volumeShaperConfig);
            }
            mediaPlayer.prepare();
            return new LocalRingtonePlayer(mediaPlayer, audioAttributes, audioManager,
            return new LocalRingtonePlayer(mediaPlayer, audioAttributes, injectables, audioManager,
                    /* hapticGenerator= */ null, volumeShaper);
        } catch (SecurityException | IOException e) {
            Log.e(TAG, "Failed to open fallback ringtone");
@@ -202,7 +208,7 @@ public class LocalRingtonePlayer
    @Override
    public void setHapticGeneratorEnabled(boolean enabled) {
        if (enabled && mHapticGenerator == null) {
            mHapticGenerator = HapticGenerator.create(mMediaPlayer.getAudioSessionId());
            mHapticGenerator = mInjectables.createHapticGenerator(mMediaPlayer);
        }
        if (mHapticGenerator != null) {
            mHapticGenerator.setEnabled(enabled);
Loading