diff --git a/library/src/main/java/eu/inloop/viewmodel/IViewModelFactory.java b/library/src/main/java/eu/inloop/viewmodel/IViewModelFactory.java new file mode 100644 index 0000000..9cec88d --- /dev/null +++ b/library/src/main/java/eu/inloop/viewmodel/IViewModelFactory.java @@ -0,0 +1,9 @@ +package eu.inloop.viewmodel; + +import android.support.annotation.Nullable; + +public interface IViewModelFactory > { + + @Nullable + R createViewModel(); +} \ No newline at end of file diff --git a/library/src/main/java/eu/inloop/viewmodel/ViewModelHelper.java b/library/src/main/java/eu/inloop/viewmodel/ViewModelHelper.java index 48b9844..9d1ed3b 100644 --- a/library/src/main/java/eu/inloop/viewmodel/ViewModelHelper.java +++ b/library/src/main/java/eu/inloop/viewmodel/ViewModelHelper.java @@ -39,16 +39,16 @@ public class ViewModelHelper> { * @param activity parent activity * @param savedInstanceState savedInstance state from {@link Activity#onCreate(Bundle)} or * {@link Fragment#onCreate(Bundle)} - * @param viewModelClass the {@link Class} of your ViewModel + * @param viewModelFactory the {@link Class} of your ViewModel * @param arguments pass {@link Fragment#getArguments()} or * {@link Activity#getIntent()}.{@link Intent#getExtras() getExtras()} */ public void onCreate(@NonNull Activity activity, @Nullable Bundle savedInstanceState, - @Nullable Class> viewModelClass, + @Nullable IViewModelFactory viewModelFactory, @Nullable Bundle arguments) { // no viewmodel for this fragment - if (viewModelClass == null) { + if (viewModelFactory == null) { mViewModel = null; return; } @@ -72,7 +72,7 @@ public void onCreate(@NonNull Activity activity, throw new IllegalStateException("ViewModelProvider for activity " + activity + " was null."); //NON-NLS } - final ViewModelProvider.ViewModelWrapper viewModelWrapper = viewModelProvider.getViewModel(mScreenId, viewModelClass); + final ViewModelProvider.ViewModelWrapper viewModelWrapper = viewModelProvider.getViewModel(mScreenId, viewModelFactory); //noinspection unchecked mViewModel = (R) viewModelWrapper.viewModel; diff --git a/library/src/main/java/eu/inloop/viewmodel/ViewModelProvider.java b/library/src/main/java/eu/inloop/viewmodel/ViewModelProvider.java index c541de4..644ab3c 100644 --- a/library/src/main/java/eu/inloop/viewmodel/ViewModelProvider.java +++ b/library/src/main/java/eu/inloop/viewmodel/ViewModelProvider.java @@ -52,17 +52,13 @@ public synchronized void removeAllViewModels() { @SuppressWarnings("unchecked") @NonNull public synchronized ViewModelWrapper getViewModel(@NonNull final String modelIdentifier, - @NonNull final Class> viewModelClass) { + @NonNull final IViewModelFactory> viewModelFactory) { AbstractViewModel instance = (AbstractViewModel) mViewModelCache.get(modelIdentifier); if (instance != null) { return new ViewModelWrapper<>(instance, false); } - try { - instance = viewModelClass.newInstance(); - } catch (final Exception ex) { - throw new RuntimeException(ex); - } + instance = viewModelFactory.createViewModel(); instance.setUniqueIdentifier(modelIdentifier); mViewModelCache.put(modelIdentifier, instance); return new ViewModelWrapper<>(instance, true); diff --git a/library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseActivity.java b/library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseActivity.java index 2a7dc47..d1e6457 100644 --- a/library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseActivity.java +++ b/library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseActivity.java @@ -7,11 +7,12 @@ import eu.inloop.viewmodel.AbstractViewModel; import eu.inloop.viewmodel.IView; +import eu.inloop.viewmodel.IViewModelFactory; import eu.inloop.viewmodel.ProxyViewHelper; import eu.inloop.viewmodel.ViewModelHelper; import eu.inloop.viewmodel.binding.ViewModelBindingConfig; -public abstract class ViewModelBaseActivity> extends ViewModelBaseEmptyActivity implements IView { +public abstract class ViewModelBaseActivity> extends ViewModelBaseEmptyActivity implements IView { @NonNull private final ViewModelHelper mViewModeHelper = new ViewModelHelper<>(); @@ -20,14 +21,29 @@ public abstract class ViewModelBaseActivity> viewModelClass = getViewModelClass(); + + IViewModelFactory viewModelFactory = getViewModelFactory(); // try to extract the ViewModel class from the implementation - if (viewModelClass == null) { + if (viewModelFactory == null) { //noinspection unchecked - viewModelClass = (Class>) ProxyViewHelper.getGenericType(getClass(), AbstractViewModel.class); + final Class> viewModelClass = (Class>) ProxyViewHelper.getGenericType(getClass(), AbstractViewModel.class); + if (viewModelClass != null) { + viewModelFactory = new IViewModelFactory() { + @Nullable + @Override + public R createViewModel() { + try { + return (R) viewModelClass.newInstance(); + } catch (InstantiationException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } + }; + } } - mViewModeHelper.onCreate(this, savedInstanceState, viewModelClass, getIntent().getExtras()); + mViewModeHelper.onCreate(this, savedInstanceState, viewModelFactory, getIntent().getExtras()); } /** @@ -40,7 +56,7 @@ public void setModelView(@NonNull final T view) { } @Nullable - public Class getViewModelClass() { + public IViewModelFactory getViewModelFactory() { return null; } diff --git a/library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseFragment.java b/library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseFragment.java index d198615..9826161 100644 --- a/library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseFragment.java +++ b/library/src/main/java/eu/inloop/viewmodel/base/ViewModelBaseFragment.java @@ -9,6 +9,7 @@ import eu.inloop.viewmodel.AbstractViewModel; import eu.inloop.viewmodel.IView; +import eu.inloop.viewmodel.IViewModelFactory; import eu.inloop.viewmodel.ProxyViewHelper; import eu.inloop.viewmodel.ViewModelHelper; import eu.inloop.viewmodel.binding.ViewModelBindingConfig; @@ -23,13 +24,28 @@ public abstract class ViewModelBaseFragment> viewModelClass = getViewModelClass(); + IViewModelFactory viewModelFactory = getViewModelFactory(); // try to extract the ViewModel class from the implementation - if (viewModelClass == null) { + if (viewModelFactory == null) { //noinspection unchecked - viewModelClass = (Class>) ProxyViewHelper.getGenericType(getClass(), AbstractViewModel.class); + final Class> viewModelClass = (Class>) ProxyViewHelper.getGenericType(getClass(), AbstractViewModel.class); + if (viewModelClass != null) { + viewModelFactory = new IViewModelFactory() { + @Nullable + @Override + public R createViewModel() { + try { + return (R) viewModelClass.newInstance(); + } catch (java.lang.InstantiationException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + } + }; + } } - getViewModelHelper().onCreate(getActivity(), savedInstanceState, viewModelClass, getArguments()); + getViewModelHelper().onCreate(getActivity(), savedInstanceState, viewModelFactory, getArguments()); } @CallSuper @@ -68,7 +84,7 @@ public void onDestroy() { } @Nullable - public Class getViewModelClass() { + public IViewModelFactory getViewModelFactory() { return null; } diff --git a/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/UserListFragment.java b/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/UserListFragment.java index 39a6055..ed6e321 100644 --- a/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/UserListFragment.java +++ b/sample/src/main/java/eu/inloop/viewmodel/sample/fragment/UserListFragment.java @@ -19,6 +19,7 @@ import butterknife.ButterKnife; import butterknife.InjectView; +import eu.inloop.viewmodel.IViewModelFactory; import eu.inloop.viewmodel.base.ViewModelBaseFragment; import eu.inloop.viewmodel.binding.ViewModelBindingConfig; import eu.inloop.viewmodel.sample.R; @@ -47,6 +48,18 @@ public void onCreate(Bundle savedInstanceState) { mAdapter = new ArrayAdapter<>(getActivity(), android.R.layout.simple_list_item_1, android.R.id.text1, new ArrayList()); } + @Nullable + @Override + public IViewModelFactory getViewModelFactory() { + return new IViewModelFactory() { + @Nullable + @Override + public UserListViewModel createViewModel() { + return new UserListViewModel(); + } + }; + } + @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { final View view = inflater.inflate(R.layout.fragment_userlist, container, false);