Skip to content

Commit 7dd6507

Browse files
committed
More AudioManager tests
Add tests for AudioFocus: - create a looper for AudioManager to use so listener callbacks can be used - test each type of audio focus gain causes the expected type of focus loss - stress test audio focus request and abandon, with and without a listener Change-Id: I7d9c84ccd8ea49cf20ede57b1245899a81e99ab0
1 parent d215ddf commit 7dd6507

File tree

1 file changed

+175
-2
lines changed

1 file changed

+175
-2
lines changed

media/tests/MediaFrameworkTest/src/com/android/mediaframeworktest/functional/audio/MediaAudioManagerTest.java

Lines changed: 175 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,35 +19,76 @@
1919
import com.android.mediaframeworktest.MediaFrameworkTest;
2020
import android.content.Context;
2121
import android.media.AudioManager;
22+
import android.media.MediaPlayer;
23+
import android.media.AudioManager.OnAudioFocusChangeListener;
24+
import android.os.Looper;
2225
import android.test.ActivityInstrumentationTestCase2;
2326
import android.test.suitebuilder.annotation.MediumTest;
27+
import android.test.suitebuilder.annotation.LargeTest;
28+
import android.util.Log;
2429

2530
/**
2631
* Junit / Instrumentation test case for the media AudioManager api
2732
*/
2833

2934
public class MediaAudioManagerTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> {
3035

31-
private String TAG = "MediaAudioManagerTest";
36+
private final static String TAG = "MediaAudioManagerTest";
37+
// the AudioManager used throughout the test
3238
private AudioManager mAudioManager;
39+
// keep track of looper for AudioManager so we can terminate it
40+
private Looper mAudioManagerLooper;
41+
private final Object mLooperLock = new Object();
42+
private final static int WAIT_FOR_LOOPER_TO_INITIALIZE_MS = 60000; // 60s
3343
private int[] ringtoneMode = {AudioManager.RINGER_MODE_NORMAL,
3444
AudioManager.RINGER_MODE_SILENT, AudioManager.RINGER_MODE_VIBRATE};
3545

3646
public MediaAudioManagerTest() {
3747
super("com.android.mediaframeworktest", MediaFrameworkTest.class);
3848
}
3949

50+
private void initializeAudioManagerWithLooper() {
51+
new Thread() {
52+
@Override
53+
public void run() {
54+
Looper.prepare();
55+
mAudioManagerLooper = Looper.myLooper();
56+
mAudioManager = (AudioManager)getActivity().getSystemService(Context.AUDIO_SERVICE);
57+
synchronized (mLooperLock) {
58+
mLooperLock.notify();
59+
}
60+
Looper.loop();
61+
}
62+
}.start();
63+
}
64+
4065
@Override
4166
protected void setUp() throws Exception {
4267
super.setUp();
43-
mAudioManager = (AudioManager) getActivity().getSystemService(Context.AUDIO_SERVICE);
68+
synchronized(mLooperLock) {
69+
initializeAudioManagerWithLooper();
70+
try {
71+
mLooperLock.wait(WAIT_FOR_LOOPER_TO_INITIALIZE_MS);
72+
} catch (Exception e) {
73+
assertTrue("initializeAudioManagerWithLooper() failed to complete in time", false);
74+
}
75+
}
4476
}
4577

4678
@Override
4779
protected void tearDown() throws Exception {
4880
super.tearDown();
81+
synchronized(mLooperLock) {
82+
if (mAudioManagerLooper != null) {
83+
mAudioManagerLooper.quit();
84+
}
85+
}
4986
}
5087

88+
//-----------------------------------------------------------------
89+
// Ringer Mode
90+
//----------------------------------
91+
5192
public boolean validateSetRingTone(int i) {
5293
int getRingtone = mAudioManager.getRingerMode();
5394
if (i != getRingtone)
@@ -67,4 +108,136 @@ public void testSetRingtoneMode() throws Exception {
67108
assertTrue("SetRingtoneMode : " + ringtoneMode[i], result);
68109
}
69110
}
111+
112+
//-----------------------------------------------------------------
113+
// AudioFocus
114+
//----------------------------------
115+
116+
private static AudioFocusListener mAudioFocusListener;
117+
private final static int INVALID_FOCUS = -80; // initialized to magic invalid focus change type
118+
private final static int WAIT_FOR_AUDIOFOCUS_LOSS_MS = 10;
119+
120+
private static class AudioFocusListener implements OnAudioFocusChangeListener {
121+
public int mLastFocusChange = INVALID_FOCUS;
122+
public int mFocusChangeCounter = 0;
123+
public AudioFocusListener() {
124+
}
125+
public void onAudioFocusChange(int focusChange) {
126+
mLastFocusChange = focusChange;
127+
mFocusChangeCounter++;
128+
}
129+
}
130+
131+
/**
132+
* Fails the test if expectedFocusLossMode != mAudioFocusListener.mLastFocusChange
133+
*/
134+
private void verifyAudioFocusLoss(int focusGainMode, int expectedFocusLossMode)
135+
throws Exception {
136+
// request AudioFocus so we can test that mAudioFocusListener loses it when another
137+
// request comes in
138+
int result = mAudioManager.requestAudioFocus(mAudioFocusListener,
139+
AudioManager.STREAM_MUSIC,
140+
AudioManager.AUDIOFOCUS_GAIN);
141+
assertTrue("requestAudioFocus returned " + result,
142+
result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED);
143+
// cause mAudioFocusListener to lose AudioFocus
144+
result = mAudioManager.requestAudioFocus(null, AudioManager.STREAM_MUSIC,
145+
focusGainMode);
146+
assertTrue("requestAudioFocus returned " + result,
147+
result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED);
148+
// the audio focus request is async, so wait a bit to verify it had the expected effect
149+
java.lang.Thread.sleep(WAIT_FOR_AUDIOFOCUS_LOSS_MS);
150+
// test successful if the expected focus loss was recorded
151+
assertEquals("listener lost focus",
152+
mAudioFocusListener.mLastFocusChange, expectedFocusLossMode);
153+
}
154+
155+
private void setupAudioFocusListener() {
156+
mAudioFocusListener = new AudioFocusListener();
157+
mAudioManager.registerAudioFocusListener(mAudioFocusListener);
158+
}
159+
160+
private void cleanupAudioFocusListener() {
161+
// clean up
162+
mAudioManager.abandonAudioFocus(mAudioFocusListener);
163+
mAudioManager.unregisterAudioFocusListener(mAudioFocusListener);
164+
}
165+
166+
//----------------------------------
167+
168+
//Test case 1: test audio focus listener loses audio focus:
169+
// AUDIOFOCUS_GAIN causes AUDIOFOCUS_LOSS
170+
@MediumTest
171+
public void testAudioFocusLoss() throws Exception {
172+
setupAudioFocusListener();
173+
174+
verifyAudioFocusLoss(AudioManager.AUDIOFOCUS_GAIN, AudioManager.AUDIOFOCUS_LOSS);
175+
176+
cleanupAudioFocusListener();
177+
}
178+
179+
//Test case 2: test audio focus listener loses audio focus:
180+
// AUDIOFOCUS_GAIN_TRANSIENT causes AUDIOFOCUS_LOSS_TRANSIENT
181+
@MediumTest
182+
public void testAudioFocusLossTransient() throws Exception {
183+
setupAudioFocusListener();
184+
185+
verifyAudioFocusLoss(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT,
186+
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT);
187+
188+
cleanupAudioFocusListener();
189+
}
190+
191+
//Test case 3: test audio focus listener loses audio focus:
192+
// AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK causes AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK
193+
@MediumTest
194+
public void testAudioFocusLossTransientDuck() throws Exception {
195+
setupAudioFocusListener();
196+
197+
verifyAudioFocusLoss(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK,
198+
AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK);
199+
200+
cleanupAudioFocusListener();
201+
}
202+
203+
//Test case 4: test audio focus registering and use over 3000 iterations
204+
@LargeTest
205+
public void testAudioFocusStressListenerRequestAbandon() throws Exception {
206+
final int ITERATIONS = 3000;
207+
// here we only test the life cycle of a focus listener, and make sure we don't crash
208+
// when doing it many times without waiting
209+
for (int i = 0 ; i < ITERATIONS ; i++) {
210+
setupAudioFocusListener();
211+
int result = mAudioManager.requestAudioFocus(mAudioFocusListener,
212+
AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
213+
assertTrue("audio focus request was not granted",
214+
result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED);
215+
cleanupAudioFocusListener();
216+
}
217+
assertTrue("testAudioFocusListenerLifeCycle : tested" + ITERATIONS +" iterations", true);
218+
}
219+
220+
//Test case 5: test audio focus use without listener
221+
@LargeTest
222+
public void testAudioFocusStressNoListenerRequestAbandon() throws Exception {
223+
final int ITERATIONS = 1000;
224+
// make sure we have a listener in the stack
225+
setupAudioFocusListener();
226+
mAudioManager.requestAudioFocus(mAudioFocusListener, AudioManager.STREAM_MUSIC,
227+
AudioManager.AUDIOFOCUS_GAIN);
228+
// keep making the current owner lose and gain audio focus repeatedly
229+
for (int i = 0 ; i < ITERATIONS ; i++) {
230+
mAudioManager.requestAudioFocus(null, AudioManager.STREAM_MUSIC,
231+
AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
232+
mAudioManager.abandonAudioFocus(null);
233+
// the audio focus request is async, so wait a bit to verify it had the expected effect
234+
java.lang.Thread.sleep(WAIT_FOR_AUDIOFOCUS_LOSS_MS);
235+
}
236+
// verify there were 2 audio focus changes per iteration (one loss + one gain)
237+
assertTrue("testAudioFocusListenerLifeCycle : observed " +
238+
mAudioFocusListener.mFocusChangeCounter + " AudioFocus changes",
239+
mAudioFocusListener.mFocusChangeCounter == ITERATIONS * 2);
240+
mAudioManager.abandonAudioFocus(mAudioFocusListener);
241+
mAudioManager.unregisterAudioFocusListener(mAudioFocusListener);
242+
}
70243
}

0 commit comments

Comments
 (0)