Commit 006a519a by bachinger Committed by Marc Baechinger

Migrate media constants from androidx.media.util.MediaConstants

Adds root extras and metadata extras to MockMediaLibraryService and MockMediaBrowserCompatService and completed test cases for asserting
interoperability with a media1 or Media3 browser.

PiperOrigin-RevId: 480854842
parent 7e8f0f09
......@@ -40,7 +40,7 @@ project.ext {
androidxConstraintLayoutVersion = '2.0.4'
androidxCoreVersion = '1.7.0'
androidxFuturesVersion = '1.1.0'
androidxMediaVersion = '1.4.3'
androidxMediaVersion = '1.6.0'
androidxMedia2Version = '1.2.0'
androidxMultidexVersion = '2.0.1'
androidxRecyclerViewVersion = '1.2.1'
......
......@@ -26,6 +26,8 @@ public class MediaBrowserConstants {
public static final String ROOT_ID = "rootId";
public static final Bundle ROOT_EXTRAS = new Bundle();
public static final String ROOT_EXTRAS_KEY = "root_extras_key";
public static final int ROOT_EXTRAS_VALUE = 4321;
public static final String MEDIA_ID_GET_BROWSABLE_ITEM = "media_id_get_browsable_item";
public static final String MEDIA_ID_GET_PLAYABLE_ITEM = "media_id_get_playable_item";
......@@ -71,7 +73,7 @@ public class MediaBrowserConstants {
public static final String CUSTOM_ACTION_ASSERT_PARAMS = "assertParams";
static {
ROOT_EXTRAS.putString(ROOT_ID, ROOT_ID);
ROOT_EXTRAS.putInt(ROOT_EXTRAS_KEY, ROOT_EXTRAS_VALUE);
CUSTOM_ACTION_EXTRAS.putString(CUSTOM_ACTION, CUSTOM_ACTION);
......
......@@ -24,6 +24,8 @@ public class MediaBrowserServiceCompatConstants {
public static final String TEST_CONNECT_REJECTED = "testConnect_rejected";
public static final String TEST_ON_CHILDREN_CHANGED_SUBSCRIBE_AND_UNSUBSCRIBE =
"testOnChildrenChanged_subscribeAndUnsubscribe";
public static final String TEST_GET_LIBRARY_ROOT = "getLibraryRoot_correctExtraKeyAndValue";
public static final String TEST_GET_CHILDREN = "getChildren_correctMetadataExtras";
private MediaBrowserServiceCompatConstants() {}
}
......@@ -15,6 +15,8 @@
*/
package androidx.media3.session;
import static androidx.media3.session.MediaConstants.EXTRAS_KEY_COMPLETION_STATUS;
import static androidx.media3.session.MediaConstants.EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED;
import static androidx.media3.test.session.common.CommonConstants.METADATA_ARTWORK_URI;
import static androidx.media3.test.session.common.CommonConstants.METADATA_DESCRIPTION;
import static androidx.media3.test.session.common.CommonConstants.METADATA_EXTRA_KEY;
......@@ -38,6 +40,8 @@ import static androidx.media3.test.session.common.MediaBrowserConstants.PARENT_I
import static androidx.media3.test.session.common.MediaBrowserConstants.PARENT_ID_LONG_LIST;
import static androidx.media3.test.session.common.MediaBrowserConstants.PARENT_ID_NO_CHILDREN;
import static androidx.media3.test.session.common.MediaBrowserConstants.ROOT_EXTRAS;
import static androidx.media3.test.session.common.MediaBrowserConstants.ROOT_EXTRAS_KEY;
import static androidx.media3.test.session.common.MediaBrowserConstants.ROOT_EXTRAS_VALUE;
import static androidx.media3.test.session.common.MediaBrowserConstants.ROOT_ID;
import static androidx.media3.test.session.common.MediaBrowserConstants.SEARCH_QUERY;
import static androidx.media3.test.session.common.MediaBrowserConstants.SEARCH_QUERY_EMPTY_RESULT;
......@@ -67,6 +71,7 @@ import androidx.media3.test.session.common.TestUtils;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.ext.truth.os.BundleSubject;
import androidx.test.filters.LargeTest;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.atomic.AtomicReference;
......@@ -96,6 +101,11 @@ public class MediaBrowserCompatWithMediaLibraryServiceTest
});
connectAndWait();
assertThat(browserCompat.getRoot()).isEqualTo(ROOT_ID);
assertThat(
browserCompat
.getExtras()
.getInt(ROOT_EXTRAS_KEY, /* defaultValue= */ ROOT_EXTRAS_VALUE + 1))
.isEqualTo(ROOT_EXTRAS_VALUE);
// Note: Cannot use equals() here because browser compat's extra contains server version,
// extra binder, and extra messenger.
......@@ -202,22 +212,18 @@ public class MediaBrowserCompatWithMediaLibraryServiceTest
@Test
public void getChildren() throws InterruptedException {
String testParentId = PARENT_ID;
connectAndWait();
CountDownLatch latch = new CountDownLatch(1);
List<MediaItem> receivedChildren = new ArrayList<>();
final String[] receivedParentId = new String[1];
browserCompat.subscribe(
testParentId,
new SubscriptionCallback() {
@Override
public void onChildrenLoaded(String parentId, List<MediaItem> children) {
assertThat(parentId).isEqualTo(testParentId);
assertThat(children).isNotNull();
assertThat(children.size()).isEqualTo(GET_CHILDREN_RESULT.size());
// Compare the given results with originals.
for (int i = 0; i < children.size(); i++) {
assertThat(children.get(i).getMediaId()).isEqualTo(GET_CHILDREN_RESULT.get(i));
}
receivedParentId[0] = parentId;
receivedChildren.addAll(children);
latch.countDown();
}
......@@ -226,7 +232,23 @@ public class MediaBrowserCompatWithMediaLibraryServiceTest
assertWithMessage("").fail();
}
});
assertThat(latch.await(TIMEOUT_MS, MILLISECONDS)).isTrue();
assertThat(receivedParentId[0]).isEqualTo(testParentId);
assertThat(receivedChildren).hasSize(GET_CHILDREN_RESULT.size());
// Compare the given results with originals.
for (int i = 0; i < receivedChildren.size(); i++) {
MediaItem mediaItem = receivedChildren.get(i);
assertThat(mediaItem.getMediaId()).isEqualTo(GET_CHILDREN_RESULT.get(i));
assertThat(
mediaItem
.getDescription()
.getExtras()
.getInt(
EXTRAS_KEY_COMPLETION_STATUS,
/* defaultValue= */ EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED + 1))
.isEqualTo(EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED);
}
}
@Test
......
......@@ -17,12 +17,17 @@ package androidx.media3.session;
import static androidx.media3.session.LibraryResult.RESULT_ERROR_BAD_VALUE;
import static androidx.media3.session.LibraryResult.RESULT_SUCCESS;
import static androidx.media3.session.MediaConstants.EXTRAS_KEY_COMPLETION_STATUS;
import static androidx.media3.session.MediaConstants.EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED;
import static androidx.media3.test.session.common.CommonConstants.MOCK_MEDIA3_LIBRARY_SERVICE;
import static androidx.media3.test.session.common.MediaBrowserConstants.CUSTOM_ACTION_ASSERT_PARAMS;
import static androidx.media3.test.session.common.MediaBrowserConstants.LONG_LIST_COUNT;
import static androidx.media3.test.session.common.MediaBrowserConstants.NOTIFY_CHILDREN_CHANGED_EXTRAS;
import static androidx.media3.test.session.common.MediaBrowserConstants.NOTIFY_CHILDREN_CHANGED_ITEM_COUNT;
import static androidx.media3.test.session.common.MediaBrowserConstants.PARENT_ID;
import static androidx.media3.test.session.common.MediaBrowserConstants.ROOT_EXTRAS;
import static androidx.media3.test.session.common.MediaBrowserConstants.ROOT_EXTRAS_KEY;
import static androidx.media3.test.session.common.MediaBrowserConstants.ROOT_EXTRAS_VALUE;
import static androidx.media3.test.session.common.MediaBrowserConstants.ROOT_ID;
import static androidx.media3.test.session.common.MediaBrowserConstants.SUBSCRIBE_ID_NOTIFY_CHILDREN_CHANGED_TO_ALL;
import static androidx.media3.test.session.common.MediaBrowserConstants.SUBSCRIBE_ID_NOTIFY_CHILDREN_CHANGED_TO_ALL_WITH_NON_SUBSCRIBED_ID;
......@@ -99,6 +104,45 @@ public class MediaBrowserListenerTest extends MediaControllerListenerTest {
}
@Test
public void getLibraryRoot_correctExtraKeyAndValue() throws Exception {
MediaBrowser browser = createBrowser();
LibraryResult<MediaItem> resultForLibraryRoot =
threadTestRule
.getHandler()
.postAndSync(() -> browser.getLibraryRoot(new LibraryParams.Builder().build()))
.get(TIMEOUT_MS, MILLISECONDS);
Bundle extras = resultForLibraryRoot.params.extras;
assertThat(extras.getInt(ROOT_EXTRAS_KEY, /* defaultValue= */ ROOT_EXTRAS_VALUE + 1))
.isEqualTo(ROOT_EXTRAS_VALUE);
}
@Test
public void getChildren_correctMetadataExtras() throws Exception {
LibraryParams params = MediaTestUtils.createLibraryParams();
MediaBrowser browser = createBrowser();
LibraryResult<ImmutableList<MediaItem>> libraryResult =
threadTestRule
.getHandler()
.postAndSync(
() -> browser.getChildren(PARENT_ID, /* page= */ 4, /* pageSize= */ 10, params))
.get(TIMEOUT_MS, MILLISECONDS);
assertThat(libraryResult.resultCode).isEqualTo(RESULT_SUCCESS);
assertThat(libraryResult.value).isNotEmpty();
for (MediaItem mediaItem : libraryResult.value) {
int status =
mediaItem.mediaMetadata.extras.getInt(
EXTRAS_KEY_COMPLETION_STATUS,
/* defaultValue= */ EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED + 1);
assertThat(status).isEqualTo(EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED);
}
}
@Test
public void getItem_browsable() throws Exception {
String mediaId = MediaBrowserConstants.MEDIA_ID_GET_BROWSABLE_ITEM;
......@@ -144,14 +188,15 @@ public class MediaBrowserListenerTest extends MediaControllerListenerTest {
}
@Test
public void getChildren() throws Exception {
String parentId = MediaBrowserConstants.PARENT_ID;
public void getChildren_correctLibraryResultWithExtras() throws Exception {
String parentId = PARENT_ID;
int page = 4;
int pageSize = 10;
LibraryParams params = MediaTestUtils.createLibraryParams();
MediaBrowser browser = createBrowser();
setExpectedLibraryParam(browser, params);
LibraryResult<ImmutableList<MediaItem>> result =
threadTestRule
.getHandler()
......@@ -159,7 +204,6 @@ public class MediaBrowserListenerTest extends MediaControllerListenerTest {
.get(TIMEOUT_MS, MILLISECONDS);
assertThat(result.resultCode).isEqualTo(RESULT_SUCCESS);
MediaTestUtils.assertLibraryParamsEquals(params, result.params);
MediaTestUtils.assertPaginatedListHasIds(
result.value, MediaBrowserConstants.GET_CHILDREN_RESULT, page, pageSize);
}
......
......@@ -16,8 +16,15 @@
package androidx.media3.session;
import static androidx.media3.session.LibraryResult.RESULT_SUCCESS;
import static androidx.media3.session.MediaConstants.EXTRAS_KEY_COMPLETION_STATUS;
import static androidx.media3.session.MediaConstants.EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED;
import static androidx.media3.test.session.common.CommonConstants.MOCK_MEDIA_BROWSER_SERVICE_COMPAT;
import static androidx.media3.test.session.common.MediaBrowserConstants.PARENT_ID;
import static androidx.media3.test.session.common.MediaBrowserConstants.ROOT_EXTRAS_KEY;
import static androidx.media3.test.session.common.MediaBrowserConstants.ROOT_EXTRAS_VALUE;
import static androidx.media3.test.session.common.MediaBrowserServiceCompatConstants.TEST_CONNECT_REJECTED;
import static androidx.media3.test.session.common.MediaBrowserServiceCompatConstants.TEST_GET_CHILDREN;
import static androidx.media3.test.session.common.MediaBrowserServiceCompatConstants.TEST_GET_LIBRARY_ROOT;
import static androidx.media3.test.session.common.MediaBrowserServiceCompatConstants.TEST_ON_CHILDREN_CHANGED_SUBSCRIBE_AND_UNSUBSCRIBE;
import static androidx.media3.test.session.common.TestUtils.TIMEOUT_MS;
import static com.google.common.truth.Truth.assertThat;
......@@ -25,13 +32,16 @@ import static java.util.concurrent.TimeUnit.MILLISECONDS;
import static org.junit.Assert.assertThrows;
import android.content.Context;
import android.os.Bundle;
import androidx.annotation.Nullable;
import androidx.media.MediaBrowserServiceCompat;
import androidx.media3.common.MediaItem;
import androidx.media3.session.MediaLibraryService.LibraryParams;
import androidx.media3.test.session.common.HandlerThreadTestRule;
import androidx.test.core.app.ApplicationProvider;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.LargeTest;
import com.google.common.collect.ImmutableList;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutionException;
import org.junit.After;
......@@ -137,4 +147,56 @@ public class MediaBrowserListenerWithMediaBrowserServiceCompatTest {
// Wait for some time. Exception will be thrown in the listener if error happens.
Thread.sleep(TIMEOUT_MS);
}
@Test
public void getLibraryRoot_correctExtraKeyAndValue() throws Exception {
remoteService.setProxyForTest(TEST_GET_LIBRARY_ROOT);
MediaBrowser browser = createBrowser(/* listener= */ null);
LibraryResult<MediaItem> resultForLibraryRoot =
threadTestRule
.getHandler()
.postAndSync(() -> browser.getLibraryRoot(new LibraryParams.Builder().build()))
.get(TIMEOUT_MS, MILLISECONDS);
Bundle extras = resultForLibraryRoot.params.extras;
assertThat(extras.getInt(ROOT_EXTRAS_KEY, ROOT_EXTRAS_VALUE + 1)).isEqualTo(ROOT_EXTRAS_VALUE);
}
@Test
public void getChildren_correctMetadataExtras() throws Exception {
LibraryParams params = MediaTestUtils.createLibraryParams();
remoteService.setProxyForTest(TEST_GET_CHILDREN);
MediaBrowser browser = createBrowser(/* listener= */ null);
LibraryResult<ImmutableList<MediaItem>> libraryResult =
threadTestRule
.getHandler()
.postAndSync(
() -> browser.getChildren(PARENT_ID, /* page= */ 4, /* pageSize= */ 10, params))
.get(TIMEOUT_MS, MILLISECONDS);
assertThat(libraryResult.resultCode).isEqualTo(RESULT_SUCCESS);
assertThat(libraryResult.value).hasSize(MockMediaBrowserServiceCompat.MEDIA_ITEMS.size());
for (int i = 0; i < libraryResult.value.size(); i++) {
int status =
libraryResult
.value
.get(i)
.mediaMetadata
.extras
.getInt(
EXTRAS_KEY_COMPLETION_STATUS,
/* defaultValue= */ EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED + 1);
int expectedStatus =
MockMediaBrowserServiceCompat.MEDIA_ITEMS
.get(i)
.getDescription()
.getExtras()
.getInt(
EXTRAS_KEY_COMPLETION_STATUS,
/* defaultValue= */ EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED + 1);
assertThat(status).isEqualTo(expectedStatus);
}
}
}
......@@ -15,21 +15,33 @@
*/
package androidx.media3.session;
import static androidx.media3.session.MediaConstants.EXTRAS_KEY_COMPLETION_STATUS;
import static androidx.media3.session.MediaConstants.EXTRAS_VALUE_COMPLETION_STATUS_FULLY_PLAYED;
import static androidx.media3.session.MediaConstants.EXTRAS_VALUE_COMPLETION_STATUS_NOT_PLAYED;
import static androidx.media3.session.MediaConstants.EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED;
import static androidx.media3.test.session.common.CommonConstants.SUPPORT_APP_PACKAGE_NAME;
import static androidx.media3.test.session.common.MediaBrowserConstants.ROOT_EXTRAS;
import static androidx.media3.test.session.common.MediaBrowserConstants.ROOT_ID;
import static androidx.media3.test.session.common.MediaBrowserServiceCompatConstants.TEST_CONNECT_REJECTED;
import static androidx.media3.test.session.common.MediaBrowserServiceCompatConstants.TEST_GET_CHILDREN;
import static androidx.media3.test.session.common.MediaBrowserServiceCompatConstants.TEST_GET_LIBRARY_ROOT;
import static androidx.media3.test.session.common.MediaBrowserServiceCompatConstants.TEST_ON_CHILDREN_CHANGED_SUBSCRIBE_AND_UNSUBSCRIBE;
import android.content.Intent;
import android.os.Bundle;
import android.os.IBinder;
import android.os.RemoteException;
import android.support.v4.media.MediaBrowserCompat;
import android.support.v4.media.MediaBrowserCompat.MediaItem;
import android.support.v4.media.MediaDescriptionCompat;
import android.support.v4.media.session.MediaSessionCompat;
import android.support.v4.media.session.MediaSessionCompat.Callback;
import androidx.annotation.GuardedBy;
import androidx.media.MediaBrowserServiceCompat;
import androidx.media3.common.util.UnstableApi;
import androidx.media3.test.session.common.IRemoteMediaBrowserServiceCompat;
import androidx.media3.test.session.common.MediaBrowserServiceCompatConstants;
import com.google.common.collect.ImmutableList;
import java.lang.reflect.Method;
import java.util.Collections;
import java.util.List;
......@@ -38,6 +50,12 @@ import java.util.List;
@UnstableApi
public class MockMediaBrowserServiceCompat extends MediaBrowserServiceCompat {
/**
* Immutable list of media items sent to controllers for {@link
* MediaBrowserServiceCompatConstants#TEST_GET_CHILDREN}.
*/
public static final ImmutableList<MediaItem> MEDIA_ITEMS = createMediaItems();
private static final String TAG = "MockMBSCompat";
private static final Object lock = new Object();
......@@ -226,6 +244,12 @@ public class MockMediaBrowserServiceCompat extends MediaBrowserServiceCompat {
case TEST_ON_CHILDREN_CHANGED_SUBSCRIBE_AND_UNSUBSCRIBE:
setProxyForTestOnChildrenChanged_subscribeAndUnsubscribe();
break;
case TEST_GET_LIBRARY_ROOT:
setProxyForTestGetLibraryRoot_correctExtraKeyAndValue();
break;
case TEST_GET_CHILDREN:
setProxyForTestGetChildren_correctMetadataExtras();
break;
default:
throw new IllegalArgumentException("Unknown testName: " + testName);
}
......@@ -257,5 +281,54 @@ public class MockMediaBrowserServiceCompat extends MediaBrowserServiceCompat {
}
});
}
private void setProxyForTestGetChildren_correctMetadataExtras() {
setMediaBrowserServiceProxy(
new MockMediaBrowserServiceCompat.Proxy() {
@Override
public void onLoadChildren(String parentId, Result<List<MediaItem>> result) {
onLoadChildren(parentId, result, new Bundle());
}
@Override
public void onLoadChildren(
String parentId, Result<List<MediaItem>> result, Bundle bundle) {
result.sendResult(MEDIA_ITEMS);
}
});
}
private void setProxyForTestGetLibraryRoot_correctExtraKeyAndValue() {
setMediaBrowserServiceProxy(
new MockMediaBrowserServiceCompat.Proxy() {
@Override
public BrowserRoot onGetRoot(
String clientPackageName, int clientUid, Bundle rootHints) {
return new BrowserRoot(ROOT_ID, ROOT_EXTRAS);
}
});
}
}
private static ImmutableList<MediaItem> createMediaItems() {
int[] completionStates =
new int[] {
EXTRAS_VALUE_COMPLETION_STATUS_NOT_PLAYED,
EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED,
EXTRAS_VALUE_COMPLETION_STATUS_FULLY_PLAYED
};
ImmutableList.Builder<MediaItem> builder = new ImmutableList.Builder<>();
for (int i = 0; i < 3; i++) {
Bundle extras = new Bundle();
extras.putInt(EXTRAS_KEY_COMPLETION_STATUS, completionStates[i]);
builder.add(
new MediaBrowserCompat.MediaItem(
new MediaDescriptionCompat.Builder()
.setMediaId("media-id-" + i)
.setExtras(extras)
.build(),
/* flags= */ 0));
}
return builder.build();
}
}
......@@ -16,8 +16,10 @@
package androidx.media3.session;
import static androidx.media3.common.util.Assertions.checkNotNull;
import static androidx.media3.session.MediaConstants.EXTRAS_KEY_COMPLETION_STATUS;
import static androidx.media3.session.MediaConstants.EXTRAS_KEY_ERROR_RESOLUTION_ACTION_INTENT_COMPAT;
import static androidx.media3.session.MediaConstants.EXTRAS_KEY_ERROR_RESOLUTION_ACTION_LABEL_COMPAT;
import static androidx.media3.session.MediaConstants.EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED;
import static androidx.media3.session.MediaTestUtils.assertLibraryParamsEquals;
import static androidx.media3.test.session.common.CommonConstants.SUPPORT_APP_PACKAGE_NAME;
import static androidx.media3.test.session.common.MediaBrowserConstants.CUSTOM_ACTION;
......@@ -63,7 +65,6 @@ import androidx.media3.common.MediaMetadata;
import androidx.media3.common.util.Log;
import androidx.media3.common.util.UnstableApi;
import androidx.media3.common.util.Util;
import androidx.media3.session.MediaLibraryService.MediaLibrarySession;
import androidx.media3.session.MediaSession.ControllerInfo;
import androidx.media3.test.session.common.CommonConstants;
import androidx.media3.test.session.common.TestHandler;
......@@ -425,10 +426,13 @@ public class MockMediaLibraryService extends MediaLibraryService {
}
private static MediaItem createPlayableMediaItem(String mediaId) {
Bundle extras = new Bundle();
extras.putInt(EXTRAS_KEY_COMPLETION_STATUS, EXTRAS_VALUE_COMPLETION_STATUS_PARTIALLY_PLAYED);
MediaMetadata mediaMetadata =
new MediaMetadata.Builder()
.setFolderType(MediaMetadata.FOLDER_TYPE_NONE)
.setIsPlayable(true)
.setExtras(extras)
.build();
return new MediaItem.Builder().setMediaId(mediaId).setMediaMetadata(mediaMetadata).build();
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment