More Related Content Similar to Building maintainable app (20) Building maintainable app10. LoginActivity LoginPresenterImpl LoginInteractorImpl
LoginView LoginPresenter LoginInteractor
showLoading()
hideLoading()
setUsernameError()
setPasswordError()
showLoading()
hideLoading()
setUsernameError()
setPasswordError()
login(username, pass)
loginPresenter loginView
loginInteractor
login(username, pass) login(username, pass,
listener)
login(username, pass,
listener)
VIEW PRESENTER MODEL
11. public interface HomeView {
...
}
public interface HomePresenter {
...
}
public interface CurrencyInteractor {
...
}
VIEW
PRESENTER
MODEL
15. public class HomePresenterImpl
implements HomePresenter {
// interface
private HomeView view;
// and another interface
private CurrencyInteractor interactor;
public HomePresenterImpl(
HomeView view, CurrencyInteractor interactor) {
this.view = view;
this.interactor = interactor;
}
...
}
19. public interface HomeView {
void showCurrencies(List<Currency> currencies);
}
public interface HomePresenter {
void loadCurrencyList();
}
public interface CurrencyInteractor {
void getCurrencyList(CurrencyListener listener);
}
20. public class HomeActivity
extends BaseActivity
implements HomeView {
private void init() {
presenter = new HomePresenterImpl(this,
new CurrencyInteractorImpl());
presenter.getCurrencyList();
}
@Override
public void showCurrencies(List<Currency> currencies) {
// display data
}
}
25. JSR 330
• 5 annotations - @Named, @Inject, @Qualifier, @Scope,
@Singleton
• 1 interface - Provider<T>
27. DAGGER 2
• @Module, @Provides, @Component, @Subcomponent,
ScopedProvider
• Injection into Fields, Constructors, Methods
• Each @Inject has to have its @Provides
30. @Module
public class ApiModule {
@Provides
@Singleton
public ApiService provideApiService(
OkHttpClient client, BaseUrl endpoint,
Converter.Factory converter) {
return RestUtils.createApiService(
client, endpoint, converter,
ApiService.class);
}
}
31. @Module
public class ApiModule {
@Provides
@Singleton
public ApiService provideApiService(
OkHttpClient client, BaseUrl endpoint,
Converter.Factory converter) {
return RestUtils.createApiService(
client, endpoint, converter,
ApiService.class);
}
}
32. @Module
public class ApiModule {
@Provides
@Singleton
public ApiService provideApiService(
OkHttpClient client, BaseUrl endpoint,
Converter.Factory converter) {
return RestUtils.createApiService(
client, endpoint, converter,
ApiService.class);
}
}
36. public class MyApplication extends Application {
protected AppComponent appComponent;
protected void init() {
appComponent = DaggerAppComponent.create();
}
}
38. public class HomeActivity
extends BaseActivity
implements HomeView {
private void init() {
presenter = new HomePresenterImpl(this,
new CurrencyInteractorImpl());
presenter.getCurrencyList();
}
@Override
public void showCurrencies(List<Currency> currencies) {
// display data
}
}
40. @Module
public class HomeModule {
private HomeView view;
public HomeModule(HomeView view) {
this.view = view;
}
@Provides
public HomeView provideView() {
return view;
}
@Provides
public HomePresenter providePresenter(HomePresenterImpl presenter) {
return presenter;
}
@Provides
public CurrencyInteractor provideInteractor(
CurrencyInteractorImpl interactor) {
return interactor;
}
}
41. @Module
public class HomeModule {
private HomeView view;
public HomeModule(HomeView view) {
this.view = view;
}
@Provides
public HomeView provideView() {
return view;
}
@Provides
public HomePresenter providePresenter(HomePresenterImpl presenter) {
return presenter;
}
@Provides
public CurrencyInteractor provideInteractor(
CurrencyInteractorImpl interactor) {
return interactor;
}
}
42. @Module
public class HomeModule {
private HomeView view;
public HomeModule(HomeView view) {
this.view = view;
}
@Provides
public HomeView provideView() {
return view;
}
@Provides
public HomePresenter providePresenter(HomePresenterImpl presenter) {
return presenter;
}
@Provides
public CurrencyInteractor provideInteractor(
CurrencyInteractorImpl interactor) {
return interactor;
}
}
45. @Module
public class HomeModule {
private HomeView view;
public HomeModule(HomeView view) {
this.view = view;
}
@Provides
public HomeView provideView() {
return view;
}
@Provides
public HomePresenter providePresenter(HomePresenterImpl presenter) {
return presenter;
}
@Provides
public CurrencyInteractor provideInteractor(
CurrencyInteractorImpl interactor) {
return interactor;
}
}
52. public abstract class BaseActivity
extends AppCompatActivity {
Override
protected void onCreate(Bundle savedInstanceState) {
...
injectDependencies(MyApplication.getAppComponent());
}
protected abstract
void injectDependencies(AppComponent appComponent);
}
53. public class HomeActivity
extends BaseActivity
implements HomeView {
protected void
injectDependencies(AppComponent appComponent) {
appComponent
.plus(new HomeModule(this))
.inject(this);
}
}
56. “If you don’t like testing your product, most
likely your customers won’t like to test it
either.”
64. protected void enqueueResponse(String filename) {
String body = ResourceUtils.readFromFile(filename);
MockResponse mockResponse =
new MockResponse()
.setBody(body)
.setResponseCode(HttpURLConnection.HTTP_OK);
mockWebServer.enqueue(mockResponse);
}
65. @Override
public void setup() throws Exception {
super.setup();
controller = Robolectric
.buildActivity(MockActivity.class)
.create()
.start()
.resume()
.visible();
fragment = DashboardDrivingModeFragment.newInstance();
controller.get().getSupportFragmentManager()
.beginTransaction()
.replace(R.id.container, fragment, null)
.commit();
ButterKnife.bind(this, fragment.getView());
}
68. THINGS TO REMEMBER
• Dagger2 is a powerful tool - make good use of it
• Save yourselves from regression bugs