Fixing white circle in QS media player.
In resume player, no need to update data. We only update semantic actions and state when the media session flag is set. Bug: 236951669 Test: atest MediaDataManagerTest Change-Id: I8785478f5795e230137a300e09598a8f915a5dc9
This commit is contained in:
@@ -518,9 +518,20 @@ class MediaDataManager(
|
||||
}
|
||||
val actions = createActionsFromState(it.packageName,
|
||||
mediaControllerFactory.create(it.token), UserHandle(it.userId))
|
||||
val data = it.copy(
|
||||
semanticActions = actions,
|
||||
isPlaying = isPlayingState(state.state))
|
||||
|
||||
// Control buttons
|
||||
// If flag is enabled and controller has a PlaybackState,
|
||||
// create actions from session info
|
||||
// otherwise, no need to update semantic actions.
|
||||
val data = if (actions != null) {
|
||||
it.copy(
|
||||
semanticActions = actions,
|
||||
isPlaying = isPlayingState(state.state))
|
||||
} else {
|
||||
it.copy(
|
||||
isPlaying = isPlayingState(state.state)
|
||||
)
|
||||
}
|
||||
if (DEBUG) Log.d(TAG, "State updated outside of notification")
|
||||
onMediaDataLoaded(key, key, data)
|
||||
}
|
||||
|
||||
@@ -31,7 +31,6 @@ import com.android.systemui.statusbar.SbnBuilder
|
||||
import com.android.systemui.tuner.TunerService
|
||||
import com.android.systemui.util.concurrency.FakeExecutor
|
||||
import com.android.systemui.util.mockito.any
|
||||
import com.android.systemui.util.mockito.argumentCaptor
|
||||
import com.android.systemui.util.mockito.capture
|
||||
import com.android.systemui.util.mockito.eq
|
||||
import com.android.systemui.util.time.FakeSystemClock
|
||||
@@ -108,6 +107,7 @@ class MediaDataManagerTest : SysuiTestCase() {
|
||||
private val clock = FakeSystemClock()
|
||||
@Mock private lateinit var tunerService: TunerService
|
||||
@Captor lateinit var tunableCaptor: ArgumentCaptor<TunerService.Tunable>
|
||||
@Captor lateinit var callbackCaptor: ArgumentCaptor<(String, PlaybackState) -> Unit>
|
||||
|
||||
private val instanceIdSequence = InstanceIdSequenceFake(1 shl 20)
|
||||
|
||||
@@ -974,7 +974,6 @@ class MediaDataManagerTest : SysuiTestCase() {
|
||||
fun testPlaybackStateChange_keyExists_callsListener() {
|
||||
// Notification has been added
|
||||
addNotificationAndLoad()
|
||||
val callbackCaptor = argumentCaptor<(String, PlaybackState) -> Unit>()
|
||||
verify(mediaTimeoutListener).stateCallback = capture(callbackCaptor)
|
||||
|
||||
// Callback gets an updated state
|
||||
@@ -992,7 +991,6 @@ class MediaDataManagerTest : SysuiTestCase() {
|
||||
@Test
|
||||
fun testPlaybackStateChange_keyDoesNotExist_doesNothing() {
|
||||
val state = PlaybackState.Builder().build()
|
||||
val callbackCaptor = argumentCaptor<(String, PlaybackState) -> Unit>()
|
||||
verify(mediaTimeoutListener).stateCallback = capture(callbackCaptor)
|
||||
|
||||
// No media added with this key
|
||||
@@ -1013,7 +1011,6 @@ class MediaDataManagerTest : SysuiTestCase() {
|
||||
|
||||
// And then get a state update
|
||||
val state = PlaybackState.Builder().build()
|
||||
val callbackCaptor = argumentCaptor<(String, PlaybackState) -> Unit>()
|
||||
verify(mediaTimeoutListener).stateCallback = capture(callbackCaptor)
|
||||
|
||||
// Then no changes are made
|
||||
@@ -1022,6 +1019,83 @@ class MediaDataManagerTest : SysuiTestCase() {
|
||||
anyBoolean())
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testPlaybackState_PauseWhenFlagTrue_keyExists_callsListener() {
|
||||
whenever(mediaFlags.areMediaSessionActionsEnabled(any(), any())).thenReturn(true)
|
||||
val state = PlaybackState.Builder()
|
||||
.setState(PlaybackState.STATE_PAUSED, 0L, 1f)
|
||||
.build()
|
||||
whenever(controller.playbackState).thenReturn(state)
|
||||
|
||||
addNotificationAndLoad()
|
||||
verify(mediaTimeoutListener).stateCallback = capture(callbackCaptor)
|
||||
callbackCaptor.value.invoke(KEY, state)
|
||||
|
||||
verify(listener).onMediaDataLoaded(eq(KEY), eq(KEY),
|
||||
capture(mediaDataCaptor), eq(true), eq(0), eq(false))
|
||||
assertThat(mediaDataCaptor.value.isPlaying).isFalse()
|
||||
assertThat(mediaDataCaptor.value.semanticActions).isNotNull()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testPlaybackState_PauseStateAfterAddingResumption_keyExists_callsListener() {
|
||||
val desc = MediaDescription.Builder().run {
|
||||
setTitle(SESSION_TITLE)
|
||||
build()
|
||||
}
|
||||
val state = PlaybackState.Builder()
|
||||
.setState(PlaybackState.STATE_PAUSED, 0L, 1f)
|
||||
.setActions(PlaybackState.ACTION_PLAY_PAUSE)
|
||||
.build()
|
||||
|
||||
// Add resumption controls in order to have semantic actions.
|
||||
// To make sure that they are not null after changing state.
|
||||
mediaDataManager.addResumptionControls(
|
||||
USER_ID,
|
||||
desc,
|
||||
Runnable {},
|
||||
session.sessionToken,
|
||||
APP_NAME,
|
||||
pendingIntent,
|
||||
PACKAGE_NAME
|
||||
)
|
||||
backgroundExecutor.runAllReady()
|
||||
foregroundExecutor.runAllReady()
|
||||
|
||||
verify(mediaTimeoutListener).stateCallback = capture(callbackCaptor)
|
||||
callbackCaptor.value.invoke(PACKAGE_NAME, state)
|
||||
|
||||
verify(listener)
|
||||
.onMediaDataLoaded(
|
||||
eq(PACKAGE_NAME),
|
||||
eq(PACKAGE_NAME),
|
||||
capture(mediaDataCaptor),
|
||||
eq(true),
|
||||
eq(0),
|
||||
eq(false)
|
||||
)
|
||||
assertThat(mediaDataCaptor.value.isPlaying).isFalse()
|
||||
assertThat(mediaDataCaptor.value.semanticActions).isNotNull()
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testPlaybackStateNull_Pause_keyExists_callsListener() {
|
||||
whenever(controller.playbackState).thenReturn(null)
|
||||
val state = PlaybackState.Builder()
|
||||
.setState(PlaybackState.STATE_PAUSED, 0L, 1f)
|
||||
.setActions(PlaybackState.ACTION_PLAY_PAUSE)
|
||||
.build()
|
||||
|
||||
addNotificationAndLoad()
|
||||
verify(mediaTimeoutListener).stateCallback = capture(callbackCaptor)
|
||||
callbackCaptor.value.invoke(KEY, state)
|
||||
|
||||
verify(listener).onMediaDataLoaded(eq(KEY), eq(KEY),
|
||||
capture(mediaDataCaptor), eq(true), eq(0), eq(false))
|
||||
assertThat(mediaDataCaptor.value.isPlaying).isFalse()
|
||||
assertThat(mediaDataCaptor.value.semanticActions).isNull()
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper function to add a media notification and capture the resulting MediaData
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user