1 /* 2 * Copyright (C) 2017 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 17 package com.android.tv; 18 19 import static com.google.common.truth.Truth.assertThat; 20 21 import android.app.PendingIntent; 22 import android.content.Intent; 23 import android.media.MediaMetadata; 24 import android.media.session.PlaybackState; 25 26 import com.android.tv.testing.EpgTestData; 27 import com.android.tv.testing.TvRobolectricTestRunner; 28 import com.android.tv.testing.TestSingletonApp; 29 import com.android.tv.testing.constants.ConfigConstants; 30 import com.android.tv.testing.shadows.ShadowMediaSession; 31 32 import com.google.common.collect.Maps; 33 34 import org.junit.Before; 35 import org.junit.Test; 36 import org.junit.runner.RunWith; 37 import org.robolectric.RuntimeEnvironment; 38 import org.robolectric.annotation.Config; 39 import org.robolectric.shadow.api.Shadow; 40 41 import java.util.Map; 42 43 /** Tests fpr {@link MediaSessionWrapper}. */ 44 @RunWith(TvRobolectricTestRunner.class) 45 @Config( 46 sdk = ConfigConstants.SDK, 47 application = TestSingletonApp.class, 48 shadows = {ShadowMediaSession.class}) 49 public class MediaSessionWrapperTest { 50 51 private static final int TEST_REQUEST_CODE = 1337; 52 53 private ShadowMediaSession mediaSession; 54 private MediaSessionWrapper mediaSessionWrapper; 55 private PendingIntent pendingIntent; 56 57 @Before setUp()58 public void setUp() { 59 pendingIntent = PendingIntent.getActivity(RuntimeEnvironment.application, TEST_REQUEST_CODE, 60 new Intent(), PendingIntent.FLAG_IMMUTABLE); 61 mediaSessionWrapper = 62 new MediaSessionWrapper(RuntimeEnvironment.application, pendingIntent) { 63 @Override 64 void initMediaController() { 65 // Not use MediaController for tests here because: 66 // 1. it's not allow to shadow MediaController 67 // 2. The Context TestSingletonApp is not an instance of Activity so 68 // Activity.setMediaController cannot be called. 69 // onPlaybackStateChanged() is called in #setPlaybackState instead. 70 } 71 72 @Override 73 void unregisterMediaControllerCallback() {} 74 }; 75 mediaSession = Shadow.extract(mediaSessionWrapper.getMediaSession()); 76 } 77 78 @Test setSessionActivity()79 public void setSessionActivity() { 80 assertThat(mediaSession.mSessionActivity).isEqualTo(this.pendingIntent); 81 } 82 83 @Test setPlaybackState_true()84 public void setPlaybackState_true() { 85 setPlaybackState(true); 86 assertThat(mediaSession.mActive).isTrue(); 87 assertThat(mediaSession.mPlaybackState.getState()).isEqualTo(PlaybackState.STATE_PLAYING); 88 } 89 90 @Test setPlaybackState_false()91 public void setPlaybackState_false() { 92 setPlaybackState(false); 93 assertThat(mediaSession.mActive).isFalse(); 94 assertThat(mediaSession.mPlaybackState).isNull(); 95 } 96 97 @Test setPlaybackState_trueThenFalse()98 public void setPlaybackState_trueThenFalse() { 99 setPlaybackState(true); 100 setPlaybackState(false); 101 assertThat(mediaSession.mActive).isFalse(); 102 assertThat(mediaSession.mPlaybackState.getState()).isEqualTo(PlaybackState.STATE_STOPPED); 103 } 104 105 @Test update_channel10()106 public void update_channel10() { 107 108 mediaSessionWrapper.update(false, EpgTestData.toTvChannel(EpgTestData.CHANNEL_10), null); 109 assertThat(asMap(mediaSession.mMediaMetadata)) 110 .containsExactly(MediaMetadata.METADATA_KEY_TITLE, "Channel TEN"); 111 } 112 113 @Test update_blockedChannel10()114 public void update_blockedChannel10() { 115 mediaSessionWrapper.update(true, EpgTestData.toTvChannel(EpgTestData.CHANNEL_10), null); 116 assertThat(asMap(mediaSession.mMediaMetadata)) 117 .containsExactly( 118 MediaMetadata.METADATA_KEY_TITLE, 119 "Channel blocked", 120 MediaMetadata.METADATA_KEY_ART, 121 null); 122 } 123 124 @Test update_channel10Program2()125 public void update_channel10Program2() { 126 mediaSessionWrapper.update( 127 false, EpgTestData.toTvChannel(EpgTestData.CHANNEL_10), EpgTestData.PROGRAM_2); 128 assertThat(asMap(mediaSession.mMediaMetadata)) 129 .containsExactly(MediaMetadata.METADATA_KEY_TITLE, "Program 2"); 130 } 131 132 @Test update_blockedChannel10Program2()133 public void update_blockedChannel10Program2() { 134 mediaSessionWrapper.update( 135 true, EpgTestData.toTvChannel(EpgTestData.CHANNEL_10), EpgTestData.PROGRAM_2); 136 assertThat(asMap(mediaSession.mMediaMetadata)) 137 .containsExactly( 138 MediaMetadata.METADATA_KEY_TITLE, 139 "Channel blocked", 140 MediaMetadata.METADATA_KEY_ART, 141 null); 142 // TODO(b/70559407): test async loading of images. 143 } 144 145 @Test release()146 public void release() { 147 mediaSessionWrapper.release(); 148 assertThat(mediaSession.mReleased).isTrue(); 149 } 150 asMap(MediaMetadata mediaMetadata)151 private Map<String, Object> asMap(MediaMetadata mediaMetadata) { 152 return Maps.asMap(mediaMetadata.keySet(), key -> mediaMetadata.getString(key)); 153 } 154 setPlaybackState(boolean isPlaying)155 private void setPlaybackState(boolean isPlaying) { 156 mediaSessionWrapper.setPlaybackState(isPlaying); 157 mediaSessionWrapper 158 .getMediaControllerCallback() 159 .onPlaybackStateChanged( 160 isPlaying 161 ? MediaSessionWrapper.MEDIA_SESSION_STATE_PLAYING 162 : MediaSessionWrapper.MEDIA_SESSION_STATE_STOPPED); 163 } 164 } 165