now bindings working only while fragment started

This commit is contained in:
Gavriil Sitnikov 2016-04-03 17:08:13 +03:00
parent df9b3f1dcc
commit 3efeb33bc9
2 changed files with 37 additions and 18 deletions

View File

@ -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);
}

View File

@ -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);