package nucleus.view; import android.app.Fragment; import android.os.Bundle; import nucleus.factory.PresenterFactory; import nucleus.factory.ReflectionPresenterFactory; import nucleus.presenter.Presenter; /** * This view is an example of how a view should control it's presenter. * You can inherit from this class or copy/paste this class's code to * create your own view implementation. * * @param

a type of presenter to return with {@link #getPresenter}. */ public abstract class NucleusFragment

extends Fragment implements ViewWithPresenter

{ private static final String PRESENTER_STATE_KEY = "presenter_state"; private PresenterLifecycleDelegate

presenterDelegate = new PresenterLifecycleDelegate<>(ReflectionPresenterFactory.

fromViewClass(getClass())); /** * Returns a current presenter factory. */ public PresenterFactory

getPresenterFactory() { return presenterDelegate.getPresenterFactory(); } /** * Sets a presenter factory. * Call this method before onCreate/onFinishInflate to override default {@link ReflectionPresenterFactory} presenter factory. * Use this method for presenter dependency injection. */ @Override public void setPresenterFactory(PresenterFactory

presenterFactory) { presenterDelegate.setPresenterFactory(presenterFactory); } /** * Returns a current attached presenter. * This method is guaranteed to return a non-null value between * onResume/onPause and onAttachedToWindow/onDetachedFromWindow calls * if the presenter factory returns a non-null value. * * @return a currently attached presenter or null. */ public P getPresenter() { return presenterDelegate.getPresenter(); } @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); if (bundle != null) presenterDelegate.onRestoreInstanceState(bundle.getBundle(PRESENTER_STATE_KEY)); } @Override public void onSaveInstanceState(Bundle bundle) { super.onSaveInstanceState(bundle); bundle.putBundle(PRESENTER_STATE_KEY, presenterDelegate.onSaveInstanceState()); } @Override public void onResume() { super.onResume(); presenterDelegate.onResume(this); } @Override public void onDestroyView() { super.onDestroyView(); presenterDelegate.onDropView(); } @Override public void onDestroy() { super.onDestroy(); presenterDelegate.onDestroy(!getActivity().isChangingConfigurations()); } }