@Override public void subscribe(SingleEmitter<Integer> e) throws Exception { e.setDisposable(d1); e.setCancellable(new Cancellable() { @Override public void cancel() throws Exception { d2.dispose(); } }); e.onSuccess(1); e.onError(new TestException()); e.onSuccess(2); e.onError(new TestException()); } })
@Test public void deferredResultSubscriberWithError() throws Exception { IllegalStateException ex = new IllegalStateException(); // Mono MonoProcessor<String> mono = MonoProcessor.create(); testDeferredResultSubscriber(mono, Mono.class, forClass(String.class), () -> mono.onError(ex), ex); // RxJava 1 Single AtomicReference<SingleEmitter<String>> ref = new AtomicReference<>(); Single<String> single = Single.fromEmitter(ref::set); testDeferredResultSubscriber(single, Single.class, forClass(String.class), () -> ref.get().onError(ex), ex); // RxJava 2 Single AtomicReference<io.reactivex.SingleEmitter<String>> ref2 = new AtomicReference<>(); io.reactivex.Single<String> single2 = io.reactivex.Single.create(ref2::set); testDeferredResultSubscriber(single2, io.reactivex.Single.class, forClass(String.class), () -> ref2.get().onError(ex), ex); }
public static Single<Bitmap> combineBitmaps (final Context context, final List<String> urls) { return Single.create(e -> { final ArrayList<Bitmap> bitmaps = new ArrayList<>(); ArrayList<Single<Bitmap>> singles = new ArrayList<>(); for(String url : urls) { if(singles.size() >= 4) { break; } singles.add(bitmapForURL(context, url).onErrorResumeNext(throwable -> null)); } Single.merge(singles).observeOn(AndroidSchedulers.mainThread()) .doOnComplete(() -> { int size = context.getResources().getDimensionPixelSize(R.dimen.chat_sdk_chat_action_barcircle_image_view_size); Bitmap bitmap = ImageUtils.getMixImagesBitmap(size, size, bitmaps); if(bitmap == null) { e.onError(new Throwable(context.getString(R.string.thread_image_could_not_be_created))); } else { e.onSuccess(bitmap); } }) .subscribe(bitmaps::add, throwable -> { e.onError(throwable); ChatSDK.logError(throwable); }); }); }
public static Single<Bitmap> bitmapForURL (final Context context, final String url) { return Single.create((SingleOnSubscribe<Bitmap>) e -> { if(!StringChecker.isNullOrEmpty(url)) { Uri uri = Uri.parse(url); ImageRequest request = ImageRequestBuilder .newBuilderWithSource(uri) .build(); ImagePipeline pipeline = Fresco.getImagePipeline(); DataSource dataSource = pipeline.fetchDecodedImage(request, context); dataSource.subscribe(new BaseBitmapDataSubscriber() { @Override protected void onNewResultImpl(Bitmap bitmap) { // We need to copy the bitmap because in some cases, Fresco is recycling the bitmap // which causes a crash later on. Seen this problem in Android 5 e.onSuccess(bitmap.copy(bitmap.getConfig(), true)); } @Override protected void onFailureImpl(DataSource<CloseableReference<CloseableImage>> dataSource) { e.onError(new Throwable(context.getString(R.string.unable_to_load_image))); } }, CallerThreadExecutor.getInstance()); } else { e.onError(new Throwable("Unable to load image")); } }).subscribeOn(AndroidSchedulers.mainThread()); } }
public Completable authenticateWithCachedToken() { return Single.create((SingleOnSubscribe<FirebaseUser>) emitter-> { if (isAuthenticating()) { emitter.onError(ChatError.getError(ChatError.Code.AUTH_IN_PROCESS, "Cant execute two auth in parallel")); } else { setAuthStatus(AuthStatus.CHECKING_IF_AUTH); FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser(); if (user != null) { emitter.onSuccess(user); } else { emitter.onError(ChatError.getError(ChatError.Code.NO_AUTH_DATA, "No auth bundle found")); } } }) .flatMapCompletable(this::authenticateWithUser) .doOnTerminate(this::setAuthStateToIdle) // Whether we complete successfully or not, we set the status to idle .subscribeOn(Schedulers.single()); }
@Override public Completable loginWithGoogle(final Activity activity) { return Single.create((SingleOnSubscribe<AuthCredential>) e -> { googleClient = new GoogleApiClient.Builder(activity) .addApi(Auth.GOOGLE_SIGN_IN_API, gso) .build(); Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(googleClient); activity.startActivityForResult(signInIntent, RC_GOOGLE_SIGN_IN); googleSignInCompleteListener = result -> { if(result.isSuccess()) { AuthCredential credential = GoogleAuthProvider.getCredential(result.getSignInAccount().getIdToken(), null); e.onSuccess(credential); } else { e.onError(new Exception(result.getStatus().toString())); } }; }).flatMapCompletable(authCredential -> signInWithCredential(activity, authCredential)); }
emitter->{ if (isAuthenticating()) { emitter.onError(ChatError.getError(ChatError.Code.AUTH_IN_PROCESS, "Can't execute two auth in parallel")); return; emitter.onSuccess(task.getResult().getUser()); } else { emitter.onError(task.getException()); case Twitter: default: emitter.onError(ChatError.getError(ChatError.Code.NO_LOGIN_TYPE, "No matching login type was found")); break;
@Override public Single<JWT> decode(String jwt) { return Single.create(emitter -> { try { String json = new String(Base64.getDecoder().decode(jwt.split("\\.")[1]), "UTF-8"); emitter.onSuccess(objectMapper.readValue(json, JWT.class)); } catch (Exception ex) { logger.debug("Failed to decode JWT", ex); emitter.onError(new InvalidTokenException("The access token is invalid", ex)); } }); }
@Override public Single<JWT> decode(String jwt) { return Single.create(emitter -> { try { String json = new String(Base64.getDecoder().decode(jwt.split("\\.")[1]), "UTF-8"); emitter.onSuccess(objectMapper.readValue(json, JWT.class)); } catch (Exception ex) { logger.debug("Failed to decode JWT", ex); emitter.onError(new InvalidTokenException("The access token is invalid", ex)); } }); }
protected <T> void setupBaseSingleError(final BaseSingle<T> baseSingle) { doAnswer(invocation -> { final SingleEmitter<T> subscriber = ((BaseSingle.ApiClientConnectionCallbacks)invocation.getArguments()[0]).subscriber; doAnswer(invocation1 -> { subscriber.onError(new GoogleAPIConnectionException("Error connecting to GoogleApiClient.", connectionResult)); return null; }).when(apiClient).connect(); return apiClient; }).when(baseSingle).createApiClient(Matchers.any(BaseRx.ApiClientConnectionCallbacks.class)); }
@Override public void subscribe(SingleEmitter<Object> e) throws Exception { e.onSuccess(1); e.onSuccess(2); e.onError(new IOException()); } })
@Override public void subscribe(SingleEmitter<Object> e) throws Exception { e.setCancellable(SoloTest.this); e.onSuccess(1); e.onSuccess(2); e.onError(new IOException()); } })