110 lines
3.9 KiB
Java
110 lines
3.9 KiB
Java
|
package androidx.browser.trusted;
|
||
|
|
||
|
import android.content.ComponentName;
|
||
|
import android.content.ServiceConnection;
|
||
|
import android.os.IBinder;
|
||
|
import androidx.annotation.MainThread;
|
||
|
import androidx.annotation.NonNull;
|
||
|
import androidx.annotation.Nullable;
|
||
|
import androidx.concurrent.futures.CallbackToFutureAdapter;
|
||
|
import c.d.b.a.a;
|
||
|
import java.util.ArrayList;
|
||
|
import java.util.List;
|
||
|
import x.a.a.d.b;
|
||
|
public class ConnectionHolder implements ServiceConnection {
|
||
|
private static final int STATE_AWAITING_CONNECTION = 0;
|
||
|
private static final int STATE_CANCELLED = 3;
|
||
|
private static final int STATE_CONNECTED = 1;
|
||
|
private static final int STATE_DISCONNECTED = 2;
|
||
|
@Nullable
|
||
|
private Exception mCancellationException;
|
||
|
@NonNull
|
||
|
private final Runnable mCloseRunnable;
|
||
|
@NonNull
|
||
|
private List<CallbackToFutureAdapter.Completer<TrustedWebActivityServiceConnection>> mCompleters;
|
||
|
@Nullable
|
||
|
private TrustedWebActivityServiceConnection mService;
|
||
|
private int mState;
|
||
|
@NonNull
|
||
|
private final WrapperFactory mWrapperFactory;
|
||
|
|
||
|
public static class WrapperFactory {
|
||
|
@NonNull
|
||
|
public TrustedWebActivityServiceConnection create(ComponentName componentName, IBinder iBinder) {
|
||
|
return new TrustedWebActivityServiceConnection(b.a.asInterface(iBinder), componentName);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
@MainThread
|
||
|
public ConnectionHolder(@NonNull Runnable runnable) {
|
||
|
this(runnable, new WrapperFactory());
|
||
|
}
|
||
|
|
||
|
@MainThread
|
||
|
public ConnectionHolder(@NonNull Runnable runnable, @NonNull WrapperFactory wrapperFactory) {
|
||
|
this.mState = 0;
|
||
|
this.mCompleters = new ArrayList();
|
||
|
this.mCloseRunnable = runnable;
|
||
|
this.mWrapperFactory = wrapperFactory;
|
||
|
}
|
||
|
|
||
|
public /* synthetic */ Object a(CallbackToFutureAdapter.Completer completer) {
|
||
|
int i = this.mState;
|
||
|
if (i == 0) {
|
||
|
this.mCompleters.add(completer);
|
||
|
} else if (i == 1) {
|
||
|
TrustedWebActivityServiceConnection trustedWebActivityServiceConnection = this.mService;
|
||
|
if (trustedWebActivityServiceConnection != null) {
|
||
|
completer.set(trustedWebActivityServiceConnection);
|
||
|
} else {
|
||
|
throw new IllegalStateException("ConnectionHolder state is incorrect.");
|
||
|
}
|
||
|
} else if (i == 2) {
|
||
|
throw new IllegalStateException("Service has been disconnected.");
|
||
|
} else if (i != 3) {
|
||
|
throw new IllegalStateException("Connection state is invalid");
|
||
|
} else {
|
||
|
throw this.mCancellationException;
|
||
|
}
|
||
|
StringBuilder L = a.L("ConnectionHolder, state = ");
|
||
|
L.append(this.mState);
|
||
|
return L.toString();
|
||
|
}
|
||
|
|
||
|
@MainThread
|
||
|
public void cancel(@NonNull Exception exc) {
|
||
|
for (CallbackToFutureAdapter.Completer<TrustedWebActivityServiceConnection> completer : this.mCompleters) {
|
||
|
completer.setException(exc);
|
||
|
}
|
||
|
this.mCompleters.clear();
|
||
|
this.mCloseRunnable.run();
|
||
|
this.mState = 3;
|
||
|
this.mCancellationException = exc;
|
||
|
}
|
||
|
|
||
|
@NonNull
|
||
|
@MainThread
|
||
|
public c.i.b.d.a.a<TrustedWebActivityServiceConnection> getServiceWrapper() {
|
||
|
return CallbackToFutureAdapter.getFuture(new y.a.b.a(this));
|
||
|
}
|
||
|
|
||
|
@Override // android.content.ServiceConnection
|
||
|
@MainThread
|
||
|
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
|
||
|
this.mService = this.mWrapperFactory.create(componentName, iBinder);
|
||
|
for (CallbackToFutureAdapter.Completer<TrustedWebActivityServiceConnection> completer : this.mCompleters) {
|
||
|
completer.set(this.mService);
|
||
|
}
|
||
|
this.mCompleters.clear();
|
||
|
this.mState = 1;
|
||
|
}
|
||
|
|
||
|
@Override // android.content.ServiceConnection
|
||
|
@MainThread
|
||
|
public void onServiceDisconnected(ComponentName componentName) {
|
||
|
this.mService = null;
|
||
|
this.mCloseRunnable.run();
|
||
|
this.mState = 2;
|
||
|
}
|
||
|
}
|