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, browser: MediaSession.ControllerInfo,
params: LibraryParams? params: LibraryParams?
): ListenableFuture<LibraryResult<MediaItem>> { ): ListenableFuture<LibraryResult<MediaItem>> {
return Futures.immediateFuture( return Futures.immediateFuture(LibraryResult.ofItem(MediaItemTree.getRootItem(), params))
LibraryResult.ofItem(MediaItemTree.getRootItem(), /* params= */ null)
)
} }
override fun onGetItem( override fun onGetItem(

View File

@ -153,7 +153,7 @@ public final class LibraryResult<V> implements Bundleable {
/** The optional parameters. */ /** The optional parameters. */
@Nullable public final MediaLibraryService.LibraryParams params; @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() { public static LibraryResult<Void> ofVoid() {
return new LibraryResult<>( return new LibraryResult<>(
RESULT_SUCCESS, RESULT_SUCCESS,
@ -163,6 +163,15 @@ public final class LibraryResult<V> implements Bundleable {
VALUE_TYPE_VOID); 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}. * 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)) .postAndSync(() -> browser.getChildren(parentId, page, pageSize, params))
.get(TIMEOUT_MS, MILLISECONDS); .get(TIMEOUT_MS, MILLISECONDS);
assertThat(result.resultCode).isEqualTo(RESULT_SUCCESS); assertThat(result.resultCode).isEqualTo(RESULT_SUCCESS);
assertThat(result.params).isNull(); MediaTestUtils.assertLibraryParamsEquals(params, result.params);
MediaTestUtils.assertPaginatedListHasIds( MediaTestUtils.assertPaginatedListHasIds(
result.value, MediaBrowserConstants.GET_CHILDREN_RESULT, page, pageSize); result.value, MediaBrowserConstants.GET_CHILDREN_RESULT, page, pageSize);
@ -205,7 +205,7 @@ public class MediaBrowserListenerTest extends MediaControllerListenerTest {
.postAndSync(() -> browser.getChildren(parentId, page, pageSize, params)) .postAndSync(() -> browser.getChildren(parentId, page, pageSize, params))
.get(LONG_TIMEOUT_MS, MILLISECONDS); .get(LONG_TIMEOUT_MS, MILLISECONDS);
assertThat(result.resultCode).isEqualTo(RESULT_SUCCESS); assertThat(result.resultCode).isEqualTo(RESULT_SUCCESS);
assertThat(result.params).isNull(); MediaTestUtils.assertLibraryParamsEquals(params, result.params);
assertThat(result.value).hasSize(LONG_LIST_COUNT); assertThat(result.value).hasSize(LONG_LIST_COUNT);
for (int i = 0; i < result.value.size(); i++) { 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 static java.util.concurrent.TimeUnit.MILLISECONDS;
import android.content.Context; import android.content.Context;
import androidx.annotation.Nullable;
import androidx.media3.session.MediaLibraryService.LibraryParams; import androidx.media3.session.MediaLibraryService.LibraryParams;
import androidx.media3.session.MediaLibraryService.MediaLibrarySession; import androidx.media3.session.MediaLibraryService.MediaLibrarySession;
import androidx.media3.session.MediaSession.ControllerInfo; import androidx.media3.session.MediaSession.ControllerInfo;
@ -82,11 +83,11 @@ public class MediaLibrarySessionCallbackTest {
MediaLibrarySession session, MediaLibrarySession session,
ControllerInfo browser, ControllerInfo browser,
String parentId, String parentId,
LibraryParams params) { @Nullable LibraryParams params) {
assertThat(parentId).isEqualTo(testParentId); assertThat(parentId).isEqualTo(testParentId);
MediaTestUtils.assertLibraryParamsEquals(testParams, params); MediaTestUtils.assertLibraryParamsEquals(testParams, params);
latch.countDown(); 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.Bundle;
import android.os.HandlerThread; import android.os.HandlerThread;
import androidx.annotation.GuardedBy; import androidx.annotation.GuardedBy;
import androidx.annotation.Nullable;
import androidx.media3.common.MediaItem; import androidx.media3.common.MediaItem;
import androidx.media3.common.MediaMetadata; import androidx.media3.common.MediaMetadata;
import androidx.media3.common.util.BundleableUtil; import androidx.media3.common.util.BundleableUtil;
@ -183,7 +184,7 @@ public class MockMediaLibraryService extends MediaLibraryService {
@Override @Override
public ListenableFuture<LibraryResult<MediaItem>> onGetLibraryRoot( public ListenableFuture<LibraryResult<MediaItem>> onGetLibraryRoot(
MediaLibrarySession session, ControllerInfo browser, LibraryParams params) { MediaLibrarySession session, ControllerInfo browser, @Nullable LibraryParams params) {
assertLibraryParams(params); assertLibraryParams(params);
return Futures.immediateFuture(LibraryResult.ofItem(ROOT_ITEM, ROOT_PARAMS)); return Futures.immediateFuture(LibraryResult.ofItem(ROOT_ITEM, ROOT_PARAMS));
} }
@ -218,30 +219,32 @@ public class MockMediaLibraryService extends MediaLibraryService {
String parentId, String parentId,
int page, int page,
int pageSize, int pageSize,
LibraryParams params) { @Nullable LibraryParams params) {
assertLibraryParams(params); assertLibraryParams(params);
if (PARENT_ID.equals(parentId)) { if (PARENT_ID.equals(parentId)) {
return Futures.immediateFuture( return Futures.immediateFuture(
LibraryResult.ofItemList( 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)) { } else if (PARENT_ID_LONG_LIST.equals(parentId)) {
List<MediaItem> list = new ArrayList<>(LONG_LIST_COUNT); List<MediaItem> list = new ArrayList<>(LONG_LIST_COUNT);
for (int i = 0; i < LONG_LIST_COUNT; i++) { for (int i = 0; i < LONG_LIST_COUNT; i++) {
list.add(createPlayableMediaItem(TestUtils.getMediaIdInFakeTimeline(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)) { } else if (PARENT_ID_ERROR.equals(parentId)) {
return Futures.immediateFuture(LibraryResult.ofError(LibraryResult.RESULT_ERROR_BAD_VALUE)); return Futures.immediateFuture(LibraryResult.ofError(LibraryResult.RESULT_ERROR_BAD_VALUE));
} }
// Includes the case of PARENT_ID_NO_CHILDREN. // Includes the case of PARENT_ID_NO_CHILDREN.
return Futures.immediateFuture( return Futures.immediateFuture(LibraryResult.ofItemList(ImmutableList.of(), params));
LibraryResult.ofItemList(ImmutableList.of(), /* params= */ null));
} }
@Override @Override
@SuppressWarnings("FutureReturnValueIgnored") @SuppressWarnings("FutureReturnValueIgnored")
public ListenableFuture<LibraryResult<Void>> onSearch( public ListenableFuture<LibraryResult<Void>> onSearch(
MediaLibrarySession session, ControllerInfo browser, String query, LibraryParams params) { MediaLibrarySession session,
ControllerInfo browser,
String query,
@Nullable LibraryParams params) {
assertLibraryParams(params); assertLibraryParams(params);
if (SEARCH_QUERY.equals(query)) { if (SEARCH_QUERY.equals(query)) {
MockMediaLibraryService.this.session.notifySearchResultChanged( 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. // SEARCH_QUERY_EMPTY_RESULT and SEARCH_QUERY_ERROR will be handled here.
MockMediaLibraryService.this.session.notifySearchResultChanged(browser, query, 0, params); MockMediaLibraryService.this.session.notifySearchResultChanged(browser, query, 0, params);
} }
return Futures.immediateFuture(LibraryResult.ofVoid()); return Futures.immediateFuture(LibraryResult.ofVoid(params));
} }
@Override @Override
@ -276,21 +279,19 @@ public class MockMediaLibraryService extends MediaLibraryService {
String query, String query,
int page, int page,
int pageSize, int pageSize,
LibraryParams params) { @Nullable LibraryParams params) {
assertLibraryParams(params); assertLibraryParams(params);
if (SEARCH_QUERY.equals(query)) { if (SEARCH_QUERY.equals(query)) {
return Futures.immediateFuture( return Futures.immediateFuture(
LibraryResult.ofItemList( LibraryResult.ofItemList(getPaginatedResult(SEARCH_RESULT, page, pageSize), params));
getPaginatedResult(SEARCH_RESULT, page, pageSize), /* params= */ null));
} else if (SEARCH_QUERY_LONG_LIST.equals(query)) { } else if (SEARCH_QUERY_LONG_LIST.equals(query)) {
List<MediaItem> list = new ArrayList<>(LONG_LIST_COUNT); List<MediaItem> list = new ArrayList<>(LONG_LIST_COUNT);
for (int i = 0; i < LONG_LIST_COUNT; i++) { for (int i = 0; i < LONG_LIST_COUNT; i++) {
list.add(createPlayableMediaItem(TestUtils.getMediaIdInFakeTimeline(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)) { } else if (SEARCH_QUERY_EMPTY_RESULT.equals(query)) {
return Futures.immediateFuture( return Futures.immediateFuture(LibraryResult.ofItemList(ImmutableList.of(), params));
LibraryResult.ofItemList(ImmutableList.of(), /* params= */ null));
} else { } else {
// SEARCH_QUERY_ERROR will be handled here. // SEARCH_QUERY_ERROR will be handled here.
return Futures.immediateFuture(LibraryResult.ofError(LibraryResult.RESULT_ERROR_BAD_VALUE)); 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: case SUBSCRIBE_ID_NOTIFY_CHILDREN_CHANGED_TO_ALL:
MockMediaLibraryService.this.session.notifyChildrenChanged( MockMediaLibraryService.this.session.notifyChildrenChanged(
parentId, NOTIFY_CHILDREN_CHANGED_ITEM_COUNT, NOTIFY_CHILDREN_CHANGED_PARAMS); 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: case SUBSCRIBE_ID_NOTIFY_CHILDREN_CHANGED_TO_ONE:
MockMediaLibraryService.this.session.notifyChildrenChanged( MockMediaLibraryService.this.session.notifyChildrenChanged(
MediaTestUtils.getTestControllerInfo(MockMediaLibraryService.this.session), MediaTestUtils.getTestControllerInfo(MockMediaLibraryService.this.session),
parentId, parentId,
NOTIFY_CHILDREN_CHANGED_ITEM_COUNT, NOTIFY_CHILDREN_CHANGED_ITEM_COUNT,
NOTIFY_CHILDREN_CHANGED_PARAMS); 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: case SUBSCRIBE_ID_NOTIFY_CHILDREN_CHANGED_TO_ALL_WITH_NON_SUBSCRIBED_ID:
MockMediaLibraryService.this.session.notifyChildrenChanged( MockMediaLibraryService.this.session.notifyChildrenChanged(
unsubscribedId, NOTIFY_CHILDREN_CHANGED_ITEM_COUNT, NOTIFY_CHILDREN_CHANGED_PARAMS); 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: case SUBSCRIBE_ID_NOTIFY_CHILDREN_CHANGED_TO_ONE_WITH_NON_SUBSCRIBED_ID:
MockMediaLibraryService.this.session.notifyChildrenChanged( MockMediaLibraryService.this.session.notifyChildrenChanged(
MediaTestUtils.getTestControllerInfo(MockMediaLibraryService.this.session), MediaTestUtils.getTestControllerInfo(MockMediaLibraryService.this.session),
unsubscribedId, unsubscribedId,
NOTIFY_CHILDREN_CHANGED_ITEM_COUNT, NOTIFY_CHILDREN_CHANGED_ITEM_COUNT,
NOTIFY_CHILDREN_CHANGED_PARAMS); NOTIFY_CHILDREN_CHANGED_PARAMS);
return Futures.immediateFuture(LibraryResult.ofVoid()); return Futures.immediateFuture(LibraryResult.ofVoid(params));
default: // fall out default: // fall out
} }
return Futures.immediateFuture(LibraryResult.ofError(LibraryResult.RESULT_ERROR_BAD_VALUE)); 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)); return Futures.immediateFuture(new SessionResult(SessionResult.RESULT_ERROR_BAD_VALUE));
} }
private void assertLibraryParams(LibraryParams params) { private void assertLibraryParams(@Nullable LibraryParams params) {
synchronized (MockMediaLibraryService.class) { synchronized (MockMediaLibraryService.class) {
if (assertLibraryParams) { if (assertLibraryParams) {
assertLibraryParamsEquals(expectedParams, params); assertLibraryParamsEquals(expectedParams, params);