package in.mvpstarter.sample.ui.base; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.util.LongSparseArray; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import java.util.concurrent.atomic.AtomicLong; import butterknife.ButterKnife; import in.mvpstarter.sample.MvpStarterApplication; import in.mvpstarter.sample.injection.component.ConfigPersistentComponent; import in.mvpstarter.sample.injection.component.DaggerConfigPersistentComponent; import in.mvpstarter.sample.injection.component.FragmentComponent; import in.mvpstarter.sample.injection.module.FragmentModule; import timber.log.Timber; /** * Abstract Fragment that every other Fragment in this application must implement. It handles * creation of Dagger components and makes sure that instances of ConfigPersistentComponent are kept * across configuration changes. */ public abstract class BaseFragment extends Fragment { private static final String KEY_FRAGMENT_ID = "KEY_FRAGMENT_ID"; private static final LongSparseArray<ConfigPersistentComponent> sComponentsArray = new LongSparseArray<>(); private static final AtomicLong NEXT_ID = new AtomicLong(0); private FragmentComponent mFragmentComponent; private long mFragmentId; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); // Create the FragmentComponent and reuses cached ConfigPersistentComponent if this is // being called after a configuration change. mFragmentId = savedInstanceState != null ? savedInstanceState.getLong(KEY_FRAGMENT_ID) : NEXT_ID.getAndIncrement(); ConfigPersistentComponent configPersistentComponent; if (sComponentsArray.get(mFragmentId) == null) { Timber.i("Creating new ConfigPersistentComponent id=%d", mFragmentId); configPersistentComponent = DaggerConfigPersistentComponent.builder() .applicationComponent(MvpStarterApplication.get( getActivity()).getComponent()) .build(); sComponentsArray.put(mFragmentId, configPersistentComponent); } else { Timber.i("Reusing ConfigPersistentComponent id=%d", mFragmentId); configPersistentComponent = sComponentsArray.get(mFragmentId); } mFragmentComponent = configPersistentComponent.fragmentComponent(new FragmentModule(this)); } @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(getLayout(), container, false); ButterKnife.bind(this, view); return view; } public abstract int getLayout(); @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putLong(KEY_FRAGMENT_ID, mFragmentId); } @Override public void onDestroy() { if (!getActivity().isChangingConfigurations()) { Timber.i("Clearing ConfigPersistentComponent id=%d", mFragmentId); sComponentsArray.remove(mFragmentId); } super.onDestroy(); } public FragmentComponent fragmentComponent() { return mFragmentComponent; } }