Merge "Add/fix null-check on ringtoneSupplier." into udc-dev
diff --git a/src/com/android/server/telecom/CallStreamingController.java b/src/com/android/server/telecom/CallStreamingController.java
index 54ea385..31b2235 100644
--- a/src/com/android/server/telecom/CallStreamingController.java
+++ b/src/com/android/server/telecom/CallStreamingController.java
@@ -54,10 +54,12 @@
     private CallStreamingServiceConnection mConnection;
     private boolean mIsStreaming;
     private final Object mLock;
+    private TelecomSystem.SyncRoot mTelecomLock;
 
-    public CallStreamingController(Context context) {
+    public CallStreamingController(Context context, TelecomSystem.SyncRoot telecomLock) {
         mLock = new Object();
         mContext = context;
+        mTelecomLock = telecomLock;
     }
 
     private void onConnectedInternal(Call call, TransactionalServiceWrapper wrapper,
@@ -101,6 +103,7 @@
         private final CallsManager mCallsManager;
 
         public QueryCallStreamingTransaction(CallsManager callsManager) {
+            super(callsManager.getLock());
             mCallsManager = callsManager;
         }
 
@@ -128,7 +131,9 @@
         private Call mCall;
         private boolean mEnterInterception;
 
-        public AudioInterceptionTransaction(Call call, boolean enterInterception) {
+        public AudioInterceptionTransaction(Call call, boolean enterInterception,
+                TelecomSystem.SyncRoot lock) {
+            super(lock);
             mCall = call;
             mEnterInterception = enterInterception;
         }
@@ -164,6 +169,7 @@
 
         public StreamingServiceTransaction(Context context, TransactionalServiceWrapper wrapper,
                 Call call) {
+            super(mTelecomLock);
             mWrapper = wrapper;
             mCall = call;
             mUserHandle = mCall.getInitiatingUser();
@@ -240,6 +246,7 @@
         private static final String TAG = "UnbindStreamingServiceTransaction";
 
         public UnbindStreamingServiceTransaction() {
+            super(mTelecomLock);
         }
 
         @SuppressLint("LongLogTag")
@@ -305,6 +312,7 @@
         @StreamingCall.StreamingCallState int mState;
 
         public CallStreamingStateChangeTransaction(@StreamingCall.StreamingCallState int state) {
+            super(mTelecomLock);
             mState = state;
         }
 
diff --git a/src/com/android/server/telecom/CallsManager.java b/src/com/android/server/telecom/CallsManager.java
index 591df7b..f36ba1b 100644
--- a/src/com/android/server/telecom/CallsManager.java
+++ b/src/com/android/server/telecom/CallsManager.java
@@ -136,6 +136,7 @@
 import com.android.server.telecom.ui.DisconnectedCallNotifier;
 import com.android.server.telecom.ui.IncomingCallNotifier;
 import com.android.server.telecom.ui.ToastFactory;
+import com.android.server.telecom.voip.TransactionManager;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -441,6 +442,7 @@
     private final CallAnomalyWatchdog mCallAnomalyWatchdog;
     private final CallStreamingController mCallStreamingController;
     private final BlockedNumbersAdapter mBlockedNumbersAdapter;
+    private final TransactionManager mTransactionManager;
 
     private final ConnectionServiceFocusManager.CallsManagerRequester mRequester =
             new ConnectionServiceFocusManager.CallsManagerRequester() {
@@ -549,7 +551,8 @@
             CallAnomalyWatchdog callAnomalyWatchdog,
             Ringer.AccessibilityManagerAdapter accessibilityManagerAdapter,
             Executor asyncTaskExecutor,
-            BlockedNumbersAdapter blockedNumbersAdapter) {
+            BlockedNumbersAdapter blockedNumbersAdapter,
+            TransactionManager transactionManager) {
         mContext = context;
         mLock = lock;
         mPhoneNumberUtilsAdapter = phoneNumberUtilsAdapter;
@@ -632,8 +635,9 @@
         mClockProxy = clockProxy;
         mToastFactory = toastFactory;
         mRoleManagerAdapter = roleManagerAdapter;
-        mCallStreamingController = new CallStreamingController(mContext);
+        mTransactionManager = transactionManager;
         mBlockedNumbersAdapter = blockedNumbersAdapter;
+        mCallStreamingController = new CallStreamingController(mContext, mLock);
 
         mListeners.add(mInCallWakeLockController);
         mListeners.add(statusBarNotifier);
diff --git a/src/com/android/server/telecom/TelecomSystem.java b/src/com/android/server/telecom/TelecomSystem.java
index fc5b1b6..8984b2b 100644
--- a/src/com/android/server/telecom/TelecomSystem.java
+++ b/src/com/android/server/telecom/TelecomSystem.java
@@ -49,6 +49,7 @@
 import com.android.server.telecom.ui.IncomingCallNotifier;
 import com.android.server.telecom.ui.MissedCallNotifierImpl.MissedCallNotifierImplFactory;
 import com.android.server.telecom.ui.ToastFactory;
+import com.android.server.telecom.voip.TransactionManager;
 
 import java.io.FileNotFoundException;
 import java.io.InputStream;
@@ -216,6 +217,7 @@
             BlockedNumbersAdapter blockedNumbersAdapter) {
         mContext = context.getApplicationContext();
         LogUtils.initLogging(mContext);
+        android.telecom.Log.setLock(mLock);
         AnomalyReporter.initialize(mContext);
         DefaultDialerManagerAdapter defaultDialerAdapter =
                 new DefaultDialerCache.DefaultDialerManagerAdapterImpl();
@@ -337,6 +339,7 @@
             CallAnomalyWatchdog callAnomalyWatchdog = new CallAnomalyWatchdog(
                     Executors.newSingleThreadScheduledExecutor(),
                     mLock, timeoutsAdapter, clockProxy);
+            TransactionManager transactionManager = TransactionManager.getInstance();
 
             mCallsManager = new CallsManager(
                     mContext,
@@ -372,8 +375,8 @@
                     callAnomalyWatchdog,
                     accessibilityManagerAdapter,
                     asyncTaskExecutor,
-                    blockedNumbersAdapter);
-
+                    blockedNumbersAdapter,
+                    transactionManager);
             mIncomingCallNotifier = incomingCallNotifier;
             incomingCallNotifier.setCallsManagerProxy(new IncomingCallNotifier.CallsManagerProxy() {
                 @Override
diff --git a/src/com/android/server/telecom/TransactionalServiceWrapper.java b/src/com/android/server/telecom/TransactionalServiceWrapper.java
index d97d192..90acba8 100644
--- a/src/com/android/server/telecom/TransactionalServiceWrapper.java
+++ b/src/com/android/server/telecom/TransactionalServiceWrapper.java
@@ -86,7 +86,7 @@
     private ConnectionServiceFocusManager.ConnectionServiceFocusListener mConnSvrFocusListener;
     // init when constructor is called
     private final Hashtable<String, Call> mTrackedCalls = new Hashtable<>();
-    private final Object mLock;
+    private final TelecomSystem.SyncRoot mLock;
     private final String mPackageName;
     // needs to be non-final for testing
     private TransactionManager mTransactionManager;
@@ -105,7 +105,7 @@
         mPackageName = phoneAccountHandle.getComponentName().getPackageName();
         mTransactionManager = TransactionManager.getInstance();
         mStreamingController = mCallsManager.getCallStreamingController();
-        mLock = new Object();
+        mLock = mCallsManager.getLock();
     }
 
     @VisibleForTesting
@@ -378,7 +378,7 @@
         SerialTransaction serialTransactions = createSetActiveTransactions(call);
         serialTransactions.appendTransaction(
                 new CallEventCallbackAckTransaction(mICallEventCallback,
-                        action, call.getId(), videoState));
+                        action, call.getId(), videoState, mLock));
 
         // do CallsManager workload before asking client and
         //   reset CallsManager state if client does NOT ack
@@ -403,7 +403,7 @@
             Log.i(TAG, String.format(Locale.US, "onSetInactive: callId=[%s]", call.getId()));
             mTransactionManager.addTransaction(
                     new CallEventCallbackAckTransaction(mICallEventCallback,
-                            ON_SET_INACTIVE, call.getId()), new OutcomeReceiver<>() {
+                            ON_SET_INACTIVE, call.getId(), mLock), new OutcomeReceiver<>() {
                         @Override
                         public void onResult(VoipCallTransactionResult result) {
                             mCallsManager.markCallAsOnHold(call);
@@ -426,7 +426,7 @@
 
             mTransactionManager.addTransaction(
                     new CallEventCallbackAckTransaction(mICallEventCallback, ON_DISCONNECT,
-                            call.getId(), cause), new OutcomeReceiver<>() {
+                            call.getId(), cause, mLock), new OutcomeReceiver<>() {
                         @Override
                         public void onResult(VoipCallTransactionResult result) {
                             removeCallFromCallsManager(call, cause);
@@ -451,7 +451,7 @@
 
             mTransactionManager.addTransaction(
                     new CallEventCallbackAckTransaction(mICallEventCallback, ON_STREAMING_STARTED,
-                            call.getId()), new OutcomeReceiver<>() {
+                            call.getId(), mLock), new OutcomeReceiver<>() {
                         @Override
                         public void onResult(VoipCallTransactionResult result) {
                         }
@@ -560,7 +560,7 @@
         transactions.add(new RequestFocusTransaction(mCallsManager, call));
 
         // send off to Transaction Manager to process
-        return new SerialTransaction(transactions);
+        return new SerialTransaction(transactions, mLock);
     }
 
     private SerialTransaction createSetAnswerTransactions(Call call, int videoState) {
@@ -574,7 +574,7 @@
         transactions.add(new AnswerCallTransaction(mCallsManager, call, videoState));
 
         // send off to Transaction Manager to process
-        return new SerialTransaction(transactions);
+        return new SerialTransaction(transactions, mLock);
     }
 
     /***
@@ -631,12 +631,13 @@
         subTransactions.add(mStreamingController.getCallStreamingServiceTransaction(
                 mCallsManager.getContext(), this, call));
         // add t2.2 audio route operations
-        subTransactions.add(new CallStreamingController.AudioInterceptionTransaction(call, true));
+        subTransactions.add(new CallStreamingController.AudioInterceptionTransaction(call,
+                true, mLock));
 
         // add t2
-        transactions.add(new ParallelTransaction(subTransactions));
+        transactions.add(new ParallelTransaction(subTransactions, mLock));
         // send off to Transaction Manager to process
-        return new SerialTransaction(transactions);
+        return new SerialTransaction(transactions, mLock);
     }
 
     private VoipCallTransaction createStopStreamingTransaction(Call call) {
@@ -647,8 +648,9 @@
         // 1. unbind to call streaming service
         transactions.add(mStreamingController.getUnbindStreamingServiceTransaction());
         // 2. audio route operations
-        transactions.add(new CallStreamingController.AudioInterceptionTransaction(call, false));
-        return new ParallelTransaction(transactions);
+        transactions.add(new CallStreamingController.AudioInterceptionTransaction(call,
+                false, mLock));
+        return new ParallelTransaction(transactions, mLock);
     }
 
 
diff --git a/src/com/android/server/telecom/voip/AnswerCallTransaction.java b/src/com/android/server/telecom/voip/AnswerCallTransaction.java
index 1eb34c4..efd2343 100644
--- a/src/com/android/server/telecom/voip/AnswerCallTransaction.java
+++ b/src/com/android/server/telecom/voip/AnswerCallTransaction.java
@@ -41,6 +41,7 @@
     private final int mVideoState;
 
     public AnswerCallTransaction(CallsManager callsManager, Call call, int videoState) {
+        super(callsManager.getLock());
         mCallsManager = callsManager;
         mCall = call;
         mVideoState = videoState;
diff --git a/src/com/android/server/telecom/voip/CallEventCallbackAckTransaction.java b/src/com/android/server/telecom/voip/CallEventCallbackAckTransaction.java
index f47e4c5..3d59ed3 100644
--- a/src/com/android/server/telecom/voip/CallEventCallbackAckTransaction.java
+++ b/src/com/android/server/telecom/voip/CallEventCallbackAckTransaction.java
@@ -26,6 +26,7 @@
 import android.util.Log;
 
 import com.android.internal.telecom.ICallEventCallback;
+import com.android.server.telecom.TelecomSystem;
 import com.android.server.telecom.TransactionalServiceWrapper;
 
 import java.util.concurrent.CompletableFuture;
@@ -66,7 +67,8 @@
     }
 
     public CallEventCallbackAckTransaction(ICallEventCallback service, String action,
-            String callId) {
+            String callId, TelecomSystem.SyncRoot lock) {
+        super(lock);
         mICallEventCallback = service;
         mAction = action;
         mCallId = callId;
@@ -74,7 +76,8 @@
 
 
     public CallEventCallbackAckTransaction(ICallEventCallback service, String action, String callId,
-            int videoState) {
+            int videoState, TelecomSystem.SyncRoot lock) {
+        super(lock);
         mICallEventCallback = service;
         mAction = action;
         mCallId = callId;
@@ -82,7 +85,8 @@
     }
 
     public CallEventCallbackAckTransaction(ICallEventCallback service, String action, String callId,
-            DisconnectCause cause) {
+            DisconnectCause cause, TelecomSystem.SyncRoot lock) {
+        super(lock);
         mICallEventCallback = service;
         mAction = action;
         mCallId = callId;
diff --git a/src/com/android/server/telecom/voip/EndCallTransaction.java b/src/com/android/server/telecom/voip/EndCallTransaction.java
index 7a5006a..0cb7458 100644
--- a/src/com/android/server/telecom/voip/EndCallTransaction.java
+++ b/src/com/android/server/telecom/voip/EndCallTransaction.java
@@ -36,6 +36,7 @@
     private DisconnectCause mCause;
 
     public EndCallTransaction(CallsManager callsManager, DisconnectCause cause, Call call) {
+        super(callsManager.getLock());
         mCallsManager = callsManager;
         mCause = cause;
         mCall = call;
diff --git a/src/com/android/server/telecom/voip/EndpointChangeTransaction.java b/src/com/android/server/telecom/voip/EndpointChangeTransaction.java
index 88630c8..e037a79 100644
--- a/src/com/android/server/telecom/voip/EndpointChangeTransaction.java
+++ b/src/com/android/server/telecom/voip/EndpointChangeTransaction.java
@@ -32,6 +32,7 @@
     private final CallsManager mCallsManager;
 
     public EndpointChangeTransaction(CallEndpoint endpoint, CallsManager callsManager) {
+        super(callsManager.getLock());
         mCallEndpoint = endpoint;
         mCallsManager = callsManager;
     }
diff --git a/src/com/android/server/telecom/voip/HoldActiveCallForNewCallTransaction.java b/src/com/android/server/telecom/voip/HoldActiveCallForNewCallTransaction.java
index 5d269b1..ab203ad 100644
--- a/src/com/android/server/telecom/voip/HoldActiveCallForNewCallTransaction.java
+++ b/src/com/android/server/telecom/voip/HoldActiveCallForNewCallTransaction.java
@@ -33,6 +33,7 @@
     private final Call mCall;
 
     public HoldActiveCallForNewCallTransaction(CallsManager callsManager, Call call) {
+        super(callsManager.getLock());
         mCallsManager = callsManager;
         mCall = call;
     }
diff --git a/src/com/android/server/telecom/voip/HoldCallTransaction.java b/src/com/android/server/telecom/voip/HoldCallTransaction.java
index bf0805e..6c4e8b7 100644
--- a/src/com/android/server/telecom/voip/HoldCallTransaction.java
+++ b/src/com/android/server/telecom/voip/HoldCallTransaction.java
@@ -32,6 +32,7 @@
     private final Call mCall;
 
     public HoldCallTransaction(CallsManager callsManager, Call call) {
+        super(callsManager.getLock());
         mCallsManager = callsManager;
         mCall = call;
     }
diff --git a/src/com/android/server/telecom/voip/IncomingCallTransaction.java b/src/com/android/server/telecom/voip/IncomingCallTransaction.java
index 7bb9736..7413014 100644
--- a/src/com/android/server/telecom/voip/IncomingCallTransaction.java
+++ b/src/com/android/server/telecom/voip/IncomingCallTransaction.java
@@ -40,6 +40,7 @@
 
     public IncomingCallTransaction(String callId, CallAttributes callAttributes,
             CallsManager callsManager) {
+        super(callsManager.getLock());
         mCallId = callId;
         mCallAttributes = callAttributes;
         mCallsManager = callsManager;
diff --git a/src/com/android/server/telecom/voip/OutgoingCallTransaction.java b/src/com/android/server/telecom/voip/OutgoingCallTransaction.java
index 169fc48..124f5f3 100644
--- a/src/com/android/server/telecom/voip/OutgoingCallTransaction.java
+++ b/src/com/android/server/telecom/voip/OutgoingCallTransaction.java
@@ -46,6 +46,7 @@
 
     public OutgoingCallTransaction(String callId, Context context, CallAttributes callAttributes,
             CallsManager callsManager) {
+        super(callsManager.getLock());
         mCallId = callId;
         mContext = context;
         mCallingPackage = mContext.getOpPackageName();
diff --git a/src/com/android/server/telecom/voip/ParallelTransaction.java b/src/com/android/server/telecom/voip/ParallelTransaction.java
index c2d532c..2762949 100644
--- a/src/com/android/server/telecom/voip/ParallelTransaction.java
+++ b/src/com/android/server/telecom/voip/ParallelTransaction.java
@@ -16,6 +16,8 @@
 
 package com.android.server.telecom.voip;
 
+import com.android.server.telecom.TelecomSystem;
+
 import java.util.List;
 import java.util.concurrent.atomic.AtomicInteger;
 
@@ -23,8 +25,9 @@
  * A VoipCallTransaction implementation that its sub transactions will be executed in parallel
  */
 public class ParallelTransaction extends VoipCallTransaction {
-    public ParallelTransaction(List<VoipCallTransaction> subTransactions) {
-        super(subTransactions);
+    public ParallelTransaction(List<VoipCallTransaction> subTransactions,
+            TelecomSystem.SyncRoot lock) {
+        super(subTransactions, lock);
     }
 
     @Override
diff --git a/src/com/android/server/telecom/voip/RequestFocusTransaction.java b/src/com/android/server/telecom/voip/RequestFocusTransaction.java
index 5dedbda..cb4ee37 100644
--- a/src/com/android/server/telecom/voip/RequestFocusTransaction.java
+++ b/src/com/android/server/telecom/voip/RequestFocusTransaction.java
@@ -34,6 +34,7 @@
     private final Call mCall;
 
     public RequestFocusTransaction(CallsManager callsManager, Call call) {
+        super(callsManager.getLock());
         mCallsManager = callsManager;
         mCall = call;
     }
diff --git a/src/com/android/server/telecom/voip/SerialTransaction.java b/src/com/android/server/telecom/voip/SerialTransaction.java
index 87bc9ec..4c6d02e 100644
--- a/src/com/android/server/telecom/voip/SerialTransaction.java
+++ b/src/com/android/server/telecom/voip/SerialTransaction.java
@@ -16,14 +16,17 @@
 
 package com.android.server.telecom.voip;
 
+import com.android.server.telecom.TelecomSystem;
+
 import java.util.List;
 
 /**
  * A VoipCallTransaction implementation that its sub transactions will be executed in serial
  */
 public class SerialTransaction extends VoipCallTransaction {
-    public SerialTransaction(List<VoipCallTransaction> subTransactions) {
-        super(subTransactions);
+    public SerialTransaction(List<VoipCallTransaction> subTransactions,
+            TelecomSystem.SyncRoot lock) {
+        super(subTransactions, lock);
     }
 
     public void appendTransaction(VoipCallTransaction transaction){
diff --git a/src/com/android/server/telecom/voip/VoipCallTransaction.java b/src/com/android/server/telecom/voip/VoipCallTransaction.java
index 413a1cd..a1cc13c 100644
--- a/src/com/android/server/telecom/voip/VoipCallTransaction.java
+++ b/src/com/android/server/telecom/voip/VoipCallTransaction.java
@@ -20,6 +20,7 @@
 import android.os.HandlerThread;
 
 import com.android.server.telecom.LoggedHandlerExecutor;
+import com.android.server.telecom.TelecomSystem;
 
 import java.util.List;
 import java.util.concurrent.CompletableFuture;
@@ -36,17 +37,19 @@
     protected Handler mHandler;
     protected TransactionManager.TransactionCompleteListener mCompleteListener;
     protected List<VoipCallTransaction> mSubTransactions;
+    private TelecomSystem.SyncRoot mLock;
 
     public VoipCallTransaction(
-            List<VoipCallTransaction> subTransactions) {
+            List<VoipCallTransaction> subTransactions, TelecomSystem.SyncRoot lock) {
         mSubTransactions = subTransactions;
         mHandlerThread = new HandlerThread(this.toString());
         mHandlerThread.start();
         mHandler = new Handler(mHandlerThread.getLooper());
+        mLock = lock;
     }
 
-    public VoipCallTransaction() {
-        this(null /** mSubTransactions */);
+    public VoipCallTransaction(TelecomSystem.SyncRoot lock) {
+        this(null /** mSubTransactions */, lock);
     }
 
     public void start() {
@@ -68,7 +71,7 @@
         CompletableFuture<Void> future = CompletableFuture.completedFuture(null);
         future.thenComposeAsync(this::processTransaction,
                         new LoggedHandlerExecutor(mHandler, mTransactionName + "@"
-                                + hashCode() + ".pT", null))
+                                + hashCode() + ".pT", mLock))
                 .thenApplyAsync(
                         (Function<VoipCallTransactionResult, Void>) result -> {
                             mCompleted.set(true);
diff --git a/tests/src/com/android/server/telecom/tests/CallsManagerTest.java b/tests/src/com/android/server/telecom/tests/CallsManagerTest.java
index e5312f0..c467671 100644
--- a/tests/src/com/android/server/telecom/tests/CallsManagerTest.java
+++ b/tests/src/com/android/server/telecom/tests/CallsManagerTest.java
@@ -121,6 +121,7 @@
 import com.android.server.telecom.ui.AudioProcessingNotification;
 import com.android.server.telecom.ui.DisconnectedCallNotifier;
 import com.android.server.telecom.ui.ToastFactory;
+import com.android.server.telecom.voip.TransactionManager;
 
 import org.junit.After;
 import org.junit.Before;
@@ -304,7 +305,8 @@
                 mAccessibilityManagerAdapter,
                 // Just do async tasks synchronously to support testing.
                 command -> command.run(),
-                mBlockedNumbersAdapter);
+                mBlockedNumbersAdapter,
+                TransactionManager.getTestInstance());
 
         when(mPhoneAccountRegistrar.getPhoneAccount(
                 eq(SELF_MANAGED_HANDLE), any())).thenReturn(SELF_MANAGED_ACCOUNT);
diff --git a/tests/src/com/android/server/telecom/tests/TransactionalServiceWrapperTest.java b/tests/src/com/android/server/telecom/tests/TransactionalServiceWrapperTest.java
index ae6e15f..98624d4 100644
--- a/tests/src/com/android/server/telecom/tests/TransactionalServiceWrapperTest.java
+++ b/tests/src/com/android/server/telecom/tests/TransactionalServiceWrapperTest.java
@@ -35,6 +35,7 @@
 import com.android.internal.telecom.ICallEventCallback;
 import com.android.server.telecom.Call;
 import com.android.server.telecom.CallsManager;
+import com.android.server.telecom.TelecomSystem;
 import com.android.server.telecom.TransactionalServiceRepository;
 import com.android.server.telecom.TransactionalServiceWrapper;
 import com.android.server.telecom.voip.EndCallTransaction;
@@ -68,6 +69,7 @@
     @Mock private TransactionManager mTransactionManager;
     @Mock private ICallEventCallback mCallEventCallback;
     @Mock private TransactionalServiceRepository mRepository;
+    private final TelecomSystem.SyncRoot mLock = new TelecomSystem.SyncRoot() {};
 
     @Override
     @Before
@@ -76,6 +78,7 @@
         MockitoAnnotations.initMocks(this);
         Mockito.when(mMockCall1.getId()).thenReturn(CALL_ID_1);
         Mockito.when(mMockCall2.getId()).thenReturn(CALL_ID_2);
+        Mockito.when(mCallsManager.getLock()).thenReturn(mLock);
 
         mTransactionalServiceWrapper = new TransactionalServiceWrapper(mCallEventCallback,
                 mCallsManager, SERVICE_HANDLE, mMockCall1, mRepository);
diff --git a/tests/src/com/android/server/telecom/tests/VoipCallTransactionTest.java b/tests/src/com/android/server/telecom/tests/VoipCallTransactionTest.java
index 58e4a77..62b8bc4 100644
--- a/tests/src/com/android/server/telecom/tests/VoipCallTransactionTest.java
+++ b/tests/src/com/android/server/telecom/tests/VoipCallTransactionTest.java
@@ -25,6 +25,7 @@
 
 import androidx.test.filters.SmallTest;
 
+import com.android.server.telecom.TelecomSystem;
 import com.android.server.telecom.voip.ParallelTransaction;
 import com.android.server.telecom.voip.SerialTransaction;
 import com.android.server.telecom.voip.TransactionManager;
@@ -49,6 +50,7 @@
 public class VoipCallTransactionTest extends TelecomTestCase {
     private StringBuilder mLog;
     private TransactionManager mTransactionManager;
+    private static final TelecomSystem.SyncRoot mLock = new TelecomSystem.SyncRoot() { };
 
     private class TestVoipCallTransaction extends VoipCallTransaction {
         public static final int SUCCESS = 0;
@@ -60,7 +62,7 @@
         private int mType;
 
         public TestVoipCallTransaction(String name, long sleepTime, int type) {
-            super();
+            super(mLock);
             mName = name;
             mSleepTime = sleepTime;
             mType = type;
@@ -125,7 +127,8 @@
         OutcomeReceiver<VoipCallTransactionResult, CallException> outcomeReceiver =
                 resultFuture::complete;
         String expectedLog = "t1 success;\nt2 success;\nt3 success;\n";
-        mTransactionManager.addTransaction(new SerialTransaction(subTransactions), outcomeReceiver);
+        mTransactionManager.addTransaction(new SerialTransaction(subTransactions, mLock),
+                outcomeReceiver);
         assertEquals(VoipCallTransactionResult.RESULT_SUCCEED,
                 resultFuture.get(5000L, TimeUnit.MILLISECONDS).getResult());
         assertEquals(expectedLog, mLog.toString());
@@ -158,7 +161,7 @@
                         exceptionFuture.complete(e.getMessage());
                     }
                 };
-        mTransactionManager.addTransaction(new SerialTransaction(subTransactions),
+        mTransactionManager.addTransaction(new SerialTransaction(subTransactions, mLock),
                 outcomeReceiver);
         exceptionFuture.get(5000L, TimeUnit.MILLISECONDS);
         String expectedLog = "t1 success;\nt2 failed;\n";
@@ -182,7 +185,7 @@
         CompletableFuture<VoipCallTransactionResult> resultFuture = new CompletableFuture<>();
         OutcomeReceiver<VoipCallTransactionResult, CallException> outcomeReceiver =
                 resultFuture::complete;
-        mTransactionManager.addTransaction(new ParallelTransaction(subTransactions),
+        mTransactionManager.addTransaction(new ParallelTransaction(subTransactions, mLock),
                 outcomeReceiver);
         assertEquals(VoipCallTransactionResult.RESULT_SUCCEED,
                 resultFuture.get(5000L, TimeUnit.MILLISECONDS).getResult());
@@ -219,7 +222,7 @@
                 exceptionFuture.complete(e.getMessage());
             }
         };
-        mTransactionManager.addTransaction(new ParallelTransaction(subTransactions),
+        mTransactionManager.addTransaction(new ParallelTransaction(subTransactions, mLock),
                 outcomeReceiver);
         exceptionFuture.get(5000L, TimeUnit.MILLISECONDS);
         assertTrue(mLog.toString().contains("t2 failed;\n"));