Merge "Add check for null token when updating state" into tm-dev am: 0e29401d65 am: 9854e5d1fb

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/18634544

Change-Id: I578b92280ba09630ac2b293dea8c21a18de82165
Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
Beth Thibodeau
2022-05-28 02:49:02 +00:00
committed by Automerger Merge Worker
4 changed files with 30 additions and 3 deletions

View File

@@ -16,6 +16,7 @@
package com.android.systemui.media;
import android.annotation.NonNull;
import android.content.Context;
import android.media.session.MediaController;
import android.media.session.MediaSession;
@@ -39,7 +40,7 @@ public class MediaControllerFactory {
*
* @param token The token for the session. This value must never be null.
*/
public MediaController create(MediaSession.Token token) {
public MediaController create(@NonNull MediaSession.Token token) {
return new MediaController(mContext, token);
}
}

View File

@@ -509,6 +509,11 @@ class MediaDataManager(
*/
private fun updateState(key: String, state: PlaybackState) {
mediaEntries.get(key)?.let {
val token = it.token
if (token == null) {
if (DEBUG) Log.d(TAG, "State updated, but token was null")
return
}
val actions = createActionsFromState(it.packageName,
mediaControllerFactory.create(it.token), UserHandle(it.userId))
val data = it.copy(

View File

@@ -161,8 +161,9 @@ class MediaTimeoutListener @Inject constructor(
destroyed = false
mediaController?.unregisterCallback(this)
field = value
mediaController = if (field.token != null) {
mediaControllerFactory.create(field.token)
val token = field.token
mediaController = if (token != null) {
mediaControllerFactory.create(token)
} else {
null
}

View File

@@ -978,6 +978,26 @@ class MediaDataManagerTest : SysuiTestCase() {
anyBoolean())
}
@Test
fun testPlaybackStateChange_keyHasNullToken_doesNothing() {
// When we get an update that sets the data's token to null
whenever(controller.metadata).thenReturn(metadataBuilder.build())
addNotificationAndLoad()
val data = mediaDataCaptor.value
assertThat(data.resumption).isFalse()
mediaDataManager.onMediaDataLoaded(KEY, null, data.copy(token = null))
// 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
callbackCaptor.value.invoke(KEY, state)
verify(listener, never()).onMediaDataLoaded(eq(KEY), any(), any(), anyBoolean(), anyInt(),
anyBoolean())
}
/**
* Helper function to add a media notification and capture the resulting MediaData
*/