package com.artemzin.qualitymatters.ui.presenters;
import android.support.annotation.CallSuper;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import rx.Subscription;
import rx.subscriptions.CompositeSubscription;
/**
* Base presenter implementation.
*
* @param <V> view.
*/
public class Presenter<V> {
@NonNull
private final CompositeSubscription subscriptionsToUnsubscribeOnUnbindView = new CompositeSubscription();
@Nullable
private volatile V view;
@CallSuper
public void bindView(@NonNull V view) {
final V previousView = this.view;
if (previousView != null) {
throw new IllegalStateException("Previous view is not unbounded! previousView = " + previousView);
}
this.view = view;
}
@Nullable
protected V view() {
return view;
}
protected final void unsubscribeOnUnbindView(@NonNull Subscription subscription, @NonNull Subscription... subscriptions) {
subscriptionsToUnsubscribeOnUnbindView.add(subscription);
for (Subscription s : subscriptions) {
subscriptionsToUnsubscribeOnUnbindView.add(s);
}
}
@CallSuper
@SuppressWarnings("PMD.CompareObjectsWithEquals")
public void unbindView(@NonNull V view) {
final V previousView = this.view;
if (previousView == view) {
this.view = null;
} else {
throw new IllegalStateException("Unexpected view! previousView = " + previousView + ", view to unbind = " + view);
}
// Unsubscribe all subscriptions that need to be unsubscribed in this lifecycle state.
subscriptionsToUnsubscribeOnUnbindView.clear();
}
}