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