package eu.inloop.viewmodel; import android.app.Activity; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v4.app.FragmentActivity; import java.util.HashMap; /** * Create and keep this class inside your Activity. Store it * in {@link android.support.v4.app.FragmentActivity#onRetainCustomNonConfigurationInstance() * and restore in {@link android.support.v4.app.FragmentActivity#onCreate(android.os.Bundle)} before * calling the super implemenentation. */ public class ViewModelProvider { @NonNull private final HashMap<String, AbstractViewModel<? extends IView>> mViewModelCache; @NonNull public static ViewModelProvider newInstance(@NonNull final FragmentActivity activity) { if (activity.getLastCustomNonConfigurationInstance() == null) { return new ViewModelProvider(); } else { return (ViewModelProvider) activity.getLastCustomNonConfigurationInstance(); } } @SuppressWarnings({"deprecation", "unused"}) @NonNull @Deprecated public static ViewModelProvider newInstance(@NonNull final Activity activity) { if (activity.getLastNonConfigurationInstance() == null) { return new ViewModelProvider(); } else { return (ViewModelProvider) activity.getLastNonConfigurationInstance(); } } private ViewModelProvider() { mViewModelCache = new HashMap<>(); } public synchronized void remove(@Nullable String modeIdentifier) { mViewModelCache.remove(modeIdentifier); } public synchronized void removeAllViewModels() { mViewModelCache.clear(); } @SuppressWarnings("unchecked") @NonNull public synchronized <T extends IView> ViewModelWrapper<T> getViewModel(@NonNull final String modelIdentifier, @NonNull final Class<? extends AbstractViewModel<T>> viewModelClass) { AbstractViewModel<T> instance = (AbstractViewModel<T>) mViewModelCache.get(modelIdentifier); if (instance != null) { return new ViewModelWrapper<>(instance, false); } try { instance = viewModelClass.newInstance(); } catch (final Exception ex) { throw new RuntimeException(ex); } instance.setUniqueIdentifier(modelIdentifier); mViewModelCache.put(modelIdentifier, instance); return new ViewModelWrapper<>(instance, true); } final static class ViewModelWrapper<T extends IView> { @NonNull final AbstractViewModel<T> viewModel; final boolean wasCreated; private ViewModelWrapper(@NonNull AbstractViewModel<T> mViewModel, final boolean mWasCreated) { this.viewModel = mViewModel; this.wasCreated = mWasCreated; } } }