- Added realracing3-community.apk (71.57 MB) - Removed 32-bit support (armeabi-v7a) - Only includes arm64-v8a libraries - Decompiled source code included - Added README-community.md with analysis
1754 lines
72 KiB
Java
1754 lines
72 KiB
Java
package android.support.v4.media.session;
|
|
|
|
import android.annotation.SuppressLint;
|
|
import android.app.Activity;
|
|
import android.app.PendingIntent;
|
|
import android.content.Context;
|
|
import android.media.MediaMetadata;
|
|
import android.media.Rating;
|
|
import android.media.session.MediaController;
|
|
import android.media.session.MediaSession;
|
|
import android.media.session.PlaybackState;
|
|
import android.net.Uri;
|
|
import android.os.Build;
|
|
import android.os.Bundle;
|
|
import android.os.Handler;
|
|
import android.os.IBinder;
|
|
import android.os.Looper;
|
|
import android.os.Message;
|
|
import android.os.RemoteException;
|
|
import android.os.ResultReceiver;
|
|
import android.support.v4.media.MediaDescriptionCompat;
|
|
import android.support.v4.media.MediaMetadataCompat;
|
|
import android.support.v4.media.RatingCompat;
|
|
import android.support.v4.media.session.IMediaControllerCallback;
|
|
import android.support.v4.media.session.IMediaSession;
|
|
import android.support.v4.media.session.MediaSessionCompat;
|
|
import android.support.v4.media.session.PlaybackStateCompat;
|
|
import android.text.TextUtils;
|
|
import android.util.Log;
|
|
import android.view.KeyEvent;
|
|
import androidx.annotation.GuardedBy;
|
|
import androidx.annotation.NonNull;
|
|
import androidx.annotation.Nullable;
|
|
import androidx.annotation.RequiresApi;
|
|
import androidx.annotation.RestrictTo;
|
|
import androidx.core.app.BundleCompat;
|
|
import androidx.media.AudioAttributesCompat;
|
|
import androidx.media.R;
|
|
import androidx.versionedparcelable.ParcelUtils;
|
|
import androidx.versionedparcelable.VersionedParcelable;
|
|
import csdk.gluads.Consts;
|
|
import java.lang.ref.WeakReference;
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.concurrent.ConcurrentHashMap;
|
|
|
|
/* loaded from: classes.dex */
|
|
public final class MediaControllerCompat {
|
|
|
|
@RestrictTo({RestrictTo.Scope.LIBRARY})
|
|
public static final String COMMAND_ADD_QUEUE_ITEM = "android.support.v4.media.session.command.ADD_QUEUE_ITEM";
|
|
|
|
@RestrictTo({RestrictTo.Scope.LIBRARY})
|
|
public static final String COMMAND_ADD_QUEUE_ITEM_AT = "android.support.v4.media.session.command.ADD_QUEUE_ITEM_AT";
|
|
|
|
@RestrictTo({RestrictTo.Scope.LIBRARY})
|
|
public static final String COMMAND_ARGUMENT_INDEX = "android.support.v4.media.session.command.ARGUMENT_INDEX";
|
|
|
|
@RestrictTo({RestrictTo.Scope.LIBRARY})
|
|
public static final String COMMAND_ARGUMENT_MEDIA_DESCRIPTION = "android.support.v4.media.session.command.ARGUMENT_MEDIA_DESCRIPTION";
|
|
|
|
@RestrictTo({RestrictTo.Scope.LIBRARY})
|
|
public static final String COMMAND_GET_EXTRA_BINDER = "android.support.v4.media.session.command.GET_EXTRA_BINDER";
|
|
|
|
@RestrictTo({RestrictTo.Scope.LIBRARY})
|
|
public static final String COMMAND_REMOVE_QUEUE_ITEM = "android.support.v4.media.session.command.REMOVE_QUEUE_ITEM";
|
|
|
|
@RestrictTo({RestrictTo.Scope.LIBRARY})
|
|
public static final String COMMAND_REMOVE_QUEUE_ITEM_AT = "android.support.v4.media.session.command.REMOVE_QUEUE_ITEM_AT";
|
|
static final String TAG = "MediaControllerCompat";
|
|
private final MediaControllerImpl mImpl;
|
|
|
|
@SuppressLint({"BanConcurrentHashMap"})
|
|
private final ConcurrentHashMap<Callback, Boolean> mRegisteredCallbacks = new ConcurrentHashMap<>();
|
|
private final MediaSessionCompat.Token mToken;
|
|
|
|
public interface MediaControllerImpl {
|
|
void addQueueItem(MediaDescriptionCompat mediaDescriptionCompat);
|
|
|
|
void addQueueItem(MediaDescriptionCompat mediaDescriptionCompat, int i);
|
|
|
|
void adjustVolume(int i, int i2);
|
|
|
|
boolean dispatchMediaButtonEvent(KeyEvent keyEvent);
|
|
|
|
Bundle getExtras();
|
|
|
|
long getFlags();
|
|
|
|
Object getMediaController();
|
|
|
|
MediaMetadataCompat getMetadata();
|
|
|
|
String getPackageName();
|
|
|
|
PlaybackInfo getPlaybackInfo();
|
|
|
|
PlaybackStateCompat getPlaybackState();
|
|
|
|
List<MediaSessionCompat.QueueItem> getQueue();
|
|
|
|
CharSequence getQueueTitle();
|
|
|
|
int getRatingType();
|
|
|
|
int getRepeatMode();
|
|
|
|
PendingIntent getSessionActivity();
|
|
|
|
Bundle getSessionInfo();
|
|
|
|
int getShuffleMode();
|
|
|
|
TransportControls getTransportControls();
|
|
|
|
boolean isCaptioningEnabled();
|
|
|
|
boolean isSessionReady();
|
|
|
|
void registerCallback(Callback callback, Handler handler);
|
|
|
|
void removeQueueItem(MediaDescriptionCompat mediaDescriptionCompat);
|
|
|
|
void sendCommand(String str, Bundle bundle, ResultReceiver resultReceiver);
|
|
|
|
void setVolumeTo(int i, int i2);
|
|
|
|
void unregisterCallback(Callback callback);
|
|
}
|
|
|
|
public static abstract class TransportControls {
|
|
public static final String EXTRA_LEGACY_STREAM_TYPE = "android.media.session.extra.LEGACY_STREAM_TYPE";
|
|
|
|
public abstract void fastForward();
|
|
|
|
public abstract void pause();
|
|
|
|
public abstract void play();
|
|
|
|
public abstract void playFromMediaId(String str, Bundle bundle);
|
|
|
|
public abstract void playFromSearch(String str, Bundle bundle);
|
|
|
|
public abstract void playFromUri(Uri uri, Bundle bundle);
|
|
|
|
public abstract void prepare();
|
|
|
|
public abstract void prepareFromMediaId(String str, Bundle bundle);
|
|
|
|
public abstract void prepareFromSearch(String str, Bundle bundle);
|
|
|
|
public abstract void prepareFromUri(Uri uri, Bundle bundle);
|
|
|
|
public abstract void rewind();
|
|
|
|
public abstract void seekTo(long j);
|
|
|
|
public abstract void sendCustomAction(PlaybackStateCompat.CustomAction customAction, Bundle bundle);
|
|
|
|
public abstract void sendCustomAction(String str, Bundle bundle);
|
|
|
|
public abstract void setCaptioningEnabled(boolean z);
|
|
|
|
public void setPlaybackSpeed(float f) {
|
|
}
|
|
|
|
public abstract void setRating(RatingCompat ratingCompat);
|
|
|
|
public abstract void setRating(RatingCompat ratingCompat, Bundle bundle);
|
|
|
|
public abstract void setRepeatMode(int i);
|
|
|
|
public abstract void setShuffleMode(int i);
|
|
|
|
public abstract void skipToNext();
|
|
|
|
public abstract void skipToPrevious();
|
|
|
|
public abstract void skipToQueueItem(long j);
|
|
|
|
public abstract void stop();
|
|
}
|
|
|
|
public MediaSessionCompat.Token getSessionToken() {
|
|
return this.mToken;
|
|
}
|
|
|
|
public static void setMediaController(@NonNull Activity activity, MediaControllerCompat mediaControllerCompat) {
|
|
activity.getWindow().getDecorView().setTag(R.id.media_controller_compat_view_tag, mediaControllerCompat);
|
|
activity.setMediaController(mediaControllerCompat != null ? new MediaController(activity, (MediaSession.Token) mediaControllerCompat.getSessionToken().getToken()) : null);
|
|
}
|
|
|
|
public static MediaControllerCompat getMediaController(@NonNull Activity activity) {
|
|
Object tag = activity.getWindow().getDecorView().getTag(R.id.media_controller_compat_view_tag);
|
|
if (tag instanceof MediaControllerCompat) {
|
|
return (MediaControllerCompat) tag;
|
|
}
|
|
MediaController mediaController = activity.getMediaController();
|
|
if (mediaController == null) {
|
|
return null;
|
|
}
|
|
return new MediaControllerCompat(activity, MediaSessionCompat.Token.fromToken(mediaController.getSessionToken()));
|
|
}
|
|
|
|
public static void validateCustomAction(String str, Bundle bundle) {
|
|
if (str == null) {
|
|
return;
|
|
}
|
|
if (str.equals(MediaSessionCompat.ACTION_FOLLOW) || str.equals(MediaSessionCompat.ACTION_UNFOLLOW)) {
|
|
if (bundle == null || !bundle.containsKey(MediaSessionCompat.ARGUMENT_MEDIA_ATTRIBUTE)) {
|
|
throw new IllegalArgumentException("An extra field android.support.v4.media.session.ARGUMENT_MEDIA_ATTRIBUTE is required for this action " + str + Consts.STRING_PERIOD);
|
|
}
|
|
}
|
|
}
|
|
|
|
public MediaControllerCompat(Context context, @NonNull MediaSessionCompat mediaSessionCompat) {
|
|
if (mediaSessionCompat == null) {
|
|
throw new IllegalArgumentException("session must not be null");
|
|
}
|
|
MediaSessionCompat.Token sessionToken = mediaSessionCompat.getSessionToken();
|
|
this.mToken = sessionToken;
|
|
this.mImpl = new MediaControllerImplApi21(context, sessionToken);
|
|
}
|
|
|
|
public MediaControllerCompat(Context context, @NonNull MediaSessionCompat.Token token) {
|
|
if (token == null) {
|
|
throw new IllegalArgumentException("sessionToken must not be null");
|
|
}
|
|
this.mToken = token;
|
|
this.mImpl = new MediaControllerImplApi21(context, token);
|
|
}
|
|
|
|
public TransportControls getTransportControls() {
|
|
return this.mImpl.getTransportControls();
|
|
}
|
|
|
|
public boolean dispatchMediaButtonEvent(KeyEvent keyEvent) {
|
|
if (keyEvent == null) {
|
|
throw new IllegalArgumentException("KeyEvent may not be null");
|
|
}
|
|
return this.mImpl.dispatchMediaButtonEvent(keyEvent);
|
|
}
|
|
|
|
public PlaybackStateCompat getPlaybackState() {
|
|
return this.mImpl.getPlaybackState();
|
|
}
|
|
|
|
public MediaMetadataCompat getMetadata() {
|
|
return this.mImpl.getMetadata();
|
|
}
|
|
|
|
public List<MediaSessionCompat.QueueItem> getQueue() {
|
|
return this.mImpl.getQueue();
|
|
}
|
|
|
|
public void addQueueItem(MediaDescriptionCompat mediaDescriptionCompat) {
|
|
this.mImpl.addQueueItem(mediaDescriptionCompat);
|
|
}
|
|
|
|
public void addQueueItem(MediaDescriptionCompat mediaDescriptionCompat, int i) {
|
|
this.mImpl.addQueueItem(mediaDescriptionCompat, i);
|
|
}
|
|
|
|
public void removeQueueItem(MediaDescriptionCompat mediaDescriptionCompat) {
|
|
this.mImpl.removeQueueItem(mediaDescriptionCompat);
|
|
}
|
|
|
|
@Deprecated
|
|
public void removeQueueItemAt(int i) {
|
|
MediaSessionCompat.QueueItem queueItem;
|
|
List<MediaSessionCompat.QueueItem> queue = getQueue();
|
|
if (queue == null || i < 0 || i >= queue.size() || (queueItem = queue.get(i)) == null) {
|
|
return;
|
|
}
|
|
removeQueueItem(queueItem.getDescription());
|
|
}
|
|
|
|
public CharSequence getQueueTitle() {
|
|
return this.mImpl.getQueueTitle();
|
|
}
|
|
|
|
public Bundle getExtras() {
|
|
return this.mImpl.getExtras();
|
|
}
|
|
|
|
public int getRatingType() {
|
|
return this.mImpl.getRatingType();
|
|
}
|
|
|
|
public boolean isCaptioningEnabled() {
|
|
return this.mImpl.isCaptioningEnabled();
|
|
}
|
|
|
|
public int getRepeatMode() {
|
|
return this.mImpl.getRepeatMode();
|
|
}
|
|
|
|
public int getShuffleMode() {
|
|
return this.mImpl.getShuffleMode();
|
|
}
|
|
|
|
public long getFlags() {
|
|
return this.mImpl.getFlags();
|
|
}
|
|
|
|
public PlaybackInfo getPlaybackInfo() {
|
|
return this.mImpl.getPlaybackInfo();
|
|
}
|
|
|
|
public PendingIntent getSessionActivity() {
|
|
return this.mImpl.getSessionActivity();
|
|
}
|
|
|
|
@Nullable
|
|
@RestrictTo({RestrictTo.Scope.LIBRARY})
|
|
public VersionedParcelable getSession2Token() {
|
|
return this.mToken.getSession2Token();
|
|
}
|
|
|
|
public void setVolumeTo(int i, int i2) {
|
|
this.mImpl.setVolumeTo(i, i2);
|
|
}
|
|
|
|
public void adjustVolume(int i, int i2) {
|
|
this.mImpl.adjustVolume(i, i2);
|
|
}
|
|
|
|
public void registerCallback(@NonNull Callback callback) {
|
|
registerCallback(callback, null);
|
|
}
|
|
|
|
public void registerCallback(@NonNull Callback callback, Handler handler) {
|
|
if (callback == null) {
|
|
throw new IllegalArgumentException("callback must not be null");
|
|
}
|
|
if (this.mRegisteredCallbacks.putIfAbsent(callback, Boolean.TRUE) != null) {
|
|
Log.w(TAG, "the callback has already been registered");
|
|
return;
|
|
}
|
|
if (handler == null) {
|
|
handler = new Handler();
|
|
}
|
|
callback.setHandler(handler);
|
|
this.mImpl.registerCallback(callback, handler);
|
|
}
|
|
|
|
public void unregisterCallback(@NonNull Callback callback) {
|
|
if (callback == null) {
|
|
throw new IllegalArgumentException("callback must not be null");
|
|
}
|
|
if (this.mRegisteredCallbacks.remove(callback) == null) {
|
|
Log.w(TAG, "the callback has never been registered");
|
|
return;
|
|
}
|
|
try {
|
|
this.mImpl.unregisterCallback(callback);
|
|
} finally {
|
|
callback.setHandler(null);
|
|
}
|
|
}
|
|
|
|
public void sendCommand(@NonNull String str, @Nullable Bundle bundle, @Nullable ResultReceiver resultReceiver) {
|
|
if (TextUtils.isEmpty(str)) {
|
|
throw new IllegalArgumentException("command must neither be null nor empty");
|
|
}
|
|
this.mImpl.sendCommand(str, bundle, resultReceiver);
|
|
}
|
|
|
|
public boolean isSessionReady() {
|
|
return this.mImpl.isSessionReady();
|
|
}
|
|
|
|
public String getPackageName() {
|
|
return this.mImpl.getPackageName();
|
|
}
|
|
|
|
@NonNull
|
|
public Bundle getSessionInfo() {
|
|
return this.mImpl.getSessionInfo();
|
|
}
|
|
|
|
public Object getMediaController() {
|
|
return this.mImpl.getMediaController();
|
|
}
|
|
|
|
public static abstract class Callback implements IBinder.DeathRecipient {
|
|
final MediaController.Callback mCallbackFwk = new MediaControllerCallbackApi21(this);
|
|
MessageHandler mHandler;
|
|
IMediaControllerCallback mIControllerCallback;
|
|
|
|
@RestrictTo({RestrictTo.Scope.LIBRARY_GROUP_PREFIX})
|
|
public IMediaControllerCallback getIControllerCallback() {
|
|
return this.mIControllerCallback;
|
|
}
|
|
|
|
public void onAudioInfoChanged(PlaybackInfo playbackInfo) {
|
|
}
|
|
|
|
public void onCaptioningEnabledChanged(boolean z) {
|
|
}
|
|
|
|
public void onExtrasChanged(Bundle bundle) {
|
|
}
|
|
|
|
public void onMetadataChanged(MediaMetadataCompat mediaMetadataCompat) {
|
|
}
|
|
|
|
public void onPlaybackStateChanged(PlaybackStateCompat playbackStateCompat) {
|
|
}
|
|
|
|
public void onQueueChanged(List<MediaSessionCompat.QueueItem> list) {
|
|
}
|
|
|
|
public void onQueueTitleChanged(CharSequence charSequence) {
|
|
}
|
|
|
|
public void onRepeatModeChanged(int i) {
|
|
}
|
|
|
|
public void onSessionDestroyed() {
|
|
}
|
|
|
|
public void onSessionEvent(String str, Bundle bundle) {
|
|
}
|
|
|
|
public void onSessionReady() {
|
|
}
|
|
|
|
public void onShuffleModeChanged(int i) {
|
|
}
|
|
|
|
@Override // android.os.IBinder.DeathRecipient
|
|
public void binderDied() {
|
|
postToHandler(8, null, null);
|
|
}
|
|
|
|
public void setHandler(Handler handler) {
|
|
if (handler != null) {
|
|
MessageHandler messageHandler = new MessageHandler(handler.getLooper());
|
|
this.mHandler = messageHandler;
|
|
messageHandler.mRegistered = true;
|
|
} else {
|
|
MessageHandler messageHandler2 = this.mHandler;
|
|
if (messageHandler2 != null) {
|
|
messageHandler2.mRegistered = false;
|
|
messageHandler2.removeCallbacksAndMessages(null);
|
|
this.mHandler = null;
|
|
}
|
|
}
|
|
}
|
|
|
|
public void postToHandler(int i, Object obj, Bundle bundle) {
|
|
MessageHandler messageHandler = this.mHandler;
|
|
if (messageHandler != null) {
|
|
Message obtainMessage = messageHandler.obtainMessage(i, obj);
|
|
obtainMessage.setData(bundle);
|
|
obtainMessage.sendToTarget();
|
|
}
|
|
}
|
|
|
|
@RequiresApi(21)
|
|
public static class MediaControllerCallbackApi21 extends MediaController.Callback {
|
|
private final WeakReference<Callback> mCallback;
|
|
|
|
public MediaControllerCallbackApi21(Callback callback) {
|
|
this.mCallback = new WeakReference<>(callback);
|
|
}
|
|
|
|
@Override // android.media.session.MediaController.Callback
|
|
public void onSessionDestroyed() {
|
|
Callback callback = this.mCallback.get();
|
|
if (callback != null) {
|
|
callback.onSessionDestroyed();
|
|
}
|
|
}
|
|
|
|
@Override // android.media.session.MediaController.Callback
|
|
public void onSessionEvent(String str, Bundle bundle) {
|
|
MediaSessionCompat.ensureClassLoader(bundle);
|
|
Callback callback = this.mCallback.get();
|
|
if (callback != null) {
|
|
callback.onSessionEvent(str, bundle);
|
|
}
|
|
}
|
|
|
|
@Override // android.media.session.MediaController.Callback
|
|
public void onPlaybackStateChanged(PlaybackState playbackState) {
|
|
Callback callback = this.mCallback.get();
|
|
if (callback == null || callback.mIControllerCallback != null) {
|
|
return;
|
|
}
|
|
callback.onPlaybackStateChanged(PlaybackStateCompat.fromPlaybackState(playbackState));
|
|
}
|
|
|
|
@Override // android.media.session.MediaController.Callback
|
|
public void onMetadataChanged(MediaMetadata mediaMetadata) {
|
|
Callback callback = this.mCallback.get();
|
|
if (callback != null) {
|
|
callback.onMetadataChanged(MediaMetadataCompat.fromMediaMetadata(mediaMetadata));
|
|
}
|
|
}
|
|
|
|
@Override // android.media.session.MediaController.Callback
|
|
public void onQueueChanged(List<MediaSession.QueueItem> list) {
|
|
Callback callback = this.mCallback.get();
|
|
if (callback != null) {
|
|
callback.onQueueChanged(MediaSessionCompat.QueueItem.fromQueueItemList(list));
|
|
}
|
|
}
|
|
|
|
@Override // android.media.session.MediaController.Callback
|
|
public void onQueueTitleChanged(CharSequence charSequence) {
|
|
Callback callback = this.mCallback.get();
|
|
if (callback != null) {
|
|
callback.onQueueTitleChanged(charSequence);
|
|
}
|
|
}
|
|
|
|
@Override // android.media.session.MediaController.Callback
|
|
public void onExtrasChanged(Bundle bundle) {
|
|
MediaSessionCompat.ensureClassLoader(bundle);
|
|
Callback callback = this.mCallback.get();
|
|
if (callback != null) {
|
|
callback.onExtrasChanged(bundle);
|
|
}
|
|
}
|
|
|
|
@Override // android.media.session.MediaController.Callback
|
|
public void onAudioInfoChanged(MediaController.PlaybackInfo playbackInfo) {
|
|
Callback callback = this.mCallback.get();
|
|
if (callback != null) {
|
|
callback.onAudioInfoChanged(new PlaybackInfo(playbackInfo.getPlaybackType(), AudioAttributesCompat.wrap(playbackInfo.getAudioAttributes()), playbackInfo.getVolumeControl(), playbackInfo.getMaxVolume(), playbackInfo.getCurrentVolume()));
|
|
}
|
|
}
|
|
}
|
|
|
|
public static class StubCompat extends IMediaControllerCallback.Stub {
|
|
private final WeakReference<Callback> mCallback;
|
|
|
|
@Override // android.support.v4.media.session.IMediaControllerCallback
|
|
public void onShuffleModeChangedRemoved(boolean z) throws RemoteException {
|
|
}
|
|
|
|
public StubCompat(Callback callback) {
|
|
this.mCallback = new WeakReference<>(callback);
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.IMediaControllerCallback
|
|
public void onEvent(String str, Bundle bundle) throws RemoteException {
|
|
Callback callback = this.mCallback.get();
|
|
if (callback != null) {
|
|
callback.postToHandler(1, str, bundle);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.IMediaControllerCallback
|
|
public void onSessionDestroyed() throws RemoteException {
|
|
Callback callback = this.mCallback.get();
|
|
if (callback != null) {
|
|
callback.postToHandler(8, null, null);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.IMediaControllerCallback
|
|
public void onPlaybackStateChanged(PlaybackStateCompat playbackStateCompat) throws RemoteException {
|
|
Callback callback = this.mCallback.get();
|
|
if (callback != null) {
|
|
callback.postToHandler(2, playbackStateCompat, null);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.IMediaControllerCallback
|
|
public void onMetadataChanged(MediaMetadataCompat mediaMetadataCompat) throws RemoteException {
|
|
Callback callback = this.mCallback.get();
|
|
if (callback != null) {
|
|
callback.postToHandler(3, mediaMetadataCompat, null);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.IMediaControllerCallback
|
|
public void onQueueChanged(List<MediaSessionCompat.QueueItem> list) throws RemoteException {
|
|
Callback callback = this.mCallback.get();
|
|
if (callback != null) {
|
|
callback.postToHandler(5, list, null);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.IMediaControllerCallback
|
|
public void onQueueTitleChanged(CharSequence charSequence) throws RemoteException {
|
|
Callback callback = this.mCallback.get();
|
|
if (callback != null) {
|
|
callback.postToHandler(6, charSequence, null);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.IMediaControllerCallback
|
|
public void onCaptioningEnabledChanged(boolean z) throws RemoteException {
|
|
Callback callback = this.mCallback.get();
|
|
if (callback != null) {
|
|
callback.postToHandler(11, Boolean.valueOf(z), null);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.IMediaControllerCallback
|
|
public void onRepeatModeChanged(int i) throws RemoteException {
|
|
Callback callback = this.mCallback.get();
|
|
if (callback != null) {
|
|
callback.postToHandler(9, Integer.valueOf(i), null);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.IMediaControllerCallback
|
|
public void onShuffleModeChanged(int i) throws RemoteException {
|
|
Callback callback = this.mCallback.get();
|
|
if (callback != null) {
|
|
callback.postToHandler(12, Integer.valueOf(i), null);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.IMediaControllerCallback
|
|
public void onExtrasChanged(Bundle bundle) throws RemoteException {
|
|
Callback callback = this.mCallback.get();
|
|
if (callback != null) {
|
|
callback.postToHandler(7, bundle, null);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.IMediaControllerCallback
|
|
public void onVolumeInfoChanged(ParcelableVolumeInfo parcelableVolumeInfo) throws RemoteException {
|
|
Callback callback = this.mCallback.get();
|
|
if (callback != null) {
|
|
callback.postToHandler(4, parcelableVolumeInfo != null ? new PlaybackInfo(parcelableVolumeInfo.volumeType, parcelableVolumeInfo.audioStream, parcelableVolumeInfo.controlType, parcelableVolumeInfo.maxVolume, parcelableVolumeInfo.currentVolume) : null, null);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.IMediaControllerCallback
|
|
public void onSessionReady() throws RemoteException {
|
|
Callback callback = this.mCallback.get();
|
|
if (callback != null) {
|
|
callback.postToHandler(13, null, null);
|
|
}
|
|
}
|
|
}
|
|
|
|
public class MessageHandler extends Handler {
|
|
private static final int MSG_DESTROYED = 8;
|
|
private static final int MSG_EVENT = 1;
|
|
private static final int MSG_SESSION_READY = 13;
|
|
private static final int MSG_UPDATE_CAPTIONING_ENABLED = 11;
|
|
private static final int MSG_UPDATE_EXTRAS = 7;
|
|
private static final int MSG_UPDATE_METADATA = 3;
|
|
private static final int MSG_UPDATE_PLAYBACK_STATE = 2;
|
|
private static final int MSG_UPDATE_QUEUE = 5;
|
|
private static final int MSG_UPDATE_QUEUE_TITLE = 6;
|
|
private static final int MSG_UPDATE_REPEAT_MODE = 9;
|
|
private static final int MSG_UPDATE_SHUFFLE_MODE = 12;
|
|
private static final int MSG_UPDATE_VOLUME = 4;
|
|
boolean mRegistered;
|
|
|
|
public MessageHandler(Looper looper) {
|
|
super(looper);
|
|
this.mRegistered = false;
|
|
}
|
|
|
|
@Override // android.os.Handler
|
|
public void handleMessage(Message message) {
|
|
if (this.mRegistered) {
|
|
switch (message.what) {
|
|
case 1:
|
|
Bundle data = message.getData();
|
|
MediaSessionCompat.ensureClassLoader(data);
|
|
Callback.this.onSessionEvent((String) message.obj, data);
|
|
break;
|
|
case 2:
|
|
Callback.this.onPlaybackStateChanged((PlaybackStateCompat) message.obj);
|
|
break;
|
|
case 3:
|
|
Callback.this.onMetadataChanged((MediaMetadataCompat) message.obj);
|
|
break;
|
|
case 4:
|
|
Callback.this.onAudioInfoChanged((PlaybackInfo) message.obj);
|
|
break;
|
|
case 5:
|
|
Callback.this.onQueueChanged((List) message.obj);
|
|
break;
|
|
case 6:
|
|
Callback.this.onQueueTitleChanged((CharSequence) message.obj);
|
|
break;
|
|
case 7:
|
|
Bundle bundle = (Bundle) message.obj;
|
|
MediaSessionCompat.ensureClassLoader(bundle);
|
|
Callback.this.onExtrasChanged(bundle);
|
|
break;
|
|
case 8:
|
|
Callback.this.onSessionDestroyed();
|
|
break;
|
|
case 9:
|
|
Callback.this.onRepeatModeChanged(((Integer) message.obj).intValue());
|
|
break;
|
|
case 11:
|
|
Callback.this.onCaptioningEnabledChanged(((Boolean) message.obj).booleanValue());
|
|
break;
|
|
case 12:
|
|
Callback.this.onShuffleModeChanged(((Integer) message.obj).intValue());
|
|
break;
|
|
case 13:
|
|
Callback.this.onSessionReady();
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public static final class PlaybackInfo {
|
|
public static final int PLAYBACK_TYPE_LOCAL = 1;
|
|
public static final int PLAYBACK_TYPE_REMOTE = 2;
|
|
private final AudioAttributesCompat mAudioAttrsCompat;
|
|
private final int mCurrentVolume;
|
|
private final int mMaxVolume;
|
|
private final int mPlaybackType;
|
|
private final int mVolumeControl;
|
|
|
|
@NonNull
|
|
public AudioAttributesCompat getAudioAttributes() {
|
|
return this.mAudioAttrsCompat;
|
|
}
|
|
|
|
public int getCurrentVolume() {
|
|
return this.mCurrentVolume;
|
|
}
|
|
|
|
public int getMaxVolume() {
|
|
return this.mMaxVolume;
|
|
}
|
|
|
|
public int getPlaybackType() {
|
|
return this.mPlaybackType;
|
|
}
|
|
|
|
public int getVolumeControl() {
|
|
return this.mVolumeControl;
|
|
}
|
|
|
|
public PlaybackInfo(int i, int i2, int i3, int i4, int i5) {
|
|
this(i, new AudioAttributesCompat.Builder().setLegacyStreamType(i2).build(), i3, i4, i5);
|
|
}
|
|
|
|
public PlaybackInfo(int i, @NonNull AudioAttributesCompat audioAttributesCompat, int i2, int i3, int i4) {
|
|
this.mPlaybackType = i;
|
|
this.mAudioAttrsCompat = audioAttributesCompat;
|
|
this.mVolumeControl = i2;
|
|
this.mMaxVolume = i3;
|
|
this.mCurrentVolume = i4;
|
|
}
|
|
|
|
@Deprecated
|
|
public int getAudioStream() {
|
|
return this.mAudioAttrsCompat.getLegacyStreamType();
|
|
}
|
|
}
|
|
|
|
public static class MediaControllerImplBase implements MediaControllerImpl {
|
|
private IMediaSession mBinder;
|
|
private Bundle mSessionInfo;
|
|
private TransportControls mTransportControls;
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public Object getMediaController() {
|
|
return null;
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public boolean isSessionReady() {
|
|
return true;
|
|
}
|
|
|
|
public MediaControllerImplBase(MediaSessionCompat.Token token) {
|
|
this.mBinder = IMediaSession.Stub.asInterface((IBinder) token.getToken());
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public void registerCallback(Callback callback, Handler handler) {
|
|
if (callback == null) {
|
|
throw new IllegalArgumentException("callback may not be null.");
|
|
}
|
|
try {
|
|
this.mBinder.asBinder().linkToDeath(callback, 0);
|
|
this.mBinder.registerCallbackListener(callback.mIControllerCallback);
|
|
callback.postToHandler(13, null, null);
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in registerCallback.", e);
|
|
callback.postToHandler(8, null, null);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public void unregisterCallback(Callback callback) {
|
|
if (callback == null) {
|
|
throw new IllegalArgumentException("callback may not be null.");
|
|
}
|
|
try {
|
|
this.mBinder.unregisterCallbackListener(callback.mIControllerCallback);
|
|
this.mBinder.asBinder().unlinkToDeath(callback, 0);
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in unregisterCallback.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public boolean dispatchMediaButtonEvent(KeyEvent keyEvent) {
|
|
if (keyEvent == null) {
|
|
throw new IllegalArgumentException("event may not be null.");
|
|
}
|
|
try {
|
|
this.mBinder.sendMediaButton(keyEvent);
|
|
return false;
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in dispatchMediaButtonEvent.", e);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public TransportControls getTransportControls() {
|
|
if (this.mTransportControls == null) {
|
|
this.mTransportControls = new TransportControlsBase(this.mBinder);
|
|
}
|
|
return this.mTransportControls;
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public PlaybackStateCompat getPlaybackState() {
|
|
try {
|
|
return this.mBinder.getPlaybackState();
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in getPlaybackState.", e);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public MediaMetadataCompat getMetadata() {
|
|
try {
|
|
return this.mBinder.getMetadata();
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in getMetadata.", e);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public List<MediaSessionCompat.QueueItem> getQueue() {
|
|
try {
|
|
return this.mBinder.getQueue();
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in getQueue.", e);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public void addQueueItem(MediaDescriptionCompat mediaDescriptionCompat) {
|
|
try {
|
|
if ((this.mBinder.getFlags() & 4) == 0) {
|
|
throw new UnsupportedOperationException("This session doesn't support queue management operations");
|
|
}
|
|
this.mBinder.addQueueItem(mediaDescriptionCompat);
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in addQueueItem.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public void addQueueItem(MediaDescriptionCompat mediaDescriptionCompat, int i) {
|
|
try {
|
|
if ((this.mBinder.getFlags() & 4) == 0) {
|
|
throw new UnsupportedOperationException("This session doesn't support queue management operations");
|
|
}
|
|
this.mBinder.addQueueItemAt(mediaDescriptionCompat, i);
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in addQueueItemAt.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public void removeQueueItem(MediaDescriptionCompat mediaDescriptionCompat) {
|
|
try {
|
|
if ((this.mBinder.getFlags() & 4) == 0) {
|
|
throw new UnsupportedOperationException("This session doesn't support queue management operations");
|
|
}
|
|
this.mBinder.removeQueueItem(mediaDescriptionCompat);
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in removeQueueItem.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public CharSequence getQueueTitle() {
|
|
try {
|
|
return this.mBinder.getQueueTitle();
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in getQueueTitle.", e);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public Bundle getExtras() {
|
|
try {
|
|
return this.mBinder.getExtras();
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in getExtras.", e);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public int getRatingType() {
|
|
try {
|
|
return this.mBinder.getRatingType();
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in getRatingType.", e);
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public boolean isCaptioningEnabled() {
|
|
try {
|
|
return this.mBinder.isCaptioningEnabled();
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in isCaptioningEnabled.", e);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public int getRepeatMode() {
|
|
try {
|
|
return this.mBinder.getRepeatMode();
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in getRepeatMode.", e);
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public int getShuffleMode() {
|
|
try {
|
|
return this.mBinder.getShuffleMode();
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in getShuffleMode.", e);
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public long getFlags() {
|
|
try {
|
|
return this.mBinder.getFlags();
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in getFlags.", e);
|
|
return 0L;
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public PlaybackInfo getPlaybackInfo() {
|
|
try {
|
|
ParcelableVolumeInfo volumeAttributes = this.mBinder.getVolumeAttributes();
|
|
return new PlaybackInfo(volumeAttributes.volumeType, volumeAttributes.audioStream, volumeAttributes.controlType, volumeAttributes.maxVolume, volumeAttributes.currentVolume);
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in getPlaybackInfo.", e);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public PendingIntent getSessionActivity() {
|
|
try {
|
|
return this.mBinder.getLaunchPendingIntent();
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in getSessionActivity.", e);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public void setVolumeTo(int i, int i2) {
|
|
try {
|
|
this.mBinder.setVolumeTo(i, i2, null);
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in setVolumeTo.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public void adjustVolume(int i, int i2) {
|
|
try {
|
|
this.mBinder.adjustVolume(i, i2, null);
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in adjustVolume.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public void sendCommand(String str, Bundle bundle, ResultReceiver resultReceiver) {
|
|
try {
|
|
this.mBinder.sendCommand(str, bundle, resultReceiver == null ? null : new MediaSessionCompat.ResultReceiverWrapper(resultReceiver));
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in sendCommand.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public String getPackageName() {
|
|
try {
|
|
return this.mBinder.getPackageName();
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in getPackageName.", e);
|
|
return null;
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public Bundle getSessionInfo() {
|
|
try {
|
|
this.mSessionInfo = this.mBinder.getSessionInfo();
|
|
} catch (RemoteException unused) {
|
|
}
|
|
Bundle unparcelWithClassLoader = MediaSessionCompat.unparcelWithClassLoader(this.mSessionInfo);
|
|
this.mSessionInfo = unparcelWithClassLoader;
|
|
return unparcelWithClassLoader == null ? Bundle.EMPTY : new Bundle(this.mSessionInfo);
|
|
}
|
|
}
|
|
|
|
public static class TransportControlsBase extends TransportControls {
|
|
private IMediaSession mBinder;
|
|
|
|
public TransportControlsBase(IMediaSession iMediaSession) {
|
|
this.mBinder = iMediaSession;
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void prepare() {
|
|
try {
|
|
this.mBinder.prepare();
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in prepare.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void prepareFromMediaId(String str, Bundle bundle) {
|
|
try {
|
|
this.mBinder.prepareFromMediaId(str, bundle);
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in prepareFromMediaId.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void prepareFromSearch(String str, Bundle bundle) {
|
|
try {
|
|
this.mBinder.prepareFromSearch(str, bundle);
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in prepareFromSearch.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void prepareFromUri(Uri uri, Bundle bundle) {
|
|
try {
|
|
this.mBinder.prepareFromUri(uri, bundle);
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in prepareFromUri.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void play() {
|
|
try {
|
|
this.mBinder.play();
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in play.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void playFromMediaId(String str, Bundle bundle) {
|
|
try {
|
|
this.mBinder.playFromMediaId(str, bundle);
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in playFromMediaId.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void playFromSearch(String str, Bundle bundle) {
|
|
try {
|
|
this.mBinder.playFromSearch(str, bundle);
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in playFromSearch.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void playFromUri(Uri uri, Bundle bundle) {
|
|
try {
|
|
this.mBinder.playFromUri(uri, bundle);
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in playFromUri.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void skipToQueueItem(long j) {
|
|
try {
|
|
this.mBinder.skipToQueueItem(j);
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in skipToQueueItem.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void pause() {
|
|
try {
|
|
this.mBinder.pause();
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in pause.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void stop() {
|
|
try {
|
|
this.mBinder.stop();
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in stop.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void seekTo(long j) {
|
|
try {
|
|
this.mBinder.seekTo(j);
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in seekTo.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void fastForward() {
|
|
try {
|
|
this.mBinder.fastForward();
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in fastForward.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void skipToNext() {
|
|
try {
|
|
this.mBinder.next();
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in skipToNext.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void rewind() {
|
|
try {
|
|
this.mBinder.rewind();
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in rewind.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void skipToPrevious() {
|
|
try {
|
|
this.mBinder.previous();
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in skipToPrevious.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void setRating(RatingCompat ratingCompat) {
|
|
try {
|
|
this.mBinder.rate(ratingCompat);
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in setRating.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void setRating(RatingCompat ratingCompat, Bundle bundle) {
|
|
try {
|
|
this.mBinder.rateWithExtras(ratingCompat, bundle);
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in setRating.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void setPlaybackSpeed(float f) {
|
|
if (f == 0.0f) {
|
|
throw new IllegalArgumentException("speed must not be zero");
|
|
}
|
|
try {
|
|
this.mBinder.setPlaybackSpeed(f);
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in setPlaybackSpeed.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void setCaptioningEnabled(boolean z) {
|
|
try {
|
|
this.mBinder.setCaptioningEnabled(z);
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in setCaptioningEnabled.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void setRepeatMode(int i) {
|
|
try {
|
|
this.mBinder.setRepeatMode(i);
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in setRepeatMode.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void setShuffleMode(int i) {
|
|
try {
|
|
this.mBinder.setShuffleMode(i);
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in setShuffleMode.", e);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void sendCustomAction(PlaybackStateCompat.CustomAction customAction, Bundle bundle) {
|
|
sendCustomAction(customAction.getAction(), bundle);
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void sendCustomAction(String str, Bundle bundle) {
|
|
MediaControllerCompat.validateCustomAction(str, bundle);
|
|
try {
|
|
this.mBinder.sendCustomAction(str, bundle);
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in sendCustomAction.", e);
|
|
}
|
|
}
|
|
}
|
|
|
|
@RequiresApi(21)
|
|
public static class MediaControllerImplApi21 implements MediaControllerImpl {
|
|
protected final MediaController mControllerFwk;
|
|
private Bundle mSessionInfo;
|
|
final MediaSessionCompat.Token mSessionToken;
|
|
final Object mLock = new Object();
|
|
|
|
@GuardedBy("mLock")
|
|
private final List<Callback> mPendingCallbacks = new ArrayList();
|
|
private HashMap<Callback, ExtraCallback> mCallbackMap = new HashMap<>();
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public Object getMediaController() {
|
|
return this.mControllerFwk;
|
|
}
|
|
|
|
public MediaControllerImplApi21(Context context, MediaSessionCompat.Token token) {
|
|
this.mSessionToken = token;
|
|
this.mControllerFwk = new MediaController(context, (MediaSession.Token) token.getToken());
|
|
if (token.getExtraBinder() == null) {
|
|
requestExtraBinder();
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public final void registerCallback(Callback callback, Handler handler) {
|
|
this.mControllerFwk.registerCallback(callback.mCallbackFwk, handler);
|
|
synchronized (this.mLock) {
|
|
if (this.mSessionToken.getExtraBinder() != null) {
|
|
ExtraCallback extraCallback = new ExtraCallback(callback);
|
|
this.mCallbackMap.put(callback, extraCallback);
|
|
callback.mIControllerCallback = extraCallback;
|
|
try {
|
|
this.mSessionToken.getExtraBinder().registerCallbackListener(extraCallback);
|
|
callback.postToHandler(13, null, null);
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in registerCallback.", e);
|
|
}
|
|
} else {
|
|
callback.mIControllerCallback = null;
|
|
this.mPendingCallbacks.add(callback);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public final void unregisterCallback(Callback callback) {
|
|
this.mControllerFwk.unregisterCallback(callback.mCallbackFwk);
|
|
synchronized (this.mLock) {
|
|
if (this.mSessionToken.getExtraBinder() != null) {
|
|
try {
|
|
ExtraCallback remove = this.mCallbackMap.remove(callback);
|
|
if (remove != null) {
|
|
callback.mIControllerCallback = null;
|
|
this.mSessionToken.getExtraBinder().unregisterCallbackListener(remove);
|
|
}
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in unregisterCallback.", e);
|
|
}
|
|
} else {
|
|
this.mPendingCallbacks.remove(callback);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public boolean dispatchMediaButtonEvent(KeyEvent keyEvent) {
|
|
return this.mControllerFwk.dispatchMediaButtonEvent(keyEvent);
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public TransportControls getTransportControls() {
|
|
return new TransportControlsApi21(this.mControllerFwk.getTransportControls());
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public PlaybackStateCompat getPlaybackState() {
|
|
if (this.mSessionToken.getExtraBinder() != null) {
|
|
try {
|
|
return this.mSessionToken.getExtraBinder().getPlaybackState();
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in getPlaybackState.", e);
|
|
}
|
|
}
|
|
PlaybackState playbackState = this.mControllerFwk.getPlaybackState();
|
|
if (playbackState != null) {
|
|
return PlaybackStateCompat.fromPlaybackState(playbackState);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public MediaMetadataCompat getMetadata() {
|
|
MediaMetadata metadata = this.mControllerFwk.getMetadata();
|
|
if (metadata != null) {
|
|
return MediaMetadataCompat.fromMediaMetadata(metadata);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public List<MediaSessionCompat.QueueItem> getQueue() {
|
|
List<MediaSession.QueueItem> queue = this.mControllerFwk.getQueue();
|
|
if (queue != null) {
|
|
return MediaSessionCompat.QueueItem.fromQueueItemList(queue);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public void addQueueItem(MediaDescriptionCompat mediaDescriptionCompat) {
|
|
if ((getFlags() & 4) == 0) {
|
|
throw new UnsupportedOperationException("This session doesn't support queue management operations");
|
|
}
|
|
Bundle bundle = new Bundle();
|
|
bundle.putParcelable(MediaControllerCompat.COMMAND_ARGUMENT_MEDIA_DESCRIPTION, mediaDescriptionCompat);
|
|
sendCommand(MediaControllerCompat.COMMAND_ADD_QUEUE_ITEM, bundle, null);
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public void addQueueItem(MediaDescriptionCompat mediaDescriptionCompat, int i) {
|
|
if ((getFlags() & 4) == 0) {
|
|
throw new UnsupportedOperationException("This session doesn't support queue management operations");
|
|
}
|
|
Bundle bundle = new Bundle();
|
|
bundle.putParcelable(MediaControllerCompat.COMMAND_ARGUMENT_MEDIA_DESCRIPTION, mediaDescriptionCompat);
|
|
bundle.putInt(MediaControllerCompat.COMMAND_ARGUMENT_INDEX, i);
|
|
sendCommand(MediaControllerCompat.COMMAND_ADD_QUEUE_ITEM_AT, bundle, null);
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public void removeQueueItem(MediaDescriptionCompat mediaDescriptionCompat) {
|
|
if ((getFlags() & 4) == 0) {
|
|
throw new UnsupportedOperationException("This session doesn't support queue management operations");
|
|
}
|
|
Bundle bundle = new Bundle();
|
|
bundle.putParcelable(MediaControllerCompat.COMMAND_ARGUMENT_MEDIA_DESCRIPTION, mediaDescriptionCompat);
|
|
sendCommand(MediaControllerCompat.COMMAND_REMOVE_QUEUE_ITEM, bundle, null);
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public CharSequence getQueueTitle() {
|
|
return this.mControllerFwk.getQueueTitle();
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public Bundle getExtras() {
|
|
return this.mControllerFwk.getExtras();
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public int getRatingType() {
|
|
return this.mControllerFwk.getRatingType();
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public boolean isCaptioningEnabled() {
|
|
if (this.mSessionToken.getExtraBinder() == null) {
|
|
return false;
|
|
}
|
|
try {
|
|
return this.mSessionToken.getExtraBinder().isCaptioningEnabled();
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in isCaptioningEnabled.", e);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public int getRepeatMode() {
|
|
if (this.mSessionToken.getExtraBinder() == null) {
|
|
return -1;
|
|
}
|
|
try {
|
|
return this.mSessionToken.getExtraBinder().getRepeatMode();
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in getRepeatMode.", e);
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public int getShuffleMode() {
|
|
if (this.mSessionToken.getExtraBinder() == null) {
|
|
return -1;
|
|
}
|
|
try {
|
|
return this.mSessionToken.getExtraBinder().getShuffleMode();
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in getShuffleMode.", e);
|
|
return -1;
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public long getFlags() {
|
|
return this.mControllerFwk.getFlags();
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public PlaybackInfo getPlaybackInfo() {
|
|
MediaController.PlaybackInfo playbackInfo = this.mControllerFwk.getPlaybackInfo();
|
|
if (playbackInfo != null) {
|
|
return new PlaybackInfo(playbackInfo.getPlaybackType(), AudioAttributesCompat.wrap(playbackInfo.getAudioAttributes()), playbackInfo.getVolumeControl(), playbackInfo.getMaxVolume(), playbackInfo.getCurrentVolume());
|
|
}
|
|
return null;
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public PendingIntent getSessionActivity() {
|
|
return this.mControllerFwk.getSessionActivity();
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public void setVolumeTo(int i, int i2) {
|
|
this.mControllerFwk.setVolumeTo(i, i2);
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public void adjustVolume(int i, int i2) {
|
|
this.mControllerFwk.adjustVolume(i, i2);
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public void sendCommand(String str, Bundle bundle, ResultReceiver resultReceiver) {
|
|
this.mControllerFwk.sendCommand(str, bundle, resultReceiver);
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public boolean isSessionReady() {
|
|
return this.mSessionToken.getExtraBinder() != null;
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public String getPackageName() {
|
|
return this.mControllerFwk.getPackageName();
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.MediaControllerImpl
|
|
public Bundle getSessionInfo() {
|
|
Bundle sessionInfo;
|
|
if (this.mSessionInfo != null) {
|
|
return new Bundle(this.mSessionInfo);
|
|
}
|
|
if (Build.VERSION.SDK_INT >= 29) {
|
|
sessionInfo = this.mControllerFwk.getSessionInfo();
|
|
this.mSessionInfo = sessionInfo;
|
|
} else if (this.mSessionToken.getExtraBinder() != null) {
|
|
try {
|
|
this.mSessionInfo = this.mSessionToken.getExtraBinder().getSessionInfo();
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in getSessionInfo.", e);
|
|
this.mSessionInfo = Bundle.EMPTY;
|
|
}
|
|
}
|
|
Bundle unparcelWithClassLoader = MediaSessionCompat.unparcelWithClassLoader(this.mSessionInfo);
|
|
this.mSessionInfo = unparcelWithClassLoader;
|
|
return unparcelWithClassLoader == null ? Bundle.EMPTY : new Bundle(this.mSessionInfo);
|
|
}
|
|
|
|
private void requestExtraBinder() {
|
|
sendCommand(MediaControllerCompat.COMMAND_GET_EXTRA_BINDER, null, new ExtraBinderRequestResultReceiver(this));
|
|
}
|
|
|
|
@GuardedBy("mLock")
|
|
public void processPendingCallbacksLocked() {
|
|
if (this.mSessionToken.getExtraBinder() == null) {
|
|
return;
|
|
}
|
|
for (Callback callback : this.mPendingCallbacks) {
|
|
ExtraCallback extraCallback = new ExtraCallback(callback);
|
|
this.mCallbackMap.put(callback, extraCallback);
|
|
callback.mIControllerCallback = extraCallback;
|
|
try {
|
|
this.mSessionToken.getExtraBinder().registerCallbackListener(extraCallback);
|
|
callback.postToHandler(13, null, null);
|
|
} catch (RemoteException e) {
|
|
Log.e(MediaControllerCompat.TAG, "Dead object in registerCallback.", e);
|
|
}
|
|
}
|
|
this.mPendingCallbacks.clear();
|
|
}
|
|
|
|
public static class ExtraBinderRequestResultReceiver extends ResultReceiver {
|
|
private WeakReference<MediaControllerImplApi21> mMediaControllerImpl;
|
|
|
|
public ExtraBinderRequestResultReceiver(MediaControllerImplApi21 mediaControllerImplApi21) {
|
|
super(null);
|
|
this.mMediaControllerImpl = new WeakReference<>(mediaControllerImplApi21);
|
|
}
|
|
|
|
@Override // android.os.ResultReceiver
|
|
public void onReceiveResult(int i, Bundle bundle) {
|
|
MediaControllerImplApi21 mediaControllerImplApi21 = this.mMediaControllerImpl.get();
|
|
if (mediaControllerImplApi21 == null || bundle == null) {
|
|
return;
|
|
}
|
|
synchronized (mediaControllerImplApi21.mLock) {
|
|
mediaControllerImplApi21.mSessionToken.setExtraBinder(IMediaSession.Stub.asInterface(BundleCompat.getBinder(bundle, MediaSessionCompat.KEY_EXTRA_BINDER)));
|
|
mediaControllerImplApi21.mSessionToken.setSession2Token(ParcelUtils.getVersionedParcelable(bundle, MediaSessionCompat.KEY_SESSION2_TOKEN));
|
|
mediaControllerImplApi21.processPendingCallbacksLocked();
|
|
}
|
|
}
|
|
}
|
|
|
|
public static class ExtraCallback extends Callback.StubCompat {
|
|
public ExtraCallback(Callback callback) {
|
|
super(callback);
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.Callback.StubCompat, android.support.v4.media.session.IMediaControllerCallback
|
|
public void onSessionDestroyed() throws RemoteException {
|
|
throw new AssertionError();
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.Callback.StubCompat, android.support.v4.media.session.IMediaControllerCallback
|
|
public void onMetadataChanged(MediaMetadataCompat mediaMetadataCompat) throws RemoteException {
|
|
throw new AssertionError();
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.Callback.StubCompat, android.support.v4.media.session.IMediaControllerCallback
|
|
public void onQueueChanged(List<MediaSessionCompat.QueueItem> list) throws RemoteException {
|
|
throw new AssertionError();
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.Callback.StubCompat, android.support.v4.media.session.IMediaControllerCallback
|
|
public void onQueueTitleChanged(CharSequence charSequence) throws RemoteException {
|
|
throw new AssertionError();
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.Callback.StubCompat, android.support.v4.media.session.IMediaControllerCallback
|
|
public void onExtrasChanged(Bundle bundle) throws RemoteException {
|
|
throw new AssertionError();
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.Callback.StubCompat, android.support.v4.media.session.IMediaControllerCallback
|
|
public void onVolumeInfoChanged(ParcelableVolumeInfo parcelableVolumeInfo) throws RemoteException {
|
|
throw new AssertionError();
|
|
}
|
|
}
|
|
}
|
|
|
|
@RequiresApi(21)
|
|
public static class TransportControlsApi21 extends TransportControls {
|
|
protected final MediaController.TransportControls mControlsFwk;
|
|
|
|
public TransportControlsApi21(MediaController.TransportControls transportControls) {
|
|
this.mControlsFwk = transportControls;
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void prepare() {
|
|
this.mControlsFwk.prepare();
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void prepareFromMediaId(String str, Bundle bundle) {
|
|
this.mControlsFwk.prepareFromMediaId(str, bundle);
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void prepareFromSearch(String str, Bundle bundle) {
|
|
this.mControlsFwk.prepareFromSearch(str, bundle);
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void prepareFromUri(Uri uri, Bundle bundle) {
|
|
this.mControlsFwk.prepareFromUri(uri, bundle);
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void play() {
|
|
this.mControlsFwk.play();
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void pause() {
|
|
this.mControlsFwk.pause();
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void stop() {
|
|
this.mControlsFwk.stop();
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void seekTo(long j) {
|
|
this.mControlsFwk.seekTo(j);
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void fastForward() {
|
|
this.mControlsFwk.fastForward();
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void rewind() {
|
|
this.mControlsFwk.rewind();
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void skipToNext() {
|
|
this.mControlsFwk.skipToNext();
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void skipToPrevious() {
|
|
this.mControlsFwk.skipToPrevious();
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void setRating(RatingCompat ratingCompat) {
|
|
this.mControlsFwk.setRating(ratingCompat != null ? (Rating) ratingCompat.getRating() : null);
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void setRating(RatingCompat ratingCompat, Bundle bundle) {
|
|
Bundle bundle2 = new Bundle();
|
|
bundle2.putParcelable(MediaSessionCompat.ACTION_ARGUMENT_RATING, ratingCompat);
|
|
bundle2.putBundle(MediaSessionCompat.ACTION_ARGUMENT_EXTRAS, bundle);
|
|
sendCustomAction(MediaSessionCompat.ACTION_SET_RATING, bundle2);
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void setPlaybackSpeed(float f) {
|
|
if (f == 0.0f) {
|
|
throw new IllegalArgumentException("speed must not be zero");
|
|
}
|
|
if (Build.VERSION.SDK_INT >= 29) {
|
|
this.mControlsFwk.setPlaybackSpeed(f);
|
|
return;
|
|
}
|
|
Bundle bundle = new Bundle();
|
|
bundle.putFloat(MediaSessionCompat.ACTION_ARGUMENT_PLAYBACK_SPEED, f);
|
|
sendCustomAction(MediaSessionCompat.ACTION_SET_PLAYBACK_SPEED, bundle);
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void setCaptioningEnabled(boolean z) {
|
|
Bundle bundle = new Bundle();
|
|
bundle.putBoolean(MediaSessionCompat.ACTION_ARGUMENT_CAPTIONING_ENABLED, z);
|
|
sendCustomAction(MediaSessionCompat.ACTION_SET_CAPTIONING_ENABLED, bundle);
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void setRepeatMode(int i) {
|
|
Bundle bundle = new Bundle();
|
|
bundle.putInt(MediaSessionCompat.ACTION_ARGUMENT_REPEAT_MODE, i);
|
|
sendCustomAction(MediaSessionCompat.ACTION_SET_REPEAT_MODE, bundle);
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void setShuffleMode(int i) {
|
|
Bundle bundle = new Bundle();
|
|
bundle.putInt(MediaSessionCompat.ACTION_ARGUMENT_SHUFFLE_MODE, i);
|
|
sendCustomAction(MediaSessionCompat.ACTION_SET_SHUFFLE_MODE, bundle);
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void playFromMediaId(String str, Bundle bundle) {
|
|
this.mControlsFwk.playFromMediaId(str, bundle);
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void playFromSearch(String str, Bundle bundle) {
|
|
this.mControlsFwk.playFromSearch(str, bundle);
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void playFromUri(Uri uri, Bundle bundle) {
|
|
this.mControlsFwk.playFromUri(uri, bundle);
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void skipToQueueItem(long j) {
|
|
this.mControlsFwk.skipToQueueItem(j);
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void sendCustomAction(PlaybackStateCompat.CustomAction customAction, Bundle bundle) {
|
|
MediaControllerCompat.validateCustomAction(customAction.getAction(), bundle);
|
|
this.mControlsFwk.sendCustomAction(customAction.getAction(), bundle);
|
|
}
|
|
|
|
@Override // android.support.v4.media.session.MediaControllerCompat.TransportControls
|
|
public void sendCustomAction(String str, Bundle bundle) {
|
|
MediaControllerCompat.validateCustomAction(str, bundle);
|
|
this.mControlsFwk.sendCustomAction(str, bundle);
|
|
}
|
|
}
|
|
}
|