package co.smartreceipts.android.apis; import android.os.Bundle; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import retrofit2.Retrofit; import retrofit2.converter.gson.GsonConverterFactory; /** * Safely holds a desired retrofit service in order that it will persist across configuration changes (so long as the parent activity * or fragment is not destroyed). Use the {@link #getService()} method to retrieve a service from this class * * @param <T> the service class type */ public class NetworkRequestManager<T> { private final RetrofitHeadlessFragment mHeadlessFragment; public NetworkRequestManager(@NonNull FragmentManager fragmentManager, @NonNull String endpoint, @NonNull Class<T> serviceClass) { RetrofitHeadlessFragment headlessFragment = (RetrofitHeadlessFragment) fragmentManager.findFragmentByTag(RetrofitHeadlessFragment.TAG); if (headlessFragment == null || headlessFragment.mServiceClass == null) { headlessFragment = new RetrofitHeadlessFragment(); fragmentManager.beginTransaction().add(headlessFragment, RetrofitHeadlessFragment.TAG).commit(); final Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create(); final Retrofit restAdapter = new Retrofit.Builder().baseUrl(endpoint).addConverterFactory(GsonConverterFactory.create(gson)).build(); headlessFragment.mServiceClass = restAdapter.create(serviceClass); } mHeadlessFragment = headlessFragment; } @SuppressWarnings("unchecked") public final T getService() { return (T) mHeadlessFragment.mServiceClass; } public static final class RetrofitHeadlessFragment extends Fragment { private static final String TAG = RetrofitHeadlessFragment.class.getName(); private Object mServiceClass; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } } }