blob: c9090993860e166a8513c1c0739f31ac2e2f0ee7 [file] [log] [blame]
/*
* Copyright 2018 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.media;
import android.content.Context;
import android.media.MediaBrowser2;
import android.media.MediaBrowser2.BrowserCallback;
import android.media.MediaController2;
import android.media.MediaItem2;
import android.media.SessionToken2;
import android.media.update.MediaBrowser2Provider;
import android.os.Bundle;
import android.os.RemoteException;
import android.text.TextUtils;
import android.util.Log;
import java.util.List;
import java.util.concurrent.Executor;
public class MediaBrowser2Impl extends MediaController2Impl implements MediaBrowser2Provider {
private final String TAG = "MediaBrowser2";
private final boolean DEBUG = true; // TODO(jaewan): change.
private final MediaBrowser2 mInstance;
private final MediaBrowser2.BrowserCallback mCallback;
public MediaBrowser2Impl(Context context, MediaBrowser2 instance, SessionToken2 token,
Executor executor, BrowserCallback callback) {
super(context, instance, token, executor, callback);
mInstance = instance;
mCallback = callback;
}
@Override MediaBrowser2 getInstance() {
return (MediaBrowser2) super.getInstance();
}
@Override
public void getLibraryRoot_impl(Bundle rootHints) {
final IMediaSession2 binder = getSessionBinder();
if (binder != null) {
try {
binder.getLibraryRoot(getControllerStub(), rootHints);
} catch (RemoteException e) {
// TODO(jaewan): Handle disconnect.
if (DEBUG) {
Log.w(TAG, "Cannot connect to the service or the session is gone", e);
}
}
} else {
Log.w(TAG, "Session isn't active", new IllegalStateException());
}
}
@Override
public void subscribe_impl(String parentId, Bundle extras) {
if (parentId == null) {
throw new IllegalArgumentException("parentId shouldn't be null");
}
final IMediaSession2 binder = getSessionBinder();
if (binder != null) {
try {
binder.subscribe(getControllerStub(), parentId, extras);
} catch (RemoteException e) {
// TODO(jaewan): Handle disconnect.
if (DEBUG) {
Log.w(TAG, "Cannot connect to the service or the session is gone", e);
}
}
} else {
Log.w(TAG, "Session isn't active", new IllegalStateException());
}
}
@Override
public void unsubscribe_impl(String parentId) {
if (parentId == null) {
throw new IllegalArgumentException("parentId shouldn't be null");
}
final IMediaSession2 binder = getSessionBinder();
if (binder != null) {
try {
binder.unsubscribe(getControllerStub(), parentId);
} catch (RemoteException e) {
// TODO(jaewan): Handle disconnect.
if (DEBUG) {
Log.w(TAG, "Cannot connect to the service or the session is gone", e);
}
}
} else {
Log.w(TAG, "Session isn't active", new IllegalStateException());
}
}
@Override
public void getItem_impl(String mediaId) {
if (mediaId == null) {
throw new IllegalArgumentException("mediaId shouldn't be null");
}
final IMediaSession2 binder = getSessionBinder();
if (binder != null) {
try {
binder.getItem(getControllerStub(), mediaId);
} catch (RemoteException e) {
// TODO(jaewan): Handle disconnect.
if (DEBUG) {
Log.w(TAG, "Cannot connect to the service or the session is gone", e);
}
}
} else {
Log.w(TAG, "Session isn't active", new IllegalStateException());
}
}
@Override
public void getChildren_impl(String parentId, int page, int pageSize, Bundle extras) {
if (parentId == null) {
throw new IllegalArgumentException("parentId shouldn't be null");
}
if (page < 1 || pageSize < 1) {
throw new IllegalArgumentException("Neither page nor pageSize should be less than 1");
}
final IMediaSession2 binder = getSessionBinder();
if (binder != null) {
try {
binder.getChildren(getControllerStub(), parentId, page, pageSize, extras);
} catch (RemoteException e) {
// TODO(jaewan): Handle disconnect.
if (DEBUG) {
Log.w(TAG, "Cannot connect to the service or the session is gone", e);
}
}
} else {
Log.w(TAG, "Session isn't active", new IllegalStateException());
}
}
@Override
public void search_impl(String query, Bundle extras) {
if (TextUtils.isEmpty(query)) {
throw new IllegalArgumentException("query shouldn't be empty");
}
final IMediaSession2 binder = getSessionBinder();
if (binder != null) {
try {
binder.search(getControllerStub(), query, extras);
} catch (RemoteException e) {
// TODO(jaewan): Handle disconnect.
if (DEBUG) {
Log.w(TAG, "Cannot connect to the service or the session is gone", e);
}
}
} else {
Log.w(TAG, "Session isn't active", new IllegalStateException());
}
}
@Override
public void getSearchResult_impl(String query, int page, int pageSize, Bundle extras) {
if (TextUtils.isEmpty(query)) {
throw new IllegalArgumentException("query shouldn't be empty");
}
if (page < 1 || pageSize < 1) {
throw new IllegalArgumentException("Neither page nor pageSize should be less than 1");
}
final IMediaSession2 binder = getSessionBinder();
if (binder != null) {
try {
binder.getSearchResult(getControllerStub(), query, page, pageSize, extras);
} catch (RemoteException e) {
// TODO(jaewan): Handle disconnect.
if (DEBUG) {
Log.w(TAG, "Cannot connect to the service or the session is gone", e);
}
}
} else {
Log.w(TAG, "Session isn't active", new IllegalStateException());
}
}
public void onGetLibraryRootDone(
final Bundle rootHints, final String rootMediaId, final Bundle rootExtra) {
getCallbackExecutor().execute(() -> {
mCallback.onGetLibraryRootDone(getInstance(), rootHints, rootMediaId, rootExtra);
});
}
public void onGetItemDone(String mediaId, MediaItem2 item) {
getCallbackExecutor().execute(() -> {
mCallback.onGetItemDone(getInstance(), mediaId, item);
});
}
public void onGetChildrenDone(String parentId, int page, int pageSize, List<MediaItem2> result,
Bundle extras) {
getCallbackExecutor().execute(() -> {
mCallback.onGetChildrenDone(getInstance(), parentId, page, pageSize, result, extras);
});
}
public void onSearchResultChanged(String query, int itemCount, Bundle extras) {
getCallbackExecutor().execute(() -> {
mCallback.onSearchResultChanged(getInstance(), query, itemCount, extras);
});
}
public void onGetSearchResultDone(String query, int page, int pageSize, List<MediaItem2> result,
Bundle extras) {
getCallbackExecutor().execute(() -> {
mCallback.onGetSearchResultDone(getInstance(), query, page, pageSize, result, extras);
});
}
public void onChildrenChanged(final String parentId, int itemCount, final Bundle extras) {
getCallbackExecutor().execute(() -> {
mCallback.onChildrenChanged(getInstance(), parentId, itemCount, extras);
});
}
}