now bindings working only while fragment started
This commit is contained in:
parent
df9b3f1dcc
commit
3efeb33bc9
|
|
@ -53,6 +53,8 @@ public class ViewController<TLogic extends Logic,
|
|||
private final ViewGroup container;
|
||||
@NonNull
|
||||
private final BehaviorSubject<Boolean> isDestroyedSubject = BehaviorSubject.create(false);
|
||||
@NonNull
|
||||
private final BehaviorSubject<Boolean> isStartedSubject = BehaviorSubject.create(false);
|
||||
|
||||
public ViewController(@NonNull final CreationContext<TLogic, TActivity, TFragment> creationContext,
|
||||
@Nullable final Bundle savedInstanceState) {
|
||||
|
|
@ -137,9 +139,9 @@ public class ViewController<TLogic extends Logic,
|
|||
|
||||
@NonNull
|
||||
protected <T> Observable<T> bind(@NonNull final Observable<T> observable) {
|
||||
return observable
|
||||
.observeOn(AndroidSchedulers.mainThread())
|
||||
.takeUntil(isDestroyedSubject.filter(isDestroyed -> isDestroyed).first());
|
||||
return isStartedSubject
|
||||
.switchMap(isStarted -> isStarted ? observable.observeOn(AndroidSchedulers.mainThread()) : Observable.never())
|
||||
.takeUntil(isDestroyedSubject.filter(isDestroyed -> isDestroyed));
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
@ -154,10 +156,18 @@ public class ViewController<TLogic extends Logic,
|
|||
}
|
||||
}
|
||||
|
||||
public void onStart() {
|
||||
isStartedSubject.onNext(true);
|
||||
}
|
||||
|
||||
public void onSaveInstanceState(@NonNull final Bundle savedInstanceState) {
|
||||
// do nothing
|
||||
}
|
||||
|
||||
public void onStop() {
|
||||
isStartedSubject.onNext(false);
|
||||
}
|
||||
|
||||
public void onDestroy() {
|
||||
isDestroyedSubject.onNext(true);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -71,6 +71,7 @@ public abstract class ViewControllerFragment<TState extends Serializable, TLogic
|
|||
private ViewController viewController;
|
||||
private Subscription viewControllerSubscription;
|
||||
private TState state;
|
||||
private boolean isStarted;
|
||||
|
||||
/**
|
||||
* Returns specific object which contains state of ViewController.
|
||||
|
|
@ -95,26 +96,13 @@ public abstract class ViewControllerFragment<TState extends Serializable, TLogic
|
|||
public void onCreate(@Nullable final Bundle savedInstanceState) {
|
||||
super.onCreate(savedInstanceState);
|
||||
|
||||
if (getContext() == null) {
|
||||
Lc.assertion("Context is null in onCreate");
|
||||
return;
|
||||
}
|
||||
|
||||
setHasOptionsMenu(getParentFragment() == null);
|
||||
|
||||
state = savedInstanceState != null
|
||||
? (TState) savedInstanceState.getSerializable(VIEW_CONTROLLER_STATE_EXTRA)
|
||||
: (getArguments() != null ? (TState) getArguments().getSerializable(VIEW_CONTROLLER_STATE_EXTRA) : null);
|
||||
viewControllerSubscription = createViewControllerObservable().subscribe(this::onViewControllerChanged, Lc::assertion);
|
||||
}
|
||||
|
||||
@NonNull
|
||||
private Observable<ViewController> createViewControllerObservable() {
|
||||
return Observable.combineLatest(activitySubject.distinctUntilChanged(), viewSubject.distinctUntilChanged(), this::createViewController)
|
||||
.onErrorResumeNext(throwable -> {
|
||||
Lc.assertion(throwable);
|
||||
return Observable.empty();
|
||||
});
|
||||
viewControllerSubscription = Observable.combineLatest(activitySubject, viewSubject, this::createViewController)
|
||||
.subscribe(this::onViewControllerChanged, Lc::assertion);
|
||||
}
|
||||
|
||||
@Nullable
|
||||
|
|
@ -171,6 +159,15 @@ public abstract class ViewControllerFragment<TState extends Serializable, TLogic
|
|||
activitySubject.onNext(activity);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStart(@NonNull final View view, @NonNull final TActivity activity) {
|
||||
super.onStart(view, activity);
|
||||
isStarted = true;
|
||||
if (viewController != null) {
|
||||
viewController.onStart();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreateOptionsMenu(@NonNull final Menu menu, @NonNull final MenuInflater inflater) {
|
||||
super.onCreateOptionsMenu(menu, inflater);
|
||||
|
|
@ -190,6 +187,9 @@ public abstract class ViewControllerFragment<TState extends Serializable, TLogic
|
|||
}
|
||||
this.viewController = viewController;
|
||||
if (this.viewController != null) {
|
||||
if (isStarted) {
|
||||
this.viewController.onStart();
|
||||
}
|
||||
this.viewController.getActivity().supportInvalidateOptionsMenu();
|
||||
}
|
||||
}
|
||||
|
|
@ -205,6 +205,15 @@ public abstract class ViewControllerFragment<TState extends Serializable, TLogic
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onStop(@NonNull final View view, @NonNull final TActivity activity) {
|
||||
isStarted = false;
|
||||
if (viewController != null) {
|
||||
viewController.onStop();
|
||||
}
|
||||
super.onStop(view, activity);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void onDestroyView(@NonNull final View view) {
|
||||
viewSubject.onNext(null);
|
||||
|
|
|
|||
Loading…
Reference in New Issue