Skip to content

Commit b64a353

Browse files
committed
Generify UseCase<T>
1 parent 70eeacf commit b64a353

File tree

7 files changed

+15
-42
lines changed

7 files changed

+15
-42
lines changed

domain/src/main/java/com/fernandocejas/android10/sample/domain/interactor/GetUserDetails.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,8 @@
2828
* This class is an implementation of {@link UseCase} that represents a use case for
2929
* retrieving data related to an specific {@link User}.
3030
*/
31-
public class GetUserDetails extends UseCase {
31+
public class GetUserDetails extends UseCase<User> {
3232

33-
public static final String NAME = "userDetails";
3433
public static final String PARAM_USER_ID_KEY = "userId";
3534

3635
@VisibleForTesting
@@ -39,13 +38,13 @@ public class GetUserDetails extends UseCase {
3938
private final UserRepository userRepository;
4039

4140
@Inject
42-
public GetUserDetails(UserRepository userRepository, ThreadExecutor threadExecutor,
41+
GetUserDetails(UserRepository userRepository, ThreadExecutor threadExecutor,
4342
PostExecutionThread postExecutionThread) {
4443
super(threadExecutor, postExecutionThread);
4544
this.userRepository = userRepository;
4645
}
4746

48-
@Override protected Observable buildUseCaseObservable(Optional<Params> params) {
47+
@Override protected Observable<User> buildUseCaseObservable(Optional<Params> params) {
4948
if (params.isPresent()) {
5049
final int userId = params.get().getInt(PARAM_USER_ID_KEY, PARAM_USER_ID_DEFAULT_VALUE);
5150
return this.userRepository.user(userId);

domain/src/main/java/com/fernandocejas/android10/sample/domain/interactor/GetUserList.java

+3-4
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,14 @@
2121
import com.fernandocejas.android10.sample.domain.repository.UserRepository;
2222
import com.fernandocejas.arrow.optional.Optional;
2323
import io.reactivex.Observable;
24+
import java.util.List;
2425
import javax.inject.Inject;
2526

2627
/**
2728
* This class is an implementation of {@link UseCase} that represents a use case for
2829
* retrieving a collection of all {@link User}.
2930
*/
30-
public class GetUserList extends UseCase {
31-
32-
public static final String NAME = "userList";
31+
public class GetUserList extends UseCase<List<User>> {
3332

3433
private final UserRepository userRepository;
3534

@@ -40,7 +39,7 @@ public class GetUserList extends UseCase {
4039
this.userRepository = userRepository;
4140
}
4241

43-
@Override public Observable buildUseCaseObservable(Optional<Params> params) {
42+
@Override public Observable<List<User>> buildUseCaseObservable(Optional<Params> params) {
4443
return this.userRepository.users();
4544
}
4645
}

domain/src/main/java/com/fernandocejas/android10/sample/domain/interactor/UseCase.java

+4-5
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@
3333
* By convention each UseCase implementation will return the result using a {@link DisposableObserver}
3434
* that will execute its job in a background thread and will post the result in the UI thread.
3535
*/
36-
public abstract class UseCase {
36+
public abstract class UseCase<T> {
3737

3838
private final ThreadExecutor threadExecutor;
3939
private final PostExecutionThread postExecutionThread;
@@ -48,7 +48,7 @@ public abstract class UseCase {
4848
/**
4949
* Builds an {@link Observable} which will be used when executing the current {@link UseCase}.
5050
*/
51-
protected abstract Observable buildUseCaseObservable(Optional<Params> params);
51+
abstract Observable<T> buildUseCaseObservable(Optional<Params> params);
5252

5353
/**
5454
* Executes the current use case.
@@ -57,9 +57,8 @@ public abstract class UseCase {
5757
* by {@link #buildUseCaseObservable(Optional)} ()} method.
5858
* @param params Parameters used to build execute this use case.
5959
*/
60-
@SuppressWarnings("unchecked")
61-
public void execute(DisposableObserver observer, Params params) {
62-
final Observable<?> observable = this.buildUseCaseObservable(Optional.of(params))
60+
public void execute(DisposableObserver<T> observer, Params params) {
61+
final Observable<T> observable = this.buildUseCaseObservable(Optional.of(params))
6362
.subscribeOn(Schedulers.from(threadExecutor))
6463
.observeOn(postExecutionThread.getScheduler());
6564
addDisposable(observable.subscribeWith(observer));

domain/src/test/java/com/fernandocejas/android10/sample/domain/interactor/UseCaseTest.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public void testSubscriptionWhenExecutingUseCase() {
6363
assertThat(testObserver.isDisposed()).isTrue();
6464
}
6565

66-
private static class UseCaseTestClass extends UseCase {
66+
private static class UseCaseTestClass extends UseCase<Object> {
6767

6868
UseCaseTestClass(ThreadExecutor threadExecutor, PostExecutionThread postExecutionThread) {
6969
super(threadExecutor, postExecutionThread);

presentation/src/main/java/com/fernandocejas/android10/sample/presentation/internal/di/modules/UserModule.java

-20
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,7 @@
1515
*/
1616
package com.fernandocejas.android10.sample.presentation.internal.di.modules;
1717

18-
import com.fernandocejas.android10.sample.domain.executor.PostExecutionThread;
19-
import com.fernandocejas.android10.sample.domain.executor.ThreadExecutor;
20-
import com.fernandocejas.android10.sample.domain.interactor.GetUserDetails;
21-
import com.fernandocejas.android10.sample.domain.interactor.GetUserList;
22-
import com.fernandocejas.android10.sample.domain.interactor.UseCase;
23-
import com.fernandocejas.android10.sample.domain.repository.UserRepository;
24-
import com.fernandocejas.android10.sample.presentation.internal.di.PerActivity;
2518
import dagger.Module;
26-
import dagger.Provides;
27-
import javax.inject.Named;
2819

2920
/**
3021
* Dagger module that provides user related collaborators.
@@ -33,15 +24,4 @@
3324
public class UserModule {
3425

3526
public UserModule() {}
36-
37-
@Provides @PerActivity @Named(GetUserList.NAME) UseCase provideGetUserListUseCase(
38-
GetUserList getUserList) {
39-
return getUserList;
40-
}
41-
42-
@Provides @PerActivity @Named(GetUserDetails.NAME) UseCase provideGetUserDetailsUseCase(
43-
UserRepository userRepository, ThreadExecutor threadExecutor,
44-
PostExecutionThread postExecutionThread) {
45-
return new GetUserDetails(userRepository, threadExecutor, postExecutionThread);
46-
}
4727
}

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

+2-4
Original file line numberDiff line numberDiff line change
@@ -21,15 +21,13 @@
2121
import com.fernandocejas.android10.sample.domain.exception.ErrorBundle;
2222
import com.fernandocejas.android10.sample.domain.interactor.DefaultObserver;
2323
import com.fernandocejas.android10.sample.domain.interactor.GetUserDetails;
24-
import com.fernandocejas.android10.sample.domain.interactor.UseCase;
2524
import com.fernandocejas.android10.sample.domain.interactor.Params;
2625
import com.fernandocejas.android10.sample.presentation.exception.ErrorMessageFactory;
2726
import com.fernandocejas.android10.sample.presentation.internal.di.PerActivity;
2827
import com.fernandocejas.android10.sample.presentation.mapper.UserModelDataMapper;
2928
import com.fernandocejas.android10.sample.presentation.model.UserModel;
3029
import com.fernandocejas.android10.sample.presentation.view.UserDetailsView;
3130
import javax.inject.Inject;
32-
import javax.inject.Named;
3331

3432
/**
3533
* {@link Presenter} that controls communication between views and models of the presentation
@@ -40,11 +38,11 @@ public class UserDetailsPresenter implements Presenter {
4038

4139
private UserDetailsView viewDetailsView;
4240

43-
private final UseCase getUserDetailsUseCase;
41+
private final GetUserDetails getUserDetailsUseCase;
4442
private final UserModelDataMapper userModelDataMapper;
4543

4644
@Inject
47-
public UserDetailsPresenter(@Named(GetUserDetails.NAME) UseCase getUserDetailsUseCase,
45+
public UserDetailsPresenter(GetUserDetails getUserDetailsUseCase,
4846
UserModelDataMapper userModelDataMapper) {
4947
this.getUserDetailsUseCase = getUserDetailsUseCase;
5048
this.userModelDataMapper = userModelDataMapper;

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

+2-4
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
import com.fernandocejas.android10.sample.domain.exception.ErrorBundle;
2222
import com.fernandocejas.android10.sample.domain.interactor.DefaultObserver;
2323
import com.fernandocejas.android10.sample.domain.interactor.GetUserList;
24-
import com.fernandocejas.android10.sample.domain.interactor.UseCase;
2524
import com.fernandocejas.android10.sample.domain.interactor.Params;
2625
import com.fernandocejas.android10.sample.presentation.exception.ErrorMessageFactory;
2726
import com.fernandocejas.android10.sample.presentation.internal.di.PerActivity;
@@ -31,7 +30,6 @@
3130
import java.util.Collection;
3231
import java.util.List;
3332
import javax.inject.Inject;
34-
import javax.inject.Named;
3533

3634
/**
3735
* {@link Presenter} that controls communication between views and models of the presentation
@@ -42,11 +40,11 @@ public class UserListPresenter implements Presenter {
4240

4341
private UserListView viewListView;
4442

45-
private final UseCase getUserListUseCase;
43+
private final GetUserList getUserListUseCase;
4644
private final UserModelDataMapper userModelDataMapper;
4745

4846
@Inject
49-
public UserListPresenter(@Named(GetUserList.NAME) UseCase getUserListUserCase,
47+
public UserListPresenter(GetUserList getUserListUserCase,
5048
UserModelDataMapper userModelDataMapper) {
5149
this.getUserListUseCase = getUserListUserCase;
5250
this.userModelDataMapper = userModelDataMapper;

0 commit comments

Comments
 (0)