Merge "Remove MediaItem2" into qt-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
4e57ccbea9
@@ -25138,25 +25138,6 @@ package android.media {
|
|||||||
field public static final int TYPE_STRING = 4; // 0x4
|
field public static final int TYPE_STRING = 4; // 0x4
|
||||||
}
|
}
|
||||||
|
|
||||||
public final class MediaItem2 implements android.os.Parcelable {
|
|
||||||
method public int describeContents();
|
|
||||||
method public long getEndPosition();
|
|
||||||
method @Nullable public android.media.MediaMetadata getMetadata();
|
|
||||||
method public long getStartPosition();
|
|
||||||
method public void setMetadata(@Nullable android.media.MediaMetadata);
|
|
||||||
method public void writeToParcel(android.os.Parcel, int);
|
|
||||||
field @NonNull public static final android.os.Parcelable.Creator<android.media.MediaItem2> CREATOR;
|
|
||||||
field public static final long POSITION_UNKNOWN = 576460752303423487L; // 0x7ffffffffffffffL
|
|
||||||
}
|
|
||||||
|
|
||||||
public static final class MediaItem2.Builder {
|
|
||||||
ctor public MediaItem2.Builder();
|
|
||||||
method @NonNull public android.media.MediaItem2 build();
|
|
||||||
method @NonNull public android.media.MediaItem2.Builder setEndPosition(long);
|
|
||||||
method @NonNull public android.media.MediaItem2.Builder setMetadata(@Nullable android.media.MediaMetadata);
|
|
||||||
method @NonNull public android.media.MediaItem2.Builder setStartPosition(long);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final class MediaMetadata implements android.os.Parcelable {
|
public final class MediaMetadata implements android.os.Parcelable {
|
||||||
method public boolean containsKey(String);
|
method public boolean containsKey(String);
|
||||||
method public int describeContents();
|
method public int describeContents();
|
||||||
|
|||||||
@@ -64,7 +64,6 @@ filegroup {
|
|||||||
"apex/java/android/media/IMediaSession2Service.aidl",
|
"apex/java/android/media/IMediaSession2Service.aidl",
|
||||||
"apex/java/android/media/MediaConstants.java",
|
"apex/java/android/media/MediaConstants.java",
|
||||||
"apex/java/android/media/MediaController2.java",
|
"apex/java/android/media/MediaController2.java",
|
||||||
"apex/java/android/media/MediaItem2.java",
|
|
||||||
"apex/java/android/media/MediaSession2.java",
|
"apex/java/android/media/MediaSession2.java",
|
||||||
"apex/java/android/media/MediaSession2Service.java",
|
"apex/java/android/media/MediaSession2Service.java",
|
||||||
"apex/java/android/media/Session2Command.java",
|
"apex/java/android/media/Session2Command.java",
|
||||||
|
|||||||
@@ -1,310 +0,0 @@
|
|||||||
/*
|
|
||||||
* 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 android.media;
|
|
||||||
|
|
||||||
import static android.media.MediaMetadata.METADATA_KEY_MEDIA_ID;
|
|
||||||
|
|
||||||
import android.annotation.NonNull;
|
|
||||||
import android.annotation.Nullable;
|
|
||||||
import android.os.Parcel;
|
|
||||||
import android.os.Parcelable;
|
|
||||||
import android.text.TextUtils;
|
|
||||||
import android.util.Log;
|
|
||||||
import android.util.Pair;
|
|
||||||
|
|
||||||
import com.android.internal.annotations.GuardedBy;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.concurrent.Executor;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A class with information on a single media item with the metadata information.
|
|
||||||
* <p>
|
|
||||||
* This API is not generally intended for third party application developers.
|
|
||||||
* Use the <a href="{@docRoot}jetpack/androidx.html">AndroidX</a>
|
|
||||||
* <a href="{@docRoot}reference/androidx/media2/package-summary.html">Media2 Library</a>
|
|
||||||
* for consistent behavior across all devices.
|
|
||||||
* <p>
|
|
||||||
*/
|
|
||||||
public final class MediaItem2 implements Parcelable {
|
|
||||||
private static final String TAG = "MediaItem2";
|
|
||||||
|
|
||||||
// intentionally less than long.MAX_VALUE.
|
|
||||||
// Declare this first to avoid 'illegal forward reference'.
|
|
||||||
static final long LONG_MAX = 0x7ffffffffffffffL;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used when a position is unknown.
|
|
||||||
*
|
|
||||||
* @see #getEndPosition()
|
|
||||||
*/
|
|
||||||
public static final long POSITION_UNKNOWN = LONG_MAX;
|
|
||||||
|
|
||||||
public static final @android.annotation.NonNull Parcelable.Creator<MediaItem2> CREATOR =
|
|
||||||
new Parcelable.Creator<MediaItem2>() {
|
|
||||||
@Override
|
|
||||||
public MediaItem2 createFromParcel(Parcel in) {
|
|
||||||
return new MediaItem2(in);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public MediaItem2[] newArray(int size) {
|
|
||||||
return new MediaItem2[size];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
private static final long UNKNOWN_TIME = -1;
|
|
||||||
|
|
||||||
private final long mStartPositionMs;
|
|
||||||
private final long mEndPositionMs;
|
|
||||||
|
|
||||||
private final Object mLock = new Object();
|
|
||||||
|
|
||||||
@GuardedBy("mLock")
|
|
||||||
private MediaMetadata mMetadata;
|
|
||||||
@GuardedBy("mLock")
|
|
||||||
private final List<Pair<OnMetadataChangedListener, Executor>> mListeners = new ArrayList<>();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used by {@link MediaItem2.Builder}.
|
|
||||||
*/
|
|
||||||
// Note: Needs to be protected when we want to allow 3rd party player to define customized
|
|
||||||
// MediaItem2.
|
|
||||||
@SuppressWarnings("WeakerAccess") /* synthetic access */
|
|
||||||
MediaItem2(Builder builder) {
|
|
||||||
this(builder.mMetadata, builder.mStartPositionMs, builder.mEndPositionMs);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Used by Parcelable.Creator.
|
|
||||||
*/
|
|
||||||
// Note: Needs to be protected when we want to allow 3rd party player to define customized
|
|
||||||
// MediaItem2.
|
|
||||||
@SuppressWarnings("WeakerAccess") /* synthetic access */
|
|
||||||
MediaItem2(Parcel in) {
|
|
||||||
this(in.readParcelable(MediaItem2.class.getClassLoader()), in.readLong(), in.readLong());
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("WeakerAccess") /* synthetic access */
|
|
||||||
MediaItem2(MediaItem2 item) {
|
|
||||||
this(item.mMetadata, item.mStartPositionMs, item.mEndPositionMs);
|
|
||||||
}
|
|
||||||
|
|
||||||
@SuppressWarnings("WeakerAccess") /* synthetic access */
|
|
||||||
MediaItem2(@Nullable MediaMetadata metadata, long startPositionMs, long endPositionMs) {
|
|
||||||
if (startPositionMs > endPositionMs) {
|
|
||||||
throw new IllegalArgumentException("Illegal start/end position: "
|
|
||||||
+ startPositionMs + " : " + endPositionMs);
|
|
||||||
}
|
|
||||||
if (metadata != null && metadata.containsKey(MediaMetadata.METADATA_KEY_DURATION)) {
|
|
||||||
long durationMs = metadata.getLong(MediaMetadata.METADATA_KEY_DURATION);
|
|
||||||
if (durationMs != UNKNOWN_TIME && endPositionMs != POSITION_UNKNOWN
|
|
||||||
&& endPositionMs > durationMs) {
|
|
||||||
throw new IllegalArgumentException("endPositionMs shouldn't be greater than"
|
|
||||||
+ " duration in the metdata, endPositionMs=" + endPositionMs
|
|
||||||
+ ", durationMs=" + durationMs);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mMetadata = metadata;
|
|
||||||
mStartPositionMs = startPositionMs;
|
|
||||||
mEndPositionMs = endPositionMs;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String toString() {
|
|
||||||
final StringBuilder sb = new StringBuilder(getClass().getSimpleName());
|
|
||||||
synchronized (mLock) {
|
|
||||||
sb.append("{mMetadata=").append(mMetadata);
|
|
||||||
sb.append(", mStartPositionMs=").append(mStartPositionMs);
|
|
||||||
sb.append(", mEndPositionMs=").append(mEndPositionMs);
|
|
||||||
sb.append('}');
|
|
||||||
}
|
|
||||||
return sb.toString();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets metadata. If the metadata is not {@code null}, its id should be matched with this
|
|
||||||
* instance's media id.
|
|
||||||
*
|
|
||||||
* @param metadata metadata to update
|
|
||||||
* @see MediaMetadata#METADATA_KEY_MEDIA_ID
|
|
||||||
*/
|
|
||||||
public void setMetadata(@Nullable MediaMetadata metadata) {
|
|
||||||
List<Pair<OnMetadataChangedListener, Executor>> listeners = new ArrayList<>();
|
|
||||||
synchronized (mLock) {
|
|
||||||
if (mMetadata != null && metadata != null
|
|
||||||
&& !TextUtils.equals(getMediaId(), metadata.getString(METADATA_KEY_MEDIA_ID))) {
|
|
||||||
Log.d(TAG, "MediaItem2's media ID shouldn't be changed");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
mMetadata = metadata;
|
|
||||||
listeners.addAll(mListeners);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Pair<OnMetadataChangedListener, Executor> pair : listeners) {
|
|
||||||
final OnMetadataChangedListener listener = pair.first;
|
|
||||||
pair.second.execute(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
listener.onMetadataChanged(MediaItem2.this);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the metadata of the media.
|
|
||||||
*
|
|
||||||
* @return metadata from the session
|
|
||||||
*/
|
|
||||||
public @Nullable MediaMetadata getMetadata() {
|
|
||||||
synchronized (mLock) {
|
|
||||||
return mMetadata;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the position in milliseconds at which the playback will start.
|
|
||||||
* @return the position in milliseconds at which the playback will start
|
|
||||||
*/
|
|
||||||
public long getStartPosition() {
|
|
||||||
return mStartPositionMs;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Return the position in milliseconds at which the playback will end.
|
|
||||||
* {@link #POSITION_UNKNOWN} means ending at the end of source content.
|
|
||||||
* @return the position in milliseconds at which the playback will end
|
|
||||||
*/
|
|
||||||
public long getEndPosition() {
|
|
||||||
return mEndPositionMs;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int describeContents() {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void writeToParcel(Parcel dest, int flags) {
|
|
||||||
dest.writeParcelable(mMetadata, 0);
|
|
||||||
dest.writeLong(mStartPositionMs);
|
|
||||||
dest.writeLong(mEndPositionMs);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Gets the media id for this item. If it's not {@code null}, it's a persistent unique key
|
|
||||||
* for the underlying media content.
|
|
||||||
*
|
|
||||||
* @return media Id from the session
|
|
||||||
*/
|
|
||||||
@Nullable String getMediaId() {
|
|
||||||
synchronized (mLock) {
|
|
||||||
return mMetadata != null
|
|
||||||
? mMetadata.getString(METADATA_KEY_MEDIA_ID) : null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void addOnMetadataChangedListener(Executor executor, OnMetadataChangedListener listener) {
|
|
||||||
synchronized (mLock) {
|
|
||||||
for (Pair<OnMetadataChangedListener, Executor> pair : mListeners) {
|
|
||||||
if (pair.first == listener) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mListeners.add(new Pair<>(listener, executor));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void removeOnMetadataChangedListener(OnMetadataChangedListener listener) {
|
|
||||||
synchronized (mLock) {
|
|
||||||
for (int i = mListeners.size() - 1; i >= 0; i--) {
|
|
||||||
if (mListeners.get(i).first == listener) {
|
|
||||||
mListeners.remove(i);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Builder for {@link MediaItem2}.
|
|
||||||
*/
|
|
||||||
public static final class Builder {
|
|
||||||
@SuppressWarnings("WeakerAccess") /* synthetic access */
|
|
||||||
MediaMetadata mMetadata;
|
|
||||||
@SuppressWarnings("WeakerAccess") /* synthetic access */
|
|
||||||
long mStartPositionMs = 0;
|
|
||||||
@SuppressWarnings("WeakerAccess") /* synthetic access */
|
|
||||||
long mEndPositionMs = POSITION_UNKNOWN;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the metadata of this instance. {@code null} for unset.
|
|
||||||
*
|
|
||||||
* @param metadata metadata
|
|
||||||
* @return this instance for chaining
|
|
||||||
*/
|
|
||||||
public @NonNull Builder setMetadata(@Nullable MediaMetadata metadata) {
|
|
||||||
mMetadata = metadata;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the start position in milliseconds at which the playback will start.
|
|
||||||
* Any negative number is treated as 0.
|
|
||||||
*
|
|
||||||
* @param position the start position in milliseconds at which the playback will start
|
|
||||||
* @return the same Builder instance.
|
|
||||||
*/
|
|
||||||
public @NonNull Builder setStartPosition(long position) {
|
|
||||||
if (position < 0) {
|
|
||||||
position = 0;
|
|
||||||
}
|
|
||||||
mStartPositionMs = position;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Sets the end position in milliseconds at which the playback will end.
|
|
||||||
* Any negative number is treated as maximum length of the media item.
|
|
||||||
*
|
|
||||||
* @param position the end position in milliseconds at which the playback will end
|
|
||||||
* @return the same Builder instance.
|
|
||||||
*/
|
|
||||||
public @NonNull Builder setEndPosition(long position) {
|
|
||||||
if (position < 0) {
|
|
||||||
position = POSITION_UNKNOWN;
|
|
||||||
}
|
|
||||||
mEndPositionMs = position;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Build {@link MediaItem2}.
|
|
||||||
*
|
|
||||||
* @return a new {@link MediaItem2}.
|
|
||||||
*/
|
|
||||||
public @NonNull MediaItem2 build() {
|
|
||||||
return new MediaItem2(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
interface OnMetadataChangedListener {
|
|
||||||
void onMetadataChanged(MediaItem2 item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Reference in New Issue
Block a user