• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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