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

Commit 0167a67f authored by Hall Liu's avatar Hall Liu
Browse files

Fix ringer test that got broken by VibrationEffect

Isolate Ringer.java from any direct dependency on VibrationEffect, using
a proxy for all the static VibrationEffect creation methods.

Change-Id: I8ab4da14150528d70bfff4a52fb02f32eb4b03be
Fixes: 80201920
Test: unit
parent 679e6fd8
Loading
Loading
Loading
Loading
+2 −1
Original line number Original line Diff line number Diff line
@@ -418,7 +418,8 @@ public class CallsManager extends Call.ListenerBase
                systemStateProvider, defaultDialerCache, mTimeoutsAdapter,
                systemStateProvider, defaultDialerCache, mTimeoutsAdapter,
                emergencyCallHelper);
                emergencyCallHelper);
        mRinger = new Ringer(playerFactory, context, systemSettingsUtil, asyncRingtonePlayer,
        mRinger = new Ringer(playerFactory, context, systemSettingsUtil, asyncRingtonePlayer,
                ringtoneFactory, systemVibrator, mInCallController);
                ringtoneFactory, systemVibrator,
                new Ringer.VibrationEffectProxy(), mInCallController);
        mCallRecordingTonePlayer = new CallRecordingTonePlayer(mContext,
        mCallRecordingTonePlayer = new CallRecordingTonePlayer(mContext,
                (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE), mLock);
                (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE), mLock);
        mCallAudioManager = new CallAudioManager(callAudioRouteStateMachine,
        mCallAudioManager = new CallAudioManager(callAudioRouteStateMachine,
+15 −3
Original line number Original line Diff line number Diff line
@@ -39,6 +39,15 @@ import java.util.ArrayList;
 */
 */
@VisibleForTesting
@VisibleForTesting
public class Ringer {
public class Ringer {
    public static class VibrationEffectProxy {
        public VibrationEffect createWaveform(long[] timings, int[] amplitudes, int repeat) {
            return VibrationEffect.createWaveform(timings, amplitudes, repeat);
        }

        public VibrationEffect get(Uri ringtoneUri, Context context) {
            return VibrationEffect.get(ringtoneUri, context);
        }
    }
    @VisibleForTesting
    @VisibleForTesting
    public VibrationEffect mDefaultVibrationEffect;
    public VibrationEffect mDefaultVibrationEffect;


@@ -89,6 +98,7 @@ public class Ringer {
    private final Context mContext;
    private final Context mContext;
    private final Vibrator mVibrator;
    private final Vibrator mVibrator;
    private final InCallController mInCallController;
    private final InCallController mInCallController;
    private final VibrationEffectProxy mVibrationEffectProxy;


    private InCallTonePlayer mCallWaitingPlayer;
    private InCallTonePlayer mCallWaitingPlayer;
    private RingtoneFactory mRingtoneFactory;
    private RingtoneFactory mRingtoneFactory;
@@ -115,6 +125,7 @@ public class Ringer {
            AsyncRingtonePlayer asyncRingtonePlayer,
            AsyncRingtonePlayer asyncRingtonePlayer,
            RingtoneFactory ringtoneFactory,
            RingtoneFactory ringtoneFactory,
            Vibrator vibrator,
            Vibrator vibrator,
            VibrationEffectProxy vibrationEffectProxy,
            InCallController inCallController) {
            InCallController inCallController) {


        mSystemSettingsUtil = systemSettingsUtil;
        mSystemSettingsUtil = systemSettingsUtil;
@@ -126,12 +137,13 @@ public class Ringer {
        mRingtonePlayer = asyncRingtonePlayer;
        mRingtonePlayer = asyncRingtonePlayer;
        mRingtoneFactory = ringtoneFactory;
        mRingtoneFactory = ringtoneFactory;
        mInCallController = inCallController;
        mInCallController = inCallController;
        mVibrationEffectProxy = vibrationEffectProxy;


        if (mContext.getResources().getBoolean(R.bool.use_simple_vibration_pattern)) {
        if (mContext.getResources().getBoolean(R.bool.use_simple_vibration_pattern)) {
            mDefaultVibrationEffect = VibrationEffect.createWaveform(SIMPLE_VIBRATION_PATTERN,
            mDefaultVibrationEffect = mVibrationEffectProxy.createWaveform(SIMPLE_VIBRATION_PATTERN,
                    SIMPLE_VIBRATION_AMPLITUDE, REPEAT_SIMPLE_VIBRATION_AT);
                    SIMPLE_VIBRATION_AMPLITUDE, REPEAT_SIMPLE_VIBRATION_AT);
        } else {
        } else {
            mDefaultVibrationEffect = VibrationEffect.createWaveform(PULSE_PATTERN,
            mDefaultVibrationEffect = mVibrationEffectProxy.createWaveform(PULSE_PATTERN,
                    PULSE_AMPLITUDE, REPEAT_VIBRATION_AT);
                    PULSE_AMPLITUDE, REPEAT_VIBRATION_AT);
        }
        }
    }
    }
@@ -209,7 +221,7 @@ public class Ringer {
        Ringtone ringtone = factory.getRingtone(call);
        Ringtone ringtone = factory.getRingtone(call);
        Uri ringtoneUri = ringtone != null ? ringtone.getUri() : null;
        Uri ringtoneUri = ringtone != null ? ringtone.getUri() : null;
        if (ringtoneUri != null) {
        if (ringtoneUri != null) {
            effect = VibrationEffect.get(ringtoneUri, mContext);
            effect = mVibrationEffectProxy.get(ringtoneUri, mContext);
        }
        }


        if (effect == null) {
        if (effect == null) {
+46 −7
Original line number Original line Diff line number Diff line
@@ -18,12 +18,12 @@ package com.android.server.telecom.tests;


import android.app.NotificationManager;
import android.app.NotificationManager;
import android.content.Context;
import android.content.Context;
import android.content.res.Resources;
import android.media.AudioAttributes;
import android.media.AudioAttributes;
import android.media.AudioManager;
import android.media.AudioManager;
import android.media.Ringtone;
import android.media.Ringtone;
import android.net.Uri;
import android.net.Uri;
import android.os.Bundle;
import android.os.Bundle;
import android.os.Parcel;
import android.os.VibrationEffect;
import android.os.VibrationEffect;
import android.os.Vibrator;
import android.os.Vibrator;
import android.telecom.TelecomManager;
import android.telecom.TelecomManager;
@@ -42,20 +42,56 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;
import org.junit.runners.JUnit4;
import org.mockito.Mock;
import org.mockito.Mock;
import org.mockito.Spy;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;


import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.assertTrue;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.when;


import java.util.Objects;

@RunWith(JUnit4.class)
@RunWith(JUnit4.class)
public class RingerTest extends TelecomTestCase {
public class RingerTest extends TelecomTestCase {
    private static final Uri FAKE_RINGTONE_URI = Uri.parse("content://media/fake/audio/1729");
    private static final Uri FAKE_RINGTONE_URI = Uri.parse("content://media/fake/audio/1729");
    private static class UriVibrationEffect extends VibrationEffect {
        final Uri mUri;

        private UriVibrationEffect(Uri uri) {
            mUri = uri;
        }

        @Override
        public void validate() {
            // not needed
        }

        @Override
        public long getDuration() {
            return 0;
        }

        @Override
        public void writeToParcel(Parcel dest, int flags) {
            // not needed
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            UriVibrationEffect that = (UriVibrationEffect) o;
            return Objects.equals(mUri, that.mUri);
        }
    }


    @Mock InCallTonePlayer.Factory mockPlayerFactory;
    @Mock InCallTonePlayer.Factory mockPlayerFactory;
    @Mock SystemSettingsUtil mockSystemSettingsUtil;
    @Mock SystemSettingsUtil mockSystemSettingsUtil;
@@ -63,6 +99,7 @@ public class RingerTest extends TelecomTestCase {
    @Mock RingtoneFactory mockRingtoneFactory;
    @Mock RingtoneFactory mockRingtoneFactory;
    @Mock Vibrator mockVibrator;
    @Mock Vibrator mockVibrator;
    @Mock InCallController mockInCallController;
    @Mock InCallController mockInCallController;
    @Spy Ringer.VibrationEffectProxy spyVibrationEffectProxy;


    @Mock InCallTonePlayer mockTonePlayer;
    @Mock InCallTonePlayer mockTonePlayer;
    @Mock Call mockCall1;
    @Mock Call mockCall1;
@@ -76,8 +113,10 @@ public class RingerTest extends TelecomTestCase {
    public void setUp() throws Exception {
    public void setUp() throws Exception {
        super.setUp();
        super.setUp();
        mContext = mComponentContextFixture.getTestDouble().getApplicationContext();
        mContext = mComponentContextFixture.getTestDouble().getApplicationContext();
        mRingerUnderTest = new Ringer(mockPlayerFactory, mContext, mockSystemSettingsUtil,
        doAnswer(invocation -> {
                mockRingtonePlayer, mockRingtoneFactory, mockVibrator, mockInCallController);
            Uri ringtoneUriForEffect = invocation.getArgument(0);
            return new UriVibrationEffect(ringtoneUriForEffect);
        }).when(spyVibrationEffectProxy).get(any(), any());
        when(mockPlayerFactory.createPlayer(anyInt())).thenReturn(mockTonePlayer);
        when(mockPlayerFactory.createPlayer(anyInt())).thenReturn(mockTonePlayer);
        mockAudioManager =
        mockAudioManager =
                (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
                (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
@@ -85,6 +124,9 @@ public class RingerTest extends TelecomTestCase {
        NotificationManager notificationManager =
        NotificationManager notificationManager =
                (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
                (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
        when(notificationManager.matchesCallFilter(any(Bundle.class))).thenReturn(true);
        when(notificationManager.matchesCallFilter(any(Bundle.class))).thenReturn(true);
        mRingerUnderTest = new Ringer(mockPlayerFactory, mContext, mockSystemSettingsUtil,
                mockRingtonePlayer, mockRingtoneFactory, mockVibrator, spyVibrationEffectProxy,
                mockInCallController);
    }
    }


    @SmallTest
    @SmallTest
@@ -207,9 +249,6 @@ public class RingerTest extends TelecomTestCase {
    @SmallTest
    @SmallTest
    @Test
    @Test
    public void testCustomVibrationForRingtone() {
    public void testCustomVibrationForRingtone() {
        Resources resources = mContext.getResources();
        when(resources.getStringArray(com.android.internal.R.array.config_ringtoneEffectUris))
                .thenReturn(new String[] { FAKE_RINGTONE_URI.toString() });
        mRingerUnderTest.startCallWaiting(mockCall1);
        mRingerUnderTest.startCallWaiting(mockCall1);
        Ringtone mockRingtone = mock(Ringtone.class);
        Ringtone mockRingtone = mock(Ringtone.class);
        when(mockRingtoneFactory.getRingtone(any(Call.class))).thenReturn(mockRingtone);
        when(mockRingtoneFactory.getRingtone(any(Call.class))).thenReturn(mockRingtone);
@@ -218,7 +257,7 @@ public class RingerTest extends TelecomTestCase {
        assertTrue(mRingerUnderTest.startRinging(mockCall2, false));
        assertTrue(mRingerUnderTest.startRinging(mockCall2, false));
        verify(mockTonePlayer).stopTone();
        verify(mockTonePlayer).stopTone();
        verify(mockRingtonePlayer).play(any(RingtoneFactory.class), any(Call.class));
        verify(mockRingtonePlayer).play(any(RingtoneFactory.class), any(Call.class));
        verify(mockVibrator).vibrate(eq(VibrationEffect.get(FAKE_RINGTONE_URI, mContext)),
        verify(mockVibrator).vibrate(eq(spyVibrationEffectProxy.get(FAKE_RINGTONE_URI, mContext)),
                any(AudioAttributes.class));
                any(AudioAttributes.class));
    }
    }