Home | History | Annotate | Download | only in cts
      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