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());
     }
 }