Change InCallTonePlayerTest to use mock MediaPlayer.
This was causing flakes. Using a mock will prevent that.
Unfortunately the startPlaying method on MediaPlayer is native, so had to
abstract out access to MediaPlayer.
Bug: 120289096
Bug: 120422950
Test: Ran unit tests.
Merged-In: If5462ae23978238e948f8693c95813b0dc4a1850
Change-Id: If5462ae23978238e948f8693c95813b0dc4a1850
diff --git a/src/com/android/server/telecom/CallsManager.java b/src/com/android/server/telecom/CallsManager.java
index 31787dc..993c40e 100644
--- a/src/com/android/server/telecom/CallsManager.java
+++ b/src/com/android/server/telecom/CallsManager.java
@@ -436,8 +436,10 @@
AudioManager audioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
InCallTonePlayer.MediaPlayerFactory mediaPlayerFactory =
- (resourceId, attributes) -> MediaPlayer.create(mContext, resourceId, attributes,
- audioManager.generateAudioSessionId());
+ (resourceId, attributes) ->
+ new InCallTonePlayer.MediaPlayerAdapterImpl(
+ MediaPlayer.create(mContext, resourceId, attributes,
+ audioManager.generateAudioSessionId()));
InCallTonePlayer.Factory playerFactory = new InCallTonePlayer.Factory(
callAudioRoutePeripheralAdapter, lock, toneGeneratorFactory, mediaPlayerFactory,
() -> audioManager.getStreamVolume(AudioManager.STREAM_RING) > 0);
diff --git a/src/com/android/server/telecom/InCallTonePlayer.java b/src/com/android/server/telecom/InCallTonePlayer.java
index 1c9801c..0cc7ad2 100644
--- a/src/com/android/server/telecom/InCallTonePlayer.java
+++ b/src/com/android/server/telecom/InCallTonePlayer.java
@@ -76,8 +76,49 @@
ToneGenerator get (int streamType, int volume);
}
+ public interface MediaPlayerAdapter {
+ void setLooping(boolean isLooping);
+ void setOnCompletionListener(MediaPlayer.OnCompletionListener listener);
+ void start();
+ void release();
+ int getDuration();
+ }
+
+ public static class MediaPlayerAdapterImpl implements MediaPlayerAdapter {
+ private MediaPlayer mMediaPlayer;
+
+ public MediaPlayerAdapterImpl(MediaPlayer mediaPlayer) {
+ mMediaPlayer = mediaPlayer;
+ }
+
+ @Override
+ public void setLooping(boolean isLooping) {
+ mMediaPlayer.setLooping(isLooping);
+ }
+
+ @Override
+ public void setOnCompletionListener(MediaPlayer.OnCompletionListener listener) {
+ mMediaPlayer.setOnCompletionListener(listener);
+ }
+
+ @Override
+ public void start() {
+ mMediaPlayer.start();
+ }
+
+ @Override
+ public void release() {
+ mMediaPlayer.release();
+ }
+
+ @Override
+ public int getDuration() {
+ return mMediaPlayer.getDuration();
+ }
+ }
+
public interface MediaPlayerFactory {
- MediaPlayer get (int resourceId, AudioAttributes attributes);
+ MediaPlayerAdapter get (int resourceId, AudioAttributes attributes);
}
public interface AudioManagerAdapter {
@@ -136,7 +177,7 @@
private int mState;
/** For tones which are not generated using ToneGenerator. */
- private MediaPlayer mToneMediaPlayer = null;
+ private MediaPlayerAdapter mToneMediaPlayer = null;
/** Telecom lock object. */
private final TelecomSystem.SyncRoot mLock;
diff --git a/tests/src/com/android/server/telecom/tests/InCallTonePlayerTest.java b/tests/src/com/android/server/telecom/tests/InCallTonePlayerTest.java
index af5c36b..7718da8 100644
--- a/tests/src/com/android/server/telecom/tests/InCallTonePlayerTest.java
+++ b/tests/src/com/android/server/telecom/tests/InCallTonePlayerTest.java
@@ -19,6 +19,7 @@
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.timeout;
import static org.mockito.Mockito.verify;
@@ -56,7 +57,35 @@
@Mock
private InCallTonePlayer.ToneGeneratorFactory mToneGeneratorFactory;
- private MediaPlayer mMediaPlayer;
+ private InCallTonePlayer.MediaPlayerAdapter mMediaPlayerAdapter =
+ new InCallTonePlayer.MediaPlayerAdapter() {
+ private MediaPlayer.OnCompletionListener mListener;
+
+ @Override
+ public void setLooping(boolean isLooping) {
+ // Do nothing.
+ }
+
+ @Override
+ public void setOnCompletionListener(MediaPlayer.OnCompletionListener listener) {
+ mListener = listener;
+ }
+
+ @Override
+ public void start() {
+ mListener.onCompletion(null);
+ }
+
+ @Override
+ public void release() {
+ // Do nothing.
+ }
+
+ @Override
+ public int getDuration() {
+ return 0;
+ }
+ };
@Mock
private InCallTonePlayer.MediaPlayerFactory mMediaPlayerFactory;
@@ -71,14 +100,13 @@
@Before
public void setUp() throws Exception {
super.setUp();
+
+ when(mToneGeneratorFactory.get(anyInt(), anyInt())).thenReturn(mToneGenerator);
+ when(mMediaPlayerFactory.get(anyInt(), any())).thenReturn(mMediaPlayerAdapter);
+
mFactory = new InCallTonePlayer.Factory(mCallAudioRoutePeripheralAdapter, mLock,
mToneGeneratorFactory, mMediaPlayerFactory, mAudioManagerAdapter);
mFactory.setCallAudioManager(mCallAudioManager);
-
- when(mToneGeneratorFactory.get(anyInt(), anyInt())).thenReturn(mToneGenerator);
-
- mMediaPlayer = new MediaPlayer();
- when(mMediaPlayerFactory.get(anyInt(), any())).thenReturn(mMediaPlayer);
}
@SmallTest
@@ -102,6 +130,6 @@
// Verify we did play a tone.
verify(mCallAudioManager).setIsTonePlaying(eq(true));
- verify(mMediaPlayerFactory ,timeout(5000)).get(anyInt(), any());
+ verify(mMediaPlayerFactory, timeout(5000)).get(anyInt(), any());
}
}