Skip to content

Commit d80a9d7

Browse files
committed
First refactor to use dagger on presentation layer.
1 parent f81fcf8 commit d80a9d7

File tree

12 files changed

+169
-103
lines changed

12 files changed

+169
-103
lines changed

data/src/main/java/com/fernandocejas/android10/sample/data/cache/serializer/JsonSerializer.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,18 @@
66

77
import com.fernandocejas.android10.sample.data.entity.UserEntity;
88
import com.google.gson.Gson;
9+
import javax.inject.Inject;
10+
import javax.inject.Singleton;
911

1012
/**
1113
* Class user as Serializer/Deserializer for user entities.
1214
*/
15+
@Singleton
1316
public class JsonSerializer {
1417

1518
private final Gson gson = new Gson();
1619

20+
@Inject
1721
public JsonSerializer() {
1822
//empty
1923
}

data/src/main/java/com/fernandocejas/android10/sample/data/entity/mapper/UserEntityDataMapper.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,17 @@
99
import java.util.ArrayList;
1010
import java.util.Collection;
1111
import java.util.List;
12+
import javax.inject.Inject;
13+
import javax.inject.Singleton;
1214

1315
/**
1416
* Mapper class used to transform {@link UserEntity} (in the data layer) to {@link User} in the
1517
* domain layer.
1618
*/
19+
@Singleton
1720
public class UserEntityDataMapper {
1821

22+
@Inject
1923
public UserEntityDataMapper() {
2024
//empty
2125
}

data/src/main/java/com/fernandocejas/android10/sample/data/repository/datasource/UserDataStoreFactory.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
import com.fernandocejas.android10.sample.data.entity.mapper.UserEntityJsonMapper;
1010
import com.fernandocejas.android10.sample.data.net.RestApi;
1111
import com.fernandocejas.android10.sample.data.net.RestApiImpl;
12+
import javax.inject.Inject;
1213

1314
/**
1415
* Factory that creates different implementations of {@link UserDataStore}.
@@ -18,6 +19,7 @@ public class UserDataStoreFactory {
1819
private final Context context;
1920
private final UserCache userCache;
2021

22+
@Inject
2123
public UserDataStoreFactory(Context context, UserCache userCache) {
2224
if (context == null || userCache == null) {
2325
throw new IllegalArgumentException("Constructor parameters cannot be null!!!");

presentation/src/main/java/com/fernandocejas/android10/sample/presentation/AndroidApplication.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import com.fernandocejas.android10.sample.presentation.internal.di.components.Dagger_ApplicationComponent;
1010
import com.fernandocejas.android10.sample.presentation.internal.di.modules.ApplicationModule;
1111
import com.fernandocejas.android10.sample.presentation.view.activity.BaseActivity;
12+
import com.fernandocejas.android10.sample.presentation.view.fragment.UserDetailsFragment;
13+
import com.fernandocejas.android10.sample.presentation.view.fragment.UserListFragment;
1214

1315
/**
1416
* Android Main Application
@@ -32,4 +34,12 @@ private void initializeInjector() {
3234
public void inject(BaseActivity baseActivity) {
3335
this.applicationComponent.inject(baseActivity);
3436
}
37+
38+
public void inject(UserListFragment userListFragment) {
39+
this.applicationComponent.inject(userListFragment);
40+
}
41+
42+
public void inject(UserDetailsFragment userDetailsFragment) {
43+
this.applicationComponent.inject(userDetailsFragment);
44+
}
3545
}

presentation/src/main/java/com/fernandocejas/android10/sample/presentation/internal/di/components/ApplicationComponent.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,18 @@
77
import com.fernandocejas.android10.sample.presentation.AndroidApplication;
88
import com.fernandocejas.android10.sample.presentation.internal.di.modules.ActivityModule;
99
import com.fernandocejas.android10.sample.presentation.internal.di.modules.ApplicationModule;
10+
import com.fernandocejas.android10.sample.presentation.internal.di.modules.UserModule;
1011
import com.fernandocejas.android10.sample.presentation.view.activity.BaseActivity;
12+
import com.fernandocejas.android10.sample.presentation.view.fragment.UserDetailsFragment;
13+
import com.fernandocejas.android10.sample.presentation.view.fragment.UserListFragment;
1114
import dagger.Component;
1215
import javax.inject.Singleton;
1316

1417
@Singleton
15-
@Component(modules = {ApplicationModule.class, ActivityModule.class})
18+
@Component(modules = {ApplicationModule.class, ActivityModule.class, UserModule.class})
1619
public interface ApplicationComponent {
1720
void inject(AndroidApplication androidApplication);
1821
void inject(BaseActivity activity);
22+
void inject(UserListFragment userListFragment);
23+
void inject(UserDetailsFragment userDetailsFragment);
1924
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/**
2+
* Copyright (C) 2015 android10.org. All rights reserved.
3+
* @author Fernando Cejas (the android10 coder)
4+
*/
5+
package com.fernandocejas.android10.sample.presentation.internal.di.modules;
6+
7+
import android.content.Context;
8+
import com.fernandocejas.android10.sample.data.cache.FileManager;
9+
import com.fernandocejas.android10.sample.data.cache.UserCache;
10+
import com.fernandocejas.android10.sample.data.cache.UserCacheImpl;
11+
import com.fernandocejas.android10.sample.data.cache.serializer.JsonSerializer;
12+
import com.fernandocejas.android10.sample.data.entity.mapper.UserEntityDataMapper;
13+
import com.fernandocejas.android10.sample.data.executor.JobExecutor;
14+
import com.fernandocejas.android10.sample.data.repository.UserDataRepository;
15+
import com.fernandocejas.android10.sample.data.repository.datasource.UserDataStoreFactory;
16+
import com.fernandocejas.android10.sample.domain.executor.PostExecutionThread;
17+
import com.fernandocejas.android10.sample.domain.executor.ThreadExecutor;
18+
import com.fernandocejas.android10.sample.domain.interactor.GetUserDetailsUseCase;
19+
import com.fernandocejas.android10.sample.domain.interactor.GetUserDetailsUseCaseImpl;
20+
import com.fernandocejas.android10.sample.domain.interactor.GetUserListUseCase;
21+
import com.fernandocejas.android10.sample.domain.interactor.GetUserListUseCaseImpl;
22+
import com.fernandocejas.android10.sample.domain.repository.UserRepository;
23+
import com.fernandocejas.android10.sample.presentation.UIThread;
24+
import com.fernandocejas.android10.sample.presentation.mapper.UserModelDataMapper;
25+
import com.fernandocejas.android10.sample.presentation.presenter.UserDetailsPresenter;
26+
import com.fernandocejas.android10.sample.presentation.presenter.UserListPresenter;
27+
import dagger.Module;
28+
import dagger.Provides;
29+
30+
@Module
31+
public class UserModule {
32+
33+
@Provides ThreadExecutor provideThreadExecutor() {
34+
return JobExecutor.getInstance();
35+
}
36+
37+
@Provides PostExecutionThread providePostExecutionThread() {
38+
return UIThread.getInstance();
39+
}
40+
41+
@Provides JsonSerializer provideJsonSerializer() {
42+
return new JsonSerializer();
43+
}
44+
45+
@Provides FileManager provideFileManager() {
46+
return FileManager.getInstance();
47+
}
48+
49+
@Provides UserCache provideUserCache(Context context, JsonSerializer jsonSerializer,
50+
FileManager fileManager, ThreadExecutor threadExecutor) {
51+
return UserCacheImpl.getInstance(context, jsonSerializer, fileManager, threadExecutor);
52+
}
53+
54+
@Provides UserDataStoreFactory provideUserDataStoreFactory(Context context, UserCache userCache) {
55+
return new UserDataStoreFactory(context, userCache);
56+
}
57+
58+
@Provides UserEntityDataMapper provideUserEntityDataMapper() {
59+
return new UserEntityDataMapper();
60+
}
61+
62+
@Provides UserRepository provideUserRepository(UserDataStoreFactory userDataStoreFactory,
63+
UserEntityDataMapper userEntityDataMapper) {
64+
return UserDataRepository.getInstance(userDataStoreFactory, userEntityDataMapper);
65+
}
66+
67+
@Provides GetUserListUseCase provideGetUserListUseCase(UserRepository userRepository,
68+
ThreadExecutor threadExecutor, PostExecutionThread postExecutionThread) {
69+
return new GetUserListUseCaseImpl(userRepository, threadExecutor, postExecutionThread);
70+
}
71+
72+
@Provides UserModelDataMapper provideUserModelDataMapper() {
73+
return new UserModelDataMapper();
74+
}
75+
76+
@Provides UserListPresenter provideUserListPresenter(GetUserListUseCase userListUseCase,
77+
UserModelDataMapper userModelDataMapper) {
78+
return new UserListPresenter(userListUseCase, userModelDataMapper);
79+
}
80+
81+
@Provides GetUserDetailsUseCase provideGetUserDetailsUseCase(UserRepository userRepository,
82+
ThreadExecutor threadExecutor, PostExecutionThread postExecutionThread) {
83+
return new GetUserDetailsUseCaseImpl(userRepository,
84+
threadExecutor, postExecutionThread);
85+
}
86+
87+
@Provides UserDetailsPresenter provideUserDetailsPresenter(GetUserDetailsUseCase getUserDetailsUseCase,
88+
UserModelDataMapper userModelDataMapper) {
89+
return new UserDetailsPresenter(getUserDetailsUseCase, userModelDataMapper);
90+
}
91+
}

presentation/src/main/java/com/fernandocejas/android10/sample/presentation/mapper/UserModelDataMapper.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,17 @@
99
import java.util.ArrayList;
1010
import java.util.Collection;
1111
import java.util.Collections;
12+
import javax.inject.Inject;
13+
import javax.inject.Singleton;
1214

1315
/**
1416
* Mapper class used to transform {@link User} (in the domain layer) to {@link UserModel} in the
1517
* presentation layer.
1618
*/
19+
@Singleton
1720
public class UserModelDataMapper {
1821

22+
@Inject
1923
public UserModelDataMapper() {
2024
//empty
2125
}

presentation/src/main/java/com/fernandocejas/android10/sample/presentation/presenter/UserDetailsPresenter.java

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55
package com.fernandocejas.android10.sample.presentation.presenter;
66

7+
import android.support.annotation.NonNull;
78
import com.fernandocejas.android10.sample.domain.User;
89
import com.fernandocejas.android10.sample.domain.exception.ErrorBundle;
910
import com.fernandocejas.android10.sample.domain.interactor.GetUserDetailsUseCase;
@@ -21,20 +22,21 @@ public class UserDetailsPresenter implements Presenter {
2122
/** id used to retrieve user details */
2223
private int userId;
2324

24-
private final UserDetailsView viewDetailsView;
25+
private UserDetailsView viewDetailsView;
26+
2527
private final GetUserDetailsUseCase getUserDetailsUseCase;
2628
private final UserModelDataMapper userModelDataMapper;
2729

28-
public UserDetailsPresenter(UserDetailsView userDetailsView,
29-
GetUserDetailsUseCase getUserDetailsUseCase, UserModelDataMapper userModelDataMapper) {
30-
if (userDetailsView == null || getUserDetailsUseCase == null || userModelDataMapper == null) {
31-
throw new IllegalArgumentException("Constructor parameters cannot be null!!!");
32-
}
33-
this.viewDetailsView = userDetailsView;
30+
public UserDetailsPresenter(GetUserDetailsUseCase getUserDetailsUseCase,
31+
UserModelDataMapper userModelDataMapper) {
3432
this.getUserDetailsUseCase = getUserDetailsUseCase;
3533
this.userModelDataMapper = userModelDataMapper;
3634
}
3735

36+
public void setView(@NonNull UserDetailsView view) {
37+
this.viewDetailsView = view;
38+
}
39+
3840
@Override public void resume() {}
3941

4042
@Override public void pause() {}

presentation/src/main/java/com/fernandocejas/android10/sample/presentation/presenter/UserListPresenter.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
*/
55
package com.fernandocejas.android10.sample.presentation.presenter;
66

7+
import android.support.annotation.NonNull;
78
import com.fernandocejas.android10.sample.domain.User;
89
import com.fernandocejas.android10.sample.domain.exception.ErrorBundle;
910
import com.fernandocejas.android10.sample.domain.interactor.GetUserListUseCase;
@@ -12,27 +13,32 @@
1213
import com.fernandocejas.android10.sample.presentation.model.UserModel;
1314
import com.fernandocejas.android10.sample.presentation.view.UserListView;
1415
import java.util.Collection;
16+
import javax.inject.Inject;
17+
import javax.inject.Singleton;
1518

1619
/**
1720
* {@link Presenter} that controls communication between views and models of the presentation
1821
* layer.
1922
*/
23+
@Singleton
2024
public class UserListPresenter implements Presenter {
2125

22-
private final UserListView viewListView;
26+
private UserListView viewListView;
27+
2328
private final GetUserListUseCase getUserListUseCase;
2429
private final UserModelDataMapper userModelDataMapper;
2530

26-
public UserListPresenter(UserListView userListView, GetUserListUseCase getUserListUserCase,
31+
@Inject
32+
public UserListPresenter(GetUserListUseCase getUserListUserCase,
2733
UserModelDataMapper userModelDataMapper) {
28-
if (userListView == null || getUserListUserCase == null || userModelDataMapper == null) {
29-
throw new IllegalArgumentException("Constructor parameters cannot be null!!!");
30-
}
31-
this.viewListView = userListView;
3234
this.getUserListUseCase = getUserListUserCase;
3335
this.userModelDataMapper = userModelDataMapper;
3436
}
3537

38+
public void setView(@NonNull UserListView view) {
39+
this.viewListView = view;
40+
}
41+
3642
@Override public void resume() {}
3743

3844
@Override public void pause() {}

presentation/src/main/java/com/fernandocejas/android10/sample/presentation/view/fragment/BaseFragment.java

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
import android.app.Fragment;
88
import android.os.Bundle;
99
import android.widget.Toast;
10+
import com.fernandocejas.android10.sample.presentation.AndroidApplication;
1011

1112
/**
1213
* Base {@link android.app.Fragment} class for every fragment in this application.
@@ -16,15 +17,8 @@ public abstract class BaseFragment extends Fragment {
1617
@Override public void onCreate(Bundle savedInstanceState) {
1718
super.onCreate(savedInstanceState);
1819
setRetainInstance(true);
19-
initializePresenter();
2020
}
2121

22-
/**
23-
* Initializes the {@link com.fernandocejas.android10.sample.presentation.presenter.Presenter}
24-
* for this fragment in a MVP pattern used to architect the application presentation layer.
25-
*/
26-
abstract void initializePresenter();
27-
2822
/**
2923
* Shows a {@link android.widget.Toast} message.
3024
*
@@ -33,4 +27,13 @@ public abstract class BaseFragment extends Fragment {
3327
protected void showToastMessage(String message) {
3428
Toast.makeText(getActivity(), message, Toast.LENGTH_SHORT).show();
3529
}
30+
31+
/**
32+
* Get the Android Main Application.
33+
*
34+
* @return singleton {@link com.fernandocejas.android10.sample.presentation.AndroidApplication}
35+
*/
36+
protected AndroidApplication getApplication() {
37+
return (AndroidApplication)getActivity().getApplication();
38+
}
3639
}

0 commit comments

Comments
 (0)