package eu.inloop.viewmodel.base; import android.os.Bundle; import android.support.annotation.CallSuper; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.view.View; import eu.inloop.viewmodel.AbstractViewModel; import eu.inloop.viewmodel.IView; import eu.inloop.viewmodel.ProxyViewHelper; import eu.inloop.viewmodel.ViewModelHelper; import eu.inloop.viewmodel.binding.ViewModelBindingConfig; public abstract class ViewModelBaseFragment<T extends IView, R extends AbstractViewModel<T>> extends Fragment implements IView { @NonNull private final ViewModelHelper<T, R> mViewModelHelper = new ViewModelHelper<>(); @CallSuper @Override public void onCreate(@Nullable final Bundle savedInstanceState) { super.onCreate(savedInstanceState); Class<? extends AbstractViewModel<T>> viewModelClass = getViewModelClass(); // try to extract the ViewModel class from the implementation if (viewModelClass == null) { //noinspection unchecked viewModelClass = (Class<? extends AbstractViewModel<T>>) ProxyViewHelper.getGenericType(getClass(), AbstractViewModel.class); } getViewModelHelper().onCreate(getActivity(), savedInstanceState, viewModelClass, getArguments()); } @CallSuper @Override public void onSaveInstanceState(@NonNull final Bundle outState) { super.onSaveInstanceState(outState); getViewModelHelper().onSaveInstanceState(outState); } @CallSuper @Override public void onStart() { super.onStart(); getViewModelHelper().onStart(); } @CallSuper @Override public void onStop() { super.onStop(); getViewModelHelper().onStop(); } @CallSuper @Override public void onDestroyView() { getViewModelHelper().onDestroyView(this); super.onDestroyView(); } @CallSuper @Override public void onDestroy() { getViewModelHelper().onDestroy(this); super.onDestroy(); } @Nullable public Class<R> getViewModelClass() { return null; } /** * @see ViewModelHelper#getViewModel() */ @NonNull @SuppressWarnings("unused") public R getViewModel() { return getViewModelHelper().getViewModel(); } @Nullable @Override public ViewModelBindingConfig getViewModelBindingConfig() { return null; } @NonNull public ViewModelHelper<T, R> getViewModelHelper() { return mViewModelHelper; } @Override public void removeViewModel() { mViewModelHelper.removeViewModel(getActivity()); } /** * Call this after your view is ready - usually on the end of {@link * Fragment#onViewCreated(View, Bundle)} * * @param view view */ protected void setModelView(@NonNull final T view) { getViewModelHelper().setView(view); } }