1040 lines
42 KiB
Java
1040 lines
42 KiB
Java
package android.support.v4.media;
|
|
|
|
import android.content.ComponentName;
|
|
import android.content.Context;
|
|
import android.content.Intent;
|
|
import android.content.ServiceConnection;
|
|
import android.os.BadParcelableException;
|
|
import android.os.Binder;
|
|
import android.os.Build;
|
|
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.RemoteException;
|
|
import android.support.v4.media.MediaBrowserCompatApi21;
|
|
import android.support.v4.media.MediaBrowserCompatApi26;
|
|
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.collection.ArrayMap;
|
|
import androidx.core.app.BundleCompat;
|
|
import androidx.media.MediaBrowserCompatUtils;
|
|
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 {
|
|
static final boolean b = Log.isLoggable("MediaBrowserCompat", 3);
|
|
private final MediaBrowserImpl a;
|
|
|
|
private static class CallbackHandler extends Handler {
|
|
private final WeakReference<MediaBrowserServiceCallbackImpl> a;
|
|
private WeakReference<Messenger> b;
|
|
|
|
CallbackHandler(MediaBrowserServiceCallbackImpl mediaBrowserServiceCallbackImpl) {
|
|
this.a = new WeakReference<>(mediaBrowserServiceCallbackImpl);
|
|
}
|
|
|
|
void a(Messenger messenger) {
|
|
this.b = new WeakReference<>(messenger);
|
|
}
|
|
|
|
@Override // android.os.Handler
|
|
public void handleMessage(Message message) {
|
|
WeakReference<Messenger> weakReference = this.b;
|
|
if (weakReference == null || weakReference.get() == null || this.a.get() == null) {
|
|
return;
|
|
}
|
|
Bundle data = message.getData();
|
|
MediaSessionCompat.a(data);
|
|
MediaBrowserServiceCallbackImpl mediaBrowserServiceCallbackImpl = this.a.get();
|
|
Messenger messenger = this.b.get();
|
|
try {
|
|
int i = message.what;
|
|
if (i == 1) {
|
|
Bundle bundle = data.getBundle("data_root_hints");
|
|
MediaSessionCompat.a(bundle);
|
|
mediaBrowserServiceCallbackImpl.a(messenger, data.getString("data_media_item_id"), (MediaSessionCompat.Token) data.getParcelable("data_media_session_token"), bundle);
|
|
} else if (i == 2) {
|
|
mediaBrowserServiceCallbackImpl.a(messenger);
|
|
} else if (i != 3) {
|
|
Log.w("MediaBrowserCompat", "Unhandled message: " + message + "\n Client version: 1\n Service version: " + message.arg1);
|
|
} else {
|
|
Bundle bundle2 = data.getBundle("data_options");
|
|
MediaSessionCompat.a(bundle2);
|
|
Bundle bundle3 = data.getBundle("data_notify_children_changed_options");
|
|
MediaSessionCompat.a(bundle3);
|
|
mediaBrowserServiceCallbackImpl.a(messenger, data.getString("data_media_item_id"), data.getParcelableArrayList("data_media_item_list"), bundle2, bundle3);
|
|
}
|
|
} catch (BadParcelableException unused) {
|
|
Log.e("MediaBrowserCompat", "Could not unparcel the data.");
|
|
if (message.what == 1) {
|
|
mediaBrowserServiceCallbackImpl.a(messenger);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
public static class ConnectionCallback {
|
|
final Object a;
|
|
ConnectionCallbackInternal b;
|
|
|
|
interface ConnectionCallbackInternal {
|
|
void b();
|
|
|
|
void d();
|
|
|
|
void onConnected();
|
|
}
|
|
|
|
private class StubApi21 implements MediaBrowserCompatApi21.ConnectionCallback {
|
|
StubApi21() {
|
|
}
|
|
|
|
@Override // android.support.v4.media.MediaBrowserCompatApi21.ConnectionCallback
|
|
public void b() {
|
|
ConnectionCallbackInternal connectionCallbackInternal = ConnectionCallback.this.b;
|
|
if (connectionCallbackInternal != null) {
|
|
connectionCallbackInternal.b();
|
|
}
|
|
ConnectionCallback.this.c();
|
|
}
|
|
|
|
@Override // android.support.v4.media.MediaBrowserCompatApi21.ConnectionCallback
|
|
public void d() {
|
|
ConnectionCallbackInternal connectionCallbackInternal = ConnectionCallback.this.b;
|
|
if (connectionCallbackInternal != null) {
|
|
connectionCallbackInternal.d();
|
|
}
|
|
ConnectionCallback.this.b();
|
|
}
|
|
|
|
@Override // android.support.v4.media.MediaBrowserCompatApi21.ConnectionCallback
|
|
public void onConnected() {
|
|
ConnectionCallbackInternal connectionCallbackInternal = ConnectionCallback.this.b;
|
|
if (connectionCallbackInternal != null) {
|
|
connectionCallbackInternal.onConnected();
|
|
}
|
|
ConnectionCallback.this.a();
|
|
}
|
|
}
|
|
|
|
public ConnectionCallback() {
|
|
if (Build.VERSION.SDK_INT >= 21) {
|
|
this.a = MediaBrowserCompatApi21.a((MediaBrowserCompatApi21.ConnectionCallback) new StubApi21());
|
|
} else {
|
|
this.a = null;
|
|
}
|
|
}
|
|
|
|
public void a() {
|
|
throw null;
|
|
}
|
|
|
|
void a(ConnectionCallbackInternal connectionCallbackInternal) {
|
|
this.b = connectionCallbackInternal;
|
|
}
|
|
|
|
public void b() {
|
|
throw null;
|
|
}
|
|
|
|
public void c() {
|
|
throw null;
|
|
}
|
|
}
|
|
|
|
public static abstract class CustomActionCallback {
|
|
public abstract void a(String str, Bundle bundle, Bundle bundle2);
|
|
|
|
public abstract void b(String str, Bundle bundle, Bundle bundle2);
|
|
|
|
public abstract void c(String str, Bundle bundle, Bundle bundle2);
|
|
}
|
|
|
|
private static class CustomActionResultReceiver extends ResultReceiver {
|
|
private final String mAction;
|
|
private final CustomActionCallback mCallback;
|
|
private final Bundle mExtras;
|
|
|
|
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
|
|
protected void onReceiveResult(int i, Bundle bundle) {
|
|
if (this.mCallback == null) {
|
|
return;
|
|
}
|
|
MediaSessionCompat.a(bundle);
|
|
if (i == -1) {
|
|
this.mCallback.a(this.mAction, this.mExtras, bundle);
|
|
return;
|
|
}
|
|
if (i == 0) {
|
|
this.mCallback.c(this.mAction, this.mExtras, bundle);
|
|
return;
|
|
}
|
|
if (i == 1) {
|
|
this.mCallback.b(this.mAction, this.mExtras, bundle);
|
|
return;
|
|
}
|
|
Log.w("MediaBrowserCompat", "Unknown result code: " + i + " (extras=" + this.mExtras + ", resultData=" + bundle + ")");
|
|
}
|
|
}
|
|
|
|
public static abstract class ItemCallback {
|
|
public abstract void a(MediaItem mediaItem);
|
|
|
|
public abstract void a(String str);
|
|
}
|
|
|
|
private static class ItemReceiver extends ResultReceiver {
|
|
private final ItemCallback mCallback;
|
|
private final String mMediaId;
|
|
|
|
ItemReceiver(String str, ItemCallback itemCallback, Handler handler) {
|
|
super(handler);
|
|
this.mMediaId = str;
|
|
this.mCallback = itemCallback;
|
|
}
|
|
|
|
@Override // android.support.v4.os.ResultReceiver
|
|
protected void onReceiveResult(int i, Bundle bundle) {
|
|
MediaSessionCompat.a(bundle);
|
|
if (i != 0 || bundle == null || !bundle.containsKey("media_item")) {
|
|
this.mCallback.a(this.mMediaId);
|
|
return;
|
|
}
|
|
Parcelable parcelable = bundle.getParcelable("media_item");
|
|
if (parcelable == null || (parcelable instanceof MediaItem)) {
|
|
this.mCallback.a((MediaItem) parcelable);
|
|
} else {
|
|
this.mCallback.a(this.mMediaId);
|
|
}
|
|
}
|
|
}
|
|
|
|
interface MediaBrowserImpl {
|
|
void a();
|
|
|
|
void c();
|
|
|
|
MediaSessionCompat.Token e();
|
|
}
|
|
|
|
static class MediaBrowserImplApi23 extends MediaBrowserImplApi21 {
|
|
MediaBrowserImplApi23(Context context, ComponentName componentName, ConnectionCallback connectionCallback, Bundle bundle) {
|
|
super(context, componentName, connectionCallback, bundle);
|
|
}
|
|
}
|
|
|
|
static class MediaBrowserImplApi26 extends MediaBrowserImplApi23 {
|
|
MediaBrowserImplApi26(Context context, ComponentName componentName, ConnectionCallback connectionCallback, Bundle bundle) {
|
|
super(context, componentName, connectionCallback, bundle);
|
|
}
|
|
}
|
|
|
|
interface MediaBrowserServiceCallbackImpl {
|
|
void a(Messenger messenger);
|
|
|
|
void a(Messenger messenger, String str, MediaSessionCompat.Token token, Bundle bundle);
|
|
|
|
void a(Messenger messenger, String str, List list, Bundle bundle, Bundle bundle2);
|
|
}
|
|
|
|
public static abstract class SearchCallback {
|
|
public abstract void a(String str, Bundle bundle);
|
|
|
|
public abstract void a(String str, Bundle bundle, List<MediaItem> list);
|
|
}
|
|
|
|
private static class SearchResultReceiver extends ResultReceiver {
|
|
private final SearchCallback mCallback;
|
|
private final Bundle mExtras;
|
|
private final String mQuery;
|
|
|
|
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
|
|
protected void onReceiveResult(int i, Bundle bundle) {
|
|
MediaSessionCompat.a(bundle);
|
|
if (i != 0 || bundle == null || !bundle.containsKey("search_results")) {
|
|
this.mCallback.a(this.mQuery, this.mExtras);
|
|
return;
|
|
}
|
|
Parcelable[] parcelableArray = bundle.getParcelableArray("search_results");
|
|
ArrayList arrayList = null;
|
|
if (parcelableArray != null) {
|
|
arrayList = new ArrayList();
|
|
for (Parcelable parcelable : parcelableArray) {
|
|
arrayList.add((MediaItem) parcelable);
|
|
}
|
|
}
|
|
this.mCallback.a(this.mQuery, this.mExtras, arrayList);
|
|
}
|
|
}
|
|
|
|
private static class Subscription {
|
|
private final List<SubscriptionCallback> a = new ArrayList();
|
|
private final List<Bundle> b = new ArrayList();
|
|
|
|
public List<SubscriptionCallback> a() {
|
|
return this.a;
|
|
}
|
|
|
|
public List<Bundle> b() {
|
|
return this.b;
|
|
}
|
|
|
|
public SubscriptionCallback a(Bundle bundle) {
|
|
for (int i = 0; i < this.b.size(); i++) {
|
|
if (MediaBrowserCompatUtils.a(this.b.get(i), bundle)) {
|
|
return this.a.get(i);
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
}
|
|
|
|
public MediaBrowserCompat(Context context, ComponentName componentName, ConnectionCallback connectionCallback, Bundle bundle) {
|
|
int i = Build.VERSION.SDK_INT;
|
|
if (i >= 26) {
|
|
this.a = new MediaBrowserImplApi26(context, componentName, connectionCallback, bundle);
|
|
return;
|
|
}
|
|
if (i >= 23) {
|
|
this.a = new MediaBrowserImplApi23(context, componentName, connectionCallback, bundle);
|
|
} else if (i >= 21) {
|
|
this.a = new MediaBrowserImplApi21(context, componentName, connectionCallback, bundle);
|
|
} else {
|
|
this.a = new MediaBrowserImplBase(context, componentName, connectionCallback, bundle);
|
|
}
|
|
}
|
|
|
|
public void a() {
|
|
this.a.c();
|
|
}
|
|
|
|
public void b() {
|
|
this.a.a();
|
|
}
|
|
|
|
public MediaSessionCompat.Token c() {
|
|
return this.a.e();
|
|
}
|
|
|
|
static class MediaBrowserImplBase implements MediaBrowserImpl, MediaBrowserServiceCallbackImpl {
|
|
final Context a;
|
|
final ComponentName b;
|
|
final ConnectionCallback c;
|
|
final Bundle d;
|
|
final CallbackHandler e = new CallbackHandler(this);
|
|
private final ArrayMap<String, Subscription> f = new ArrayMap<>();
|
|
int g = 1;
|
|
MediaServiceConnection h;
|
|
ServiceBinderWrapper i;
|
|
Messenger j;
|
|
private String k;
|
|
private MediaSessionCompat.Token l;
|
|
|
|
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.a = context;
|
|
this.b = componentName;
|
|
this.c = connectionCallback;
|
|
this.d = bundle == null ? null : new Bundle(bundle);
|
|
}
|
|
|
|
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
|
|
public void a() {
|
|
this.g = 0;
|
|
this.e.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.j;
|
|
if (messenger != null) {
|
|
try {
|
|
mediaBrowserImplBase.i.a(messenger);
|
|
} catch (RemoteException unused) {
|
|
Log.w("MediaBrowserCompat", "RemoteException during connect for " + MediaBrowserImplBase.this.b);
|
|
}
|
|
}
|
|
MediaBrowserImplBase mediaBrowserImplBase2 = MediaBrowserImplBase.this;
|
|
int i = mediaBrowserImplBase2.g;
|
|
mediaBrowserImplBase2.d();
|
|
if (i != 0) {
|
|
MediaBrowserImplBase.this.g = i;
|
|
}
|
|
if (MediaBrowserCompat.b) {
|
|
Log.d("MediaBrowserCompat", "disconnect...");
|
|
MediaBrowserImplBase.this.b();
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
void b() {
|
|
Log.d("MediaBrowserCompat", "MediaBrowserCompat...");
|
|
Log.d("MediaBrowserCompat", " mServiceComponent=" + this.b);
|
|
Log.d("MediaBrowserCompat", " mCallback=" + this.c);
|
|
Log.d("MediaBrowserCompat", " mRootHints=" + this.d);
|
|
Log.d("MediaBrowserCompat", " mState=" + a(this.g));
|
|
Log.d("MediaBrowserCompat", " mServiceConnection=" + this.h);
|
|
Log.d("MediaBrowserCompat", " mServiceBinderWrapper=" + this.i);
|
|
Log.d("MediaBrowserCompat", " mCallbacksMessenger=" + this.j);
|
|
Log.d("MediaBrowserCompat", " mRootId=" + this.k);
|
|
Log.d("MediaBrowserCompat", " mMediaSessionToken=" + this.l);
|
|
}
|
|
|
|
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
|
|
public void c() {
|
|
int i = this.g;
|
|
if (i == 0 || i == 1) {
|
|
this.g = 2;
|
|
this.e.post(new Runnable() { // from class: android.support.v4.media.MediaBrowserCompat.MediaBrowserImplBase.1
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
MediaBrowserImplBase mediaBrowserImplBase = MediaBrowserImplBase.this;
|
|
if (mediaBrowserImplBase.g == 0) {
|
|
return;
|
|
}
|
|
mediaBrowserImplBase.g = 2;
|
|
if (MediaBrowserCompat.b && mediaBrowserImplBase.h != null) {
|
|
throw new RuntimeException("mServiceConnection should be null. Instead it is " + MediaBrowserImplBase.this.h);
|
|
}
|
|
MediaBrowserImplBase mediaBrowserImplBase2 = MediaBrowserImplBase.this;
|
|
if (mediaBrowserImplBase2.i != null) {
|
|
throw new RuntimeException("mServiceBinderWrapper should be null. Instead it is " + MediaBrowserImplBase.this.i);
|
|
}
|
|
if (mediaBrowserImplBase2.j != null) {
|
|
throw new RuntimeException("mCallbacksMessenger should be null. Instead it is " + MediaBrowserImplBase.this.j);
|
|
}
|
|
Intent intent = new Intent("android.media.browse.MediaBrowserService");
|
|
intent.setComponent(MediaBrowserImplBase.this.b);
|
|
MediaBrowserImplBase mediaBrowserImplBase3 = MediaBrowserImplBase.this;
|
|
mediaBrowserImplBase3.h = mediaBrowserImplBase3.new MediaServiceConnection();
|
|
boolean z = false;
|
|
try {
|
|
z = MediaBrowserImplBase.this.a.bindService(intent, MediaBrowserImplBase.this.h, 1);
|
|
} catch (Exception unused) {
|
|
Log.e("MediaBrowserCompat", "Failed binding to service " + MediaBrowserImplBase.this.b);
|
|
}
|
|
if (!z) {
|
|
MediaBrowserImplBase.this.d();
|
|
MediaBrowserImplBase.this.c.b();
|
|
}
|
|
if (MediaBrowserCompat.b) {
|
|
Log.d("MediaBrowserCompat", "connect...");
|
|
MediaBrowserImplBase.this.b();
|
|
}
|
|
}
|
|
});
|
|
} else {
|
|
throw new IllegalStateException("connect() called while neigther disconnecting nor disconnected (state=" + a(this.g) + ")");
|
|
}
|
|
}
|
|
|
|
void d() {
|
|
MediaServiceConnection mediaServiceConnection = this.h;
|
|
if (mediaServiceConnection != null) {
|
|
this.a.unbindService(mediaServiceConnection);
|
|
}
|
|
this.g = 1;
|
|
this.h = null;
|
|
this.i = null;
|
|
this.j = null;
|
|
this.e.a(null);
|
|
this.k = null;
|
|
this.l = null;
|
|
}
|
|
|
|
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
|
|
public MediaSessionCompat.Token e() {
|
|
if (f()) {
|
|
return this.l;
|
|
}
|
|
throw new IllegalStateException("getSessionToken() called while not connected(state=" + this.g + ")");
|
|
}
|
|
|
|
public boolean f() {
|
|
return this.g == 3;
|
|
}
|
|
|
|
private class MediaServiceConnection implements ServiceConnection {
|
|
MediaServiceConnection() {
|
|
}
|
|
|
|
private void a(Runnable runnable) {
|
|
if (Thread.currentThread() == MediaBrowserImplBase.this.e.getLooper().getThread()) {
|
|
runnable.run();
|
|
} else {
|
|
MediaBrowserImplBase.this.e.post(runnable);
|
|
}
|
|
}
|
|
|
|
@Override // android.content.ServiceConnection
|
|
public void onServiceConnected(final ComponentName componentName, final IBinder iBinder) {
|
|
a(new Runnable() { // from class: android.support.v4.media.MediaBrowserCompat.MediaBrowserImplBase.MediaServiceConnection.1
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
if (MediaBrowserCompat.b) {
|
|
Log.d("MediaBrowserCompat", "MediaServiceConnection.onServiceConnected name=" + componentName + " binder=" + iBinder);
|
|
MediaBrowserImplBase.this.b();
|
|
}
|
|
if (MediaServiceConnection.this.a("onServiceConnected")) {
|
|
MediaBrowserImplBase mediaBrowserImplBase = MediaBrowserImplBase.this;
|
|
mediaBrowserImplBase.i = new ServiceBinderWrapper(iBinder, mediaBrowserImplBase.d);
|
|
MediaBrowserImplBase mediaBrowserImplBase2 = MediaBrowserImplBase.this;
|
|
mediaBrowserImplBase2.j = new Messenger(mediaBrowserImplBase2.e);
|
|
MediaBrowserImplBase mediaBrowserImplBase3 = MediaBrowserImplBase.this;
|
|
mediaBrowserImplBase3.e.a(mediaBrowserImplBase3.j);
|
|
MediaBrowserImplBase.this.g = 2;
|
|
try {
|
|
if (MediaBrowserCompat.b) {
|
|
Log.d("MediaBrowserCompat", "ServiceCallbacks.onConnect...");
|
|
MediaBrowserImplBase.this.b();
|
|
}
|
|
MediaBrowserImplBase.this.i.a(MediaBrowserImplBase.this.a, MediaBrowserImplBase.this.j);
|
|
} catch (RemoteException unused) {
|
|
Log.w("MediaBrowserCompat", "RemoteException during connect for " + MediaBrowserImplBase.this.b);
|
|
if (MediaBrowserCompat.b) {
|
|
Log.d("MediaBrowserCompat", "ServiceCallbacks.onConnect...");
|
|
MediaBrowserImplBase.this.b();
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
@Override // android.content.ServiceConnection
|
|
public void onServiceDisconnected(final ComponentName componentName) {
|
|
a(new Runnable() { // from class: android.support.v4.media.MediaBrowserCompat.MediaBrowserImplBase.MediaServiceConnection.2
|
|
@Override // java.lang.Runnable
|
|
public void run() {
|
|
if (MediaBrowserCompat.b) {
|
|
Log.d("MediaBrowserCompat", "MediaServiceConnection.onServiceDisconnected name=" + componentName + " this=" + this + " mServiceConnection=" + MediaBrowserImplBase.this.h);
|
|
MediaBrowserImplBase.this.b();
|
|
}
|
|
if (MediaServiceConnection.this.a("onServiceDisconnected")) {
|
|
MediaBrowserImplBase mediaBrowserImplBase = MediaBrowserImplBase.this;
|
|
mediaBrowserImplBase.i = null;
|
|
mediaBrowserImplBase.j = null;
|
|
mediaBrowserImplBase.e.a(null);
|
|
MediaBrowserImplBase mediaBrowserImplBase2 = MediaBrowserImplBase.this;
|
|
mediaBrowserImplBase2.g = 4;
|
|
mediaBrowserImplBase2.c.c();
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
boolean a(String str) {
|
|
int i;
|
|
MediaBrowserImplBase mediaBrowserImplBase = MediaBrowserImplBase.this;
|
|
if (mediaBrowserImplBase.h == this && (i = mediaBrowserImplBase.g) != 0 && i != 1) {
|
|
return true;
|
|
}
|
|
int i2 = MediaBrowserImplBase.this.g;
|
|
if (i2 == 0 || i2 == 1) {
|
|
return false;
|
|
}
|
|
Log.i("MediaBrowserCompat", str + " for " + MediaBrowserImplBase.this.b + " with mServiceConnection=" + MediaBrowserImplBase.this.h + " this=" + this);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserServiceCallbackImpl
|
|
public void a(Messenger messenger, String str, MediaSessionCompat.Token token, Bundle bundle) {
|
|
if (a(messenger, "onConnect")) {
|
|
if (this.g != 2) {
|
|
Log.w("MediaBrowserCompat", "onConnect from service while mState=" + a(this.g) + "... ignoring");
|
|
return;
|
|
}
|
|
this.k = str;
|
|
this.l = token;
|
|
this.g = 3;
|
|
if (MediaBrowserCompat.b) {
|
|
Log.d("MediaBrowserCompat", "ServiceCallbacks.onConnect...");
|
|
b();
|
|
}
|
|
this.c.a();
|
|
try {
|
|
for (Map.Entry<String, Subscription> entry : this.f.entrySet()) {
|
|
String key = entry.getKey();
|
|
Subscription value = entry.getValue();
|
|
List<SubscriptionCallback> a = value.a();
|
|
List<Bundle> b = value.b();
|
|
for (int i = 0; i < a.size(); i++) {
|
|
this.i.a(key, a.get(i).a, b.get(i), this.j);
|
|
}
|
|
}
|
|
} catch (RemoteException unused) {
|
|
Log.d("MediaBrowserCompat", "addSubscription failed with RemoteException.");
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserServiceCallbackImpl
|
|
public void a(Messenger messenger) {
|
|
Log.e("MediaBrowserCompat", "onConnectFailed for " + this.b);
|
|
if (a(messenger, "onConnectFailed")) {
|
|
if (this.g != 2) {
|
|
Log.w("MediaBrowserCompat", "onConnect from service while mState=" + a(this.g) + "... ignoring");
|
|
return;
|
|
}
|
|
d();
|
|
this.c.b();
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserServiceCallbackImpl
|
|
public void a(Messenger messenger, String str, List list, Bundle bundle, Bundle bundle2) {
|
|
if (a(messenger, "onLoadChildren")) {
|
|
if (MediaBrowserCompat.b) {
|
|
Log.d("MediaBrowserCompat", "onLoadChildren for " + this.b + " id=" + str);
|
|
}
|
|
Subscription subscription = this.f.get(str);
|
|
if (subscription == null) {
|
|
if (MediaBrowserCompat.b) {
|
|
Log.d("MediaBrowserCompat", "onLoadChildren for id that isn't subscribed id=" + str);
|
|
return;
|
|
}
|
|
return;
|
|
}
|
|
SubscriptionCallback a = subscription.a(bundle);
|
|
if (a != null) {
|
|
if (bundle == null) {
|
|
if (list == null) {
|
|
a.a(str);
|
|
return;
|
|
} else {
|
|
a.a(str, (List<MediaItem>) list);
|
|
return;
|
|
}
|
|
}
|
|
if (list == null) {
|
|
a.a(str, bundle);
|
|
} else {
|
|
a.a(str, list, bundle);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private static String a(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 a(Messenger messenger, String str) {
|
|
int i;
|
|
if (this.j == messenger && (i = this.g) != 0 && i != 1) {
|
|
return true;
|
|
}
|
|
int i2 = this.g;
|
|
if (i2 == 0 || i2 == 1) {
|
|
return false;
|
|
}
|
|
Log.i("MediaBrowserCompat", str + " for " + this.b + " with mCallbacksMessenger=" + this.j + " this=" + this);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public static abstract class SubscriptionCallback {
|
|
final IBinder a = new Binder();
|
|
WeakReference<Subscription> b;
|
|
|
|
public SubscriptionCallback() {
|
|
int i = Build.VERSION.SDK_INT;
|
|
if (i >= 26) {
|
|
MediaBrowserCompatApi26.a(new StubApi26());
|
|
} else if (i >= 21) {
|
|
MediaBrowserCompatApi21.a((MediaBrowserCompatApi21.SubscriptionCallback) new StubApi21());
|
|
}
|
|
}
|
|
|
|
public void a(String str) {
|
|
}
|
|
|
|
public void a(String str, Bundle bundle) {
|
|
}
|
|
|
|
public void a(String str, List<MediaItem> list) {
|
|
}
|
|
|
|
public void a(String str, List<MediaItem> list, Bundle bundle) {
|
|
}
|
|
|
|
private class StubApi26 extends StubApi21 implements MediaBrowserCompatApi26.SubscriptionCallback {
|
|
StubApi26() {
|
|
super();
|
|
}
|
|
|
|
@Override // android.support.v4.media.MediaBrowserCompatApi26.SubscriptionCallback
|
|
public void a(String str, List<?> list, Bundle bundle) {
|
|
SubscriptionCallback.this.a(str, MediaItem.fromMediaItemList(list), bundle);
|
|
}
|
|
|
|
@Override // android.support.v4.media.MediaBrowserCompatApi26.SubscriptionCallback
|
|
public void a(String str, Bundle bundle) {
|
|
SubscriptionCallback.this.a(str, bundle);
|
|
}
|
|
}
|
|
|
|
private class StubApi21 implements MediaBrowserCompatApi21.SubscriptionCallback {
|
|
StubApi21() {
|
|
}
|
|
|
|
@Override // android.support.v4.media.MediaBrowserCompatApi21.SubscriptionCallback
|
|
public void a(String str, List<?> list) {
|
|
WeakReference<Subscription> weakReference = SubscriptionCallback.this.b;
|
|
Subscription subscription = weakReference == null ? null : weakReference.get();
|
|
if (subscription == null) {
|
|
SubscriptionCallback.this.a(str, MediaItem.fromMediaItemList(list));
|
|
return;
|
|
}
|
|
List<MediaItem> fromMediaItemList = MediaItem.fromMediaItemList(list);
|
|
List<SubscriptionCallback> a = subscription.a();
|
|
List<Bundle> b = subscription.b();
|
|
for (int i = 0; i < a.size(); i++) {
|
|
Bundle bundle = b.get(i);
|
|
if (bundle == null) {
|
|
SubscriptionCallback.this.a(str, fromMediaItemList);
|
|
} else {
|
|
SubscriptionCallback.this.a(str, a(fromMediaItemList, bundle), bundle);
|
|
}
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.MediaBrowserCompatApi21.SubscriptionCallback
|
|
public void b(String str) {
|
|
SubscriptionCallback.this.a(str);
|
|
}
|
|
|
|
List<MediaItem> a(List<MediaItem> list, Bundle bundle) {
|
|
if (list == null) {
|
|
return null;
|
|
}
|
|
int i = bundle.getInt("android.media.browse.extra.PAGE", -1);
|
|
int i2 = bundle.getInt("android.media.browse.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()) {
|
|
if (i4 > list.size()) {
|
|
i4 = list.size();
|
|
}
|
|
return list.subList(i3, i4);
|
|
}
|
|
return Collections.emptyList();
|
|
}
|
|
}
|
|
}
|
|
|
|
static class MediaBrowserImplApi21 implements MediaBrowserImpl, MediaBrowserServiceCallbackImpl, ConnectionCallback.ConnectionCallbackInternal {
|
|
final Context a;
|
|
protected final Object b;
|
|
protected final Bundle c;
|
|
protected final CallbackHandler d = new CallbackHandler(this);
|
|
private final ArrayMap<String, Subscription> e = new ArrayMap<>();
|
|
protected ServiceBinderWrapper f;
|
|
protected Messenger g;
|
|
private MediaSessionCompat.Token h;
|
|
|
|
MediaBrowserImplApi21(Context context, ComponentName componentName, ConnectionCallback connectionCallback, Bundle bundle) {
|
|
this.a = context;
|
|
this.c = bundle != null ? new Bundle(bundle) : new Bundle();
|
|
this.c.putInt("extra_client_version", 1);
|
|
connectionCallback.a(this);
|
|
this.b = MediaBrowserCompatApi21.a(context, componentName, connectionCallback.a, this.c);
|
|
}
|
|
|
|
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
|
|
public void a() {
|
|
Messenger messenger;
|
|
ServiceBinderWrapper serviceBinderWrapper = this.f;
|
|
if (serviceBinderWrapper != null && (messenger = this.g) != null) {
|
|
try {
|
|
serviceBinderWrapper.b(messenger);
|
|
} catch (RemoteException unused) {
|
|
Log.i("MediaBrowserCompat", "Remote error unregistering client messenger.");
|
|
}
|
|
}
|
|
MediaBrowserCompatApi21.b(this.b);
|
|
}
|
|
|
|
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserServiceCallbackImpl
|
|
public void a(Messenger messenger) {
|
|
}
|
|
|
|
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserServiceCallbackImpl
|
|
public void a(Messenger messenger, String str, MediaSessionCompat.Token token, Bundle bundle) {
|
|
}
|
|
|
|
@Override // android.support.v4.media.MediaBrowserCompat.ConnectionCallback.ConnectionCallbackInternal
|
|
public void b() {
|
|
this.f = null;
|
|
this.g = null;
|
|
this.h = null;
|
|
this.d.a(null);
|
|
}
|
|
|
|
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
|
|
public void c() {
|
|
MediaBrowserCompatApi21.a(this.b);
|
|
}
|
|
|
|
@Override // android.support.v4.media.MediaBrowserCompat.ConnectionCallback.ConnectionCallbackInternal
|
|
public void d() {
|
|
}
|
|
|
|
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserImpl
|
|
public MediaSessionCompat.Token e() {
|
|
if (this.h == null) {
|
|
this.h = MediaSessionCompat.Token.fromToken(MediaBrowserCompatApi21.d(this.b));
|
|
}
|
|
return this.h;
|
|
}
|
|
|
|
@Override // android.support.v4.media.MediaBrowserCompat.ConnectionCallback.ConnectionCallbackInternal
|
|
public void onConnected() {
|
|
Bundle c = MediaBrowserCompatApi21.c(this.b);
|
|
if (c == null) {
|
|
return;
|
|
}
|
|
c.getInt("extra_service_version", 0);
|
|
IBinder a = BundleCompat.a(c, "extra_messenger");
|
|
if (a != null) {
|
|
this.f = new ServiceBinderWrapper(a, this.c);
|
|
this.g = new Messenger(this.d);
|
|
this.d.a(this.g);
|
|
try {
|
|
this.f.b(this.a, this.g);
|
|
} catch (RemoteException unused) {
|
|
Log.i("MediaBrowserCompat", "Remote error registering client messenger.");
|
|
}
|
|
}
|
|
IMediaSession a2 = IMediaSession.Stub.a(BundleCompat.a(c, "extra_session_binder"));
|
|
if (a2 != null) {
|
|
this.h = MediaSessionCompat.Token.fromToken(MediaBrowserCompatApi21.d(this.b), a2);
|
|
}
|
|
}
|
|
|
|
@Override // android.support.v4.media.MediaBrowserCompat.MediaBrowserServiceCallbackImpl
|
|
public void a(Messenger messenger, String str, List list, Bundle bundle, Bundle bundle2) {
|
|
if (this.g != messenger) {
|
|
return;
|
|
}
|
|
Subscription subscription = this.e.get(str);
|
|
if (subscription == null) {
|
|
if (MediaBrowserCompat.b) {
|
|
Log.d("MediaBrowserCompat", "onLoadChildren for id that isn't subscribed id=" + str);
|
|
return;
|
|
}
|
|
return;
|
|
}
|
|
SubscriptionCallback a = subscription.a(bundle);
|
|
if (a != null) {
|
|
if (bundle == null) {
|
|
if (list == null) {
|
|
a.a(str);
|
|
return;
|
|
} else {
|
|
a.a(str, (List<MediaItem>) list);
|
|
return;
|
|
}
|
|
}
|
|
if (list == null) {
|
|
a.a(str, bundle);
|
|
} else {
|
|
a.a(str, list, bundle);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private static class ServiceBinderWrapper {
|
|
private Messenger a;
|
|
private Bundle b;
|
|
|
|
public ServiceBinderWrapper(IBinder iBinder, Bundle bundle) {
|
|
this.a = new Messenger(iBinder);
|
|
this.b = bundle;
|
|
}
|
|
|
|
void a(Context context, Messenger messenger) throws RemoteException {
|
|
Bundle bundle = new Bundle();
|
|
bundle.putString("data_package_name", context.getPackageName());
|
|
bundle.putBundle("data_root_hints", this.b);
|
|
a(1, bundle, messenger);
|
|
}
|
|
|
|
void b(Context context, Messenger messenger) throws RemoteException {
|
|
Bundle bundle = new Bundle();
|
|
bundle.putString("data_package_name", context.getPackageName());
|
|
bundle.putBundle("data_root_hints", this.b);
|
|
a(6, bundle, messenger);
|
|
}
|
|
|
|
void a(Messenger messenger) throws RemoteException {
|
|
a(2, null, messenger);
|
|
}
|
|
|
|
void b(Messenger messenger) throws RemoteException {
|
|
a(7, null, messenger);
|
|
}
|
|
|
|
void a(String str, IBinder iBinder, Bundle bundle, Messenger messenger) throws RemoteException {
|
|
Bundle bundle2 = new Bundle();
|
|
bundle2.putString("data_media_item_id", str);
|
|
BundleCompat.a(bundle2, "data_callback_token", iBinder);
|
|
bundle2.putBundle("data_options", bundle);
|
|
a(3, bundle2, messenger);
|
|
}
|
|
|
|
private void a(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.a.send(obtain);
|
|
}
|
|
}
|
|
|
|
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;
|
|
|
|
public MediaItem(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 static MediaItem fromMediaItem(Object obj) {
|
|
if (obj == null || Build.VERSION.SDK_INT < 21) {
|
|
return null;
|
|
}
|
|
return new MediaItem(MediaDescriptionCompat.fromMediaDescription(MediaBrowserCompatApi21.MediaItem.a(obj)), MediaBrowserCompatApi21.MediaItem.b(obj));
|
|
}
|
|
|
|
public static List<MediaItem> fromMediaItemList(List<?> list) {
|
|
if (list == null || Build.VERSION.SDK_INT < 21) {
|
|
return null;
|
|
}
|
|
ArrayList arrayList = new ArrayList(list.size());
|
|
Iterator<?> it = list.iterator();
|
|
while (it.hasNext()) {
|
|
arrayList.add(fromMediaItem(it.next()));
|
|
}
|
|
return arrayList;
|
|
}
|
|
|
|
@Override // android.os.Parcelable
|
|
public int describeContents() {
|
|
return 0;
|
|
}
|
|
|
|
public MediaDescriptionCompat getDescription() {
|
|
return this.mDescription;
|
|
}
|
|
|
|
public int getFlags() {
|
|
return this.mFlags;
|
|
}
|
|
|
|
public String getMediaId() {
|
|
return this.mDescription.getMediaId();
|
|
}
|
|
|
|
public boolean isBrowsable() {
|
|
return (this.mFlags & 1) != 0;
|
|
}
|
|
|
|
public boolean isPlayable() {
|
|
return (this.mFlags & 2) != 0;
|
|
}
|
|
|
|
public String toString() {
|
|
return "MediaItem{mFlags=" + this.mFlags + ", mDescription=" + this.mDescription + '}';
|
|
}
|
|
|
|
@Override // android.os.Parcelable
|
|
public void writeToParcel(Parcel parcel, int i) {
|
|
parcel.writeInt(this.mFlags);
|
|
this.mDescription.writeToParcel(parcel, i);
|
|
}
|
|
|
|
MediaItem(Parcel parcel) {
|
|
this.mFlags = parcel.readInt();
|
|
this.mDescription = MediaDescriptionCompat.CREATOR.createFromParcel(parcel);
|
|
}
|
|
}
|
|
}
|