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

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

Add back the older Ringtone implementation to allow flag control.

This CL splits the Ringtone class into RingtoneV1 and RingtoneV2, with
a switch between them. The switch is currently a system property as
the flag system for frameworks/base is still being built.

Unfortunately the old implementation didn't have test coverage.

Bug: 293846645
Test: presubmit, manual
Change-Id: I0a7fd10261e29a74ea1798f5bfbf8eddcafa1e5e
parent d3f21133
Loading
Loading
Loading
Loading
+10 −2
Original line number Diff line number Diff line
@@ -30,12 +30,20 @@ interface IRingtonePlayer {
    /** Used for Ringtone.java playback */
    @UnsupportedAppUsage
    oneway void play(IBinder token, in Uri uri, in AudioAttributes aa, float volume, boolean looping);
    oneway void stop(IBinder token);
    boolean isPlaying(IBinder token);

    // RingtoneV1
    oneway void playWithVolumeShaping(IBinder token, in Uri uri, in AudioAttributes aa,
            float volume, boolean looping, in @nullable VolumeShaper.Configuration volumeShaperConfig);
    oneway void setPlaybackProperties(IBinder token, float volume, boolean looping,
            boolean hapticGeneratorEnabled);

    // RingtoneV2
    oneway void playRemoteRingtone(IBinder token, in Uri uri, in AudioAttributes aa,
        boolean useExactAudioAttributes, int enabledMedia, in @nullable VibrationEffect ve,
        float volume, boolean looping, boolean hapticGeneratorEnabled,
        in @nullable VolumeShaper.Configuration volumeShaperConfig);
    oneway void stop(IBinder token);
    boolean isPlaying(IBinder token);
    oneway void setLooping(IBinder token, boolean looping);
    oneway void setVolume(IBinder token, float volume);
    oneway void setHapticGeneratorEnabled(IBinder token, boolean hapticGeneratorEnabled);
+5 −5
Original line number Diff line number Diff line
@@ -37,7 +37,7 @@ import java.util.Objects;
 * @hide
 */
public class LocalRingtonePlayer
        implements Ringtone.RingtonePlayer, MediaPlayer.OnCompletionListener {
        implements RingtoneV2.RingtonePlayer, MediaPlayer.OnCompletionListener {
    private static final String TAG = "LocalRingtonePlayer";

    // keep references on active Ringtones until stopped or completion listener called.
@@ -45,7 +45,7 @@ public class LocalRingtonePlayer

    private final MediaPlayer mMediaPlayer;
    private final AudioAttributes mAudioAttributes;
    private final Ringtone.RingtonePlayer mVibrationPlayer;
    private final RingtoneV2.RingtonePlayer mVibrationPlayer;
    private final Ringtone.Injectables mInjectables;
    private final AudioManager mAudioManager;
    private final VolumeShaper mVolumeShaper;
@@ -55,7 +55,7 @@ public class LocalRingtonePlayer
            @NonNull AudioAttributes audioAttributes, @NonNull Ringtone.Injectables injectables,
            @NonNull AudioManager audioManager, @Nullable HapticGenerator hapticGenerator,
            @Nullable VolumeShaper volumeShaper,
            @Nullable Ringtone.RingtonePlayer vibrationPlayer) {
            @Nullable RingtoneV2.RingtonePlayer vibrationPlayer) {
        Objects.requireNonNull(mediaPlayer);
        Objects.requireNonNull(audioAttributes);
        Objects.requireNonNull(injectables);
@@ -74,7 +74,7 @@ public class LocalRingtonePlayer
     * loaded in the local player.
     */
    @Nullable
    static Ringtone.RingtonePlayer create(@NonNull Context context,
    static RingtoneV2.RingtonePlayer create(@NonNull Context context,
            @NonNull AudioManager audioManager, @NonNull Vibrator vibrator,
            @NonNull Uri soundUri,
            @NonNull AudioAttributes audioAttributes,
@@ -311,7 +311,7 @@ public class LocalRingtonePlayer
    }

    /** A RingtonePlayer that only plays a VibrationEffect. */
    static class VibrationEffectPlayer implements Ringtone.RingtonePlayer {
    static class VibrationEffectPlayer implements RingtoneV2.RingtonePlayer {
        private static final int VIBRATION_LOOP_DELAY_MS = 200;
        private final VibrationEffect mVibrationEffect;
        private final VibrationAttributes mVibrationAttributes;
+117 −410

File changed.

Preview size limit exceeded, changes collapsed.

+47 −12
Original line number Diff line number Diff line
@@ -496,13 +496,32 @@ public class RingtoneManager {
            mPreviousRingtone.stop();
        }

        Ringtone ringtone;
        Uri positionUri = getRingtoneUri(position);
        if (Ringtone.useRingtoneV2()) {
            mPreviousRingtone = new Ringtone.Builder(
                    mContext, Ringtone.MEDIA_SOUND, getDefaultAudioAttributes(mType))
                .setUri(getRingtoneUri(position))
                    .setUri(positionUri)
                    .build();
        } else {
            mPreviousRingtone = createRingtoneV1WithStreamType(mContext, positionUri,
                    inferStreamType(), /* volumeShaperConfig= */ null);
        }
        return mPreviousRingtone;
    }

    private static Ringtone createRingtoneV1WithStreamType(
            final Context context, Uri ringtoneUri, int streamType,
            @Nullable VolumeShaper.Configuration volumeShaperConfig) {
        try {
            return Ringtone.createV1WithCustomStreamType(context, streamType, ringtoneUri,
                    volumeShaperConfig);
        } catch (Exception ex) {
            Log.e(TAG, "Failed to open ringtone " + ringtoneUri + ": " + ex);
        }
        return null;
    }

    /**
     * Gets a {@link Uri} for the ringtone at the given position in the {@link Cursor}.
     * 
@@ -694,9 +713,14 @@ public class RingtoneManager {
     * @return A {@link Ringtone} for the given URI, or null.
     */
    public static Ringtone getRingtone(final Context context, Uri ringtoneUri) {
        return new Ringtone.Builder(context, Ringtone.MEDIA_SOUND, getDefaultAudioAttributes(-1))
        if (Ringtone.useRingtoneV2()) {
            return new Ringtone.Builder(
                    context, Ringtone.MEDIA_SOUND, getDefaultAudioAttributes(-1))
                    .setUri(ringtoneUri)
                    .build();
        } else {
            return createRingtoneV1WithStreamType(context, ringtoneUri, -1, null);
        }
    }

    /**
@@ -706,11 +730,22 @@ public class RingtoneManager {
            @Nullable VolumeShaper.Configuration volumeShaperConfig,
            AudioAttributes audioAttributes) {
        // TODO: move caller(s) away from this method: inline the builder call.
        if (Ringtone.useRingtoneV2()) {
            return new Ringtone.Builder(context, Ringtone.MEDIA_SOUND, audioAttributes)
                    .setUri(ringtoneUri)
                    .setVolumeShaperConfig(volumeShaperConfig)
                    .setUseExactAudioAttributes(true)  // May be using audio-coupled via attrs
                    .build();
        } else {
            try {
                return Ringtone.createV1WithCustomAudioAttributes(context, audioAttributes,
                        ringtoneUri, volumeShaperConfig, /* allowRemote= */ true);
            } catch (Exception ex) {
                // Match broad catching of createRingtoneV1.
                Log.e(TAG, "Failed to open ringtone " + ringtoneUri + ": " + ex);
                return null;
            }
        }
    }

    /**
+614 −0

File added.

Preview size limit exceeded, changes collapsed.

Loading