Fixes some of the flakiness in Telecom

- Fixes some flakiness in the tests
- Mocks out the ToneGenerator

Test: Run Telecom Unit Tests
Change-Id: If3bd51fe4a82068cc0d712d2e499abde4fdb0481
diff --git a/scripts/telecom_testing.sh b/scripts/telecom_testing.sh
index 0ece427..723b041 100644
--- a/scripts/telecom_testing.sh
+++ b/scripts/telecom_testing.sh
@@ -10,6 +10,7 @@
                           running tests (mmma).
   -e                    Run code coverage. Coverage will be output into the coverage/
                           directory in the repo root.
+  -g                    Run build commands with USE_GOMA=true
   -h                    This help message.
   "
 
@@ -20,8 +21,9 @@
   local installwdep=false
   local debug=false
   local coverage=false
+  local goma=false
 
-  while getopts "c:p:hadie" opt; do
+  while getopts "c:p:hadieg" opt; do
     case "$opt" in
       h)
         echo "$usage"
@@ -40,6 +42,8 @@
         installwdep=true;;
       e)
         coverage=true;;
+      g)
+        goma=true;;
       p)
         project=$OPTARG;;
     esac
@@ -67,6 +71,8 @@
   if [ $install = true ] ; then
     local olddir=$(pwd)
     local emma_opt=
+    local goma_opt=
+
     cd $T
     # Build and exit script early if build fails
 
@@ -76,10 +82,14 @@
       emma_opt="EMMA_INSTRUMENT=false"
     fi
 
+    if [ $goma = true ] ; then
+        goma_opt="USE_GOMA=true"
+    fi
+
     if [ $installwdep = true ] ; then
-      (export ${emma_opt}; mmma -j40 "$build_dir")
+      (export ${emma_opt}; mmma ${goma_opt} -j40 "$build_dir")
     else
-      (export ${emma_opt}; mmm "$build_dir")
+      (export ${emma_opt}; mmm ${goma_opt} "$build_dir")
     fi
     if [ $? -ne 0 ] ; then
       echo "Make failed! try using -a instead of -i if building with coverage"
diff --git a/src/com/android/server/telecom/CallsManager.java b/src/com/android/server/telecom/CallsManager.java
index 99e9e03..8a65c09 100644
--- a/src/com/android/server/telecom/CallsManager.java
+++ b/src/com/android/server/telecom/CallsManager.java
@@ -305,7 +305,8 @@
             Timeouts.Adapter timeoutsAdapter,
             AsyncRingtonePlayer asyncRingtonePlayer,
             PhoneNumberUtilsAdapter phoneNumberUtilsAdapter,
-            EmergencyCallHelper emergencyCallHelper) {
+            EmergencyCallHelper emergencyCallHelper,
+            InCallTonePlayer.ToneGeneratorFactory toneGeneratorFactory) {
         mContext = context;
         mLock = lock;
         mPhoneNumberUtilsAdapter = phoneNumberUtilsAdapter;
@@ -345,7 +346,7 @@
                         mDockManager);
 
         InCallTonePlayer.Factory playerFactory = new InCallTonePlayer.Factory(
-                callAudioRoutePeripheralAdapter, lock);
+                callAudioRoutePeripheralAdapter, lock, toneGeneratorFactory);
 
         SystemSettingsUtil systemSettingsUtil = new SystemSettingsUtil();
         RingtoneFactory ringtoneFactory = new RingtoneFactory(this, context);
diff --git a/src/com/android/server/telecom/InCallTonePlayer.java b/src/com/android/server/telecom/InCallTonePlayer.java
index 62c692b..a258aee 100644
--- a/src/com/android/server/telecom/InCallTonePlayer.java
+++ b/src/com/android/server/telecom/InCallTonePlayer.java
@@ -40,11 +40,13 @@
         private CallAudioManager mCallAudioManager;
         private final CallAudioRoutePeripheralAdapter mCallAudioRoutePeripheralAdapter;
         private final TelecomSystem.SyncRoot mLock;
+        private final ToneGeneratorFactory mToneGeneratorFactory;
 
         Factory(CallAudioRoutePeripheralAdapter callAudioRoutePeripheralAdapter,
-                TelecomSystem.SyncRoot lock) {
+                TelecomSystem.SyncRoot lock, ToneGeneratorFactory toneGeneratorFactory) {
             mCallAudioRoutePeripheralAdapter = callAudioRoutePeripheralAdapter;
             mLock = lock;
+            mToneGeneratorFactory = toneGeneratorFactory;
         }
 
         public void setCallAudioManager(CallAudioManager callAudioManager) {
@@ -53,10 +55,14 @@
 
         public InCallTonePlayer createPlayer(int tone) {
             return new InCallTonePlayer(tone, mCallAudioManager,
-                    mCallAudioRoutePeripheralAdapter, mLock);
+                    mCallAudioRoutePeripheralAdapter, mLock, mToneGeneratorFactory);
         }
     }
 
+    public interface ToneGeneratorFactory {
+        ToneGenerator get (int streamType, int volume);
+    }
+
     // The possible tones that we can play.
     public static final int TONE_INVALID = 0;
     public static final int TONE_BUSY = 1;
@@ -111,6 +117,8 @@
     private Session mSession;
     private final Object mSessionLock = new Object();
 
+    private final ToneGeneratorFactory mToneGenerator;
+
     /**
      * Initializes the tone player. Private; use the {@link Factory} to create tone players.
      *
@@ -120,12 +128,14 @@
             int toneId,
             CallAudioManager callAudioManager,
             CallAudioRoutePeripheralAdapter callAudioRoutePeripheralAdapter,
-            TelecomSystem.SyncRoot lock) {
+            TelecomSystem.SyncRoot lock,
+            ToneGeneratorFactory toneGeneratorFactory) {
         mState = STATE_OFF;
         mToneId = toneId;
         mCallAudioManager = callAudioManager;
         mCallAudioRoutePeripheralAdapter = callAudioRoutePeripheralAdapter;
         mLock = lock;
+        mToneGenerator = toneGeneratorFactory;
     }
 
     /** {@inheritDoc} */
@@ -227,7 +237,7 @@
             // signal, and is not as important.
             try {
                 Log.v(this, "Creating generator");
-                toneGenerator = new ToneGenerator(stream, toneVolume);
+                toneGenerator = mToneGenerator.get(stream, toneVolume);
             } catch (RuntimeException e) {
                 Log.w(this, "Failed to create ToneGenerator.", e);
                 return;
diff --git a/src/com/android/server/telecom/TelecomSystem.java b/src/com/android/server/telecom/TelecomSystem.java
index d2a1959..b40381b 100644
--- a/src/com/android/server/telecom/TelecomSystem.java
+++ b/src/com/android/server/telecom/TelecomSystem.java
@@ -189,7 +189,8 @@
             Timeouts.Adapter timeoutsAdapter,
             AsyncRingtonePlayer asyncRingtonePlayer,
             PhoneNumberUtilsAdapter phoneNumberUtilsAdapter,
-            IncomingCallNotifier incomingCallNotifier) {
+            IncomingCallNotifier incomingCallNotifier,
+            InCallTonePlayer.ToneGeneratorFactory toneGeneratorFactory) {
         mContext = context.getApplicationContext();
         LogUtils.initLogging(mContext);
         DefaultDialerManagerAdapter defaultDialerAdapter =
@@ -253,7 +254,8 @@
                 timeoutsAdapter,
                 asyncRingtonePlayer,
                 phoneNumberUtilsAdapter,
-                emergencyCallHelper);
+                emergencyCallHelper,
+                toneGeneratorFactory);
 
         mIncomingCallNotifier = incomingCallNotifier;
         incomingCallNotifier.setCallsManagerProxy(new IncomingCallNotifier.CallsManagerProxy() {
diff --git a/src/com/android/server/telecom/components/TelecomService.java b/src/com/android/server/telecom/components/TelecomService.java
index 56c1e08..d9d60b8 100644
--- a/src/com/android/server/telecom/components/TelecomService.java
+++ b/src/com/android/server/telecom/components/TelecomService.java
@@ -21,6 +21,7 @@
 import android.content.Context;
 import android.content.Intent;
 import android.media.IAudioService;
+import android.media.ToneGenerator;
 import android.os.IBinder;
 import android.os.PowerManager;
 import android.os.ServiceManager;
@@ -35,6 +36,7 @@
 import com.android.server.telecom.DefaultDialerCache;
 import com.android.server.telecom.HeadsetMediaButton;
 import com.android.server.telecom.HeadsetMediaButtonFactory;
+import com.android.server.telecom.InCallTonePlayer;
 import com.android.server.telecom.InCallWakeLockControllerFactory;
 import com.android.server.telecom.CallAudioManager;
 import com.android.server.telecom.PhoneAccountRegistrar;
@@ -129,7 +131,7 @@
                             new InCallWakeLockControllerFactory() {
                                 @Override
                                 public InCallWakeLockController create(Context context,
-                                                                       CallsManager callsManager) {
+                                        CallsManager callsManager) {
                                     return new InCallWakeLockController(
                                             new TelecomWakeLock(context,
                                                     PowerManager.FULL_WAKE_LOCK,
@@ -158,7 +160,8 @@
                             new Timeouts.Adapter(),
                             new AsyncRingtonePlayer(),
                             new PhoneNumberUtilsAdapterImpl(),
-                            new IncomingCallNotifier(context)
+                            new IncomingCallNotifier(context),
+                            ToneGenerator::new
                     ));
         }
         if (BluetoothAdapter.getDefaultAdapter() != null) {
diff --git a/tests/src/com/android/server/telecom/tests/CallAudioRouteStateMachineTest.java b/tests/src/com/android/server/telecom/tests/CallAudioRouteStateMachineTest.java
index d0d7c8e..129d86e 100644
--- a/tests/src/com/android/server/telecom/tests/CallAudioRouteStateMachineTest.java
+++ b/tests/src/com/android/server/telecom/tests/CallAudioRouteStateMachineTest.java
@@ -915,6 +915,8 @@
 
         waitForStateMachineActionCompletion(stateMachine, CallAudioModeStateMachine.RUN_RUNNABLE);
 
+        Handler h = stateMachine.getHandler();
+        waitForHandlerAction(h, TEST_TIMEOUT);
         stateMachine.quitStateMachine();
 
         // Verify that no substantive interactions have taken place with the
diff --git a/tests/src/com/android/server/telecom/tests/ComponentContextFixture.java b/tests/src/com/android/server/telecom/tests/ComponentContextFixture.java
index 255af74..1c74bfa 100644
--- a/tests/src/com/android/server/telecom/tests/ComponentContextFixture.java
+++ b/tests/src/com/android/server/telecom/tests/ComponentContextFixture.java
@@ -439,7 +439,7 @@
         mResourceConfiguration.setLocale(Locale.TAIWAN);
 
         // TODO: Move into actual tests
-        when(mAudioManager.isWiredHeadsetOn()).thenReturn(false);
+        doReturn(false).when(mAudioManager).isWiredHeadsetOn();
 
         doAnswer(new Answer<List<ResolveInfo>>() {
             @Override
diff --git a/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java b/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java
index a522cae..205d778 100644
--- a/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java
+++ b/tests/src/com/android/server/telecom/tests/TelecomSystemTest.java
@@ -44,6 +44,7 @@
 import android.content.Intent;
 import android.media.AudioManager;
 import android.media.IAudioService;
+import android.media.ToneGenerator;
 import android.net.Uri;
 import android.os.Bundle;
 import android.os.Handler;
@@ -170,6 +171,21 @@
             return mIsEmergencyCall;
         }
     }
+
+    private class IncomingCallAddedListener extends CallsManagerListenerBase {
+
+        private final CountDownLatch mCountDownLatch;
+
+        public IncomingCallAddedListener(CountDownLatch latch) {
+            mCountDownLatch = latch;
+        }
+
+        @Override
+        public void onCallAdded(com.android.server.telecom.Call call) {
+            mCountDownLatch.countDown();
+        }
+    }
+
     PhoneNumberUtilsAdapter mPhoneNumberUtilsAdapter = new EmergencyNumberUtilsAdapter();
 
     @Mock HeadsetMediaButton mHeadsetMediaButton;
@@ -320,6 +336,8 @@
         // Finally, register the ConnectionServices with the PhoneAccountRegistrar of the
         // now-running TelecomSystem
         setupConnectionServices();
+
+        waitForHandlerAction(new Handler(Looper.getMainLooper()), TEST_TIMEOUT);
     }
 
     @Override
@@ -407,7 +425,8 @@
                 mTimeoutsAdapter,
                 mAsyncRingtonePlayer,
                 mPhoneNumberUtilsAdapter,
-                mIncomingCallNotifier);
+                mIncomingCallNotifier,
+                (streamType, volume) -> mock(ToneGenerator.class));
 
         mComponentContextFixture.setTelecomManager(new TelecomManager(
                 mComponentContextFixture.getTestDouble(),
@@ -749,6 +768,10 @@
         final int startingNumCalls = mInCallServiceFixtureX.mCallById.size();
         boolean hasInCallAdapter = mInCallServiceFixtureX.mInCallAdapter != null;
         connectionServiceFixture.mConnectionServiceDelegate.mVideoState = videoState;
+        CountDownLatch incomingCallAddedLatch = new CountDownLatch(1);
+        IncomingCallAddedListener callAddedListener =
+                new IncomingCallAddedListener(incomingCallAddedLatch);
+        mTelecomSystem.getCallsManager().addListener(callAddedListener);
 
         Bundle extras = new Bundle();
         extras.putParcelable(
@@ -773,6 +796,9 @@
         mCallerInfoAsyncQueryFactoryFixture.mRequests.forEach(
                 CallerInfoAsyncQueryFactoryFixture.Request::reply);
 
+        //Wait for/Verify call blocking happened asynchronously
+        incomingCallAddedLatch.await(TEST_TIMEOUT, TimeUnit.MILLISECONDS);
+
         IContentProvider blockedNumberProvider =
                 mSpyContext.getContentResolver().acquireProvider(BlockedNumberContract.AUTHORITY);
         verify(blockedNumberProvider, timeout(TEST_TIMEOUT)).call(
diff --git a/tests/src/com/android/server/telecom/tests/TelecomTestCase.java b/tests/src/com/android/server/telecom/tests/TelecomTestCase.java
index b909a54..b735df9 100644
--- a/tests/src/com/android/server/telecom/tests/TelecomTestCase.java
+++ b/tests/src/com/android/server/telecom/tests/TelecomTestCase.java
@@ -37,6 +37,7 @@
         mMockitoHelper.setUp(getContext(), getClass());
         mComponentContextFixture = new ComponentContextFixture();
         Log.setSessionContext(mComponentContextFixture.getTestDouble().getApplicationContext());
+        Log.getSessionManager().mCleanStaleSessions = null;
         MockitoAnnotations.initMocks(this);
     }