1 /*
2  * Copyright (C) 2020 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.systemui.media.controls.ui
18 
19 import androidx.test.ext.junit.runners.AndroidJUnit4
20 import androidx.test.filters.SmallTest
21 import com.android.systemui.SysuiTestCase
22 import com.android.systemui.media.controls.MediaTestUtils
23 import com.android.systemui.media.controls.shared.model.MediaData
24 import com.android.systemui.media.controls.ui.controller.MediaControlPanel
25 import com.android.systemui.media.controls.ui.controller.MediaPlayerData
26 import com.android.systemui.util.time.FakeSystemClock
27 import com.google.common.truth.Truth.assertThat
28 import org.junit.Before
29 import org.junit.Rule
30 import org.junit.Test
31 import org.junit.runner.RunWith
32 import org.mockito.Mock
33 import org.mockito.Mockito.mock
34 import org.mockito.junit.MockitoJUnit
35 
36 @SmallTest
37 @RunWith(AndroidJUnit4::class)
38 public class MediaPlayerDataTest : SysuiTestCase() {
39 
40     @Mock private lateinit var playerIsPlaying: MediaControlPanel
41     private var systemClock: FakeSystemClock = FakeSystemClock()
42 
43     @JvmField @Rule val mockito = MockitoJUnit.rule()
44 
45     companion object {
46         val LOCAL = MediaData.PLAYBACK_LOCAL
47         val REMOTE = MediaData.PLAYBACK_CAST_LOCAL
48         val RESUMPTION = true
49         val PLAYING = true
50         val UNDETERMINED = null
51     }
52 
53     @Before
setupnull54     fun setup() {
55         MediaPlayerData.clear()
56     }
57 
58     @Test
addPlayingThenRemotenull59     fun addPlayingThenRemote() {
60         val dataIsPlaying = createMediaData("app1", PLAYING, LOCAL, !RESUMPTION)
61 
62         val playerIsRemote = mock(MediaControlPanel::class.java)
63         val dataIsRemote = createMediaData("app2", PLAYING, REMOTE, !RESUMPTION)
64 
65         MediaPlayerData.addMediaPlayer(
66             "2",
67             dataIsRemote,
68             playerIsRemote,
69             systemClock,
70             isSsReactivated = false
71         )
72         MediaPlayerData.addMediaPlayer(
73             "1",
74             dataIsPlaying,
75             playerIsPlaying,
76             systemClock,
77             isSsReactivated = false
78         )
79 
80         val players = MediaPlayerData.players()
81         assertThat(players).hasSize(2)
82         assertThat(players).containsExactly(playerIsPlaying, playerIsRemote).inOrder()
83     }
84 
85     @Test
switchPlayersPlayingnull86     fun switchPlayersPlaying() {
87         val playerIsPlaying1 = mock(MediaControlPanel::class.java)
88         var dataIsPlaying1 = createMediaData("app1", PLAYING, LOCAL, !RESUMPTION)
89 
90         val playerIsPlaying2 = mock(MediaControlPanel::class.java)
91         var dataIsPlaying2 = createMediaData("app2", !PLAYING, LOCAL, !RESUMPTION)
92 
93         MediaPlayerData.addMediaPlayer(
94             "1",
95             dataIsPlaying1,
96             playerIsPlaying1,
97             systemClock,
98             isSsReactivated = false
99         )
100         systemClock.advanceTime(1)
101         MediaPlayerData.addMediaPlayer(
102             "2",
103             dataIsPlaying2,
104             playerIsPlaying2,
105             systemClock,
106             isSsReactivated = false
107         )
108         systemClock.advanceTime(1)
109 
110         dataIsPlaying1 = createMediaData("app1", !PLAYING, LOCAL, !RESUMPTION)
111         dataIsPlaying2 = createMediaData("app2", PLAYING, LOCAL, !RESUMPTION)
112 
113         MediaPlayerData.addMediaPlayer(
114             "1",
115             dataIsPlaying1,
116             playerIsPlaying1,
117             systemClock,
118             isSsReactivated = false
119         )
120         systemClock.advanceTime(1)
121 
122         MediaPlayerData.addMediaPlayer(
123             "2",
124             dataIsPlaying2,
125             playerIsPlaying2,
126             systemClock,
127             isSsReactivated = false
128         )
129         systemClock.advanceTime(1)
130 
131         val players = MediaPlayerData.players()
132         assertThat(players).hasSize(2)
133         assertThat(players).containsExactly(playerIsPlaying2, playerIsPlaying1).inOrder()
134     }
135 
136     @Test
fullOrderTestnull137     fun fullOrderTest() {
138         val dataIsPlaying = createMediaData("app1", PLAYING, LOCAL, !RESUMPTION)
139 
140         val playerIsPlayingAndRemote = mock(MediaControlPanel::class.java)
141         val dataIsPlayingAndRemote = createMediaData("app2", PLAYING, REMOTE, !RESUMPTION)
142 
143         val playerIsStoppedAndLocal = mock(MediaControlPanel::class.java)
144         val dataIsStoppedAndLocal = createMediaData("app3", !PLAYING, LOCAL, !RESUMPTION)
145 
146         val playerIsStoppedAndRemote = mock(MediaControlPanel::class.java)
147         val dataIsStoppedAndRemote = createMediaData("app4", !PLAYING, REMOTE, !RESUMPTION)
148 
149         val playerCanResume = mock(MediaControlPanel::class.java)
150         val dataCanResume = createMediaData("app5", !PLAYING, LOCAL, RESUMPTION)
151 
152         val playerUndetermined = mock(MediaControlPanel::class.java)
153         val dataUndetermined = createMediaData("app6", UNDETERMINED, LOCAL, RESUMPTION)
154 
155         MediaPlayerData.addMediaPlayer(
156             "3",
157             dataIsStoppedAndLocal,
158             playerIsStoppedAndLocal,
159             systemClock,
160             isSsReactivated = false
161         )
162         MediaPlayerData.addMediaPlayer(
163             "5",
164             dataIsStoppedAndRemote,
165             playerIsStoppedAndRemote,
166             systemClock,
167             isSsReactivated = false
168         )
169         MediaPlayerData.addMediaPlayer(
170             "4",
171             dataCanResume,
172             playerCanResume,
173             systemClock,
174             isSsReactivated = false
175         )
176         MediaPlayerData.addMediaPlayer(
177             "1",
178             dataIsPlaying,
179             playerIsPlaying,
180             systemClock,
181             isSsReactivated = false
182         )
183         MediaPlayerData.addMediaPlayer(
184             "2",
185             dataIsPlayingAndRemote,
186             playerIsPlayingAndRemote,
187             systemClock,
188             isSsReactivated = false
189         )
190         MediaPlayerData.addMediaPlayer(
191             "6",
192             dataUndetermined,
193             playerUndetermined,
194             systemClock,
195             isSsReactivated = false
196         )
197 
198         val players = MediaPlayerData.players()
199         assertThat(players).hasSize(6)
200         assertThat(players)
201             .containsExactly(
202                 playerIsPlaying,
203                 playerIsPlayingAndRemote,
204                 playerIsStoppedAndRemote,
205                 playerIsStoppedAndLocal,
206                 playerUndetermined,
207                 playerCanResume
208             )
209             .inOrder()
210     }
211 
212     @Test
testMoveMediaKeysAroundnull213     fun testMoveMediaKeysAround() {
214         val keyA = "a"
215         val keyB = "b"
216 
217         val data = createMediaData("app1", PLAYING, LOCAL, !RESUMPTION)
218 
219         assertThat(MediaPlayerData.players()).hasSize(0)
220 
221         MediaPlayerData.addMediaPlayer(
222             keyA,
223             data,
224             playerIsPlaying,
225             systemClock,
226             isSsReactivated = false
227         )
228         systemClock.advanceTime(1)
229 
230         assertThat(MediaPlayerData.players()).hasSize(1)
231         MediaPlayerData.addMediaPlayer(
232             keyB,
233             data,
234             playerIsPlaying,
235             systemClock,
236             isSsReactivated = false
237         )
238         systemClock.advanceTime(1)
239 
240         assertThat(MediaPlayerData.players()).hasSize(2)
241 
242         MediaPlayerData.moveIfExists(keyA, keyB)
243 
244         assertThat(MediaPlayerData.players()).hasSize(1)
245 
246         assertThat(MediaPlayerData.getMediaPlayer(keyA)).isNull()
247         assertThat(MediaPlayerData.getMediaPlayer(keyB)).isNotNull()
248     }
249 
createMediaDatanull250     private fun createMediaData(
251         app: String,
252         isPlaying: Boolean?,
253         location: Int,
254         resumption: Boolean
255     ) =
256         MediaTestUtils.emptyMediaData.copy(
257             app = app,
258             packageName = "package: $app",
259             playbackLocation = location,
260             resumption = resumption,
261             notificationKey = "key: $app",
262             isPlaying = isPlaying
263         )
264 }
265