[go: nahoru, domu]

blob: 6fdd26a17e1392f814811a22923dfe1ffb930e41 [file] [log] [blame]
/*
* Copyright 2019 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 androidx.media2.session;
import static androidx.annotation.RestrictTo.Scope.LIBRARY;
import android.os.SystemClock;
import androidx.annotation.IntDef;
import androidx.annotation.Nullable;
import androidx.annotation.RestrictTo;
import androidx.concurrent.futures.ResolvableFuture;
import androidx.media2.common.MediaItem;
import androidx.media2.common.ParcelImplListSlice;
import androidx.versionedparcelable.CustomVersionedParcelable;
import androidx.versionedparcelable.NonParcelField;
import androidx.versionedparcelable.ParcelField;
import androidx.versionedparcelable.VersionedParcelize;
import com.google.common.util.concurrent.ListenableFuture;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;
/**
* Result class to be used with {@link ListenableFuture} for asynchronous calls between {@link
* MediaLibraryService.MediaLibrarySession} and {@link MediaBrowser}.
*
* @deprecated androidx.media2 is deprecated. Please migrate to <a
* href="https://developer.android.com/guide/topics/media/media3">androidx.media3</a>.
*/
@Deprecated
@VersionedParcelize(isCustom = true)
public class LibraryResult extends CustomVersionedParcelable implements RemoteResult {
/**
*/
@IntDef(flag = false, /*prefix = "RESULT_CODE",*/ value = {
RESULT_SUCCESS,
RESULT_ERROR_UNKNOWN,
RESULT_ERROR_INVALID_STATE,
RESULT_ERROR_BAD_VALUE,
RESULT_ERROR_PERMISSION_DENIED,
RESULT_ERROR_IO,
RESULT_INFO_SKIPPED,
RESULT_ERROR_SESSION_DISCONNECTED,
RESULT_ERROR_NOT_SUPPORTED,
RESULT_ERROR_SESSION_AUTHENTICATION_EXPIRED,
RESULT_ERROR_SESSION_PREMIUM_ACCOUNT_REQUIRED,
RESULT_ERROR_SESSION_CONCURRENT_STREAM_LIMIT,
RESULT_ERROR_SESSION_PARENTAL_CONTROL_RESTRICTED,
RESULT_ERROR_SESSION_NOT_AVAILABLE_IN_REGION,
RESULT_ERROR_SESSION_SKIP_LIMIT_REACHED,
RESULT_ERROR_SESSION_SETUP_REQUIRED})
@Retention(RetentionPolicy.SOURCE)
@RestrictTo(LIBRARY)
public @interface ResultCode {}
@ParcelField(1)
int mResultCode;
@ParcelField(2)
long mCompletionTime;
// Parceled via mParcelableItem.
@NonParcelField
MediaItem mItem;
// For parceling mItem. Should be only used by onPreParceling() and onPostParceling().
@ParcelField(3)
MediaItem mParcelableItem;
@ParcelField(4)
MediaLibraryService.LibraryParams mParams;
// Parceled via mItemListSlice
@NonParcelField
List<MediaItem> mItemList;
// For parceling mItemList. Should be only used by onPreParceling() and onPostParceling().
@ParcelField(5)
ParcelImplListSlice mItemListSlice;
// WARNING: Adding a new ParcelField may break old library users (b/152830728)
// For versioned parcelable
LibraryResult() {
// no-op.
}
/**
* Constructor only with the result code.
* <p>
* For success, use other constructor that you can also return the result.
*
* @param resultCode result code
*/
public LibraryResult(@ResultCode int resultCode) {
this(resultCode, null, null, null);
}
/**
* Constructor with the result code and a media item.
*
* @param resultCode result code
* @param item a media item. Can be {@code null} for error
* @param params optional library params to describe the returned media item
*/
public LibraryResult(@ResultCode int resultCode, @Nullable MediaItem item,
@Nullable MediaLibraryService.LibraryParams params) {
this(resultCode, item, null, params);
}
/**
* Constructor with the result code and a list of media items.
*
* @param resultCode result code
* @param items list of media items. Can be {@code null} for error
* @param params optional library params to describe the returned list of media items.
*/
public LibraryResult(@ResultCode int resultCode, @Nullable List<MediaItem> items,
@Nullable MediaLibraryService.LibraryParams params) {
this(resultCode, null, items, params);
}
private LibraryResult(@ResultCode int resultCode, @Nullable MediaItem item,
@Nullable List<MediaItem> items, @Nullable MediaLibraryService.LibraryParams params) {
mResultCode = resultCode;
mCompletionTime = SystemClock.elapsedRealtime();
mItem = item;
mItemList = items;
mParams = params;
}
static ListenableFuture<LibraryResult> createFutureWithResult(@ResultCode int resultCode) {
ResolvableFuture<LibraryResult> result = ResolvableFuture.create();
result.set(new LibraryResult(resultCode));
return result;
}
/**
* Gets the result code.
*
* @return result code
* @see #RESULT_SUCCESS
* @see #RESULT_ERROR_UNKNOWN
* @see #RESULT_ERROR_INVALID_STATE
* @see #RESULT_ERROR_BAD_VALUE
* @see #RESULT_ERROR_PERMISSION_DENIED
* @see #RESULT_ERROR_IO
* @see #RESULT_INFO_SKIPPED
* @see #RESULT_ERROR_SESSION_DISCONNECTED
* @see #RESULT_ERROR_NOT_SUPPORTED
* @see #RESULT_ERROR_SESSION_AUTHENTICATION_EXPIRED
* @see #RESULT_ERROR_SESSION_PREMIUM_ACCOUNT_REQUIRED
* @see #RESULT_ERROR_SESSION_CONCURRENT_STREAM_LIMIT
* @see #RESULT_ERROR_SESSION_PARENTAL_CONTROL_RESTRICTED
* @see #RESULT_ERROR_SESSION_NOT_AVAILABLE_IN_REGION
* @see #RESULT_ERROR_SESSION_SKIP_LIMIT_REACHED
* @see #RESULT_ERROR_SESSION_SETUP_REQUIRED
*/
@Override
@ResultCode
public int getResultCode() {
return mResultCode;
}
/**
* Gets the completion time of the command. Being more specific, it's the same as
* {@link android.os.SystemClock#elapsedRealtime()} when the command completed.
*
* @return completion time of the command
*/
@Override
public long getCompletionTime() {
return mCompletionTime;
}
/**
* Gets the media item.
* <p>
* Can be {@code null} if an error happened or the command doesn't return a media item.
*
* @return media item
* @see MediaBrowser#getLibraryRoot(MediaLibraryService.LibraryParams)
* @see MediaBrowser#getItem(String)
*/
@Override
@Nullable
public MediaItem getMediaItem() {
return mItem;
}
/**
* Gets the list of media item.
* <p>
* Can be {@code null} if an error happened or the command doesn't return a list of media
* items.
*
* @return list of media item
* @see MediaBrowser#getSearchResult(String, int, int, MediaLibraryService.LibraryParams)
* @see MediaBrowser#getChildren(String, int, int, MediaLibraryService.LibraryParams)
*/
@Nullable
public List<MediaItem> getMediaItems() {
return mItemList;
}
/**
* Gets the library params
*
* @return library params.
*/
@Nullable
public MediaLibraryService.LibraryParams getLibraryParams() {
return mParams;
}
/**
*/
@RestrictTo(LIBRARY)
@Override
@SuppressWarnings("SynchronizeOnNonFinalField") // mItem and mItemList are effectively final.
public void onPreParceling(boolean isStream) {
if (mItem != null) {
synchronized (mItem) {
if (mParcelableItem == null) {
mParcelableItem = MediaUtils.upcastForPreparceling(mItem);
}
}
}
if (mItemList != null) {
synchronized (mItemList) {
if (mItemListSlice == null) {
mItemListSlice = MediaUtils.convertMediaItemListToParcelImplListSlice(
mItemList);
}
}
}
}
/**
*/
@RestrictTo(LIBRARY)
@Override
public void onPostParceling() {
mItem = mParcelableItem;
mItemList = MediaUtils.convertParcelImplListSliceToMediaItemList(mItemListSlice);
}
}