I'm very new to Java, android and Rxjava. I recently noticed that in an existing project (not written by me) a chat notification that is supposed to be received isn't received. Thus I started to do some tracing. Below is part of the code.
Note: Notifications that do get received seems to always go to onSuccess in the file FCMServices
I've put breakpoints pretty much everywhere in the code below. What I noticed was for the notifications that I do not receive onSuccess and onError do not get called but onComplete does. However I find that strange as I thought either onSuccess or onError must be called before onComplete.
My understanding of those functions is based on http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/MaybeObserver.html
//FCMService.java
currentConversationRepo.getCurrentConversation()
                    .subscribeOn(Schedulers.io())
                    .observeOn(AndroidSchedulers.mainThread())
                    .subscribe(new MaybeObserver<CurrentConversation>() {
                        @Override
                        public void onSubscribe(@NonNull Disposable d) {
                            currentChatDisposable = d;
                        }
                        @Override
                        public void onSuccess(@NonNull CurrentConversation currentConversation) {
                            System.out.println("This is SUCCESS");
                            if (channelSid == null && author == null && usedAdId == null){
                                buildNotifyNotification(body, action, "", userId);
                            }
                            if (channelSid != null && author != null) {
                                if (!channelSid.equals(currentConversation.getChannelSid())) {
                                    createChatNotification(author, channelSid, body);
                                }
                            }
                            currentChatDisposable.dispose();
                        }
                        @Override
                        public void onError(@NonNull Throwable e) {
                            System.out.println("Error getting current conversation: " + e.getMessage());
                            currentChatDisposable.dispose();
                        }
                        @Override
                        public void onComplete() {
                            System.out.println("This is onComplete");
                            currentChatDisposable.dispose();
                        }
                    });
I then started to do some tracing of where onComplete was called and appears that it was called by another onSuccess from the class TestObserver in reactivex.io
http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/observers/TestObserver.html
//TestObserver.java
@Override
public void onSuccess(T value) {
    onNext(value);
    onComplete();
}
Which was in turn called by the onSuccess in MaybeFlatMapBiSelector class. (Also a reactivex.io class I believe)
//MaybeFlatMapBiSSelector.java
            @Override
            public void onSuccess(U value) {
                T t = this.value;
                this.value = null;
                R r;
                try {
                    r = ObjectHelper.requireNonNull(resultSelector.apply(t, value), "The resultSelector returned a null value");
                } catch (Throwable ex) {
                    Exceptions.throwIfFatal(ex);
                    actual.onError(ex);
                    return;
                }
                actual.onSuccess(r);
            }
This turned out to be from the MaybeObserver interface
http://reactivex.io/RxJava/2.x/javadoc/io/reactivex/MaybeObserver.html#onComplete--
My question is what exactly are the onSuccess of TestObserver and MaybeFlatMapBiSelector doing? And if it is even possible based on the information I have provided, why is it that some notifications goes to onComplete without going to onSuccess or onError in FCMServices.java
 
    