Merge "MediaBrowser: Revert Search API" into oc-dev
This commit is contained in:
@@ -24011,7 +24011,6 @@ package android.media.browse {
|
||||
method public android.content.ComponentName getServiceComponent();
|
||||
method public android.media.session.MediaSession.Token getSessionToken();
|
||||
method public boolean isConnected();
|
||||
method public void search(java.lang.String, android.os.Bundle, android.media.browse.MediaBrowser.SearchCallback);
|
||||
method public void subscribe(java.lang.String, android.media.browse.MediaBrowser.SubscriptionCallback);
|
||||
method public void subscribe(java.lang.String, android.os.Bundle, android.media.browse.MediaBrowser.SubscriptionCallback);
|
||||
method public void unsubscribe(java.lang.String);
|
||||
@@ -24047,12 +24046,6 @@ package android.media.browse {
|
||||
field public static final int FLAG_PLAYABLE = 2; // 0x2
|
||||
}
|
||||
|
||||
public static abstract class MediaBrowser.SearchCallback {
|
||||
ctor public MediaBrowser.SearchCallback();
|
||||
method public void onError(java.lang.String, android.os.Bundle);
|
||||
method public void onSearchResult(java.lang.String, android.os.Bundle, java.util.List<android.media.browse.MediaBrowser.MediaItem>);
|
||||
}
|
||||
|
||||
public static abstract class MediaBrowser.SubscriptionCallback {
|
||||
ctor public MediaBrowser.SubscriptionCallback();
|
||||
method public void onChildrenLoaded(java.lang.String, java.util.List<android.media.browse.MediaBrowser.MediaItem>);
|
||||
@@ -37360,7 +37353,6 @@ package android.service.media {
|
||||
method public abstract void onLoadChildren(java.lang.String, android.service.media.MediaBrowserService.Result<java.util.List<android.media.browse.MediaBrowser.MediaItem>>);
|
||||
method public void onLoadChildren(java.lang.String, android.service.media.MediaBrowserService.Result<java.util.List<android.media.browse.MediaBrowser.MediaItem>>, android.os.Bundle);
|
||||
method public void onLoadItem(java.lang.String, android.service.media.MediaBrowserService.Result<android.media.browse.MediaBrowser.MediaItem>);
|
||||
method public void onSearch(java.lang.String, android.os.Bundle, android.service.media.MediaBrowserService.Result<java.util.List<android.media.browse.MediaBrowser.MediaItem>>);
|
||||
method public void setSessionToken(android.media.session.MediaSession.Token);
|
||||
field public static final java.lang.String SERVICE_INTERFACE = "android.media.browse.MediaBrowserService";
|
||||
}
|
||||
|
||||
@@ -25933,7 +25933,6 @@ package android.media.browse {
|
||||
method public android.content.ComponentName getServiceComponent();
|
||||
method public android.media.session.MediaSession.Token getSessionToken();
|
||||
method public boolean isConnected();
|
||||
method public void search(java.lang.String, android.os.Bundle, android.media.browse.MediaBrowser.SearchCallback);
|
||||
method public void subscribe(java.lang.String, android.media.browse.MediaBrowser.SubscriptionCallback);
|
||||
method public void subscribe(java.lang.String, android.os.Bundle, android.media.browse.MediaBrowser.SubscriptionCallback);
|
||||
method public void unsubscribe(java.lang.String);
|
||||
@@ -25969,12 +25968,6 @@ package android.media.browse {
|
||||
field public static final int FLAG_PLAYABLE = 2; // 0x2
|
||||
}
|
||||
|
||||
public static abstract class MediaBrowser.SearchCallback {
|
||||
ctor public MediaBrowser.SearchCallback();
|
||||
method public void onError(java.lang.String, android.os.Bundle);
|
||||
method public void onSearchResult(java.lang.String, android.os.Bundle, java.util.List<android.media.browse.MediaBrowser.MediaItem>);
|
||||
}
|
||||
|
||||
public static abstract class MediaBrowser.SubscriptionCallback {
|
||||
ctor public MediaBrowser.SubscriptionCallback();
|
||||
method public void onChildrenLoaded(java.lang.String, java.util.List<android.media.browse.MediaBrowser.MediaItem>);
|
||||
@@ -40472,7 +40465,6 @@ package android.service.media {
|
||||
method public abstract void onLoadChildren(java.lang.String, android.service.media.MediaBrowserService.Result<java.util.List<android.media.browse.MediaBrowser.MediaItem>>);
|
||||
method public void onLoadChildren(java.lang.String, android.service.media.MediaBrowserService.Result<java.util.List<android.media.browse.MediaBrowser.MediaItem>>, android.os.Bundle);
|
||||
method public void onLoadItem(java.lang.String, android.service.media.MediaBrowserService.Result<android.media.browse.MediaBrowser.MediaItem>);
|
||||
method public void onSearch(java.lang.String, android.os.Bundle, android.service.media.MediaBrowserService.Result<java.util.List<android.media.browse.MediaBrowser.MediaItem>>);
|
||||
method public void setSessionToken(android.media.session.MediaSession.Token);
|
||||
field public static final java.lang.String SERVICE_INTERFACE = "android.media.browse.MediaBrowserService";
|
||||
}
|
||||
|
||||
@@ -24118,7 +24118,6 @@ package android.media.browse {
|
||||
method public android.content.ComponentName getServiceComponent();
|
||||
method public android.media.session.MediaSession.Token getSessionToken();
|
||||
method public boolean isConnected();
|
||||
method public void search(java.lang.String, android.os.Bundle, android.media.browse.MediaBrowser.SearchCallback);
|
||||
method public void subscribe(java.lang.String, android.media.browse.MediaBrowser.SubscriptionCallback);
|
||||
method public void subscribe(java.lang.String, android.os.Bundle, android.media.browse.MediaBrowser.SubscriptionCallback);
|
||||
method public void unsubscribe(java.lang.String);
|
||||
@@ -24154,12 +24153,6 @@ package android.media.browse {
|
||||
field public static final int FLAG_PLAYABLE = 2; // 0x2
|
||||
}
|
||||
|
||||
public static abstract class MediaBrowser.SearchCallback {
|
||||
ctor public MediaBrowser.SearchCallback();
|
||||
method public void onError(java.lang.String, android.os.Bundle);
|
||||
method public void onSearchResult(java.lang.String, android.os.Bundle, java.util.List<android.media.browse.MediaBrowser.MediaItem>);
|
||||
}
|
||||
|
||||
public static abstract class MediaBrowser.SubscriptionCallback {
|
||||
ctor public MediaBrowser.SubscriptionCallback();
|
||||
method public void onChildrenLoaded(java.lang.String, java.util.List<android.media.browse.MediaBrowser.MediaItem>);
|
||||
@@ -37513,7 +37506,6 @@ package android.service.media {
|
||||
method public abstract void onLoadChildren(java.lang.String, android.service.media.MediaBrowserService.Result<java.util.List<android.media.browse.MediaBrowser.MediaItem>>);
|
||||
method public void onLoadChildren(java.lang.String, android.service.media.MediaBrowserService.Result<java.util.List<android.media.browse.MediaBrowser.MediaItem>>, android.os.Bundle);
|
||||
method public void onLoadItem(java.lang.String, android.service.media.MediaBrowserService.Result<android.media.browse.MediaBrowser.MediaItem>);
|
||||
method public void onSearch(java.lang.String, android.os.Bundle, android.service.media.MediaBrowserService.Result<java.util.List<android.media.browse.MediaBrowser.MediaItem>>);
|
||||
method public void setSessionToken(android.media.session.MediaSession.Token);
|
||||
field public static final java.lang.String SERVICE_INTERFACE = "android.media.browse.MediaBrowserService";
|
||||
}
|
||||
|
||||
@@ -365,7 +365,7 @@ public final class MediaBrowser {
|
||||
* @param parentId The id of the parent media item whose list of children
|
||||
* will be subscribed.
|
||||
* @param options The bundle of service-specific arguments to send to the media
|
||||
* browse service. The contents of this bundle may affect the
|
||||
* browser service. The contents of this bundle may affect the
|
||||
* information returned when browsing.
|
||||
* @param callback The callback to receive the list of children.
|
||||
*/
|
||||
@@ -453,7 +453,7 @@ public final class MediaBrowser {
|
||||
try {
|
||||
mServiceBinder.getMediaItem(mediaId, receiver, mServiceCallbacks);
|
||||
} catch (RemoteException e) {
|
||||
Log.i(TAG, "Remote error getting media item.", e);
|
||||
Log.i(TAG, "Remote error getting media item.");
|
||||
mHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
@@ -463,62 +463,6 @@ public final class MediaBrowser {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Searches {@link MediaItem media items} from the connected service. Not
|
||||
* all services may support this, and {@link SearchCallback#onError} will be
|
||||
* called if not implemented.
|
||||
*
|
||||
* @param query The search query that contains keywords separated by space. Should not be
|
||||
* an empty string.
|
||||
* @param extras The bundle of service-specific arguments to send to the media browser
|
||||
* service. The contents of this bundle may affect the search result.
|
||||
* @param callback The callback to receive the search result.
|
||||
* @throws IllegalStateException if the browser is not connected to the media browser service.
|
||||
*/
|
||||
public void search(@NonNull final String query, final Bundle extras, SearchCallback callback) {
|
||||
if (TextUtils.isEmpty(query)) {
|
||||
throw new IllegalArgumentException("query cannot be empty.");
|
||||
}
|
||||
if (callback == null) {
|
||||
throw new IllegalArgumentException("callback cannot be null.");
|
||||
}
|
||||
if (mState != CONNECT_STATE_CONNECTED) {
|
||||
throw new IllegalStateException("search() called while not connected (state="
|
||||
+ getStateLabel(mState) + ")");
|
||||
}
|
||||
ResultReceiver receiver = new ResultReceiver(mHandler) {
|
||||
@Override
|
||||
protected void onReceiveResult(int resultCode, Bundle resultData) {
|
||||
if (resultCode != 0 || resultData == null
|
||||
|| !resultData.containsKey(MediaBrowserService.KEY_SEARCH_RESULTS)) {
|
||||
callback.onError(query, extras);
|
||||
return;
|
||||
}
|
||||
Parcelable[] items = resultData.getParcelableArray(
|
||||
MediaBrowserService.KEY_SEARCH_RESULTS);
|
||||
List<MediaItem> results = null;
|
||||
if (items != null) {
|
||||
results = new ArrayList<>();
|
||||
for (Parcelable item : items) {
|
||||
results.add((MediaItem) item);
|
||||
}
|
||||
}
|
||||
callback.onSearchResult(query, extras, results);
|
||||
}
|
||||
};
|
||||
try {
|
||||
mServiceBinder.search(query, extras, receiver, mServiceCallbacks);
|
||||
} catch (RemoteException e) {
|
||||
Log.i(TAG, "Remote error getting media item.", e);
|
||||
mHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
callback.onError(query, extras);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
private void subscribeInternal(String parentId, Bundle options, SubscriptionCallback callback) {
|
||||
// Check arguments.
|
||||
if (TextUtils.isEmpty(parentId)) {
|
||||
@@ -945,7 +889,7 @@ public final class MediaBrowser {
|
||||
* @param parentId The media id of the parent media item.
|
||||
* @param children The children which were loaded.
|
||||
* @param options The bundle of service-specific arguments sent to the media
|
||||
* browse service. The contents of this bundle may affect the
|
||||
* browser service. The contents of this bundle may affect the
|
||||
* information returned when browsing.
|
||||
*/
|
||||
public void onChildrenLoaded(@NonNull String parentId, @NonNull List<MediaItem> children,
|
||||
@@ -1003,32 +947,6 @@ public final class MediaBrowser {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Callback for receiving the result of {@link #search}.
|
||||
*/
|
||||
public static abstract class SearchCallback {
|
||||
/**
|
||||
* Called when the {@link #search} finished successfully.
|
||||
*
|
||||
* @param query The search query sent for the search request to the connected service.
|
||||
* @param extras The bundle of service-specific arguments sent to the connected service.
|
||||
* @param items The list of media items which contains the search result.
|
||||
*/
|
||||
public void onSearchResult(@NonNull String query, Bundle extras,
|
||||
@NonNull List<MediaItem> items) {
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when an error happens while {@link #search} or the connected service doesn't
|
||||
* support {@link #search}.
|
||||
*
|
||||
* @param query The search query sent for the search request to the connected service.
|
||||
* @param extras The bundle of service-specific arguments sent to the connected service.
|
||||
*/
|
||||
public void onError(@NonNull String query, Bundle extras) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* ServiceConnection to the other app.
|
||||
*/
|
||||
|
||||
@@ -19,10 +19,8 @@ oneway interface IMediaBrowserService {
|
||||
|
||||
void addSubscriptionDeprecated(String uri, IMediaBrowserServiceCallbacks callbacks);
|
||||
void removeSubscriptionDeprecated(String uri, IMediaBrowserServiceCallbacks callbacks);
|
||||
void getMediaItem(String uri, in ResultReceiver cb, IMediaBrowserServiceCallbacks callbacks);
|
||||
void search(String query, in Bundle extras, in ResultReceiver cb,
|
||||
IMediaBrowserServiceCallbacks callbacks);
|
||||
|
||||
void getMediaItem(String uri, in ResultReceiver cb, IMediaBrowserServiceCallbacks callbacks);
|
||||
void addSubscription(String uri, in IBinder token, in Bundle options,
|
||||
IMediaBrowserServiceCallbacks callbacks);
|
||||
void removeSubscription(String uri, in IBinder token, IMediaBrowserServiceCallbacks callbacks);
|
||||
|
||||
@@ -89,15 +89,8 @@ public abstract class MediaBrowserService extends Service {
|
||||
*/
|
||||
public static final String KEY_MEDIA_ITEM = "media_item";
|
||||
|
||||
/**
|
||||
* A key for passing the list of MediaItems to the ResultReceiver in search.
|
||||
* @hide
|
||||
*/
|
||||
public static final String KEY_SEARCH_RESULTS = "search_results";
|
||||
|
||||
private static final int RESULT_FLAG_OPTION_NOT_HANDLED = 1 << 0;
|
||||
private static final int RESULT_FLAG_ON_LOAD_ITEM_NOT_IMPLEMENTED = 1 << 1;
|
||||
private static final int RESULT_FLAG_ON_SEARCH_NOT_IMPLEMENTED = 1 << 2;
|
||||
|
||||
private static final int RESULT_ERROR = -1;
|
||||
private static final int RESULT_OK = 0;
|
||||
@@ -105,7 +98,7 @@ public abstract class MediaBrowserService extends Service {
|
||||
/** @hide */
|
||||
@Retention(RetentionPolicy.SOURCE)
|
||||
@IntDef(flag=true, value = { RESULT_FLAG_OPTION_NOT_HANDLED,
|
||||
RESULT_FLAG_ON_LOAD_ITEM_NOT_IMPLEMENTED, RESULT_FLAG_ON_SEARCH_NOT_IMPLEMENTED })
|
||||
RESULT_FLAG_ON_LOAD_ITEM_NOT_IMPLEMENTED })
|
||||
private @interface ResultFlags { }
|
||||
|
||||
private final ArrayMap<IBinder, ConnectionRecord> mConnections = new ArrayMap<>();
|
||||
@@ -137,7 +130,6 @@ public abstract class MediaBrowserService extends Service {
|
||||
*
|
||||
* @see #onLoadChildren
|
||||
* @see #onLoadItem
|
||||
* @see #onSearch
|
||||
*/
|
||||
public class Result<T> {
|
||||
private Object mDebug;
|
||||
@@ -330,23 +322,6 @@ public abstract class MediaBrowserService extends Service {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
public void search(final String query, Bundle extras, ResultReceiver receiver,
|
||||
final IMediaBrowserServiceCallbacks callbacks) {
|
||||
mHandler.post(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
final IBinder b = callbacks.asBinder();
|
||||
ConnectionRecord connection = mConnections.get(b);
|
||||
if (connection == null) {
|
||||
Log.w(TAG, "search for callback that isn't registered query=" + query);
|
||||
return;
|
||||
}
|
||||
performSearch(query, extras, connection, receiver);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -471,32 +446,6 @@ public abstract class MediaBrowserService extends Service {
|
||||
result.sendResult(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Called to get the search result.
|
||||
* <p>
|
||||
* Implementations must call {@link Result#sendResult result.sendResult}. If
|
||||
* the search will be an expensive operation {@link Result#detach result.detach}
|
||||
* may be called before returning from this function, and then {@link Result#sendResult
|
||||
* result.sendResult} called when the search has been completed.
|
||||
* </p><p>
|
||||
* In case there are no search results, call {@link Result#sendResult} with an empty list.
|
||||
* In case there are some errors happened, call {@link Result#sendResult result.sendResult}
|
||||
* with {@code null}, which will invoke {@link MediaBrowser.SearchCallback#onError}.
|
||||
* </p><p>
|
||||
* The default implementation will invoke {@link MediaBrowser.SearchCallback#onError}.
|
||||
* </p>
|
||||
*
|
||||
* @param query The search query sent from the media browser. It contains keywords separated
|
||||
* by space.
|
||||
* @param extras The bundle of service-specific arguments sent from the media browser.
|
||||
* @param result The {@link Result} to send the search result.
|
||||
*/
|
||||
public void onSearch(@NonNull String query, Bundle extras,
|
||||
Result<List<MediaBrowser.MediaItem>> result) {
|
||||
result.setFlags(RESULT_FLAG_ON_SEARCH_NOT_IMPLEMENTED);
|
||||
result.sendResult(null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Call to set the media session.
|
||||
* <p>
|
||||
@@ -545,16 +494,16 @@ public abstract class MediaBrowserService extends Service {
|
||||
* media browser service when connecting and retrieving the root id for browsing, or null if
|
||||
* none. The contents of this bundle may affect the information returned when browsing.
|
||||
*
|
||||
* @throws IllegalStateException If this method is called outside of {@link #onLoadChildren},
|
||||
* {@link #onLoadItem} or {@link #onSearch}.
|
||||
* @throws IllegalStateException If this method is called outside of {@link #onLoadChildren} or
|
||||
* {@link #onLoadItem}.
|
||||
* @see MediaBrowserService.BrowserRoot#EXTRA_RECENT
|
||||
* @see MediaBrowserService.BrowserRoot#EXTRA_OFFLINE
|
||||
* @see MediaBrowserService.BrowserRoot#EXTRA_SUGGESTED
|
||||
*/
|
||||
public final Bundle getBrowserRootHints() {
|
||||
if (mCurConnection == null) {
|
||||
throw new IllegalStateException("This should be called inside of onLoadChildren,"
|
||||
+ " onLoadItem or onSearch methods");
|
||||
throw new IllegalStateException("This should be called inside of onLoadChildren or"
|
||||
+ " onLoadItem methods");
|
||||
}
|
||||
return mCurConnection.rootHints == null ? null : new Bundle(mCurConnection.rootHints);
|
||||
}
|
||||
@@ -771,34 +720,6 @@ public abstract class MediaBrowserService extends Service {
|
||||
}
|
||||
}
|
||||
|
||||
private void performSearch(String query, Bundle extras, final ConnectionRecord connection,
|
||||
final ResultReceiver receiver) {
|
||||
final Result<List<MediaBrowser.MediaItem>> result =
|
||||
new Result<List<MediaBrowser.MediaItem>>(query) {
|
||||
@Override
|
||||
void onResultSent(List<MediaBrowser.MediaItem> items, @ResultFlags int flag) {
|
||||
if ((flag & RESULT_FLAG_ON_SEARCH_NOT_IMPLEMENTED) != 0
|
||||
|| items == null) {
|
||||
receiver.send(RESULT_ERROR, null);
|
||||
return;
|
||||
}
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putParcelableArray(KEY_SEARCH_RESULTS,
|
||||
items.toArray(new MediaBrowser.MediaItem[0]));
|
||||
receiver.send(RESULT_OK, bundle);
|
||||
}
|
||||
};
|
||||
|
||||
mCurConnection = connection;
|
||||
onSearch(query, extras, result);
|
||||
mCurConnection = null;
|
||||
|
||||
if (!result.isDone()) {
|
||||
throw new IllegalStateException("onSearch must call detach() or sendResult()"
|
||||
+ " before returning for query=" + query);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Contains information that the browser service needs to send to the client
|
||||
* when first connected.
|
||||
|
||||
Reference in New Issue
Block a user