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