Fix implementations of MediaLibrarySessionCallback to pass params

The documentation makes it clear this value should be propagated
through to the result.

PiperOrigin-RevId: 407085751
This commit is contained in:
ibaker 2021-11-02 15:12:32 +00:00 committed by Ian Baker
parent dfb87e2161
commit 8b34d160dc
5 changed files with 36 additions and 27 deletions

View File

@ -50,9 +50,7 @@ class PlaybackService : MediaLibraryService() {
browser: MediaSession.ControllerInfo,
params: LibraryParams?
): ListenableFuture<LibraryResult<MediaItem>> {
return Futures.immediateFuture(
LibraryResult.ofItem(MediaItemTree.getRootItem(), /* params= */ null)
)
return Futures.immediateFuture(LibraryResult.ofItem(MediaItemTree.getRootItem(), params))
}
override fun onGetItem(

View File

@ -153,7 +153,7 @@ public final class LibraryResult<V> implements Bundleable {
/** The optional parameters. */
@Nullable public final MediaLibraryService.LibraryParams params;
/** Constructs a new instance with {@link #resultCode}{@code ==}{@link #RESULT_SUCCESS}. */
/** Creates an instance with {@link #resultCode}{@code ==}{@link #RESULT_SUCCESS}. */
public static LibraryResult<Void> ofVoid() {
return new LibraryResult<>(
RESULT_SUCCESS,
@ -163,6 +163,15 @@ public final class LibraryResult<V> implements Bundleable {
VALUE_TYPE_VOID);
}
/**
* Creates an instance with {@link #resultCode}{@code ==}{@link #RESULT_SUCCESS} and optional
* {@link LibraryParams params}.
*/
public static LibraryResult<Void> ofVoid(@Nullable LibraryParams params) {
return new LibraryResult<>(
RESULT_SUCCESS, SystemClock.elapsedRealtime(), params, /* value= */ null, VALUE_TYPE_VOID);
}
/**
* Creates an instance with a media item and {@link #resultCode}{@code ==}{@link #RESULT_SUCCESS}.
*

View File

@ -183,7 +183,7 @@ public class MediaBrowserListenerTest extends MediaControllerListenerTest {
.postAndSync(() -> browser.getChildren(parentId, page, pageSize, params))
.get(TIMEOUT_MS, MILLISECONDS);
assertThat(result.resultCode).isEqualTo(RESULT_SUCCESS);
assertThat(result.params).isNull();
MediaTestUtils.assertLibraryParamsEquals(params, result.params);
MediaTestUtils.assertPaginatedListHasIds(
result.value, MediaBrowserConstants.GET_CHILDREN_RESULT, page, pageSize);
@ -205,7 +205,7 @@ public class MediaBrowserListenerTest extends MediaControllerListenerTest {
.postAndSync(() -> browser.getChildren(parentId, page, pageSize, params))
.get(LONG_TIMEOUT_MS, MILLISECONDS);
assertThat(result.resultCode).isEqualTo(RESULT_SUCCESS);
assertThat(result.params).isNull();
MediaTestUtils.assertLibraryParamsEquals(params, result.params);
assertThat(result.value).hasSize(LONG_LIST_COUNT);
for (int i = 0; i < result.value.size(); i++) {

View File

@ -20,6 +20,7 @@ import static com.google.common.truth.Truth.assertThat;
import static java.util.concurrent.TimeUnit.MILLISECONDS;
import android.content.Context;
import androidx.annotation.Nullable;
import androidx.media3.session.MediaLibraryService.LibraryParams;
import androidx.media3.session.MediaLibraryService.MediaLibrarySession;
import androidx.media3.session.MediaSession.ControllerInfo;
@ -82,11 +83,11 @@ public class MediaLibrarySessionCallbackTest {
MediaLibrarySession session,
ControllerInfo browser,
String parentId,
LibraryParams params) {
@Nullable LibraryParams params) {
assertThat(parentId).isEqualTo(testParentId);
MediaTestUtils.assertLibraryParamsEquals(testParams, params);
latch.countDown();
return Futures.immediateFuture(LibraryResult.ofVoid());
return Futures.immediateFuture(LibraryResult.ofVoid(params));
}
};

View File

@ -52,6 +52,7 @@ import android.content.Context;
import android.os.Bundle;
import android.os.HandlerThread;
import androidx.annotation.GuardedBy;
import androidx.annotation.Nullable;
import androidx.media3.common.MediaItem;
import androidx.media3.common.MediaMetadata;
import androidx.media3.common.util.BundleableUtil;
@ -183,7 +184,7 @@ public class MockMediaLibraryService extends MediaLibraryService {
@Override
public ListenableFuture<LibraryResult<MediaItem>> onGetLibraryRoot(
MediaLibrarySession session, ControllerInfo browser, LibraryParams params) {
MediaLibrarySession session, ControllerInfo browser, @Nullable LibraryParams params) {
assertLibraryParams(params);
return Futures.immediateFuture(LibraryResult.ofItem(ROOT_ITEM, ROOT_PARAMS));
}
@ -218,30 +219,32 @@ public class MockMediaLibraryService extends MediaLibraryService {
String parentId,
int page,
int pageSize,
LibraryParams params) {
@Nullable LibraryParams params) {
assertLibraryParams(params);
if (PARENT_ID.equals(parentId)) {
return Futures.immediateFuture(
LibraryResult.ofItemList(
getPaginatedResult(GET_CHILDREN_RESULT, page, pageSize), /* params= */ null));
getPaginatedResult(GET_CHILDREN_RESULT, page, pageSize), params));
} else if (PARENT_ID_LONG_LIST.equals(parentId)) {
List<MediaItem> list = new ArrayList<>(LONG_LIST_COUNT);
for (int i = 0; i < LONG_LIST_COUNT; i++) {
list.add(createPlayableMediaItem(TestUtils.getMediaIdInFakeTimeline(i)));
}
return Futures.immediateFuture(LibraryResult.ofItemList(list, /* params= */ null));
return Futures.immediateFuture(LibraryResult.ofItemList(list, params));
} else if (PARENT_ID_ERROR.equals(parentId)) {
return Futures.immediateFuture(LibraryResult.ofError(LibraryResult.RESULT_ERROR_BAD_VALUE));
}
// Includes the case of PARENT_ID_NO_CHILDREN.
return Futures.immediateFuture(
LibraryResult.ofItemList(ImmutableList.of(), /* params= */ null));
return Futures.immediateFuture(LibraryResult.ofItemList(ImmutableList.of(), params));
}
@Override
@SuppressWarnings("FutureReturnValueIgnored")
public ListenableFuture<LibraryResult<Void>> onSearch(
MediaLibrarySession session, ControllerInfo browser, String query, LibraryParams params) {
MediaLibrarySession session,
ControllerInfo browser,
String query,
@Nullable LibraryParams params) {
assertLibraryParams(params);
if (SEARCH_QUERY.equals(query)) {
MockMediaLibraryService.this.session.notifySearchResultChanged(
@ -266,7 +269,7 @@ public class MockMediaLibraryService extends MediaLibraryService {
// SEARCH_QUERY_EMPTY_RESULT and SEARCH_QUERY_ERROR will be handled here.
MockMediaLibraryService.this.session.notifySearchResultChanged(browser, query, 0, params);
}
return Futures.immediateFuture(LibraryResult.ofVoid());
return Futures.immediateFuture(LibraryResult.ofVoid(params));
}
@Override
@ -276,21 +279,19 @@ public class MockMediaLibraryService extends MediaLibraryService {
String query,
int page,
int pageSize,
LibraryParams params) {
@Nullable LibraryParams params) {
assertLibraryParams(params);
if (SEARCH_QUERY.equals(query)) {
return Futures.immediateFuture(
LibraryResult.ofItemList(
getPaginatedResult(SEARCH_RESULT, page, pageSize), /* params= */ null));
LibraryResult.ofItemList(getPaginatedResult(SEARCH_RESULT, page, pageSize), params));
} else if (SEARCH_QUERY_LONG_LIST.equals(query)) {
List<MediaItem> list = new ArrayList<>(LONG_LIST_COUNT);
for (int i = 0; i < LONG_LIST_COUNT; i++) {
list.add(createPlayableMediaItem(TestUtils.getMediaIdInFakeTimeline(i)));
}
return Futures.immediateFuture(LibraryResult.ofItemList(list, /* params= */ null));
return Futures.immediateFuture(LibraryResult.ofItemList(list, params));
} else if (SEARCH_QUERY_EMPTY_RESULT.equals(query)) {
return Futures.immediateFuture(
LibraryResult.ofItemList(ImmutableList.of(), /* params= */ null));
return Futures.immediateFuture(LibraryResult.ofItemList(ImmutableList.of(), params));
} else {
// SEARCH_QUERY_ERROR will be handled here.
return Futures.immediateFuture(LibraryResult.ofError(LibraryResult.RESULT_ERROR_BAD_VALUE));
@ -309,25 +310,25 @@ public class MockMediaLibraryService extends MediaLibraryService {
case SUBSCRIBE_ID_NOTIFY_CHILDREN_CHANGED_TO_ALL:
MockMediaLibraryService.this.session.notifyChildrenChanged(
parentId, NOTIFY_CHILDREN_CHANGED_ITEM_COUNT, NOTIFY_CHILDREN_CHANGED_PARAMS);
return Futures.immediateFuture(LibraryResult.ofVoid());
return Futures.immediateFuture(LibraryResult.ofVoid(params));
case SUBSCRIBE_ID_NOTIFY_CHILDREN_CHANGED_TO_ONE:
MockMediaLibraryService.this.session.notifyChildrenChanged(
MediaTestUtils.getTestControllerInfo(MockMediaLibraryService.this.session),
parentId,
NOTIFY_CHILDREN_CHANGED_ITEM_COUNT,
NOTIFY_CHILDREN_CHANGED_PARAMS);
return Futures.immediateFuture(LibraryResult.ofVoid());
return Futures.immediateFuture(LibraryResult.ofVoid(params));
case SUBSCRIBE_ID_NOTIFY_CHILDREN_CHANGED_TO_ALL_WITH_NON_SUBSCRIBED_ID:
MockMediaLibraryService.this.session.notifyChildrenChanged(
unsubscribedId, NOTIFY_CHILDREN_CHANGED_ITEM_COUNT, NOTIFY_CHILDREN_CHANGED_PARAMS);
return Futures.immediateFuture(LibraryResult.ofVoid());
return Futures.immediateFuture(LibraryResult.ofVoid(params));
case SUBSCRIBE_ID_NOTIFY_CHILDREN_CHANGED_TO_ONE_WITH_NON_SUBSCRIBED_ID:
MockMediaLibraryService.this.session.notifyChildrenChanged(
MediaTestUtils.getTestControllerInfo(MockMediaLibraryService.this.session),
unsubscribedId,
NOTIFY_CHILDREN_CHANGED_ITEM_COUNT,
NOTIFY_CHILDREN_CHANGED_PARAMS);
return Futures.immediateFuture(LibraryResult.ofVoid());
return Futures.immediateFuture(LibraryResult.ofVoid(params));
default: // fall out
}
return Futures.immediateFuture(LibraryResult.ofError(LibraryResult.RESULT_ERROR_BAD_VALUE));
@ -354,7 +355,7 @@ public class MockMediaLibraryService extends MediaLibraryService {
return Futures.immediateFuture(new SessionResult(SessionResult.RESULT_ERROR_BAD_VALUE));
}
private void assertLibraryParams(LibraryParams params) {
private void assertLibraryParams(@Nullable LibraryParams params) {
synchronized (MockMediaLibraryService.class) {
if (assertLibraryParams) {
assertLibraryParamsEquals(expectedParams, params);