Best practice for Android MVVM startActivity

Felipe Kenji Shiba picture Felipe Kenji Shiba · Nov 7, 2016 · Viewed 25.7k times · Source

I am building an Android App using MVVM and DataBinding. And I have a function inside my ViewModel that starts an Activity. Is it okay to have an onClick call inside a ViewModel?

Like this.

public class MyViewModel {
    public void onClick(View view, long productId) {
        Context context = view.getContext();
        Intent intent = new Intent(context, ProductDetailActivity.class);
        intent.putExtra("productId", productId);
        context.startActivity(intent);
    }
}

And in my XML:

...
android:onClick="@{(v) -> viewModel.onClick(v, viewModel.product.id)}">

Or would it be a best practice to move it to the View and call it from EventBus or Rx and have only POJO in my ViewModel?

Answer

Kaskasi picture Kaskasi · Dec 19, 2016

The answer to your question is what is your goal?

If you want to use MVVM for separation of concerns so that you can unit test your Viewmodel then you should try to keep everything that requires a Context separate from your Viewmodel. The Viewmodel contains the core business logic of your app and should have no external dependencies.

However I like where you are going :) If the decision which Activity is opened lies in the View, then it is very very hard to write a JUnit test for it. However you can pass an object into the Viewmodel which performs the startActivity() call. Now in your Unit test you can simply mock this object and verify that the correct Activity is opened