Q:

BehaviorSubject vs PublishSubject

I'm trying to get my head around the golden rule (if any) about:

When to use BehaviorSubject ?

and 

When to use PublishSubject ?

The difference between them is very clear

There are many kinds of subjects. For this specific requirement, a PublishSubject works well because we wish to continue the sequence from where it left off. So assuming events 1,2,3 were emitted in (B), after (A) connects back we only want to see 4, 5, 6. If we used a ReplaySubject we would see [1, 2, 3], 4, 5, 6; or if we used a BehaviorSubject we would see 3, 4, 5, 6 etc.
  (source : How to think about Subjects in RxJava (Part 1))

I have seen that Subject's are used in two contexts (at least), UI context and listener context.

UI context (MVVM as example)

For example here a BehaviorSubject is used, and it's clear why they use Subject and not Observable but I have changed the BehaviorSubject to PublishSubject but the app behavior still the same.

Listener context

Why they make project field a BehaviorSubject and not PublishSubject ?

A:

The main difference between PublishSubject and BehaviorSubject is that the latter one remembers the last emitted item. Because of that BehaviorSubject is really useful when you want to emit states. 

Why they make project field a BehaviorSubject and not PublishSubject ?

Probably because they want to be able to retrieve the last emitted project with this method:
@Override public @NonNull Observable<Project> project() {
  return this.project;
}

A:

PublishSubject: Starts empty and only emits new elements to subscribers.
There is a possibility that one or more items may be lost between the time the Subject is created and the observer subscribes to it because PublishSubject starts emitting elements immediately upon creation.
BehaviorSubject: It needs an initial value and replays it or the latest element to new subscribers. As BehaviorSubject always emits the latest element, you can’t create one without giving a default initial value. 
BehaviorSubject is helpful for depicting "values over time". For example, an event stream of birthdays is a Subject, but the stream of a person's age would be a BehaviorSubject.

