OLD | NEW |
(Empty) | |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 package org.chromium.content.browser; |
| 6 |
| 7 import android.content.Context; |
| 8 import android.media.AudioManager; |
| 9 import android.test.suitebuilder.annotation.MediumTest; |
| 10 import android.test.suitebuilder.annotation.SmallTest; |
| 11 |
| 12 import org.chromium.base.test.util.CommandLineFlags; |
| 13 import org.chromium.base.test.util.Feature; |
| 14 import org.chromium.content.browser.test.util.Criteria; |
| 15 import org.chromium.content.browser.test.util.CriteriaHelper; |
| 16 import org.chromium.content.browser.test.util.DOMUtils; |
| 17 import org.chromium.content.common.ContentSwitches; |
| 18 import org.chromium.content_shell_apk.ContentShellTestBase; |
| 19 |
| 20 /** |
| 21 * Tests for MediaSession. |
| 22 */ |
| 23 @CommandLineFlags.Add(ContentSwitches.DISABLE_GESTURE_REQUIREMENT_FOR_MEDIA_PLAY
BACK) |
| 24 public class MediaSessionTest extends ContentShellTestBase { |
| 25 private static final String MEDIA_SESSION_TEST_URL = |
| 26 "content/test/data/android/media-session.html"; |
| 27 private static final String SHORT_AUDIO = "short-audio"; |
| 28 private static final String LONG_AUDIO = "long-audio"; |
| 29 private static final String SHORT_VIDEO = "short-video"; |
| 30 private static final String LONG_VIDEO = "long-video"; |
| 31 |
| 32 private AudioManager getAudioManager() { |
| 33 return (AudioManager) getActivity().getApplicationContext().getSystemSer
vice( |
| 34 Context.AUDIO_SERVICE); |
| 35 } |
| 36 |
| 37 private class MockAudioFocusChangeListener implements AudioManager.OnAudioFo
cusChangeListener { |
| 38 @Override |
| 39 public void onAudioFocusChange(int focusChange) { |
| 40 mAudioFocusState = focusChange; |
| 41 } |
| 42 |
| 43 public int getAudioFocusState() { |
| 44 return mAudioFocusState; |
| 45 } |
| 46 |
| 47 public void requestAudioFocus(int focusType) throws Exception { |
| 48 int result = getAudioManager().requestAudioFocus( |
| 49 this, AudioManager.STREAM_MUSIC, focusType); |
| 50 if (result != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { |
| 51 throw new Exception("Did not get audio focus!"); |
| 52 } else { |
| 53 mAudioFocusState = focusType; |
| 54 } |
| 55 } |
| 56 |
| 57 public void abandonAudioFocus() { |
| 58 getAudioManager().abandonAudioFocus(this); |
| 59 mAudioFocusState = AudioManager.AUDIOFOCUS_LOSS; |
| 60 } |
| 61 |
| 62 public boolean waitForFocusStateChange(final int focusType) throws Inter
ruptedException { |
| 63 return CriteriaHelper.pollForCriteria(new Criteria() { |
| 64 @Override |
| 65 public boolean isSatisfied() { |
| 66 return getAudioFocusState() == focusType; |
| 67 } |
| 68 }); |
| 69 } |
| 70 |
| 71 int mAudioFocusState = AudioManager.AUDIOFOCUS_LOSS; |
| 72 } |
| 73 |
| 74 private MockAudioFocusChangeListener mAudioFocusChangeListener; |
| 75 |
| 76 @Override |
| 77 public void setUp() throws Exception { |
| 78 super.setUp(); |
| 79 |
| 80 try { |
| 81 startActivityWithTestUrl(MEDIA_SESSION_TEST_URL); |
| 82 } catch (Throwable t) { |
| 83 fail("Couldn't load test page"); |
| 84 } |
| 85 |
| 86 mAudioFocusChangeListener = new MockAudioFocusChangeListener(); |
| 87 } |
| 88 |
| 89 @Override |
| 90 public void tearDown() throws Exception { |
| 91 mAudioFocusChangeListener.abandonAudioFocus(); |
| 92 |
| 93 super.tearDown(); |
| 94 } |
| 95 |
| 96 @SmallTest |
| 97 @Feature({"MediaSession"}) |
| 98 public void testDontStopEachOther() throws Exception { |
| 99 assertTrue(DOMUtils.isMediaPaused(getWebContents(), LONG_AUDIO)); |
| 100 DOMUtils.playMedia(getWebContents(), LONG_AUDIO); |
| 101 assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_AUDIO)); |
| 102 |
| 103 assertTrue(DOMUtils.isMediaPaused(getWebContents(), LONG_VIDEO)); |
| 104 DOMUtils.playMedia(getWebContents(), LONG_VIDEO); |
| 105 assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_VIDEO)); |
| 106 |
| 107 assertTrue(DOMUtils.isMediaPaused(getWebContents(), SHORT_VIDEO)); |
| 108 DOMUtils.playMedia(getWebContents(), SHORT_VIDEO); |
| 109 assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), SHORT_VIDEO)); |
| 110 |
| 111 assertTrue(DOMUtils.isMediaPaused(getWebContents(), SHORT_AUDIO)); |
| 112 DOMUtils.playMedia(getWebContents(), SHORT_AUDIO); |
| 113 assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), SHORT_AUDIO)); |
| 114 |
| 115 assertFalse(DOMUtils.isMediaPaused(getWebContents(), SHORT_AUDIO)); |
| 116 assertFalse(DOMUtils.isMediaPaused(getWebContents(), LONG_AUDIO)); |
| 117 assertFalse(DOMUtils.isMediaPaused(getWebContents(), SHORT_VIDEO)); |
| 118 assertFalse(DOMUtils.isMediaPaused(getWebContents(), LONG_VIDEO)); |
| 119 } |
| 120 |
| 121 @MediumTest |
| 122 @Feature({"MediaSession"}) |
| 123 public void testShortAudioIsTransient() throws Exception { |
| 124 assertEquals(AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.get
AudioFocusState()); |
| 125 mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN
); |
| 126 assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.get
AudioFocusState()); |
| 127 |
| 128 DOMUtils.playMedia(getWebContents(), SHORT_AUDIO); |
| 129 assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), SHORT_AUDIO)); |
| 130 |
| 131 assertTrue(mAudioFocusChangeListener.waitForFocusStateChange( |
| 132 AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK)); |
| 133 assertTrue(mAudioFocusChangeListener.waitForFocusStateChange(AudioManage
r.AUDIOFOCUS_GAIN)); |
| 134 } |
| 135 |
| 136 @MediumTest |
| 137 @Feature({"MediaSession"}) |
| 138 public void testShortVideoIsTransient() throws Exception { |
| 139 assertEquals(AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.get
AudioFocusState()); |
| 140 mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN
); |
| 141 assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.get
AudioFocusState()); |
| 142 |
| 143 DOMUtils.playMedia(getWebContents(), SHORT_VIDEO); |
| 144 assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), SHORT_VIDEO)); |
| 145 |
| 146 assertTrue(mAudioFocusChangeListener.waitForFocusStateChange( |
| 147 AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK)); |
| 148 assertTrue(mAudioFocusChangeListener.waitForFocusStateChange(AudioManage
r.AUDIOFOCUS_GAIN)); |
| 149 } |
| 150 |
| 151 @SmallTest |
| 152 @Feature({"MediaSession"}) |
| 153 public void testAudioGainFocus() throws Exception { |
| 154 assertEquals(AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.get
AudioFocusState()); |
| 155 mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN
); |
| 156 assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.get
AudioFocusState()); |
| 157 |
| 158 DOMUtils.playMedia(getWebContents(), LONG_AUDIO); |
| 159 assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_AUDIO)); |
| 160 |
| 161 assertTrue(mAudioFocusChangeListener.waitForFocusStateChange(AudioManage
r.AUDIOFOCUS_LOSS)); |
| 162 } |
| 163 |
| 164 @SmallTest |
| 165 @Feature({"MediaSession"}) |
| 166 public void testVideoGainFocus() throws Exception { |
| 167 assertEquals(AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.get
AudioFocusState()); |
| 168 mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN
); |
| 169 assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.get
AudioFocusState()); |
| 170 |
| 171 DOMUtils.playMedia(getWebContents(), LONG_VIDEO); |
| 172 assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_VIDEO)); |
| 173 |
| 174 assertTrue(mAudioFocusChangeListener.waitForFocusStateChange(AudioManage
r.AUDIOFOCUS_LOSS)); |
| 175 } |
| 176 |
| 177 @SmallTest |
| 178 @Feature({"MediaSession"}) |
| 179 public void testLongAudioAfterShortGainsFocus() throws Exception { |
| 180 assertEquals(AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.get
AudioFocusState()); |
| 181 mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN
); |
| 182 assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.get
AudioFocusState()); |
| 183 |
| 184 DOMUtils.playMedia(getWebContents(), SHORT_AUDIO); |
| 185 assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), SHORT_AUDIO)); |
| 186 assertTrue(mAudioFocusChangeListener.waitForFocusStateChange( |
| 187 AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK)); |
| 188 |
| 189 DOMUtils.playMedia(getWebContents(), LONG_AUDIO); |
| 190 assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_AUDIO)); |
| 191 assertTrue(mAudioFocusChangeListener.waitForFocusStateChange(AudioManage
r.AUDIOFOCUS_LOSS)); |
| 192 } |
| 193 |
| 194 @SmallTest |
| 195 @Feature({"MediaSession"}) |
| 196 public void testLongVideoAfterShortGainsFocus() throws Exception { |
| 197 assertEquals(AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.get
AudioFocusState()); |
| 198 mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN
); |
| 199 assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.get
AudioFocusState()); |
| 200 |
| 201 DOMUtils.playMedia(getWebContents(), SHORT_VIDEO); |
| 202 assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), SHORT_VIDEO)); |
| 203 assertTrue(mAudioFocusChangeListener.waitForFocusStateChange( |
| 204 AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK)); |
| 205 |
| 206 DOMUtils.playMedia(getWebContents(), LONG_VIDEO); |
| 207 assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_VIDEO)); |
| 208 assertTrue(mAudioFocusChangeListener.waitForFocusStateChange(AudioManage
r.AUDIOFOCUS_LOSS)); |
| 209 } |
| 210 |
| 211 @SmallTest |
| 212 @Feature({"MediaSession"}) |
| 213 public void testShortAudioStopsIfLostFocus() throws Exception { |
| 214 DOMUtils.playMedia(getWebContents(), SHORT_AUDIO); |
| 215 assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), SHORT_AUDIO)); |
| 216 |
| 217 assertEquals(AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.get
AudioFocusState()); |
| 218 mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN
); |
| 219 assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.get
AudioFocusState()); |
| 220 |
| 221 assertTrue(DOMUtils.waitForMediaPause(getWebContents(), SHORT_AUDIO)); |
| 222 } |
| 223 |
| 224 @SmallTest |
| 225 @Feature({"MediaSession"}) |
| 226 public void testShortVideoStopsIfLostFocus() throws Exception { |
| 227 DOMUtils.playMedia(getWebContents(), SHORT_VIDEO); |
| 228 assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), SHORT_VIDEO)); |
| 229 |
| 230 assertEquals(AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.get
AudioFocusState()); |
| 231 mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN
); |
| 232 assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.get
AudioFocusState()); |
| 233 |
| 234 assertTrue(DOMUtils.waitForMediaPause(getWebContents(), SHORT_VIDEO)); |
| 235 } |
| 236 |
| 237 @MediumTest |
| 238 @Feature({"MediaSession"}) |
| 239 public void testAudioStopsIfLostFocus() throws Exception { |
| 240 DOMUtils.playMedia(getWebContents(), LONG_AUDIO); |
| 241 assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_AUDIO)); |
| 242 |
| 243 assertEquals(AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.get
AudioFocusState()); |
| 244 mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN
); |
| 245 assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.get
AudioFocusState()); |
| 246 |
| 247 assertTrue(DOMUtils.waitForMediaPause(getWebContents(), LONG_AUDIO)); |
| 248 } |
| 249 |
| 250 @SmallTest |
| 251 @Feature({"MediaSession"}) |
| 252 public void testVideoStopsIfLostFocus() throws Exception { |
| 253 DOMUtils.playMedia(getWebContents(), LONG_VIDEO); |
| 254 assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_VIDEO)); |
| 255 |
| 256 assertEquals(AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.get
AudioFocusState()); |
| 257 mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN
); |
| 258 assertEquals(AudioManager.AUDIOFOCUS_GAIN, mAudioFocusChangeListener.get
AudioFocusState()); |
| 259 |
| 260 assertTrue(DOMUtils.waitForMediaPause(getWebContents(), LONG_VIDEO)); |
| 261 } |
| 262 |
| 263 @SmallTest |
| 264 @Feature({"MediaSession"}) |
| 265 public void testMediaDontDuck() throws Exception { |
| 266 DOMUtils.playMedia(getWebContents(), LONG_AUDIO); |
| 267 assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_AUDIO)); |
| 268 DOMUtils.playMedia(getWebContents(), LONG_VIDEO); |
| 269 assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_VIDEO)); |
| 270 |
| 271 assertEquals(AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.get
AudioFocusState()); |
| 272 mAudioFocusChangeListener.requestAudioFocus( |
| 273 AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK); |
| 274 assertEquals(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, |
| 275 mAudioFocusChangeListener.getAudioFocusState()); |
| 276 |
| 277 assertTrue(DOMUtils.waitForMediaPause(getWebContents(), LONG_AUDIO)); |
| 278 assertTrue(DOMUtils.waitForMediaPause(getWebContents(), LONG_VIDEO)); |
| 279 } |
| 280 |
| 281 @MediumTest |
| 282 @Feature({"MediaSession"}) |
| 283 public void testMediaResumeAfterTransientMayDuckFocusLoss() throws Exception
{ |
| 284 DOMUtils.playMedia(getWebContents(), LONG_AUDIO); |
| 285 assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_AUDIO)); |
| 286 DOMUtils.playMedia(getWebContents(), LONG_VIDEO); |
| 287 assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_VIDEO)); |
| 288 |
| 289 assertEquals(AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.get
AudioFocusState()); |
| 290 mAudioFocusChangeListener.requestAudioFocus( |
| 291 AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK); |
| 292 assertEquals(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK, |
| 293 mAudioFocusChangeListener.getAudioFocusState()); |
| 294 |
| 295 assertTrue(DOMUtils.waitForMediaPause(getWebContents(), LONG_AUDIO)); |
| 296 assertTrue(DOMUtils.waitForMediaPause(getWebContents(), LONG_VIDEO)); |
| 297 |
| 298 mAudioFocusChangeListener.abandonAudioFocus(); |
| 299 |
| 300 assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_AUDIO)); |
| 301 assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_VIDEO)); |
| 302 } |
| 303 |
| 304 @MediumTest |
| 305 @Feature({"MediaSession"}) |
| 306 public void testMediaResumeAfterTransientFocusLoss() throws Exception { |
| 307 DOMUtils.playMedia(getWebContents(), LONG_AUDIO); |
| 308 assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_AUDIO)); |
| 309 DOMUtils.playMedia(getWebContents(), LONG_VIDEO); |
| 310 assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_VIDEO)); |
| 311 |
| 312 assertEquals(AudioManager.AUDIOFOCUS_LOSS, mAudioFocusChangeListener.get
AudioFocusState()); |
| 313 mAudioFocusChangeListener.requestAudioFocus(AudioManager.AUDIOFOCUS_GAIN
_TRANSIENT); |
| 314 assertEquals(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT, |
| 315 mAudioFocusChangeListener.getAudioFocusState()); |
| 316 |
| 317 assertTrue(DOMUtils.waitForMediaPause(getWebContents(), LONG_AUDIO)); |
| 318 assertTrue(DOMUtils.waitForMediaPause(getWebContents(), LONG_VIDEO)); |
| 319 |
| 320 mAudioFocusChangeListener.abandonAudioFocus(); |
| 321 |
| 322 assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_AUDIO)); |
| 323 assertTrue(DOMUtils.waitForMediaPlay(getWebContents(), LONG_VIDEO)); |
| 324 } |
| 325 } |
OLD | NEW |