/* * 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 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 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); }); } }