Files
rr3-apk/decompiled-community/sources/android/support/v4/media/MediaBrowserCompat.java
Daniel Elliott c080f0d97f Add Discord community version (64-bit only)
- 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
2026-02-18 15:48:36 -08:00

1764 lines
81 KiB
Java

package android.support.v4.media;
import android.annotation.SuppressLint;
import android.content.ComponentName;
import android.content.Context;
import android.content.ServiceConnection;
import android.media.browse.MediaBrowser;
import android.os.BadParcelableException;
import android.os.Binder;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
import android.os.Message;
import android.os.Messenger;
import android.os.Parcel;
import android.os.Parcelable;
import android.os.Process;
import android.os.RemoteException;
import android.support.v4.media.session.IMediaSession;
import android.support.v4.media.session.MediaSessionCompat;
import android.support.v4.os.ResultReceiver;
import android.text.TextUtils;
import android.util.Log;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.RequiresApi;
import androidx.annotation.RestrictTo;
import androidx.collection.ArrayMap;
import androidx.core.app.BundleCompat;
import androidx.media.MediaBrowserCompatUtils;
import androidx.media.MediaBrowserProtocol;
import androidx.media.MediaBrowserServiceCompat;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/* loaded from: classes.dex */
public final class MediaBrowserCompat {
public static final String CUSTOM_ACTION_DOWNLOAD = "android.support.v4.media.action.DOWNLOAD";
public static final String CUSTOM_ACTION_REMOVE_DOWNLOADED_FILE = "android.support.v4.media.action.REMOVE_DOWNLOADED_FILE";
public static final String EXTRA_DOWNLOAD_PROGRESS = "android.media.browse.extra.DOWNLOAD_PROGRESS";
public static final String EXTRA_MEDIA_ID = "android.media.browse.extra.MEDIA_ID";
public static final String EXTRA_PAGE = "android.media.browse.extra.PAGE";
public static final String EXTRA_PAGE_SIZE = "android.media.browse.extra.PAGE_SIZE";
private final MediaBrowserImpl mImpl;
static final String TAG = "MediaBrowserCompat";
static final boolean DEBUG = Log.isLoggable(TAG, 3);
public static abstract class CustomActionCallback {
public void onError(String str, Bundle bundle, Bundle bundle2) {
}
public void onProgressUpdate(String str, Bundle bundle, Bundle bundle2) {
}
public void onResult(String str, Bundle bundle, Bundle bundle2) {
}
}
public interface MediaBrowserImpl {
void connect();
void disconnect();
@Nullable
Bundle getExtras();
void getItem(@NonNull String str, @NonNull ItemCallback itemCallback);
@Nullable
Bundle getNotifyChildrenChangedOptions();
@NonNull
String getRoot();
ComponentName getServiceComponent();
@NonNull
MediaSessionCompat.Token getSessionToken();
boolean isConnected();
void search(@NonNull String str, Bundle bundle, @NonNull SearchCallback searchCallback);
void sendCustomAction(@NonNull String str, Bundle bundle, @Nullable CustomActionCallback customActionCallback);
void subscribe(@NonNull String str, @Nullable Bundle bundle, @NonNull SubscriptionCallback subscriptionCallback);
void unsubscribe(@NonNull String str, SubscriptionCallback subscriptionCallback);
}
public interface MediaBrowserServiceCallbackImpl {
void onConnectionFailed(Messenger messenger);
void onLoadChildren(Messenger messenger, String str, List<MediaItem> list, Bundle bundle, Bundle bundle2);
void onServiceConnected(Messenger messenger, String str, MediaSessionCompat.Token token, Bundle bundle);
}
public static abstract class SearchCallback {
public void onError(@NonNull String str, Bundle bundle) {
}
public void onSearchResult(@NonNull String str, Bundle bundle, @NonNull List<MediaItem> list) {
}
}
public MediaBrowserCompat(Context context, ComponentName componentName, ConnectionCallback connectionCallback, Bundle bundle) {
this.mImpl = new MediaBrowserImplApi26(context, componentName, connectionCallback, bundle);
}
public void connect() {
this.mImpl.connect();
}
public void disconnect() {
this.mImpl.disconnect();
}
public boolean isConnected() {
return this.mImpl.isConnected();
}
@NonNull
public ComponentName getServiceComponent() {
return this.mImpl.getServiceComponent();
}
@NonNull
public String getRoot() {
return this.mImpl.getRoot();
}
@Nullable
public Bundle getExtras() {
return this.mImpl.getExtras();
}
@NonNull
public MediaSessionCompat.Token getSessionToken() {
return this.mImpl.getSessionToken();
}
public void subscribe(@NonNull String str, @NonNull SubscriptionCallback subscriptionCallback) {
if (TextUtils.isEmpty(str)) {
throw new IllegalArgumentException("parentId is empty");
}
if (subscriptionCallback == null) {
throw new IllegalArgumentException("callback is null");
}
this.mImpl.subscribe(str, null, subscriptionCallback);
}
public void subscribe(@NonNull String str, @NonNull Bundle bundle, @NonNull SubscriptionCallback subscriptionCallback) {
if (TextUtils.isEmpty(str)) {
throw new IllegalArgumentException("parentId is empty");
}
if (subscriptionCallback == null) {
throw new IllegalArgumentException("callback is null");
}
if (bundle == null) {
throw new IllegalArgumentException("options are null");
}
this.mImpl.subscribe(str, bundle, subscriptionCallback);
}
public void unsubscribe(@NonNull String str) {
if (TextUtils.isEmpty(str)) {
throw new IllegalArgumentException("parentId is empty");
}
this.mImpl.unsubscribe(str, null);
}
public void unsubscribe(@NonNull String str, @NonNull SubscriptionCallback subscriptionCallback) {
if (TextUtils.isEmpty(str)) {
throw new IllegalArgumentException("parentId is empty");
}
if (subscriptionCallback == null) {
throw new IllegalArgumentException("callback is null");
}
this.mImpl.unsubscribe(str, subscriptionCallback);
}
public void getItem(@NonNull String str, @NonNull ItemCallback itemCallback) {
this.mImpl.getItem(str, itemCallback);
}
public void search(@NonNull String str, Bundle bundle, @NonNull SearchCallback searchCallback) {
if (TextUtils.isEmpty(str)) {
throw new IllegalArgumentException("query cannot be empty");
}
if (searchCallback == null) {
throw new IllegalArgumentException("callback cannot be null");
}
this.mImpl.search(str, bundle, searchCallback);
}
public void sendCustomAction(@NonNull String str, Bundle bundle, @Nullable CustomActionCallback customActionCallback) {
if (TextUtils.isEmpty(str)) {
throw new IllegalArgumentException("action cannot be empty");
}
this.mImpl.sendCustomAction(str, bundle, customActionCallback);
}
@Nullable
@RestrictTo({RestrictTo.Scope.LIBRARY_GROUP_PREFIX})
public Bundle getNotifyChildrenChangedOptions() {
return this.mImpl.getNotifyChildrenChangedOptions();
}
@SuppressLint({"BanParcelableUsage"})
public static class MediaItem implements Parcelable {
public static final Parcelable.Creator<MediaItem> CREATOR = new Parcelable.Creator<MediaItem>() { // from class: android.support.v4.media.MediaBrowserCompat.MediaItem.1
/* JADX WARN: Can't rename method to resolve collision */
@Override // android.os.Parcelable.Creator
public MediaItem createFromParcel(Parcel parcel) {
return new MediaItem(parcel);
}
/* JADX WARN: Can't rename method to resolve collision */
@Override // android.os.Parcelable.Creator
public MediaItem[] newArray(int i) {
return new MediaItem[i];
}
};
public static final int FLAG_BROWSABLE = 1;
public static final int FLAG_PLAYABLE = 2;
private final MediaDescriptionCompat mDescription;
private final int mFlags;
@Override // android.os.Parcelable
public int describeContents() {
return 0;
}
@NonNull
public MediaDescriptionCompat getDescription() {
return this.mDescription;
}
public int getFlags() {
return this.mFlags;
}
public boolean isBrowsable() {
return (this.mFlags & 1) != 0;
}
public boolean isPlayable() {
return (this.mFlags & 2) != 0;
}
public static MediaItem fromMediaItem(Object obj) {
if (obj == null) {
return null;
}
MediaBrowser.MediaItem mediaItem = (MediaBrowser.MediaItem) obj;
return new MediaItem(MediaDescriptionCompat.fromMediaDescription(mediaItem.getDescription()), mediaItem.getFlags());
}
public static List<MediaItem> fromMediaItemList(List<?> list) {
if (list == null) {
return null;
}
ArrayList arrayList = new ArrayList(list.size());
Iterator<?> it = list.iterator();
while (it.hasNext()) {
arrayList.add(fromMediaItem(it.next()));
}
return arrayList;
}
public MediaItem(@NonNull MediaDescriptionCompat mediaDescriptionCompat, int i) {
if (mediaDescriptionCompat == null) {
throw new IllegalArgumentException("description cannot be null");
}
if (TextUtils.isEmpty(mediaDescriptionCompat.getMediaId())) {
throw new IllegalArgumentException("description must have a non-empty media id");
}
this.mFlags = i;
this.mDescription = mediaDescriptionCompat;
}
public MediaItem(Parcel parcel) {
this.mFlags = parcel.readInt();
this.mDescription = MediaDescriptionCompat.CREATOR.createFromParcel(parcel);
}
@Override // android.os.Parcelable
public void writeToParcel(Parcel parcel, int i) {
parcel.writeInt(this.mFlags);
this.mDescription.writeToParcel(parcel, i);
}
@NonNull
public String toString() {
return "MediaItem{mFlags=" + this.mFlags + ", mDescription=" + this.mDescription + '}';
}
@Nullable
public String getMediaId() {
return this.mDescription.getMediaId();
}
}
public static class ConnectionCallback {
final MediaBrowser.ConnectionCallback mConnectionCallbackFwk = new ConnectionCallbackApi21();
ConnectionCallbackInternal mConnectionCallbackInternal;
public interface ConnectionCallbackInternal {
void onConnected();
void onConnectionFailed();
void onConnectionSuspended();
}
public void onConnected() {
}
public void onConnectionFailed() {
}
public void onConnectionSuspended() {
}
public void setInternalConnectionCallback(ConnectionCallbackInternal connectionCallbackInternal) {
this.mConnectionCallbackInternal = connectionCallbackInternal;
}
@RequiresApi(21)
public class ConnectionCallbackApi21 extends MediaBrowser.ConnectionCallback {
public ConnectionCallbackApi21() {
}
@Override // android.media.browse.MediaBrowser.ConnectionCallback
public void onConnected() {
ConnectionCallbackInternal connectionCallbackInternal = ConnectionCallback.this.mConnectionCallbackInternal;
if (connectionCallbackInternal != null) {
connectionCallbackInternal.onConnected();
}
ConnectionCallback.this.onConnected();
}
@Override // android.media.browse.MediaBrowser.ConnectionCallback
public void onConnectionSuspended() {
ConnectionCallbackInternal connectionCallbackInternal = ConnectionCallback.this.mConnectionCallbackInternal;
if (connectionCallbackInternal != null) {
connectionCallbackInternal.onConnectionSuspended();
}
ConnectionCallback.this.onConnectionSuspended();
}
@Override // android.media.browse.MediaBrowser.ConnectionCallback
public void onConnectionFailed() {
ConnectionCallbackInternal connectionCallbackInternal = ConnectionCallback.this.mConnectionCallbackInternal;
if (connectionCallbackInternal != null) {
connectionCallbackInternal.onConnectionFailed();
}
ConnectionCallback.this.onConnectionFailed();
}
}
}
public static abstract class SubscriptionCallback {
WeakReference<Subscription> mSubscriptionRef;
final IBinder mToken = new Binder();
final MediaBrowser.SubscriptionCallback mSubscriptionCallbackFwk = new SubscriptionCallbackApi26();
public void onChildrenLoaded(@NonNull String str, @NonNull List<MediaItem> list) {
}
public void onChildrenLoaded(@NonNull String str, @NonNull List<MediaItem> list, @NonNull Bundle bundle) {
}
public void onError(@NonNull String str) {
}
public void onError(@NonNull String str, @NonNull Bundle bundle) {
}
public void setSubscription(Subscription subscription) {
this.mSubscriptionRef = new WeakReference<>(subscription);
}
@RequiresApi(21)
public class SubscriptionCallbackApi21 extends MediaBrowser.SubscriptionCallback {
public SubscriptionCallbackApi21() {
}
@Override // android.media.browse.MediaBrowser.SubscriptionCallback
public void onChildrenLoaded(@NonNull String str, List<MediaBrowser.MediaItem> list) {
WeakReference<Subscription> weakReference = SubscriptionCallback.this.mSubscriptionRef;
Subscription subscription = weakReference == null ? null : weakReference.get();
if (subscription == null) {
SubscriptionCallback.this.onChildrenLoaded(str, MediaItem.fromMediaItemList(list));
return;
}
List<MediaItem> fromMediaItemList = MediaItem.fromMediaItemList(list);
List<SubscriptionCallback> callbacks = subscription.getCallbacks();
List<Bundle> optionsList = subscription.getOptionsList();
for (int i = 0; i < callbacks.size(); i++) {
Bundle bundle = optionsList.get(i);
if (bundle == null) {
SubscriptionCallback.this.onChildrenLoaded(str, fromMediaItemList);
} else {
SubscriptionCallback.this.onChildrenLoaded(str, applyOptions(fromMediaItemList, bundle), bundle);
}
}
}
@Override // android.media.browse.MediaBrowser.SubscriptionCallback
public void onError(@NonNull String str) {
SubscriptionCallback.this.onError(str);
}
public List<MediaItem> applyOptions(List<MediaItem> list, Bundle bundle) {
if (list == null) {
return null;
}
int i = bundle.getInt(MediaBrowserCompat.EXTRA_PAGE, -1);
int i2 = bundle.getInt(MediaBrowserCompat.EXTRA_PAGE_SIZE, -1);
if (i == -1 && i2 == -1) {
return list;
}
int i3 = i2 * i;
int i4 = i3 + i2;
if (i < 0 || i2 < 1 || i3 >= list.size()) {
return Collections.emptyList();
}
if (i4 > list.size()) {
i4 = list.size();
}
return list.subList(i3, i4);
}
}
@RequiresApi(26)
public class SubscriptionCallbackApi26 extends SubscriptionCallbackApi21 {
public SubscriptionCallbackApi26() {
super();
}
@Override // android.media.browse.MediaBrowser.SubscriptionCallback
public void onChildrenLoaded(@NonNull String str, @NonNull List<MediaBrowser.MediaItem> list, @NonNull Bundle bundle) {
MediaSessionCompat.ensureClassLoader(bundle);
SubscriptionCallback.this.onChildrenLoaded(str, MediaItem.fromMediaItemList(list), bundle);
}
@Override // android.media.browse.MediaBrowser.SubscriptionCallback
public void onError(@NonNull String str, @NonNull Bundle bundle) {
MediaSessionCompat.ensureClassLoader(bundle);
SubscriptionCallback.this.onError(str, bundle);
}
}
}
public static abstract class ItemCallback {
final MediaBrowser.ItemCallback mItemCallbackFwk = new ItemCallbackApi23();
public void onError(@NonNull String str) {
}
public void onItemLoaded(MediaItem mediaItem) {
}
@RequiresApi(23)
public class ItemCallbackApi23 extends MediaBrowser.ItemCallback {
public ItemCallbackApi23() {
}
@Override // android.media.browse.MediaBrowser.ItemCallback
public void onItemLoaded(MediaBrowser.MediaItem mediaItem) {
ItemCallback.this.onItemLoaded(MediaItem.fromMediaItem(mediaItem));
}
@Override // android.media.browse.MediaBrowser.ItemCallback
public void onError(@NonNull String str) {
ItemCallback.this.onError(str);
}
}
}
public static class MediaBrowserImplBase implements MediaBrowserImpl, MediaBrowserServiceCallbackImpl {
static final int CONNECT_STATE_CONNECTED = 3;
static final int CONNECT_STATE_CONNECTING = 2;
static final int CONNECT_STATE_DISCONNECTED = 1;
static final int CONNECT_STATE_DISCONNECTING = 0;
static final int CONNECT_STATE_SUSPENDED = 4;
final ConnectionCallback mCallback;
Messenger mCallbacksMessenger;
final Context mContext;
private Bundle mExtras;
private MediaSessionCompat.Token mMediaSessionToken;
private Bundle mNotifyChildrenChangedOptions;
final Bundle mRootHints;
private String mRootId;
ServiceBinderWrapper mServiceBinderWrapper;
final ComponentName mServiceComponent;
MediaServiceConnection mServiceConnection;
final CallbackHandler mHandler = new CallbackHandler(this);
private final ArrayMap<String, Subscription> mSubscriptions = new ArrayMap<>();
int mState = 1;
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
public Bundle getNotifyChildrenChangedOptions() {
return this.mNotifyChildrenChangedOptions;
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
public boolean isConnected() {
return this.mState == 3;
}
public MediaBrowserImplBase(Context context, ComponentName componentName, ConnectionCallback connectionCallback, Bundle bundle) {
if (context == null) {
throw new IllegalArgumentException("context must not be null");
}
if (componentName == null) {
throw new IllegalArgumentException("service component must not be null");
}
if (connectionCallback == null) {
throw new IllegalArgumentException("connection callback must not be null");
}
this.mContext = context;
this.mServiceComponent = componentName;
this.mCallback = connectionCallback;
this.mRootHints = bundle == null ? null : new Bundle(bundle);
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
public void connect() {
int i = this.mState;
if (i != 0 && i != 1) {
throw new IllegalStateException("connect() called while neigther disconnecting nor disconnected (state=" + getStateLabel(this.mState) + ")");
}
this.mState = 2;
this.mHandler.post(new Runnable() { // from class: android.support.v4.media.MediaBrowserCompat.MediaBrowserImplBase.1
/* JADX WARN: Code restructure failed: missing block: B:18:0x0058, code lost:
if (r1.mContext.bindService(r0, r1.mServiceConnection, 1) == false) goto L21;
*/
@Override // java.lang.Runnable
/*
Code decompiled incorrectly, please refer to instructions dump.
To view partially-correct add '--show-bad-code' argument
*/
public void run() {
/*
r4 = this;
android.support.v4.media.MediaBrowserCompat$MediaBrowserImplBase r0 = android.support.v4.media.MediaBrowserCompat.MediaBrowserImplBase.this
int r1 = r0.mState
if (r1 != 0) goto L7
return
L7:
r1 = 2
r0.mState = r1
boolean r1 = android.support.v4.media.MediaBrowserCompat.DEBUG
if (r1 == 0) goto L2e
android.support.v4.media.MediaBrowserCompat$MediaBrowserImplBase$MediaServiceConnection r1 = r0.mServiceConnection
if (r1 != 0) goto L13
goto L2e
L13:
java.lang.RuntimeException r0 = new java.lang.RuntimeException
java.lang.StringBuilder r1 = new java.lang.StringBuilder
r1.<init>()
java.lang.String r2 = "mServiceConnection should be null. Instead it is "
r1.append(r2)
android.support.v4.media.MediaBrowserCompat$MediaBrowserImplBase r2 = android.support.v4.media.MediaBrowserCompat.MediaBrowserImplBase.this
android.support.v4.media.MediaBrowserCompat$MediaBrowserImplBase$MediaServiceConnection r2 = r2.mServiceConnection
r1.append(r2)
java.lang.String r1 = r1.toString()
r0.<init>(r1)
throw r0
L2e:
android.support.v4.media.MediaBrowserCompat$ServiceBinderWrapper r1 = r0.mServiceBinderWrapper
if (r1 != 0) goto La6
android.os.Messenger r0 = r0.mCallbacksMessenger
if (r0 != 0) goto L8b
android.content.Intent r0 = new android.content.Intent
java.lang.String r1 = "android.media.browse.MediaBrowserService"
r0.<init>(r1)
android.support.v4.media.MediaBrowserCompat$MediaBrowserImplBase r1 = android.support.v4.media.MediaBrowserCompat.MediaBrowserImplBase.this
android.content.ComponentName r1 = r1.mServiceComponent
r0.setComponent(r1)
android.support.v4.media.MediaBrowserCompat$MediaBrowserImplBase r1 = android.support.v4.media.MediaBrowserCompat.MediaBrowserImplBase.this
android.support.v4.media.MediaBrowserCompat$MediaBrowserImplBase$MediaServiceConnection r2 = new android.support.v4.media.MediaBrowserCompat$MediaBrowserImplBase$MediaServiceConnection
r2.<init>()
r1.mServiceConnection = r2
android.support.v4.media.MediaBrowserCompat$MediaBrowserImplBase r1 = android.support.v4.media.MediaBrowserCompat.MediaBrowserImplBase.this // Catch: java.lang.Exception -> L5b
android.content.Context r2 = r1.mContext // Catch: java.lang.Exception -> L5b
android.support.v4.media.MediaBrowserCompat$MediaBrowserImplBase$MediaServiceConnection r1 = r1.mServiceConnection // Catch: java.lang.Exception -> L5b
r3 = 1
boolean r0 = r2.bindService(r0, r1, r3) // Catch: java.lang.Exception -> L5b
if (r0 != 0) goto L81
goto L75
L5b:
java.lang.StringBuilder r0 = new java.lang.StringBuilder
r0.<init>()
java.lang.String r1 = "Failed binding to service "
r0.append(r1)
android.support.v4.media.MediaBrowserCompat$MediaBrowserImplBase r1 = android.support.v4.media.MediaBrowserCompat.MediaBrowserImplBase.this
android.content.ComponentName r1 = r1.mServiceComponent
r0.append(r1)
java.lang.String r0 = r0.toString()
java.lang.String r1 = "MediaBrowserCompat"
android.util.Log.e(r1, r0)
L75:
android.support.v4.media.MediaBrowserCompat$MediaBrowserImplBase r0 = android.support.v4.media.MediaBrowserCompat.MediaBrowserImplBase.this
r0.forceCloseConnection()
android.support.v4.media.MediaBrowserCompat$MediaBrowserImplBase r0 = android.support.v4.media.MediaBrowserCompat.MediaBrowserImplBase.this
android.support.v4.media.MediaBrowserCompat$ConnectionCallback r0 = r0.mCallback
r0.onConnectionFailed()
L81:
boolean r0 = android.support.v4.media.MediaBrowserCompat.DEBUG
if (r0 == 0) goto L8a
android.support.v4.media.MediaBrowserCompat$MediaBrowserImplBase r0 = android.support.v4.media.MediaBrowserCompat.MediaBrowserImplBase.this
r0.dump()
L8a:
return
L8b:
java.lang.RuntimeException r0 = new java.lang.RuntimeException
java.lang.StringBuilder r1 = new java.lang.StringBuilder
r1.<init>()
java.lang.String r2 = "mCallbacksMessenger should be null. Instead it is "
r1.append(r2)
android.support.v4.media.MediaBrowserCompat$MediaBrowserImplBase r2 = android.support.v4.media.MediaBrowserCompat.MediaBrowserImplBase.this
android.os.Messenger r2 = r2.mCallbacksMessenger
r1.append(r2)
java.lang.String r1 = r1.toString()
r0.<init>(r1)
throw r0
La6:
java.lang.RuntimeException r0 = new java.lang.RuntimeException
java.lang.StringBuilder r1 = new java.lang.StringBuilder
r1.<init>()
java.lang.String r2 = "mServiceBinderWrapper should be null. Instead it is "
r1.append(r2)
android.support.v4.media.MediaBrowserCompat$MediaBrowserImplBase r2 = android.support.v4.media.MediaBrowserCompat.MediaBrowserImplBase.this
android.support.v4.media.MediaBrowserCompat$ServiceBinderWrapper r2 = r2.mServiceBinderWrapper
r1.append(r2)
java.lang.String r1 = r1.toString()
r0.<init>(r1)
throw r0
*/
throw new UnsupportedOperationException("Method not decompiled: android.support.v4.media.MediaBrowserCompat.MediaBrowserImplBase.AnonymousClass1.run():void");
}
});
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
public void disconnect() {
this.mState = 0;
this.mHandler.post(new Runnable() { // from class: android.support.v4.media.MediaBrowserCompat.MediaBrowserImplBase.2
@Override // java.lang.Runnable
public void run() {
MediaBrowserImplBase mediaBrowserImplBase = MediaBrowserImplBase.this;
Messenger messenger = mediaBrowserImplBase.mCallbacksMessenger;
if (messenger != null) {
try {
mediaBrowserImplBase.mServiceBinderWrapper.disconnect(messenger);
} catch (RemoteException unused) {
Log.w(MediaBrowserCompat.TAG, "RemoteException during connect for " + MediaBrowserImplBase.this.mServiceComponent);
}
}
MediaBrowserImplBase mediaBrowserImplBase2 = MediaBrowserImplBase.this;
int i = mediaBrowserImplBase2.mState;
mediaBrowserImplBase2.forceCloseConnection();
if (i != 0) {
MediaBrowserImplBase.this.mState = i;
}
if (MediaBrowserCompat.DEBUG) {
MediaBrowserImplBase.this.dump();
}
}
});
}
public void forceCloseConnection() {
MediaServiceConnection mediaServiceConnection = this.mServiceConnection;
if (mediaServiceConnection != null) {
this.mContext.unbindService(mediaServiceConnection);
}
this.mState = 1;
this.mServiceConnection = null;
this.mServiceBinderWrapper = null;
this.mCallbacksMessenger = null;
this.mHandler.setCallbacksMessenger(null);
this.mRootId = null;
this.mMediaSessionToken = null;
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
@NonNull
public ComponentName getServiceComponent() {
if (isConnected()) {
return this.mServiceComponent;
}
throw new IllegalStateException("getServiceComponent() called while not connected (state=" + this.mState + ")");
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
@NonNull
public String getRoot() {
if (isConnected()) {
return this.mRootId;
}
throw new IllegalStateException("getRoot() called while not connected(state=" + getStateLabel(this.mState) + ")");
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
@Nullable
public Bundle getExtras() {
if (isConnected()) {
return this.mExtras;
}
throw new IllegalStateException("getExtras() called while not connected (state=" + getStateLabel(this.mState) + ")");
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
@NonNull
public MediaSessionCompat.Token getSessionToken() {
if (isConnected()) {
return this.mMediaSessionToken;
}
throw new IllegalStateException("getSessionToken() called while not connected(state=" + this.mState + ")");
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
public void subscribe(@NonNull String str, Bundle bundle, @NonNull SubscriptionCallback subscriptionCallback) {
Subscription subscription = this.mSubscriptions.get(str);
if (subscription == null) {
subscription = new Subscription();
this.mSubscriptions.put(str, subscription);
}
Bundle bundle2 = bundle == null ? null : new Bundle(bundle);
subscription.putCallback(bundle2, subscriptionCallback);
if (isConnected()) {
try {
this.mServiceBinderWrapper.addSubscription(str, subscriptionCallback.mToken, bundle2, this.mCallbacksMessenger);
} catch (RemoteException unused) {
StringBuilder sb = new StringBuilder();
sb.append("addSubscription failed with RemoteException parentId=");
sb.append(str);
}
}
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
public void unsubscribe(@NonNull String str, SubscriptionCallback subscriptionCallback) {
Subscription subscription = this.mSubscriptions.get(str);
if (subscription == null) {
return;
}
try {
if (subscriptionCallback == null) {
if (isConnected()) {
this.mServiceBinderWrapper.removeSubscription(str, null, this.mCallbacksMessenger);
}
} else {
List<SubscriptionCallback> callbacks = subscription.getCallbacks();
List<Bundle> optionsList = subscription.getOptionsList();
for (int size = callbacks.size() - 1; size >= 0; size--) {
if (callbacks.get(size) == subscriptionCallback) {
if (isConnected()) {
this.mServiceBinderWrapper.removeSubscription(str, subscriptionCallback.mToken, this.mCallbacksMessenger);
}
callbacks.remove(size);
optionsList.remove(size);
}
}
}
} catch (RemoteException unused) {
StringBuilder sb = new StringBuilder();
sb.append("removeSubscription failed with RemoteException parentId=");
sb.append(str);
}
if (subscription.isEmpty() || subscriptionCallback == null) {
this.mSubscriptions.remove(str);
}
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
public void getItem(@NonNull final String str, @NonNull final ItemCallback itemCallback) {
if (TextUtils.isEmpty(str)) {
throw new IllegalArgumentException("mediaId is empty");
}
if (itemCallback == null) {
throw new IllegalArgumentException("cb is null");
}
if (!isConnected()) {
this.mHandler.post(new Runnable() { // from class: android.support.v4.media.MediaBrowserCompat.MediaBrowserImplBase.3
@Override // java.lang.Runnable
public void run() {
itemCallback.onError(str);
}
});
return;
}
try {
this.mServiceBinderWrapper.getMediaItem(str, new ItemReceiver(str, itemCallback, this.mHandler), this.mCallbacksMessenger);
} catch (RemoteException unused) {
StringBuilder sb = new StringBuilder();
sb.append("Remote error getting media item: ");
sb.append(str);
this.mHandler.post(new Runnable() { // from class: android.support.v4.media.MediaBrowserCompat.MediaBrowserImplBase.4
@Override // java.lang.Runnable
public void run() {
itemCallback.onError(str);
}
});
}
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
public void search(@NonNull final String str, final Bundle bundle, @NonNull final SearchCallback searchCallback) {
if (!isConnected()) {
throw new IllegalStateException("search() called while not connected (state=" + getStateLabel(this.mState) + ")");
}
try {
this.mServiceBinderWrapper.search(str, bundle, new SearchResultReceiver(str, bundle, searchCallback, this.mHandler), this.mCallbacksMessenger);
} catch (RemoteException unused) {
StringBuilder sb = new StringBuilder();
sb.append("Remote error searching items with query: ");
sb.append(str);
this.mHandler.post(new Runnable() { // from class: android.support.v4.media.MediaBrowserCompat.MediaBrowserImplBase.5
@Override // java.lang.Runnable
public void run() {
searchCallback.onError(str, bundle);
}
});
}
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
public void sendCustomAction(@NonNull final String str, final Bundle bundle, @Nullable final CustomActionCallback customActionCallback) {
if (!isConnected()) {
throw new IllegalStateException("Cannot send a custom action (" + str + ") with extras " + bundle + " because the browser is not connected to the service.");
}
try {
this.mServiceBinderWrapper.sendCustomAction(str, bundle, new CustomActionResultReceiver(str, bundle, customActionCallback, this.mHandler), this.mCallbacksMessenger);
} catch (RemoteException unused) {
StringBuilder sb = new StringBuilder();
sb.append("Remote error sending a custom action: action=");
sb.append(str);
sb.append(", extras=");
sb.append(bundle);
if (customActionCallback != null) {
this.mHandler.post(new Runnable() { // from class: android.support.v4.media.MediaBrowserCompat.MediaBrowserImplBase.6
@Override // java.lang.Runnable
public void run() {
customActionCallback.onError(str, bundle, null);
}
});
}
}
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserServiceCallbackImpl
public void onServiceConnected(Messenger messenger, String str, MediaSessionCompat.Token token, Bundle bundle) {
if (isCurrent(messenger, "onConnect")) {
if (this.mState != 2) {
Log.w(MediaBrowserCompat.TAG, "onConnect from service while mState=" + getStateLabel(this.mState) + "... ignoring");
return;
}
this.mRootId = str;
this.mMediaSessionToken = token;
this.mExtras = bundle;
this.mState = 3;
if (MediaBrowserCompat.DEBUG) {
dump();
}
this.mCallback.onConnected();
try {
for (Map.Entry<String, Subscription> entry : this.mSubscriptions.entrySet()) {
String key = entry.getKey();
Subscription value = entry.getValue();
List<SubscriptionCallback> callbacks = value.getCallbacks();
List<Bundle> optionsList = value.getOptionsList();
for (int i = 0; i < callbacks.size(); i++) {
this.mServiceBinderWrapper.addSubscription(key, callbacks.get(i).mToken, optionsList.get(i), this.mCallbacksMessenger);
}
}
} catch (RemoteException unused) {
}
}
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserServiceCallbackImpl
public void onConnectionFailed(Messenger messenger) {
Log.e(MediaBrowserCompat.TAG, "onConnectFailed for " + this.mServiceComponent);
if (isCurrent(messenger, "onConnectFailed")) {
if (this.mState != 2) {
Log.w(MediaBrowserCompat.TAG, "onConnect from service while mState=" + getStateLabel(this.mState) + "... ignoring");
return;
}
forceCloseConnection();
this.mCallback.onConnectionFailed();
}
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserServiceCallbackImpl
public void onLoadChildren(Messenger messenger, String str, List<MediaItem> list, Bundle bundle, Bundle bundle2) {
if (isCurrent(messenger, "onLoadChildren")) {
boolean z = MediaBrowserCompat.DEBUG;
if (z) {
StringBuilder sb = new StringBuilder();
sb.append("onLoadChildren for ");
sb.append(this.mServiceComponent);
sb.append(" id=");
sb.append(str);
}
Subscription subscription = this.mSubscriptions.get(str);
if (subscription == null) {
if (z) {
StringBuilder sb2 = new StringBuilder();
sb2.append("onLoadChildren for id that isn't subscribed id=");
sb2.append(str);
return;
}
return;
}
SubscriptionCallback callback = subscription.getCallback(bundle);
if (callback != null) {
if (bundle == null) {
if (list == null) {
callback.onError(str);
return;
}
this.mNotifyChildrenChangedOptions = bundle2;
callback.onChildrenLoaded(str, list);
this.mNotifyChildrenChangedOptions = null;
return;
}
if (list == null) {
callback.onError(str, bundle);
return;
}
this.mNotifyChildrenChangedOptions = bundle2;
callback.onChildrenLoaded(str, list, bundle);
this.mNotifyChildrenChangedOptions = null;
}
}
}
private static String getStateLabel(int i) {
if (i == 0) {
return "CONNECT_STATE_DISCONNECTING";
}
if (i == 1) {
return "CONNECT_STATE_DISCONNECTED";
}
if (i == 2) {
return "CONNECT_STATE_CONNECTING";
}
if (i == 3) {
return "CONNECT_STATE_CONNECTED";
}
if (i == 4) {
return "CONNECT_STATE_SUSPENDED";
}
return "UNKNOWN/" + i;
}
private boolean isCurrent(Messenger messenger, String str) {
int i;
if (this.mCallbacksMessenger == messenger && (i = this.mState) != 0 && i != 1) {
return true;
}
int i2 = this.mState;
if (i2 == 0 || i2 == 1) {
return false;
}
StringBuilder sb = new StringBuilder();
sb.append(str);
sb.append(" for ");
sb.append(this.mServiceComponent);
sb.append(" with mCallbacksMessenger=");
sb.append(this.mCallbacksMessenger);
sb.append(" this=");
sb.append(this);
return false;
}
public void dump() {
StringBuilder sb = new StringBuilder();
sb.append(" mServiceComponent=");
sb.append(this.mServiceComponent);
StringBuilder sb2 = new StringBuilder();
sb2.append(" mCallback=");
sb2.append(this.mCallback);
StringBuilder sb3 = new StringBuilder();
sb3.append(" mRootHints=");
sb3.append(this.mRootHints);
StringBuilder sb4 = new StringBuilder();
sb4.append(" mState=");
sb4.append(getStateLabel(this.mState));
StringBuilder sb5 = new StringBuilder();
sb5.append(" mServiceConnection=");
sb5.append(this.mServiceConnection);
StringBuilder sb6 = new StringBuilder();
sb6.append(" mServiceBinderWrapper=");
sb6.append(this.mServiceBinderWrapper);
StringBuilder sb7 = new StringBuilder();
sb7.append(" mCallbacksMessenger=");
sb7.append(this.mCallbacksMessenger);
StringBuilder sb8 = new StringBuilder();
sb8.append(" mRootId=");
sb8.append(this.mRootId);
StringBuilder sb9 = new StringBuilder();
sb9.append(" mMediaSessionToken=");
sb9.append(this.mMediaSessionToken);
}
public class MediaServiceConnection implements ServiceConnection {
public MediaServiceConnection() {
}
@Override // android.content.ServiceConnection
public void onServiceConnected(final ComponentName componentName, final IBinder iBinder) {
postOrRun(new Runnable() { // from class: android.support.v4.media.MediaBrowserCompat.MediaBrowserImplBase.MediaServiceConnection.1
@Override // java.lang.Runnable
public void run() {
boolean z = MediaBrowserCompat.DEBUG;
if (z) {
StringBuilder sb = new StringBuilder();
sb.append("MediaServiceConnection.onServiceConnected name=");
sb.append(componentName);
sb.append(" binder=");
sb.append(iBinder);
MediaBrowserImplBase.this.dump();
}
if (MediaServiceConnection.this.isCurrent("onServiceConnected")) {
MediaBrowserImplBase mediaBrowserImplBase = MediaBrowserImplBase.this;
mediaBrowserImplBase.mServiceBinderWrapper = new ServiceBinderWrapper(iBinder, mediaBrowserImplBase.mRootHints);
MediaBrowserImplBase.this.mCallbacksMessenger = new Messenger(MediaBrowserImplBase.this.mHandler);
MediaBrowserImplBase mediaBrowserImplBase2 = MediaBrowserImplBase.this;
mediaBrowserImplBase2.mHandler.setCallbacksMessenger(mediaBrowserImplBase2.mCallbacksMessenger);
MediaBrowserImplBase.this.mState = 2;
if (z) {
try {
MediaBrowserImplBase.this.dump();
} catch (RemoteException unused) {
Log.w(MediaBrowserCompat.TAG, "RemoteException during connect for " + MediaBrowserImplBase.this.mServiceComponent);
if (MediaBrowserCompat.DEBUG) {
MediaBrowserImplBase.this.dump();
return;
}
return;
}
}
MediaBrowserImplBase mediaBrowserImplBase3 = MediaBrowserImplBase.this;
mediaBrowserImplBase3.mServiceBinderWrapper.connect(mediaBrowserImplBase3.mContext, mediaBrowserImplBase3.mCallbacksMessenger);
}
}
});
}
@Override // android.content.ServiceConnection
public void onServiceDisconnected(final ComponentName componentName) {
postOrRun(new Runnable() { // from class: android.support.v4.media.MediaBrowserCompat.MediaBrowserImplBase.MediaServiceConnection.2
@Override // java.lang.Runnable
public void run() {
if (MediaBrowserCompat.DEBUG) {
StringBuilder sb = new StringBuilder();
sb.append("MediaServiceConnection.onServiceDisconnected name=");
sb.append(componentName);
sb.append(" this=");
sb.append(this);
sb.append(" mServiceConnection=");
sb.append(MediaBrowserImplBase.this.mServiceConnection);
MediaBrowserImplBase.this.dump();
}
if (MediaServiceConnection.this.isCurrent("onServiceDisconnected")) {
MediaBrowserImplBase mediaBrowserImplBase = MediaBrowserImplBase.this;
mediaBrowserImplBase.mServiceBinderWrapper = null;
mediaBrowserImplBase.mCallbacksMessenger = null;
mediaBrowserImplBase.mHandler.setCallbacksMessenger(null);
MediaBrowserImplBase mediaBrowserImplBase2 = MediaBrowserImplBase.this;
mediaBrowserImplBase2.mState = 4;
mediaBrowserImplBase2.mCallback.onConnectionSuspended();
}
}
});
}
private void postOrRun(Runnable runnable) {
if (Thread.currentThread() == MediaBrowserImplBase.this.mHandler.getLooper().getThread()) {
runnable.run();
} else {
MediaBrowserImplBase.this.mHandler.post(runnable);
}
}
public boolean isCurrent(String str) {
int i;
MediaBrowserImplBase mediaBrowserImplBase = MediaBrowserImplBase.this;
if (mediaBrowserImplBase.mServiceConnection == this && (i = mediaBrowserImplBase.mState) != 0 && i != 1) {
return true;
}
int i2 = mediaBrowserImplBase.mState;
if (i2 == 0 || i2 == 1) {
return false;
}
StringBuilder sb = new StringBuilder();
sb.append(str);
sb.append(" for ");
sb.append(MediaBrowserImplBase.this.mServiceComponent);
sb.append(" with mServiceConnection=");
sb.append(MediaBrowserImplBase.this.mServiceConnection);
sb.append(" this=");
sb.append(this);
return false;
}
}
}
@RequiresApi(21)
public static class MediaBrowserImplApi21 implements MediaBrowserImpl, MediaBrowserServiceCallbackImpl, ConnectionCallback.ConnectionCallbackInternal {
protected final MediaBrowser mBrowserFwk;
protected Messenger mCallbacksMessenger;
final Context mContext;
private MediaSessionCompat.Token mMediaSessionToken;
private Bundle mNotifyChildrenChangedOptions;
protected final Bundle mRootHints;
protected ServiceBinderWrapper mServiceBinderWrapper;
protected int mServiceVersion;
protected final CallbackHandler mHandler = new CallbackHandler(this);
private final ArrayMap<String, Subscription> mSubscriptions = new ArrayMap<>();
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
public Bundle getNotifyChildrenChangedOptions() {
return this.mNotifyChildrenChangedOptions;
}
@Override // android.support.v4.media.MediaBrowserCompat.ConnectionCallback.ConnectionCallbackInternal
public void onConnectionFailed() {
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserServiceCallbackImpl
public void onConnectionFailed(Messenger messenger) {
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserServiceCallbackImpl
public void onServiceConnected(Messenger messenger, String str, MediaSessionCompat.Token token, Bundle bundle) {
}
public MediaBrowserImplApi21(Context context, ComponentName componentName, ConnectionCallback connectionCallback, Bundle bundle) {
this.mContext = context;
Bundle bundle2 = bundle != null ? new Bundle(bundle) : new Bundle();
this.mRootHints = bundle2;
bundle2.putInt(MediaBrowserProtocol.EXTRA_CLIENT_VERSION, 1);
bundle2.putInt(MediaBrowserProtocol.EXTRA_CALLING_PID, Process.myPid());
connectionCallback.setInternalConnectionCallback(this);
this.mBrowserFwk = new MediaBrowser(context, componentName, connectionCallback.mConnectionCallbackFwk, bundle2);
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
public void connect() {
this.mBrowserFwk.connect();
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
public void disconnect() {
Messenger messenger;
ServiceBinderWrapper serviceBinderWrapper = this.mServiceBinderWrapper;
if (serviceBinderWrapper != null && (messenger = this.mCallbacksMessenger) != null) {
try {
serviceBinderWrapper.unregisterCallbackMessenger(messenger);
} catch (RemoteException unused) {
}
}
this.mBrowserFwk.disconnect();
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
public boolean isConnected() {
return this.mBrowserFwk.isConnected();
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
public ComponentName getServiceComponent() {
return this.mBrowserFwk.getServiceComponent();
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
@NonNull
public String getRoot() {
return this.mBrowserFwk.getRoot();
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
@Nullable
public Bundle getExtras() {
return this.mBrowserFwk.getExtras();
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
@NonNull
public MediaSessionCompat.Token getSessionToken() {
if (this.mMediaSessionToken == null) {
this.mMediaSessionToken = MediaSessionCompat.Token.fromToken(this.mBrowserFwk.getSessionToken());
}
return this.mMediaSessionToken;
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
public void subscribe(@NonNull String str, Bundle bundle, @NonNull SubscriptionCallback subscriptionCallback) {
Subscription subscription = this.mSubscriptions.get(str);
if (subscription == null) {
subscription = new Subscription();
this.mSubscriptions.put(str, subscription);
}
subscriptionCallback.setSubscription(subscription);
Bundle bundle2 = bundle == null ? null : new Bundle(bundle);
subscription.putCallback(bundle2, subscriptionCallback);
ServiceBinderWrapper serviceBinderWrapper = this.mServiceBinderWrapper;
if (serviceBinderWrapper == null) {
this.mBrowserFwk.subscribe(str, subscriptionCallback.mSubscriptionCallbackFwk);
return;
}
try {
serviceBinderWrapper.addSubscription(str, subscriptionCallback.mToken, bundle2, this.mCallbacksMessenger);
} catch (RemoteException unused) {
StringBuilder sb = new StringBuilder();
sb.append("Remote error subscribing media item: ");
sb.append(str);
}
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
public void unsubscribe(@NonNull String str, SubscriptionCallback subscriptionCallback) {
Subscription subscription = this.mSubscriptions.get(str);
if (subscription == null) {
return;
}
ServiceBinderWrapper serviceBinderWrapper = this.mServiceBinderWrapper;
if (serviceBinderWrapper != null) {
try {
if (subscriptionCallback == null) {
serviceBinderWrapper.removeSubscription(str, null, this.mCallbacksMessenger);
} else {
List<SubscriptionCallback> callbacks = subscription.getCallbacks();
List<Bundle> optionsList = subscription.getOptionsList();
for (int size = callbacks.size() - 1; size >= 0; size--) {
if (callbacks.get(size) == subscriptionCallback) {
this.mServiceBinderWrapper.removeSubscription(str, subscriptionCallback.mToken, this.mCallbacksMessenger);
callbacks.remove(size);
optionsList.remove(size);
}
}
}
} catch (RemoteException unused) {
StringBuilder sb = new StringBuilder();
sb.append("removeSubscription failed with RemoteException parentId=");
sb.append(str);
}
} else if (subscriptionCallback == null) {
this.mBrowserFwk.unsubscribe(str);
} else {
List<SubscriptionCallback> callbacks2 = subscription.getCallbacks();
List<Bundle> optionsList2 = subscription.getOptionsList();
for (int size2 = callbacks2.size() - 1; size2 >= 0; size2--) {
if (callbacks2.get(size2) == subscriptionCallback) {
callbacks2.remove(size2);
optionsList2.remove(size2);
}
}
if (callbacks2.size() == 0) {
this.mBrowserFwk.unsubscribe(str);
}
}
if (subscription.isEmpty() || subscriptionCallback == null) {
this.mSubscriptions.remove(str);
}
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
public void getItem(@NonNull final String str, @NonNull final ItemCallback itemCallback) {
if (TextUtils.isEmpty(str)) {
throw new IllegalArgumentException("mediaId is empty");
}
if (itemCallback == null) {
throw new IllegalArgumentException("cb is null");
}
if (!this.mBrowserFwk.isConnected()) {
this.mHandler.post(new Runnable() { // from class: android.support.v4.media.MediaBrowserCompat.MediaBrowserImplApi21.1
@Override // java.lang.Runnable
public void run() {
itemCallback.onError(str);
}
});
return;
}
if (this.mServiceBinderWrapper == null) {
this.mHandler.post(new Runnable() { // from class: android.support.v4.media.MediaBrowserCompat.MediaBrowserImplApi21.2
@Override // java.lang.Runnable
public void run() {
itemCallback.onError(str);
}
});
return;
}
try {
this.mServiceBinderWrapper.getMediaItem(str, new ItemReceiver(str, itemCallback, this.mHandler), this.mCallbacksMessenger);
} catch (RemoteException unused) {
StringBuilder sb = new StringBuilder();
sb.append("Remote error getting media item: ");
sb.append(str);
this.mHandler.post(new Runnable() { // from class: android.support.v4.media.MediaBrowserCompat.MediaBrowserImplApi21.3
@Override // java.lang.Runnable
public void run() {
itemCallback.onError(str);
}
});
}
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
public void search(@NonNull final String str, final Bundle bundle, @NonNull final SearchCallback searchCallback) {
if (!isConnected()) {
throw new IllegalStateException("search() called while not connected");
}
if (this.mServiceBinderWrapper == null) {
this.mHandler.post(new Runnable() { // from class: android.support.v4.media.MediaBrowserCompat.MediaBrowserImplApi21.4
@Override // java.lang.Runnable
public void run() {
searchCallback.onError(str, bundle);
}
});
return;
}
try {
this.mServiceBinderWrapper.search(str, bundle, new SearchResultReceiver(str, bundle, searchCallback, this.mHandler), this.mCallbacksMessenger);
} catch (RemoteException unused) {
StringBuilder sb = new StringBuilder();
sb.append("Remote error searching items with query: ");
sb.append(str);
this.mHandler.post(new Runnable() { // from class: android.support.v4.media.MediaBrowserCompat.MediaBrowserImplApi21.5
@Override // java.lang.Runnable
public void run() {
searchCallback.onError(str, bundle);
}
});
}
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
public void sendCustomAction(@NonNull final String str, final Bundle bundle, @Nullable final CustomActionCallback customActionCallback) {
if (!isConnected()) {
throw new IllegalStateException("Cannot send a custom action (" + str + ") with extras " + bundle + " because the browser is not connected to the service.");
}
if (this.mServiceBinderWrapper == null && customActionCallback != null) {
this.mHandler.post(new Runnable() { // from class: android.support.v4.media.MediaBrowserCompat.MediaBrowserImplApi21.6
@Override // java.lang.Runnable
public void run() {
customActionCallback.onError(str, bundle, null);
}
});
}
try {
this.mServiceBinderWrapper.sendCustomAction(str, bundle, new CustomActionResultReceiver(str, bundle, customActionCallback, this.mHandler), this.mCallbacksMessenger);
} catch (RemoteException unused) {
StringBuilder sb = new StringBuilder();
sb.append("Remote error sending a custom action: action=");
sb.append(str);
sb.append(", extras=");
sb.append(bundle);
if (customActionCallback != null) {
this.mHandler.post(new Runnable() { // from class: android.support.v4.media.MediaBrowserCompat.MediaBrowserImplApi21.7
@Override // java.lang.Runnable
public void run() {
customActionCallback.onError(str, bundle, null);
}
});
}
}
}
@Override // android.support.v4.media.MediaBrowserCompat.ConnectionCallback.ConnectionCallbackInternal
public void onConnected() {
try {
Bundle extras = this.mBrowserFwk.getExtras();
if (extras == null) {
return;
}
this.mServiceVersion = extras.getInt(MediaBrowserProtocol.EXTRA_SERVICE_VERSION, 0);
IBinder binder = BundleCompat.getBinder(extras, MediaBrowserProtocol.EXTRA_MESSENGER_BINDER);
if (binder != null) {
this.mServiceBinderWrapper = new ServiceBinderWrapper(binder, this.mRootHints);
Messenger messenger = new Messenger(this.mHandler);
this.mCallbacksMessenger = messenger;
this.mHandler.setCallbacksMessenger(messenger);
try {
this.mServiceBinderWrapper.registerCallbackMessenger(this.mContext, this.mCallbacksMessenger);
} catch (RemoteException unused) {
}
}
IMediaSession asInterface = IMediaSession.Stub.asInterface(BundleCompat.getBinder(extras, MediaBrowserProtocol.EXTRA_SESSION_BINDER));
if (asInterface != null) {
this.mMediaSessionToken = MediaSessionCompat.Token.fromToken(this.mBrowserFwk.getSessionToken(), asInterface);
}
} catch (IllegalStateException e) {
Log.e(MediaBrowserCompat.TAG, "Unexpected IllegalStateException", e);
}
}
@Override // android.support.v4.media.MediaBrowserCompat.ConnectionCallback.ConnectionCallbackInternal
public void onConnectionSuspended() {
this.mServiceBinderWrapper = null;
this.mCallbacksMessenger = null;
this.mMediaSessionToken = null;
this.mHandler.setCallbacksMessenger(null);
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserServiceCallbackImpl
public void onLoadChildren(Messenger messenger, String str, List<MediaItem> list, Bundle bundle, Bundle bundle2) {
if (this.mCallbacksMessenger != messenger) {
return;
}
Subscription subscription = this.mSubscriptions.get(str);
if (subscription == null) {
if (MediaBrowserCompat.DEBUG) {
StringBuilder sb = new StringBuilder();
sb.append("onLoadChildren for id that isn't subscribed id=");
sb.append(str);
return;
}
return;
}
SubscriptionCallback callback = subscription.getCallback(bundle);
if (callback != null) {
if (bundle == null) {
if (list == null) {
callback.onError(str);
return;
}
this.mNotifyChildrenChangedOptions = bundle2;
callback.onChildrenLoaded(str, list);
this.mNotifyChildrenChangedOptions = null;
return;
}
if (list == null) {
callback.onError(str, bundle);
return;
}
this.mNotifyChildrenChangedOptions = bundle2;
callback.onChildrenLoaded(str, list, bundle);
this.mNotifyChildrenChangedOptions = null;
}
}
}
@RequiresApi(23)
public static class MediaBrowserImplApi23 extends MediaBrowserImplApi21 {
public MediaBrowserImplApi23(Context context, ComponentName componentName, ConnectionCallback connectionCallback, Bundle bundle) {
super(context, componentName, connectionCallback, bundle);
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImplApi21, android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
public void getItem(@NonNull String str, @NonNull ItemCallback itemCallback) {
if (this.mServiceBinderWrapper == null) {
this.mBrowserFwk.getItem(str, itemCallback.mItemCallbackFwk);
} else {
super.getItem(str, itemCallback);
}
}
}
@RequiresApi(26)
public static class MediaBrowserImplApi26 extends MediaBrowserImplApi23 {
public MediaBrowserImplApi26(Context context, ComponentName componentName, ConnectionCallback connectionCallback, Bundle bundle) {
super(context, componentName, connectionCallback, bundle);
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImplApi21, android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
public void subscribe(@NonNull String str, @Nullable Bundle bundle, @NonNull SubscriptionCallback subscriptionCallback) {
if (this.mServiceBinderWrapper != null && this.mServiceVersion >= 2) {
super.subscribe(str, bundle, subscriptionCallback);
} else if (bundle == null) {
this.mBrowserFwk.subscribe(str, subscriptionCallback.mSubscriptionCallbackFwk);
} else {
this.mBrowserFwk.subscribe(str, bundle, subscriptionCallback.mSubscriptionCallbackFwk);
}
}
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImplApi21, android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
public void unsubscribe(@NonNull String str, SubscriptionCallback subscriptionCallback) {
if (this.mServiceBinderWrapper != null && this.mServiceVersion >= 2) {
super.unsubscribe(str, subscriptionCallback);
} else if (subscriptionCallback == null) {
this.mBrowserFwk.unsubscribe(str);
} else {
this.mBrowserFwk.unsubscribe(str, subscriptionCallback.mSubscriptionCallbackFwk);
}
}
}
public static class Subscription {
private final List<SubscriptionCallback> mCallbacks = new ArrayList();
private final List<Bundle> mOptionsList = new ArrayList();
public List<SubscriptionCallback> getCallbacks() {
return this.mCallbacks;
}
public List<Bundle> getOptionsList() {
return this.mOptionsList;
}
public boolean isEmpty() {
return this.mCallbacks.isEmpty();
}
public SubscriptionCallback getCallback(Bundle bundle) {
for (int i = 0; i < this.mOptionsList.size(); i++) {
if (MediaBrowserCompatUtils.areSameOptions(this.mOptionsList.get(i), bundle)) {
return this.mCallbacks.get(i);
}
}
return null;
}
public void putCallback(Bundle bundle, SubscriptionCallback subscriptionCallback) {
for (int i = 0; i < this.mOptionsList.size(); i++) {
if (MediaBrowserCompatUtils.areSameOptions(this.mOptionsList.get(i), bundle)) {
this.mCallbacks.set(i, subscriptionCallback);
return;
}
}
this.mCallbacks.add(subscriptionCallback);
this.mOptionsList.add(bundle);
}
}
public static class CallbackHandler extends Handler {
private final WeakReference<MediaBrowserServiceCallbackImpl> mCallbackImplRef;
private WeakReference<Messenger> mCallbacksMessengerRef;
public CallbackHandler(MediaBrowserServiceCallbackImpl mediaBrowserServiceCallbackImpl) {
this.mCallbackImplRef = new WeakReference<>(mediaBrowserServiceCallbackImpl);
}
@Override // android.os.Handler
public void handleMessage(@NonNull Message message) {
WeakReference<Messenger> weakReference = this.mCallbacksMessengerRef;
if (weakReference == null || weakReference.get() == null || this.mCallbackImplRef.get() == null) {
return;
}
Bundle data = message.getData();
MediaSessionCompat.ensureClassLoader(data);
MediaBrowserServiceCallbackImpl mediaBrowserServiceCallbackImpl = this.mCallbackImplRef.get();
Messenger messenger = this.mCallbacksMessengerRef.get();
try {
int i = message.what;
if (i == 1) {
Bundle bundle = data.getBundle(MediaBrowserProtocol.DATA_ROOT_HINTS);
MediaSessionCompat.ensureClassLoader(bundle);
mediaBrowserServiceCallbackImpl.onServiceConnected(messenger, data.getString(MediaBrowserProtocol.DATA_MEDIA_ITEM_ID), (MediaSessionCompat.Token) data.getParcelable(MediaBrowserProtocol.DATA_MEDIA_SESSION_TOKEN), bundle);
} else if (i == 2) {
mediaBrowserServiceCallbackImpl.onConnectionFailed(messenger);
} else if (i == 3) {
Bundle bundle2 = data.getBundle(MediaBrowserProtocol.DATA_OPTIONS);
MediaSessionCompat.ensureClassLoader(bundle2);
Bundle bundle3 = data.getBundle(MediaBrowserProtocol.DATA_NOTIFY_CHILDREN_CHANGED_OPTIONS);
MediaSessionCompat.ensureClassLoader(bundle3);
mediaBrowserServiceCallbackImpl.onLoadChildren(messenger, data.getString(MediaBrowserProtocol.DATA_MEDIA_ITEM_ID), data.getParcelableArrayList(MediaBrowserProtocol.DATA_MEDIA_ITEM_LIST), bundle2, bundle3);
} else {
Log.w(MediaBrowserCompat.TAG, "Unhandled message: " + message + "\n Client version: 1\n Service version: " + message.arg1);
}
} catch (BadParcelableException unused) {
Log.e(MediaBrowserCompat.TAG, "Could not unparcel the data.");
if (message.what == 1) {
mediaBrowserServiceCallbackImpl.onConnectionFailed(messenger);
}
}
}
public void setCallbacksMessenger(Messenger messenger) {
this.mCallbacksMessengerRef = new WeakReference<>(messenger);
}
}
public static class ServiceBinderWrapper {
private Messenger mMessenger;
private Bundle mRootHints;
public ServiceBinderWrapper(IBinder iBinder, Bundle bundle) {
this.mMessenger = new Messenger(iBinder);
this.mRootHints = bundle;
}
public void connect(Context context, Messenger messenger) throws RemoteException {
Bundle bundle = new Bundle();
bundle.putString(MediaBrowserProtocol.DATA_PACKAGE_NAME, context.getPackageName());
bundle.putInt(MediaBrowserProtocol.DATA_CALLING_PID, Process.myPid());
bundle.putBundle(MediaBrowserProtocol.DATA_ROOT_HINTS, this.mRootHints);
sendRequest(1, bundle, messenger);
}
public void disconnect(Messenger messenger) throws RemoteException {
sendRequest(2, null, messenger);
}
public void addSubscription(String str, IBinder iBinder, Bundle bundle, Messenger messenger) throws RemoteException {
Bundle bundle2 = new Bundle();
bundle2.putString(MediaBrowserProtocol.DATA_MEDIA_ITEM_ID, str);
BundleCompat.putBinder(bundle2, MediaBrowserProtocol.DATA_CALLBACK_TOKEN, iBinder);
bundle2.putBundle(MediaBrowserProtocol.DATA_OPTIONS, bundle);
sendRequest(3, bundle2, messenger);
}
public void removeSubscription(String str, IBinder iBinder, Messenger messenger) throws RemoteException {
Bundle bundle = new Bundle();
bundle.putString(MediaBrowserProtocol.DATA_MEDIA_ITEM_ID, str);
BundleCompat.putBinder(bundle, MediaBrowserProtocol.DATA_CALLBACK_TOKEN, iBinder);
sendRequest(4, bundle, messenger);
}
public void getMediaItem(String str, ResultReceiver resultReceiver, Messenger messenger) throws RemoteException {
Bundle bundle = new Bundle();
bundle.putString(MediaBrowserProtocol.DATA_MEDIA_ITEM_ID, str);
bundle.putParcelable(MediaBrowserProtocol.DATA_RESULT_RECEIVER, resultReceiver);
sendRequest(5, bundle, messenger);
}
public void registerCallbackMessenger(Context context, Messenger messenger) throws RemoteException {
Bundle bundle = new Bundle();
bundle.putString(MediaBrowserProtocol.DATA_PACKAGE_NAME, context.getPackageName());
bundle.putInt(MediaBrowserProtocol.DATA_CALLING_PID, Process.myPid());
bundle.putBundle(MediaBrowserProtocol.DATA_ROOT_HINTS, this.mRootHints);
sendRequest(6, bundle, messenger);
}
public void unregisterCallbackMessenger(Messenger messenger) throws RemoteException {
sendRequest(7, null, messenger);
}
public void search(String str, Bundle bundle, ResultReceiver resultReceiver, Messenger messenger) throws RemoteException {
Bundle bundle2 = new Bundle();
bundle2.putString(MediaBrowserProtocol.DATA_SEARCH_QUERY, str);
bundle2.putBundle(MediaBrowserProtocol.DATA_SEARCH_EXTRAS, bundle);
bundle2.putParcelable(MediaBrowserProtocol.DATA_RESULT_RECEIVER, resultReceiver);
sendRequest(8, bundle2, messenger);
}
public void sendCustomAction(String str, Bundle bundle, ResultReceiver resultReceiver, Messenger messenger) throws RemoteException {
Bundle bundle2 = new Bundle();
bundle2.putString(MediaBrowserProtocol.DATA_CUSTOM_ACTION, str);
bundle2.putBundle(MediaBrowserProtocol.DATA_CUSTOM_ACTION_EXTRAS, bundle);
bundle2.putParcelable(MediaBrowserProtocol.DATA_RESULT_RECEIVER, resultReceiver);
sendRequest(9, bundle2, messenger);
}
private void sendRequest(int i, Bundle bundle, Messenger messenger) throws RemoteException {
Message obtain = Message.obtain();
obtain.what = i;
obtain.arg1 = 1;
obtain.setData(bundle);
obtain.replyTo = messenger;
this.mMessenger.send(obtain);
}
}
public static class ItemReceiver extends ResultReceiver {
private final ItemCallback mCallback;
private final String mMediaId;
public ItemReceiver(String str, ItemCallback itemCallback, Handler handler) {
super(handler);
this.mMediaId = str;
this.mCallback = itemCallback;
}
@Override // android.support.v4.os.ResultReceiver
public void onReceiveResult(int i, Bundle bundle) {
if (bundle != null) {
bundle = MediaSessionCompat.unparcelWithClassLoader(bundle);
}
if (i != 0 || bundle == null || !bundle.containsKey(MediaBrowserServiceCompat.KEY_MEDIA_ITEM)) {
this.mCallback.onError(this.mMediaId);
return;
}
Parcelable parcelable = bundle.getParcelable(MediaBrowserServiceCompat.KEY_MEDIA_ITEM);
if (parcelable == null || (parcelable instanceof MediaItem)) {
this.mCallback.onItemLoaded((MediaItem) parcelable);
} else {
this.mCallback.onError(this.mMediaId);
}
}
}
public static class SearchResultReceiver extends ResultReceiver {
private final SearchCallback mCallback;
private final Bundle mExtras;
private final String mQuery;
public SearchResultReceiver(String str, Bundle bundle, SearchCallback searchCallback, Handler handler) {
super(handler);
this.mQuery = str;
this.mExtras = bundle;
this.mCallback = searchCallback;
}
@Override // android.support.v4.os.ResultReceiver
public void onReceiveResult(int i, Bundle bundle) {
if (bundle != null) {
bundle = MediaSessionCompat.unparcelWithClassLoader(bundle);
}
if (i != 0 || bundle == null || !bundle.containsKey(MediaBrowserServiceCompat.KEY_SEARCH_RESULTS)) {
this.mCallback.onError(this.mQuery, this.mExtras);
return;
}
Parcelable[] parcelableArray = bundle.getParcelableArray(MediaBrowserServiceCompat.KEY_SEARCH_RESULTS);
if (parcelableArray != null) {
ArrayList arrayList = new ArrayList();
for (Parcelable parcelable : parcelableArray) {
arrayList.add((MediaItem) parcelable);
}
this.mCallback.onSearchResult(this.mQuery, this.mExtras, arrayList);
return;
}
this.mCallback.onError(this.mQuery, this.mExtras);
}
}
public static class CustomActionResultReceiver extends ResultReceiver {
private final String mAction;
private final CustomActionCallback mCallback;
private final Bundle mExtras;
public CustomActionResultReceiver(String str, Bundle bundle, CustomActionCallback customActionCallback, Handler handler) {
super(handler);
this.mAction = str;
this.mExtras = bundle;
this.mCallback = customActionCallback;
}
@Override // android.support.v4.os.ResultReceiver
public void onReceiveResult(int i, Bundle bundle) {
if (this.mCallback == null) {
return;
}
MediaSessionCompat.ensureClassLoader(bundle);
if (i == -1) {
this.mCallback.onError(this.mAction, this.mExtras, bundle);
return;
}
if (i == 0) {
this.mCallback.onResult(this.mAction, this.mExtras, bundle);
return;
}
if (i == 1) {
this.mCallback.onProgressUpdate(this.mAction, this.mExtras, bundle);
return;
}
Log.w(MediaBrowserCompat.TAG, "Unknown result code: " + i + " (extras=" + this.mExtras + ", resultData=" + bundle + ")");
}
}
}