1 /* 2 * Copyright (C) 2014 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 package android.media.cts; 17 18 import android.app.PendingIntent; 19 import android.content.Context; 20 import android.content.Intent; 21 import android.media.AudioAttributes; 22 import android.media.AudioManager; 23 import android.media.MediaDescription; 24 import android.media.MediaMetadata; 25 import android.media.Rating; 26 import android.media.VolumeProvider; 27 import android.media.session.MediaController; 28 import android.media.session.MediaSession; 29 import android.media.session.MediaSessionManager; 30 import android.media.session.PlaybackState; 31 import android.os.Bundle; 32 import android.test.AndroidTestCase; 33 34 import java.util.ArrayList; 35 import java.util.Set; 36 37 public class MediaSessionTest extends AndroidTestCase { 38 private AudioManager mAudioManager; 39 40 @Override 41 protected void setUp() throws Exception { 42 super.setUp(); 43 mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE); 44 } 45 46 /** 47 * Tests that a session can be created and that all the fields are 48 * initialized correctly. 49 */ 50 public void testCreateSession() throws Exception { 51 String tag = "test session"; 52 MediaSession session = new MediaSession(getContext(), tag); 53 assertNotNull(session.getSessionToken()); 54 assertFalse("New session should not be active", session.isActive()); 55 56 // Verify by getting the controller and checking all its fields 57 MediaController controller = session.getController(); 58 assertNotNull(controller); 59 verifyNewSession(controller, tag); 60 } 61 62 /** 63 * Tests that the various configuration bits on a session get passed to the 64 * controller. 65 */ 66 public void testConfigureSession() throws Exception { 67 String tag = "test session"; 68 String key = "test-key"; 69 String val = "test-val"; 70 MediaSession session = new MediaSession(getContext(), tag); 71 MediaController controller = session.getController(); 72 73 // test setExtras 74 Bundle extras = new Bundle(); 75 extras.putString(key, val); 76 session.setExtras(extras); 77 Bundle extrasOut = controller.getExtras(); 78 assertNotNull(extrasOut); 79 assertEquals(val, extrasOut.get(key)); 80 81 // test setFlags 82 session.setFlags(5); 83 assertEquals(5, controller.getFlags()); 84 85 // test setMetadata 86 MediaMetadata metadata = new MediaMetadata.Builder().putString(key, val).build(); 87 session.setMetadata(metadata); 88 MediaMetadata metadataOut = controller.getMetadata(); 89 assertNotNull(metadataOut); 90 assertEquals(val, metadataOut.getString(key)); 91 92 // test setPlaybackState 93 PlaybackState state = new PlaybackState.Builder().setActions(55).build(); 94 session.setPlaybackState(state); 95 PlaybackState stateOut = controller.getPlaybackState(); 96 assertNotNull(stateOut); 97 assertEquals(55L, stateOut.getActions()); 98 99 // test setPlaybackToRemote, do this before testing setPlaybackToLocal 100 // to ensure it switches correctly. 101 try { 102 session.setPlaybackToRemote(null); 103 fail("Expected IAE for setPlaybackToRemote(null)"); 104 } catch (IllegalArgumentException e) { 105 // expected 106 } 107 VolumeProvider vp = new VolumeProvider(VolumeProvider.VOLUME_CONTROL_FIXED, 11, 11) {}; 108 session.setPlaybackToRemote(vp); 109 MediaController.PlaybackInfo info = controller.getPlaybackInfo(); 110 assertNotNull(info); 111 assertEquals(MediaController.PlaybackInfo.PLAYBACK_TYPE_REMOTE, info.getPlaybackType()); 112 assertEquals(11, info.getMaxVolume()); 113 assertEquals(11, info.getCurrentVolume()); 114 assertEquals(VolumeProvider.VOLUME_CONTROL_FIXED, info.getVolumeControl()); 115 116 // test setPlaybackToLocal 117 AudioAttributes attrs = new AudioAttributes.Builder().addTag(val).build(); 118 session.setPlaybackToLocal(attrs); 119 info = controller.getPlaybackInfo(); 120 assertNotNull(info); 121 assertEquals(MediaController.PlaybackInfo.PLAYBACK_TYPE_LOCAL, info.getPlaybackType()); 122 Set<String> tags = info.getAudioAttributes().getTags(); 123 assertNotNull(tags); 124 assertTrue(tags.contains(val)); 125 126 // test setQueue and setQueueTitle 127 ArrayList<MediaSession.QueueItem> queue = new ArrayList<MediaSession.QueueItem>(); 128 MediaSession.QueueItem item = new MediaSession.QueueItem(new MediaDescription.Builder() 129 .setMediaId(val).setTitle("title").build(), 11); 130 queue.add(item); 131 session.setQueue(queue); 132 session.setQueueTitle(val); 133 134 assertEquals(val, controller.getQueueTitle()); 135 assertEquals(1, controller.getQueue().size()); 136 assertEquals(11, controller.getQueue().get(0).getQueueId()); 137 assertEquals(val, controller.getQueue().get(0).getDescription().getMediaId()); 138 139 session.setQueue(null); 140 session.setQueueTitle(null); 141 142 assertNull(controller.getQueueTitle()); 143 assertNull(controller.getQueue()); 144 145 // test setSessionActivity 146 Intent intent = new Intent("cts.MEDIA_SESSION_ACTION"); 147 PendingIntent pi = PendingIntent.getActivity(getContext(), 555, intent, 0); 148 session.setSessionActivity(pi); 149 assertEquals(pi, controller.getSessionActivity()); 150 } 151 152 /** 153 * Verifies that a new session hasn't had any configuration bits set yet. 154 * 155 * @param controller The controller for the session 156 */ 157 private void verifyNewSession(MediaController controller, String tag) { 158 assertEquals("New session has unexpected configuration", 0L, controller.getFlags()); 159 assertNull("New session has unexpected configuration", controller.getExtras()); 160 assertNull("New session has unexpected configuration", controller.getMetadata()); 161 assertEquals("New session has unexpected configuration", 162 getContext().getPackageName(), controller.getPackageName()); 163 assertNull("New session has unexpected configuration", controller.getPlaybackState()); 164 assertNull("New session has unexpected configuration", controller.getQueue()); 165 assertNull("New session has unexpected configuration", controller.getQueueTitle()); 166 assertEquals("New session has unexpected configuration", Rating.RATING_NONE, 167 controller.getRatingType()); 168 assertNull("New session has unexpected configuration", controller.getSessionActivity()); 169 170 assertNotNull(controller.getSessionToken()); 171 assertNotNull(controller.getTransportControls()); 172 assertEquals(tag, controller.getTag()); 173 174 MediaController.PlaybackInfo info = controller.getPlaybackInfo(); 175 assertNotNull(info); 176 assertEquals(MediaController.PlaybackInfo.PLAYBACK_TYPE_LOCAL, info.getPlaybackType()); 177 AudioAttributes attrs = info.getAudioAttributes(); 178 assertNotNull(attrs); 179 assertEquals(AudioAttributes.USAGE_MEDIA, attrs.getUsage()); 180 assertEquals(mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC), 181 info.getCurrentVolume()); 182 } 183 } 184