Loading src/com/android/server/telecom/RingbackPlayer.java +43 −28 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.server.telecom; import static com.android.server.telecom.LogUtils.Events.START_RINBACK; import static com.android.server.telecom.LogUtils.Events.STOP_RINGBACK; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Preconditions; import android.telecom.Log; Loading @@ -42,8 +43,12 @@ public class RingbackPlayer { */ private InCallTonePlayer mTonePlayer; RingbackPlayer(InCallTonePlayer.Factory playerFactory) { private final Object mLock; @VisibleForTesting public RingbackPlayer(InCallTonePlayer.Factory playerFactory) { mPlayerFactory = playerFactory; mLock = new Object(); } /** Loading @@ -52,6 +57,7 @@ public class RingbackPlayer { * @param call The call for which to ringback. */ public void startRingbackForCall(Call call) { synchronized (mLock) { Preconditions.checkState(call.getState() == CallState.DIALING); if (mCall == call) { Loading @@ -73,6 +79,7 @@ public class RingbackPlayer { mTonePlayer.startTone(); } } } /** * Stops the ringback for the specified dialing call as needed. Loading @@ -80,6 +87,7 @@ public class RingbackPlayer { * @param call The call for which to stop ringback. */ public void stopRingbackForCall(Call call) { synchronized (mLock) { if (mCall == call) { // The foreground call is no longer dialing or is no longer the foreground call. In // either case, stop the ringback tone. Loading @@ -96,3 +104,10 @@ public class RingbackPlayer { } } } public boolean isRingbackPlaying() { synchronized (mLock) { return mTonePlayer != null; } } } No newline at end of file tests/src/com/android/server/telecom/tests/RingbackPlayerTest.java 0 → 100644 +79 −0 Original line number Diff line number Diff line /* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.server.telecom.tests; import static org.junit.Assert.assertFalse; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.when; import android.test.suitebuilder.annotation.SmallTest; import com.android.server.telecom.Call; import com.android.server.telecom.CallState; import com.android.server.telecom.InCallTonePlayer; import com.android.server.telecom.RingbackPlayer; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import org.mockito.Mock; import java.util.concurrent.CountDownLatch; @RunWith(JUnit4.class) public class RingbackPlayerTest extends TelecomTestCase { @Mock InCallTonePlayer.Factory mFactory; @Mock Call mCall; @Mock InCallTonePlayer mTonePlayer; private RingbackPlayer mRingbackPlayer; @Before @Override public void setUp() throws Exception { super.setUp(); when(mFactory.createPlayer(anyInt())).thenReturn(mTonePlayer); mRingbackPlayer = new RingbackPlayer(mFactory); } @SmallTest @Test public void testPlayerSync() { // make sure InCallTonePlayer try to start playing the tone after RingbackPlayer receives // stop tone request. CountDownLatch latch = new CountDownLatch(1); doReturn(CallState.DIALING).when(mCall).getState(); doAnswer(x -> { new Thread(() -> { try { latch.wait(); } catch (InterruptedException e) { // Ignore } }).start(); return true; }).when(mTonePlayer).startTone(); mRingbackPlayer.startRingbackForCall(mCall); mRingbackPlayer.stopRingbackForCall(mCall); assertFalse(mRingbackPlayer.isRingbackPlaying()); latch.countDown(); } } Loading
src/com/android/server/telecom/RingbackPlayer.java +43 −28 Original line number Diff line number Diff line Loading @@ -19,6 +19,7 @@ package com.android.server.telecom; import static com.android.server.telecom.LogUtils.Events.START_RINBACK; import static com.android.server.telecom.LogUtils.Events.STOP_RINGBACK; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.Preconditions; import android.telecom.Log; Loading @@ -42,8 +43,12 @@ public class RingbackPlayer { */ private InCallTonePlayer mTonePlayer; RingbackPlayer(InCallTonePlayer.Factory playerFactory) { private final Object mLock; @VisibleForTesting public RingbackPlayer(InCallTonePlayer.Factory playerFactory) { mPlayerFactory = playerFactory; mLock = new Object(); } /** Loading @@ -52,6 +57,7 @@ public class RingbackPlayer { * @param call The call for which to ringback. */ public void startRingbackForCall(Call call) { synchronized (mLock) { Preconditions.checkState(call.getState() == CallState.DIALING); if (mCall == call) { Loading @@ -73,6 +79,7 @@ public class RingbackPlayer { mTonePlayer.startTone(); } } } /** * Stops the ringback for the specified dialing call as needed. Loading @@ -80,6 +87,7 @@ public class RingbackPlayer { * @param call The call for which to stop ringback. */ public void stopRingbackForCall(Call call) { synchronized (mLock) { if (mCall == call) { // The foreground call is no longer dialing or is no longer the foreground call. In // either case, stop the ringback tone. Loading @@ -96,3 +104,10 @@ public class RingbackPlayer { } } } public boolean isRingbackPlaying() { synchronized (mLock) { return mTonePlayer != null; } } } No newline at end of file
tests/src/com/android/server/telecom/tests/RingbackPlayerTest.java 0 → 100644 +79 −0 Original line number Diff line number Diff line /* * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.server.telecom.tests; import static org.junit.Assert.assertFalse; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.when; import android.test.suitebuilder.annotation.SmallTest; import com.android.server.telecom.Call; import com.android.server.telecom.CallState; import com.android.server.telecom.InCallTonePlayer; import com.android.server.telecom.RingbackPlayer; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; import org.mockito.Mock; import java.util.concurrent.CountDownLatch; @RunWith(JUnit4.class) public class RingbackPlayerTest extends TelecomTestCase { @Mock InCallTonePlayer.Factory mFactory; @Mock Call mCall; @Mock InCallTonePlayer mTonePlayer; private RingbackPlayer mRingbackPlayer; @Before @Override public void setUp() throws Exception { super.setUp(); when(mFactory.createPlayer(anyInt())).thenReturn(mTonePlayer); mRingbackPlayer = new RingbackPlayer(mFactory); } @SmallTest @Test public void testPlayerSync() { // make sure InCallTonePlayer try to start playing the tone after RingbackPlayer receives // stop tone request. CountDownLatch latch = new CountDownLatch(1); doReturn(CallState.DIALING).when(mCall).getState(); doAnswer(x -> { new Thread(() -> { try { latch.wait(); } catch (InterruptedException e) { // Ignore } }).start(); return true; }).when(mTonePlayer).startTone(); mRingbackPlayer.startRingbackForCall(mCall); mRingbackPlayer.stopRingbackForCall(mCall); assertFalse(mRingbackPlayer.isRingbackPlaying()); latch.countDown(); } }