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