package com.zhuinden.simplestackdemoexamplefragments.util;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.View;
import android.view.ViewGroup;
import com.zhuinden.simplestack.KeyContextWrapper;
import com.zhuinden.simplestackdemoexamplefragments.application.Key;
import butterknife.Unbinder;
/**
* Created by Zhuinden on 2017.01.26..
*/
public abstract class BaseFragment<C extends BaseFragment<C, P>, P extends BasePresenter<C, P>>
extends Fragment {
public static final String KEY_TAG = "KEY";
public abstract P getPresenter();
public abstract C getThis();
private Key key;
private Unbinder unbinder;
protected abstract Unbinder bindViews(View view);
protected abstract void injectSelf();
public BaseFragment() {
injectSelf();
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setHasOptionsMenu(true);
}
@Override
public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
inflater.inflate(getKey().menu(), menu);
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
if(savedInstanceState != null) {
getPresenter().fromBundle(savedInstanceState.getParcelable("PRESENTER_STATE"));
}
key = getArguments().getParcelable(KEY_TAG);
if(key == null) {
throw new IllegalStateException("The fragment was initialized without a KEY argument!");
}
View view = LayoutInflater.from(new KeyContextWrapper(inflater.getContext(), key)).inflate(key.layout(), container, false);
unbinder = bindViews(view);
return view;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
getPresenter().attachFragment(getThis());
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putParcelable("PRESENTER_STATE", getPresenter().toBundle());
}
@Override
public void onDestroyView() {
getPresenter().detachFragment(getThis());
unbinder.unbind();
unbinder = null;
super.onDestroyView();
}
public <K extends Key> K getKey() {
// noinspection unchecked
return (K) key;
}
}