1e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau /* 2e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau * Copyright (C) 2010 The Android Open Source Project 3e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau * 4e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau * Licensed under the Apache License, Version 2.0 (the "License"); you may not 5e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau * use this file except in compliance with the License. You may obtain a copy of 6e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau * the License at 7e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau * 8e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau * http://www.apache.org/licenses/LICENSE-2.0 9e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau * 10e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau * Unless required by applicable law or agreed to in writing, software 11e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 12e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the 13e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau * License for the specific language governing permissions and limitations under 14e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau * the License. 15e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau */ 16e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau 17db6028508c8eb31a0de1dcdfc410ddfe6df7c5adXia Wangpackage com.android.mediaframeworktest.functional.audio; 18e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau 19e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lauimport com.android.mediaframeworktest.MediaFrameworkTest; 20e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lauimport android.content.Context; 21e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lauimport android.media.AudioManager; 227dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Triviimport android.media.MediaPlayer; 237dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Triviimport android.media.AudioManager.OnAudioFocusChangeListener; 247dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Triviimport android.os.Looper; 25e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lauimport android.test.ActivityInstrumentationTestCase2; 26e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lauimport android.test.suitebuilder.annotation.MediumTest; 277dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Triviimport android.test.suitebuilder.annotation.LargeTest; 287dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Triviimport android.util.Log; 29e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau 30e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau/** 31e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau * Junit / Instrumentation test case for the media AudioManager api 32e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau */ 33e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau 34e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Laupublic class MediaAudioManagerTest extends ActivityInstrumentationTestCase2<MediaFrameworkTest> { 35e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau 367dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi private final static String TAG = "MediaAudioManagerTest"; 377dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi // the AudioManager used throughout the test 38e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau private AudioManager mAudioManager; 397dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi // keep track of looper for AudioManager so we can terminate it 407dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi private Looper mAudioManagerLooper; 417dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi private final Object mLooperLock = new Object(); 427dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi private final static int WAIT_FOR_LOOPER_TO_INITIALIZE_MS = 60000; // 60s 43e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau private int[] ringtoneMode = {AudioManager.RINGER_MODE_NORMAL, 44e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau AudioManager.RINGER_MODE_SILENT, AudioManager.RINGER_MODE_VIBRATE}; 4583a017b6b7c099d1a0293e5839be6477325aef06Eric Laurent private boolean mUseFixedVolume; 46e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau 47e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau public MediaAudioManagerTest() { 48e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau super("com.android.mediaframeworktest", MediaFrameworkTest.class); 49e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau } 50e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau 517dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi private void initializeAudioManagerWithLooper() { 527dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi new Thread() { 537dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi @Override 547dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi public void run() { 557dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi Looper.prepare(); 567dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi mAudioManagerLooper = Looper.myLooper(); 577dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi mAudioManager = (AudioManager)getActivity().getSystemService(Context.AUDIO_SERVICE); 587dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi synchronized (mLooperLock) { 597dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi mLooperLock.notify(); 607dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi } 617dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi Looper.loop(); 627dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi } 637dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi }.start(); 647dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi } 657dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi 66e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau @Override 67e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau protected void setUp() throws Exception { 68e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau super.setUp(); 6983a017b6b7c099d1a0293e5839be6477325aef06Eric Laurent 7083a017b6b7c099d1a0293e5839be6477325aef06Eric Laurent mUseFixedVolume = getActivity().getResources().getBoolean( 7183a017b6b7c099d1a0293e5839be6477325aef06Eric Laurent com.android.internal.R.bool.config_useFixedVolume); 7283a017b6b7c099d1a0293e5839be6477325aef06Eric Laurent 737dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi synchronized(mLooperLock) { 747dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi initializeAudioManagerWithLooper(); 757dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi try { 767dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi mLooperLock.wait(WAIT_FOR_LOOPER_TO_INITIALIZE_MS); 777dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi } catch (Exception e) { 787dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi assertTrue("initializeAudioManagerWithLooper() failed to complete in time", false); 797dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi } 807dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi } 81e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau } 82e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau 83e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau @Override 84e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau protected void tearDown() throws Exception { 85e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau super.tearDown(); 867dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi synchronized(mLooperLock) { 877dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi if (mAudioManagerLooper != null) { 887dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi mAudioManagerLooper.quit(); 897dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi } 907dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi } 91e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau } 92e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau 937dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi //----------------------------------------------------------------- 947dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi // Ringer Mode 957dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi //---------------------------------- 967dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi 97e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau public boolean validateSetRingTone(int i) { 98e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau int getRingtone = mAudioManager.getRingerMode(); 9983a017b6b7c099d1a0293e5839be6477325aef06Eric Laurent 10083a017b6b7c099d1a0293e5839be6477325aef06Eric Laurent if (mUseFixedVolume) { 10183a017b6b7c099d1a0293e5839be6477325aef06Eric Laurent return (getRingtone == AudioManager.RINGER_MODE_NORMAL); 10283a017b6b7c099d1a0293e5839be6477325aef06Eric Laurent } else { 10383a017b6b7c099d1a0293e5839be6477325aef06Eric Laurent return (getRingtone == i); 10483a017b6b7c099d1a0293e5839be6477325aef06Eric Laurent } 105e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau } 106e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau 107e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau // Test case 1: Simple test case to validate the set ringtone mode 108e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau @MediumTest 109e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau public void testSetRingtoneMode() throws Exception { 110e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau boolean result = false; 111e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau 112e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau for (int i = 0; i < ringtoneMode.length; i++) { 113e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau mAudioManager.setRingerMode(ringtoneMode[i]); 114e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau result = validateSetRingTone(ringtoneMode[i]); 115e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau assertTrue("SetRingtoneMode : " + ringtoneMode[i], result); 116e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau } 117e11bafec8d6c887c6ae95fa3d39c202859e86d48Yu Shan Emily Lau } 1187dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi 1197dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi //----------------------------------------------------------------- 1207dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi // AudioFocus 1217dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi //---------------------------------- 1227dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi 1237dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi private static AudioFocusListener mAudioFocusListener; 1247dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi private final static int INVALID_FOCUS = -80; // initialized to magic invalid focus change type 1257dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi private final static int WAIT_FOR_AUDIOFOCUS_LOSS_MS = 10; 1267dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi 1277dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi private static class AudioFocusListener implements OnAudioFocusChangeListener { 1287dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi public int mLastFocusChange = INVALID_FOCUS; 1297dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi public int mFocusChangeCounter = 0; 1307dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi public AudioFocusListener() { 1317dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi } 1327dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi public void onAudioFocusChange(int focusChange) { 1337dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi mLastFocusChange = focusChange; 1347dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi mFocusChangeCounter++; 1357dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi } 1367dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi } 1377dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi 1387dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi /** 1397dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi * Fails the test if expectedFocusLossMode != mAudioFocusListener.mLastFocusChange 1407dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi */ 1417dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi private void verifyAudioFocusLoss(int focusGainMode, int expectedFocusLossMode) 1427dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi throws Exception { 1437dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi // request AudioFocus so we can test that mAudioFocusListener loses it when another 1447dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi // request comes in 1457dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi int result = mAudioManager.requestAudioFocus(mAudioFocusListener, 1467dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi AudioManager.STREAM_MUSIC, 1477dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi AudioManager.AUDIOFOCUS_GAIN); 1487dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi assertTrue("requestAudioFocus returned " + result, 1497dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED); 1507dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi // cause mAudioFocusListener to lose AudioFocus 1517dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi result = mAudioManager.requestAudioFocus(null, AudioManager.STREAM_MUSIC, 1527dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi focusGainMode); 1537dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi assertTrue("requestAudioFocus returned " + result, 1547dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED); 1557dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi // the audio focus request is async, so wait a bit to verify it had the expected effect 1567dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi java.lang.Thread.sleep(WAIT_FOR_AUDIOFOCUS_LOSS_MS); 1577dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi // test successful if the expected focus loss was recorded 1587dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi assertEquals("listener lost focus", 1597dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi mAudioFocusListener.mLastFocusChange, expectedFocusLossMode); 1607dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi } 1617dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi 1627dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi private void setupAudioFocusListener() { 1637dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi mAudioFocusListener = new AudioFocusListener(); 1647dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi mAudioManager.registerAudioFocusListener(mAudioFocusListener); 1657dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi } 1667dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi 1677dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi private void cleanupAudioFocusListener() { 1687dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi // clean up 1697dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi mAudioManager.abandonAudioFocus(mAudioFocusListener); 1707dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi mAudioManager.unregisterAudioFocusListener(mAudioFocusListener); 1717dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi } 1727dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi 1737dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi //---------------------------------- 1747dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi 1757dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi //Test case 1: test audio focus listener loses audio focus: 1767dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi // AUDIOFOCUS_GAIN causes AUDIOFOCUS_LOSS 1777dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi @MediumTest 1787dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi public void testAudioFocusLoss() throws Exception { 1797dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi setupAudioFocusListener(); 1807dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi 1817dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi verifyAudioFocusLoss(AudioManager.AUDIOFOCUS_GAIN, AudioManager.AUDIOFOCUS_LOSS); 1827dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi 1837dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi cleanupAudioFocusListener(); 1847dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi } 1857dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi 1867dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi //Test case 2: test audio focus listener loses audio focus: 1877dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi // AUDIOFOCUS_GAIN_TRANSIENT causes AUDIOFOCUS_LOSS_TRANSIENT 1887dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi @MediumTest 1897dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi public void testAudioFocusLossTransient() throws Exception { 1907dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi setupAudioFocusListener(); 1917dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi 1927dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi verifyAudioFocusLoss(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT, 1937dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi AudioManager.AUDIOFOCUS_LOSS_TRANSIENT); 1947dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi 1957dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi cleanupAudioFocusListener(); 1967dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi } 1977dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi 1987dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi //Test case 3: test audio focus listener loses audio focus: 1997dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi // AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK causes AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK 2007dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi @MediumTest 2017dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi public void testAudioFocusLossTransientDuck() throws Exception { 2027dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi setupAudioFocusListener(); 2037dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi 2047dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi verifyAudioFocusLoss(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, 2057dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK); 2067dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi 2077dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi cleanupAudioFocusListener(); 2087dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi } 2097dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi 2107dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi //Test case 4: test audio focus registering and use over 3000 iterations 2117dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi @LargeTest 2127dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi public void testAudioFocusStressListenerRequestAbandon() throws Exception { 2137dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi final int ITERATIONS = 3000; 2147dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi // here we only test the life cycle of a focus listener, and make sure we don't crash 2157dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi // when doing it many times without waiting 2167dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi for (int i = 0 ; i < ITERATIONS ; i++) { 2177dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi setupAudioFocusListener(); 2187dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi int result = mAudioManager.requestAudioFocus(mAudioFocusListener, 2197dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); 2207dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi assertTrue("audio focus request was not granted", 2217dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED); 2227dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi cleanupAudioFocusListener(); 2237dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi } 2247dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi assertTrue("testAudioFocusListenerLifeCycle : tested" + ITERATIONS +" iterations", true); 2257dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi } 2267dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi 2277dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi //Test case 5: test audio focus use without listener 2287dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi @LargeTest 2297dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi public void testAudioFocusStressNoListenerRequestAbandon() throws Exception { 2307dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi final int ITERATIONS = 1000; 2317dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi // make sure we have a listener in the stack 2327dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi setupAudioFocusListener(); 2337dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi mAudioManager.requestAudioFocus(mAudioFocusListener, AudioManager.STREAM_MUSIC, 2347dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi AudioManager.AUDIOFOCUS_GAIN); 2357dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi // keep making the current owner lose and gain audio focus repeatedly 2367dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi for (int i = 0 ; i < ITERATIONS ; i++) { 2377dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi mAudioManager.requestAudioFocus(null, AudioManager.STREAM_MUSIC, 2387dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi AudioManager.AUDIOFOCUS_GAIN_TRANSIENT); 2397dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi mAudioManager.abandonAudioFocus(null); 2407dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi // the audio focus request is async, so wait a bit to verify it had the expected effect 2417dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi java.lang.Thread.sleep(WAIT_FOR_AUDIOFOCUS_LOSS_MS); 2427dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi } 2437dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi // verify there were 2 audio focus changes per iteration (one loss + one gain) 2447dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi assertTrue("testAudioFocusListenerLifeCycle : observed " + 2457dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi mAudioFocusListener.mFocusChangeCounter + " AudioFocus changes", 2467dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi mAudioFocusListener.mFocusChangeCounter == ITERATIONS * 2); 2477dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi mAudioManager.abandonAudioFocus(mAudioFocusListener); 2487dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi mAudioManager.unregisterAudioFocusListener(mAudioFocusListener); 2497dd65078f6a40ed98ae8cddc5d7976d4fe629a29Jean-Michel Trivi } 250db6028508c8eb31a0de1dcdfc410ddfe6df7c5adXia Wang } 251