package co.smartreceipts.android.purchases.rx; import android.content.ComponentName; import android.content.Context; import android.content.Intent; import android.content.ServiceConnection; import android.os.IBinder; import android.support.annotation.NonNull; import com.android.vending.billing.IInAppBillingService; import com.google.common.base.Preconditions; import com.hadisatrio.optional.Optional; import java.util.concurrent.atomic.AtomicBoolean; import io.reactivex.Observable; import io.reactivex.subjects.BehaviorSubject; public class RxInAppBillingServiceConnection implements ServiceConnection { private final Context context; private final AtomicBoolean isBound = new AtomicBoolean(false); private final BehaviorSubject<Optional<IInAppBillingService>> inAppBillingServiceSubject = BehaviorSubject.create(); public RxInAppBillingServiceConnection(@NonNull Context context) { this.context = Preconditions.checkNotNull(context.getApplicationContext()); } @Override public void onServiceConnected(ComponentName name, IBinder service) { inAppBillingServiceSubject.onNext(Optional.of(IInAppBillingService.Stub.asInterface(service))); } @Override public void onServiceDisconnected(ComponentName name) { inAppBillingServiceSubject.onNext(Optional.absent()); } @NonNull public Observable<IInAppBillingService> bindToInAppBillingService() { if (!isBound.getAndSet(true)) { final Intent serviceIntent = new Intent("com.android.vending.billing.InAppBillingService.BIND"); serviceIntent.setPackage("com.android.vending"); context.bindService(serviceIntent, this, Context.BIND_AUTO_CREATE); } return inAppBillingServiceSubject .take(1) .filter(Optional::isPresent) .map(Optional::get); } }