From a1d4b76a5c8933d49ccdb94cf84bdd4f975764e0 Mon Sep 17 00:00:00 2001 From: ztang Date: Thu, 18 Jan 2018 10:34:58 -0500 Subject: [PATCH 1/6] update dependencies and make corresponding changes in code to make it compile success. --- build.gradle | 7 +++---- data/build.gradle | 2 -- .../repository/NoteDataRepositoryTest.java | 2 +- .../repository/UserDataRepositoryTest.java | 2 +- .../repository/VersionDataRepositoryTest.java | 2 +- dependencies.gradle | 20 +++++++++---------- gradle/wrapper/gradle-wrapper.properties | 4 ++-- presentation/build.gradle | 7 +++---- .../dependency/module/DataModule.java | 2 +- .../view/activity/base/BaseActivity.java | 11 ++-------- .../view/fragment/LoginFragment.java | 6 +++--- .../view/fragment/NoteCreateFragment.java | 6 +++--- .../view/fragment/NoteDetailFragment.java | 7 +++---- .../view/fragment/NoteEditFragment.java | 8 ++++---- .../view/fragment/NotesFragment.java | 4 ++-- .../view/fragment/RegisterFragment.java | 8 ++++---- .../view/fragment/ResetPasswordFragment.java | 8 ++++---- .../view/fragment/WebViewFragment.java | 9 +++------ 18 files changed, 50 insertions(+), 65 deletions(-) diff --git a/build.gradle b/build.gradle index 11c9068..a2bc403 100644 --- a/build.gradle +++ b/build.gradle @@ -4,18 +4,17 @@ apply from: 'dependencies.gradle' buildscript { repositories { jcenter() - mavenCentral() + google() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.3' - classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' - classpath 'me.tatarka:gradle-retrolambda:3.4.0' + classpath 'com.android.tools.build:gradle:3.0.1' } } allprojects { repositories { jcenter() + google() } } diff --git a/data/build.gradle b/data/build.gradle index ab7bae8..1e35d2c 100644 --- a/data/build.gradle +++ b/data/build.gradle @@ -1,6 +1,4 @@ apply plugin: 'com.android.library' -apply plugin: 'com.neenbedankt.android-apt' -apply plugin: 'me.tatarka.retrolambda' android { compileSdkVersion rootProject.ext.androidCompileSdkVersion diff --git a/data/src/test/java/com/jordifierro/androidbase/data/repository/NoteDataRepositoryTest.java b/data/src/test/java/com/jordifierro/androidbase/data/repository/NoteDataRepositoryTest.java index 6affb8d..5905167 100644 --- a/data/src/test/java/com/jordifierro/androidbase/data/repository/NoteDataRepositoryTest.java +++ b/data/src/test/java/com/jordifierro/androidbase/data/repository/NoteDataRepositoryTest.java @@ -3,7 +3,6 @@ import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import com.jordifierro.androidbase.data.net.RestApi; import com.jordifierro.androidbase.data.net.error.RestApiErrorException; import com.jordifierro.androidbase.data.utils.TestUtils; @@ -23,6 +22,7 @@ import okhttp3.mockwebserver.MockWebServer; import okhttp3.mockwebserver.RecordedRequest; import retrofit2.Retrofit; +import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; import static junit.framework.Assert.assertEquals; diff --git a/data/src/test/java/com/jordifierro/androidbase/data/repository/UserDataRepositoryTest.java b/data/src/test/java/com/jordifierro/androidbase/data/repository/UserDataRepositoryTest.java index d99eade..4676171 100644 --- a/data/src/test/java/com/jordifierro/androidbase/data/repository/UserDataRepositoryTest.java +++ b/data/src/test/java/com/jordifierro/androidbase/data/repository/UserDataRepositoryTest.java @@ -3,7 +3,6 @@ import com.google.gson.FieldNamingPolicy; import com.google.gson.Gson; import com.google.gson.GsonBuilder; -import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import com.jordifierro.androidbase.data.net.RestApi; import com.jordifierro.androidbase.data.net.error.RestApiErrorException; import com.jordifierro.androidbase.data.net.wrapper.UserWrapper; @@ -24,6 +23,7 @@ import okhttp3.mockwebserver.MockWebServer; import okhttp3.mockwebserver.RecordedRequest; import retrofit2.Retrofit; +import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; import static junit.framework.Assert.assertEquals; diff --git a/data/src/test/java/com/jordifierro/androidbase/data/repository/VersionDataRepositoryTest.java b/data/src/test/java/com/jordifierro/androidbase/data/repository/VersionDataRepositoryTest.java index 01144ac..b5c5871 100644 --- a/data/src/test/java/com/jordifierro/androidbase/data/repository/VersionDataRepositoryTest.java +++ b/data/src/test/java/com/jordifierro/androidbase/data/repository/VersionDataRepositoryTest.java @@ -2,7 +2,6 @@ import com.google.gson.FieldNamingPolicy; import com.google.gson.GsonBuilder; -import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import com.jordifierro.androidbase.data.net.RestApi; import com.jordifierro.androidbase.data.utils.TestUtils; import com.jordifierro.androidbase.domain.entity.UserEntity; @@ -21,6 +20,7 @@ import okhttp3.mockwebserver.MockWebServer; import okhttp3.mockwebserver.RecordedRequest; import retrofit2.Retrofit; +import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; import static junit.framework.Assert.assertEquals; diff --git a/dependencies.gradle b/dependencies.gradle index 0b320d6..e109744 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -8,21 +8,20 @@ ext { //Android appVersionCode = 1 appVersionName = '1.0' - androidBuildToolsVersion = '25.0.2' + androidBuildToolsVersion = '27.0.3' androidMinSdkVersion = 15 - androidTargetSdkVersion = 23 - androidCompileSdkVersion = 23 - androidSupportVersion = '23.2.1' + androidTargetSdkVersion = 27 + androidCompileSdkVersion = 27 + androidSupportVersion = '27.0.2' //Libraries - daggerVersion = '2.8' - butterKnifeVersion = '7.0.1' - rxJavaVersion = '2.0.2' + daggerVersion = '2.14.1' + butterKnifeVersion = '8.8.1' + rxJavaVersion = '2.1.8' rxAndroidVersion = '2.0.1' javaxAnnotationVersion = '1.0' javaxInjectVersion = '1' - retrofitVersion = '2.1.0' - retrofitRxJava2AdapterVersion = '1.0.0' + retrofitVersion = '2.3.0' //Testing jUnitVersion = '4.10' @@ -50,7 +49,7 @@ ext { dataDependencies = [ retrofit: "com.squareup.retrofit2:retrofit:${retrofitVersion}", retrofitGson: "com.squareup.retrofit2:converter-gson:${retrofitVersion}", - retrofitRxJava2: "com.jakewharton.retrofit:retrofit2-rxjava2-adapter:${retrofitRxJava2AdapterVersion}", + retrofitRxJava2: "com.squareup.retrofit2:adapter-rxjava2:${retrofitVersion}", javaxAnnotation: "javax.annotation:jsr250-api:${javaxAnnotationVersion}", rxJava: "io.reactivex.rxjava2:rxjava:${rxJavaVersion}" ] @@ -66,6 +65,7 @@ ext { daggerCompiler: "com.google.dagger:dagger-compiler:${daggerVersion}", dagger: "com.google.dagger:dagger:${daggerVersion}", butterKnife: "com.jakewharton:butterknife:${butterKnifeVersion}", + butterCompiler: "com.jakewharton:butterknife-compiler:${butterKnifeVersion}", rxJava: "io.reactivex.rxjava2:rxjava:${rxJavaVersion}", rxAndroid: "io.reactivex.rxjava2:rxandroid:${rxAndroidVersion}", javaxAnnotation: "javax.annotation:jsr250-api:${javaxAnnotationVersion}", diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 196d6ea..1104dd2 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Wed Dec 14 20:27:34 CET 2016 +#Thu Jan 18 10:20:27 EST 2018 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-2.14.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip diff --git a/presentation/build.gradle b/presentation/build.gradle index 0ca5f87..74ef429 100644 --- a/presentation/build.gradle +++ b/presentation/build.gradle @@ -1,6 +1,4 @@ apply plugin: 'com.android.application' -apply plugin: 'com.neenbedankt.android-apt' -apply plugin: 'me.tatarka.retrolambda' android { compileSdkVersion rootProject.ext.androidCompileSdkVersion @@ -43,7 +41,8 @@ dependencies { compile project(':domain') compile project(':data') - apt presentationDependencies.daggerCompiler + annotationProcessor presentationDependencies.butterCompiler + annotationProcessor presentationDependencies.daggerCompiler compile presentationDependencies.androidDesign compile presentationDependencies.androidSupportv4 @@ -58,7 +57,7 @@ dependencies { testCompile presentationTestDependencies.mockito - androidTestApt presentationTestDependencies.daggerCompiler + androidTestAnnotationProcessor presentationTestDependencies.daggerCompiler androidTestCompile presentationTestDependencies.androidAnnotations androidTestCompile presentationTestDependencies.mockito diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/DataModule.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/DataModule.java index 552e95e..4d63949 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/DataModule.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/DataModule.java @@ -4,7 +4,6 @@ import com.google.gson.FieldNamingPolicy; import com.google.gson.GsonBuilder; -import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import com.jordifierro.androidbase.data.net.RestApi; import com.jordifierro.androidbase.data.net.interceptor.HttpInterceptor; import com.jordifierro.androidbase.data.repository.NoteDataRepository; @@ -22,6 +21,7 @@ import dagger.Provides; import okhttp3.OkHttpClient; import retrofit2.Retrofit; +import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory; import retrofit2.converter.gson.GsonConverterFactory; @Module diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/activity/base/BaseActivity.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/activity/base/BaseActivity.java index 51b8efe..228f914 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/activity/base/BaseActivity.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/activity/base/BaseActivity.java @@ -4,29 +4,22 @@ import android.app.FragmentTransaction; import android.app.ProgressDialog; import android.content.Context; -import android.content.Intent; import android.os.Bundle; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; -import android.widget.Toast; -import com.jordifierro.androidbase.data.net.error.RestApiErrorException; -import com.jordifierro.androidbase.presentation.BaseApplication; import com.jordifierro.androidbase.presentation.R; -import com.jordifierro.androidbase.presentation.dependency.component.FragmentInjector; -import com.jordifierro.androidbase.presentation.view.BaseView; -import com.jordifierro.androidbase.presentation.view.activity.LoginActivity; -import butterknife.Bind; +import butterknife.BindView; import butterknife.ButterKnife; public abstract class BaseActivity extends AppCompatActivity { private ProgressDialog progressDialog; - @Bind(R.id.toolbar) Toolbar toolbar; + @BindView(R.id.toolbar) Toolbar toolbar; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/LoginFragment.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/LoginFragment.java index 4c68ab2..4d2c714 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/LoginFragment.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/LoginFragment.java @@ -9,7 +9,7 @@ import javax.inject.Inject; -import butterknife.Bind; +import butterknife.BindView; import butterknife.OnClick; public class LoginFragment extends BaseFragment implements LoginView { @@ -17,8 +17,8 @@ public class LoginFragment extends BaseFragment implements LoginView { @Inject LoginPresenter loginPresenter; - @Bind(R.id.et_email) EditText emailEditText; - @Bind(R.id.et_password) EditText passwordEditText; + @BindView(R.id.et_email) EditText emailEditText; + @BindView(R.id.et_password) EditText passwordEditText; @Override protected void callInjection() { diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NoteCreateFragment.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NoteCreateFragment.java index ee0c04c..c5b9305 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NoteCreateFragment.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NoteCreateFragment.java @@ -11,7 +11,7 @@ import javax.inject.Inject; -import butterknife.Bind; +import butterknife.BindView; import butterknife.OnClick; public class NoteCreateFragment extends BaseFragment implements NoteCreateView { @@ -19,8 +19,8 @@ public class NoteCreateFragment extends BaseFragment implements NoteCreateView { @Inject NoteCreatePresenter noteCreatePresenter; - @Bind(R.id.et_title) TextView titleET; - @Bind(R.id.et_content) TextView contentET; + @BindView(R.id.et_title) TextView titleET; + @BindView(R.id.et_content) TextView contentET; @Override protected void callInjection() { diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NoteDetailFragment.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NoteDetailFragment.java index 16e0465..91e3000 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NoteDetailFragment.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NoteDetailFragment.java @@ -7,19 +7,18 @@ import com.jordifierro.androidbase.presentation.presenter.BasePresenter; import com.jordifierro.androidbase.presentation.presenter.NoteDetailPresenter; import com.jordifierro.androidbase.presentation.view.NoteDetailView; -import com.jordifierro.androidbase.presentation.view.activity.base.BaseActivity; import javax.inject.Inject; -import butterknife.Bind; +import butterknife.BindView; public class NoteDetailFragment extends BaseFragment implements NoteDetailView { @Inject NoteDetailPresenter noteDetailPresenter; - @Bind(R.id.tv_title) TextView titleTV; - @Bind(R.id.tv_content) TextView contentTV; + @BindView(R.id.tv_title) TextView titleTV; + @BindView(R.id.tv_content) TextView contentTV; @Override protected void callInjection() { diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NoteEditFragment.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NoteEditFragment.java index a3e9a2a..8a347b7 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NoteEditFragment.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NoteEditFragment.java @@ -16,7 +16,7 @@ import javax.inject.Inject; -import butterknife.Bind; +import butterknife.BindView; import butterknife.OnClick; public class NoteEditFragment extends BaseFragment implements NoteEditView { @@ -24,9 +24,9 @@ public class NoteEditFragment extends BaseFragment implements NoteEditView { @Inject NoteEditPresenter noteEditPresenter; - @Bind(R.id.et_title) EditText titleET; - @Bind(R.id.et_content) EditText contentET; - @Bind(R.id.btn_submit) Button submitButton; + @BindView(R.id.et_title) EditText titleET; + @BindView(R.id.et_content) EditText contentET; + @BindView(R.id.btn_submit) Button submitButton; @Override protected void callInjection() { diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NotesFragment.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NotesFragment.java index 4812ef9..995fd0f 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NotesFragment.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NotesFragment.java @@ -14,7 +14,7 @@ import javax.inject.Inject; -import butterknife.Bind; +import butterknife.BindView; import butterknife.OnClick; public class NotesFragment extends BaseFragment implements NotesView { @@ -22,7 +22,7 @@ public class NotesFragment extends BaseFragment implements NotesView { @Inject NotesPresenter notesPresenter; - @Bind(R.id.listview) ListView listView; + @BindView(R.id.listview) ListView listView; @Override protected void callInjection() { diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/RegisterFragment.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/RegisterFragment.java index e9140ca..16f44aa 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/RegisterFragment.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/RegisterFragment.java @@ -10,7 +10,7 @@ import javax.inject.Inject; -import butterknife.Bind; +import butterknife.BindView; import butterknife.OnClick; public class RegisterFragment extends BaseFragment implements RegisterView { @@ -18,9 +18,9 @@ public class RegisterFragment extends BaseFragment implements RegisterView { @Inject RegisterPresenter registerPresenter; - @Bind(R.id.et_email) EditText emailEditText; - @Bind(R.id.et_password) EditText passwordEditText; - @Bind(R.id.et_password_confirmation) EditText passwordConfirmationEditText; + @BindView(R.id.et_email) EditText emailEditText; + @BindView(R.id.et_password) EditText passwordEditText; + @BindView(R.id.et_password_confirmation) EditText passwordConfirmationEditText; @Override protected void callInjection() { diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/ResetPasswordFragment.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/ResetPasswordFragment.java index 228a8bc..e96530b 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/ResetPasswordFragment.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/ResetPasswordFragment.java @@ -11,7 +11,7 @@ import javax.inject.Inject; -import butterknife.Bind; +import butterknife.BindView; import butterknife.OnClick; public class ResetPasswordFragment extends BaseFragment implements ResetPasswordView { @@ -19,9 +19,9 @@ public class ResetPasswordFragment extends BaseFragment implements ResetPassword @Inject ResetPasswordPresenter resetPasswordPresenter; - @Bind(R.id.et_email) EditText emailEditText; - @Bind(R.id.et_password) EditText passwordEditText; - @Bind(R.id.et_password_confirmation) EditText passwordConfirmationEditText; + @BindView(R.id.et_email) EditText emailEditText; + @BindView(R.id.et_password) EditText passwordEditText; + @BindView(R.id.et_password_confirmation) EditText passwordConfirmationEditText; @Override protected void callInjection() { diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/WebViewFragment.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/WebViewFragment.java index ffd7b9c..7492cb5 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/WebViewFragment.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/WebViewFragment.java @@ -1,9 +1,7 @@ package com.jordifierro.androidbase.presentation.view.fragment; import android.app.Fragment; -import android.app.ProgressDialog; import android.os.Bundle; -import android.support.v7.widget.Toolbar; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -12,17 +10,16 @@ import android.widget.ProgressBar; import com.jordifierro.androidbase.presentation.R; -import com.jordifierro.androidbase.presentation.view.activity.base.WebViewActivity; -import butterknife.Bind; +import butterknife.BindView; import butterknife.ButterKnife; public class WebViewFragment extends Fragment { - @Bind(R.id.webview) + @BindView(R.id.webview) WebView webView; - @Bind(R.id.progress_bar) + @BindView(R.id.progress_bar) ProgressBar progressBar; @Override From 4ac8e2866b118e346eaebb29cab4df3be8cbad21 Mon Sep 17 00:00:00 2001 From: ztang Date: Thu, 18 Jan 2018 11:09:54 -0500 Subject: [PATCH 2/6] add test case sample to test onResume and onPause. --- .../view/activity/LoginActivityTest.java | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/presentation/src/androidTest/java/com/jordifierro/androidbase/presentation/view/activity/LoginActivityTest.java b/presentation/src/androidTest/java/com/jordifierro/androidbase/presentation/view/activity/LoginActivityTest.java index 75120e2..a2a9f5d 100644 --- a/presentation/src/androidTest/java/com/jordifierro/androidbase/presentation/view/activity/LoginActivityTest.java +++ b/presentation/src/androidTest/java/com/jordifierro/androidbase/presentation/view/activity/LoginActivityTest.java @@ -4,9 +4,7 @@ import android.support.test.espresso.intent.Intents; import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; -import android.support.v7.widget.Toolbar; import android.test.suitebuilder.annotation.SmallTest; -import android.widget.TextView; import com.jordifierro.androidbase.presentation.R; import com.jordifierro.androidbase.presentation.view.fragment.LoginFragment; @@ -23,13 +21,12 @@ import static android.support.test.espresso.assertion.ViewAssertions.matches; import static android.support.test.espresso.intent.Intents.intended; import static android.support.test.espresso.intent.matcher.IntentMatchers.hasComponent; -import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom; import static android.support.test.espresso.matcher.ViewMatchers.withHint; import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static android.support.test.espresso.matcher.ViewMatchers.withParent; import static android.support.test.espresso.matcher.ViewMatchers.withText; -import static org.hamcrest.Matchers.allOf; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; @RunWith(AndroidJUnit4.class) @SmallTest @@ -43,7 +40,7 @@ public class LoginActivityTest { @Before public void setUp() throws Exception { this.loginFragment = ((LoginFragment) this.activityTestRule.getActivity() - .getFragmentManager().findFragmentById(R.id.fragment_container)); + .getFragmentManager().findFragmentById(R.id.fragment_container)); } @Test @@ -64,6 +61,9 @@ public void testLoginButton() { onView(withId(R.id.btn_login)).perform(click()); verify(this.loginFragment.getLoginPresenter()).loginUser("email@test.com", "87654321"); + verify(this.loginFragment.getLoginPresenter()).initWithView(loginFragment); + verify(this.loginFragment.getLoginPresenter()).resume(); + verifyNoMoreInteractions(this.loginFragment.getLoginPresenter()); } @Test @@ -86,6 +86,24 @@ public void testRegisterButton() { Intents.release(); } + @Test + public void testPause() { + this.loginFragment.onPause(); + verify(this.loginFragment.getLoginPresenter()).resume(); + verify(this.loginFragment.getLoginPresenter()).initWithView(loginFragment); + verify(this.loginFragment.getLoginPresenter()).pause(); + verifyNoMoreInteractions(this.loginFragment.getLoginPresenter()); + } + + @Test + public void testResume() { + this.loginFragment.onResume(); + verify(this.loginFragment.getLoginPresenter(),times(2)).resume(); + verify(this.loginFragment.getLoginPresenter()).initWithView(loginFragment); + verifyNoMoreInteractions(this.loginFragment.getLoginPresenter()); + } + + @Test public void testForgotPasswordClick() { Intents.init(); From 0ab80476c7a49465fbc3b42ebaa9c6f5542a123b Mon Sep 17 00:00:00 2001 From: ztang Date: Thu, 18 Jan 2018 12:25:04 -0500 Subject: [PATCH 3/6] 1, Refactor the project by using dagger android compiler, which eliminates the boilerplate of calling presenter.initView(BaseView view) in fragment. 2, use @Application rather than singleton scope to avoid confusion. --- .../data/net/interceptor/HttpInterceptor.java | 2 - .../data/repository/NoteDataRepository.java | 4 -- .../repository/SessionDataRepository.java | 2 - .../data/repository/UserDataRepository.java | 4 -- .../repository/VersionDataRepository.java | 2 - dependencies.gradle | 2 + presentation/build.gradle | 2 + .../presentation/TestMockerApplication.java | 14 +++-- .../presentation/TestMockerComponent.java | 42 +++++++++++-- .../presentation/TestMockerModule.java | 17 +++--- .../presentation/BaseApplication.java | 45 +++++++++----- .../dependency/ApplicationScope.java | 12 ++++ .../dependency/FragmentScope.java | 12 ++++ .../component/ActivityComponent.java | 9 --- .../component/ApplicationComponent.java | 35 ----------- .../component/DemoActivityInjector.java | 8 +++ .../component/DemoApplicationComponent.java | 38 ++++++++++++ .../component/DemoFragmentInjector.java | 59 +++++++++++++++++++ .../component/FragmentInjector.java | 23 -------- .../dependency/module/ApplicationModule.java | 22 ++----- .../dependency/module/DataModule.java | 13 ++-- .../module/DemoApplicationModule.java | 17 ++++++ .../dependency/module/LoginModule.java | 19 ++++++ .../dependency/module/NoteCreateModule.java | 17 ++++++ .../dependency/module/NoteDetailModule.java | 19 ++++++ .../dependency/module/NoteEditModule.java | 17 ++++++ .../dependency/module/NotesModule.java | 19 ++++++ .../dependency/module/RegisterModule.java | 19 ++++++ .../module/ResetPasswordModule.java | 19 ++++++ .../dependency/module/SettingsModule.java | 19 ++++++ .../presentation/executor/JobExecutor.java | 4 +- .../presentation/executor/UIThread.java | 4 +- .../presentation/presenter/BasePresenter.java | 35 +++++++---- .../presenter/LoginPresenter.java | 27 +++------ .../presenter/NoteCreatePresenter.java | 30 ++++------ .../presenter/NoteDetailPresenter.java | 24 +++----- .../presenter/NoteEditPresenter.java | 23 ++------ .../presenter/NotesPresenter.java | 27 +++------ .../presentation/presenter/Presenter.java | 4 +- .../presenter/RegisterPresenter.java | 20 ++----- .../presenter/ResetPasswordPresenter.java | 22 ++----- .../presenter/SettingsPresenter.java | 22 ++----- .../view/activity/base/CleanActivity.java | 22 ------- .../view/fragment/BaseFragment.java | 12 +--- .../view/fragment/LoginFragment.java | 23 ++++---- .../view/fragment/NoteCreateFragment.java | 7 --- .../view/fragment/NoteDetailFragment.java | 5 -- .../view/fragment/NoteEditFragment.java | 6 -- .../view/fragment/NotesFragment.java | 6 -- .../view/fragment/RegisterFragment.java | 6 -- .../view/fragment/ResetPasswordFragment.java | 7 --- .../view/fragment/SettingsFragment.java | 6 -- .../presenter/LoginPresenterTest.java | 16 +++-- .../presenter/NoteCreatePresenterTest.java | 16 +++-- .../presenter/NoteDetailPresenterTest.java | 16 +++-- .../presenter/NoteEditPresenterTest.java | 24 ++++---- .../presenter/NotesPresenterTest.java | 21 ++++--- .../presenter/RegisterPresenterTest.java | 16 +++-- .../presenter/ResetPasswordPresenterTest.java | 9 ++- .../presenter/SettingsPresenterTest.java | 19 +++--- 60 files changed, 551 insertions(+), 460 deletions(-) create mode 100644 presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/ApplicationScope.java create mode 100644 presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/FragmentScope.java delete mode 100644 presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/ActivityComponent.java delete mode 100644 presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/ApplicationComponent.java create mode 100644 presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/DemoActivityInjector.java create mode 100644 presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/DemoApplicationComponent.java create mode 100644 presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/DemoFragmentInjector.java delete mode 100644 presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/FragmentInjector.java create mode 100644 presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/DemoApplicationModule.java create mode 100644 presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/LoginModule.java create mode 100644 presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/NoteCreateModule.java create mode 100644 presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/NoteDetailModule.java create mode 100644 presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/NoteEditModule.java create mode 100644 presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/NotesModule.java create mode 100644 presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/RegisterModule.java create mode 100644 presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/ResetPasswordModule.java create mode 100644 presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/SettingsModule.java diff --git a/data/src/main/java/com/jordifierro/androidbase/data/net/interceptor/HttpInterceptor.java b/data/src/main/java/com/jordifierro/androidbase/data/net/interceptor/HttpInterceptor.java index d8bc98c..69ce740 100644 --- a/data/src/main/java/com/jordifierro/androidbase/data/net/interceptor/HttpInterceptor.java +++ b/data/src/main/java/com/jordifierro/androidbase/data/net/interceptor/HttpInterceptor.java @@ -6,13 +6,11 @@ import java.util.Locale; import javax.inject.Inject; -import javax.inject.Singleton; import okhttp3.Interceptor; import okhttp3.Request; import okhttp3.Response; -@Singleton public class HttpInterceptor implements Interceptor { @Inject diff --git a/data/src/main/java/com/jordifierro/androidbase/data/repository/NoteDataRepository.java b/data/src/main/java/com/jordifierro/androidbase/data/repository/NoteDataRepository.java index c8c9ff2..f87ea6a 100644 --- a/data/src/main/java/com/jordifierro/androidbase/data/repository/NoteDataRepository.java +++ b/data/src/main/java/com/jordifierro/androidbase/data/repository/NoteDataRepository.java @@ -9,13 +9,9 @@ import java.util.List; import javax.inject.Inject; -import javax.inject.Singleton; import io.reactivex.Observable; -import io.reactivex.functions.Function; -import retrofit2.Response; -@Singleton public class NoteDataRepository extends RestApiRepository implements NoteRepository { private final RestApi restApi; diff --git a/data/src/main/java/com/jordifierro/androidbase/data/repository/SessionDataRepository.java b/data/src/main/java/com/jordifierro/androidbase/data/repository/SessionDataRepository.java index 1878ad2..7e5a58a 100644 --- a/data/src/main/java/com/jordifierro/androidbase/data/repository/SessionDataRepository.java +++ b/data/src/main/java/com/jordifierro/androidbase/data/repository/SessionDataRepository.java @@ -6,9 +6,7 @@ import com.jordifierro.androidbase.domain.repository.SessionRepository; import javax.inject.Inject; -import javax.inject.Singleton; -@Singleton public class SessionDataRepository implements SessionRepository { private static final String EMAIL = "email"; diff --git a/data/src/main/java/com/jordifierro/androidbase/data/repository/UserDataRepository.java b/data/src/main/java/com/jordifierro/androidbase/data/repository/UserDataRepository.java index 39ac80e..8c8e72a 100644 --- a/data/src/main/java/com/jordifierro/androidbase/data/repository/UserDataRepository.java +++ b/data/src/main/java/com/jordifierro/androidbase/data/repository/UserDataRepository.java @@ -8,13 +8,9 @@ import com.jordifierro.androidbase.domain.repository.UserRepository; import javax.inject.Inject; -import javax.inject.Singleton; import io.reactivex.Observable; -import io.reactivex.functions.Function; -import retrofit2.Response; -@Singleton public class UserDataRepository extends RestApiRepository implements UserRepository { private final RestApi restApi; diff --git a/data/src/main/java/com/jordifierro/androidbase/data/repository/VersionDataRepository.java b/data/src/main/java/com/jordifierro/androidbase/data/repository/VersionDataRepository.java index d9e5abb..ec545c4 100644 --- a/data/src/main/java/com/jordifierro/androidbase/data/repository/VersionDataRepository.java +++ b/data/src/main/java/com/jordifierro/androidbase/data/repository/VersionDataRepository.java @@ -6,11 +6,9 @@ import com.jordifierro.androidbase.domain.repository.VersionRepository; import javax.inject.Inject; -import javax.inject.Singleton; import io.reactivex.Observable; -@Singleton public class VersionDataRepository extends RestApiRepository implements VersionRepository { private final RestApi restApi; diff --git a/dependencies.gradle b/dependencies.gradle index e109744..589a38c 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -64,6 +64,8 @@ ext { presentationDependencies = [ daggerCompiler: "com.google.dagger:dagger-compiler:${daggerVersion}", dagger: "com.google.dagger:dagger:${daggerVersion}", + daggerAndroid: "com.google.dagger:dagger-android:${daggerVersion}", + daggerProcessor: "com.google.dagger:dagger-android-processor:${daggerVersion}", butterKnife: "com.jakewharton:butterknife:${butterKnifeVersion}", butterCompiler: "com.jakewharton:butterknife-compiler:${butterKnifeVersion}", rxJava: "io.reactivex.rxjava2:rxjava:${rxJavaVersion}", diff --git a/presentation/build.gradle b/presentation/build.gradle index 74ef429..e13cd9f 100644 --- a/presentation/build.gradle +++ b/presentation/build.gradle @@ -43,7 +43,9 @@ dependencies { annotationProcessor presentationDependencies.butterCompiler annotationProcessor presentationDependencies.daggerCompiler + annotationProcessor presentationDependencies.daggerProcessor + compile presentationDependencies.daggerAndroid compile presentationDependencies.androidDesign compile presentationDependencies.androidSupportv4 compile presentationDependencies.androidCompatv7 diff --git a/presentation/src/androidTest/java/com/jordifierro/androidbase/presentation/TestMockerApplication.java b/presentation/src/androidTest/java/com/jordifierro/androidbase/presentation/TestMockerApplication.java index 7736113..635302f 100644 --- a/presentation/src/androidTest/java/com/jordifierro/androidbase/presentation/TestMockerApplication.java +++ b/presentation/src/androidTest/java/com/jordifierro/androidbase/presentation/TestMockerApplication.java @@ -1,13 +1,15 @@ package com.jordifierro.androidbase.presentation; -import com.jordifierro.androidbase.presentation.dependency.component.FragmentInjector; public class TestMockerApplication extends BaseApplication { - @Override - public FragmentInjector getFragmentInjector() { - return DaggerTestMockerComponent.builder() - .applicationComponent(this.applicationComponent) - .testMockerModule(new TestMockerModule()).build(); + + public void initializeInjector() { + DaggerTestMockerComponent + .builder() + .application(this) + .build() + .inject(this); } + } diff --git a/presentation/src/androidTest/java/com/jordifierro/androidbase/presentation/TestMockerComponent.java b/presentation/src/androidTest/java/com/jordifierro/androidbase/presentation/TestMockerComponent.java index 32cfc18..623d3c8 100644 --- a/presentation/src/androidTest/java/com/jordifierro/androidbase/presentation/TestMockerComponent.java +++ b/presentation/src/androidTest/java/com/jordifierro/androidbase/presentation/TestMockerComponent.java @@ -1,11 +1,41 @@ package com.jordifierro.androidbase.presentation; -import com.jordifierro.androidbase.presentation.dependency.ActivityScope; -import com.jordifierro.androidbase.presentation.dependency.component.ApplicationComponent; -import com.jordifierro.androidbase.presentation.dependency.component.FragmentInjector; +import android.app.Application; +import com.jordifierro.androidbase.presentation.dependency.ApplicationScope; +import com.jordifierro.androidbase.presentation.dependency.component.DemoActivityInjector; +import com.jordifierro.androidbase.presentation.dependency.component.DemoFragmentInjector; +import com.jordifierro.androidbase.presentation.dependency.module.ApplicationModule; +import com.jordifierro.androidbase.presentation.dependency.module.DataModule; +import com.jordifierro.androidbase.presentation.dependency.module.DemoApplicationModule; + +import dagger.BindsInstance; import dagger.Component; +import dagger.android.AndroidInjectionModule; + +/** + + */ +@ApplicationScope +@Component(modules = { + DemoApplicationModule.class, + ApplicationModule.class, + AndroidInjectionModule.class, + DataModule.class, + DemoActivityInjector.class, + DemoFragmentInjector.class, + TestMockerModule.class +}) +public interface TestMockerComponent { + + void inject(BaseApplication app); + + @Component.Builder + interface Builder { + + @BindsInstance + Builder application(Application application); -@ActivityScope -@Component(modules = TestMockerModule.class, dependencies = ApplicationComponent.class) -public interface TestMockerComponent extends FragmentInjector {} + TestMockerComponent build(); + } +} diff --git a/presentation/src/androidTest/java/com/jordifierro/androidbase/presentation/TestMockerModule.java b/presentation/src/androidTest/java/com/jordifierro/androidbase/presentation/TestMockerModule.java index 6f7cdd1..ae6b748 100644 --- a/presentation/src/androidTest/java/com/jordifierro/androidbase/presentation/TestMockerModule.java +++ b/presentation/src/androidTest/java/com/jordifierro/androidbase/presentation/TestMockerModule.java @@ -1,6 +1,5 @@ package com.jordifierro.androidbase.presentation; -import com.jordifierro.androidbase.presentation.dependency.ActivityScope; import com.jordifierro.androidbase.presentation.presenter.LoginPresenter; import com.jordifierro.androidbase.presentation.presenter.NoteCreatePresenter; import com.jordifierro.androidbase.presentation.presenter.NoteDetailPresenter; @@ -18,42 +17,42 @@ @Module public class TestMockerModule { - @Provides @ActivityScope + @Provides LoginPresenter provideLoginPresenter() { return Mockito.mock(LoginPresenter.class); } - @Provides @ActivityScope + @Provides NoteCreatePresenter provideNoteCreatePresenter() { return Mockito.mock(NoteCreatePresenter.class); } - @Provides @ActivityScope + @Provides NoteDetailPresenter provideNoteDetailPresenter() { return Mockito.mock(NoteDetailPresenter.class); } - @Provides @ActivityScope + @Provides NotesPresenter provideNotesPresenter() { return Mockito.mock(NotesPresenter.class); } - @Provides @ActivityScope + @Provides RegisterPresenter provideRegisterPresenter() { return Mockito.mock(RegisterPresenter.class); } - @Provides @ActivityScope + @Provides SettingsPresenter provideSettingsPresenter() { return Mockito.mock(SettingsPresenter.class); } - @Provides @ActivityScope + @Provides NoteEditPresenter provideNoteEditPresenter() { return Mockito.mock(NoteEditPresenter.class); } - @Provides @ActivityScope + @Provides ResetPasswordPresenter provideResetPasswordPresenter() { return Mockito.mock(ResetPasswordPresenter.class); } diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/BaseApplication.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/BaseApplication.java index a287531..82efb9d 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/BaseApplication.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/BaseApplication.java @@ -1,16 +1,25 @@ package com.jordifierro.androidbase.presentation; +import android.app.Activity; import android.app.Application; +import android.app.Fragment; -import com.jordifierro.androidbase.presentation.dependency.component.ApplicationComponent; -import com.jordifierro.androidbase.presentation.dependency.component.DaggerActivityComponent; -import com.jordifierro.androidbase.presentation.dependency.component.DaggerApplicationComponent; -import com.jordifierro.androidbase.presentation.dependency.component.FragmentInjector; -import com.jordifierro.androidbase.presentation.dependency.module.ApplicationModule; +import com.jordifierro.androidbase.presentation.dependency.component.DaggerDemoApplicationComponent; -public class BaseApplication extends Application { +import javax.inject.Inject; - protected ApplicationComponent applicationComponent; +import dagger.android.AndroidInjector; +import dagger.android.DispatchingAndroidInjector; +import dagger.android.HasActivityInjector; +import dagger.android.HasFragmentInjector; + +public class BaseApplication extends Application implements HasActivityInjector, HasFragmentInjector { + + @Inject + DispatchingAndroidInjector activityDispatchingAndroidInjector; + + @Inject + DispatchingAndroidInjector fragmentDispatchingAndroidInjector; @Override public void onCreate() { @@ -18,19 +27,23 @@ public void onCreate() { this.initializeInjector(); } - protected void initializeInjector() { - this.applicationComponent = DaggerApplicationComponent.builder() - .applicationModule(new ApplicationModule(this)) - .build(); + public void initializeInjector() { + DaggerDemoApplicationComponent + .builder() + .application(this) + .build() + .inject(this); } - public ApplicationComponent getApplicationComponent() { - return this.applicationComponent; + @Override + public DispatchingAndroidInjector activityInjector() { + return activityDispatchingAndroidInjector; } - public FragmentInjector getFragmentInjector() { - return DaggerActivityComponent.builder() - .applicationComponent(this.applicationComponent).build(); + @Override + public AndroidInjector fragmentInjector() { + return fragmentDispatchingAndroidInjector; } + } diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/ApplicationScope.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/ApplicationScope.java new file mode 100644 index 0000000..837304f --- /dev/null +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/ApplicationScope.java @@ -0,0 +1,12 @@ +package com.jordifierro.androidbase.presentation.dependency; + +import java.lang.annotation.Retention; + +import javax.inject.Scope; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@Scope +@Retention(RUNTIME) +public @interface ApplicationScope { +} diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/FragmentScope.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/FragmentScope.java new file mode 100644 index 0000000..7ea7cd8 --- /dev/null +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/FragmentScope.java @@ -0,0 +1,12 @@ +package com.jordifierro.androidbase.presentation.dependency; + +import java.lang.annotation.Retention; + +import javax.inject.Scope; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@Scope +@Retention(RUNTIME) +public @interface FragmentScope { +} diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/ActivityComponent.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/ActivityComponent.java deleted file mode 100644 index 11598c3..0000000 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/ActivityComponent.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.jordifierro.androidbase.presentation.dependency.component; - -import com.jordifierro.androidbase.presentation.dependency.ActivityScope; - -import dagger.Component; - -@ActivityScope -@Component(dependencies = ApplicationComponent.class) -public interface ActivityComponent extends FragmentInjector {} diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/ApplicationComponent.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/ApplicationComponent.java deleted file mode 100644 index 685b93d..0000000 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/ApplicationComponent.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.jordifierro.androidbase.presentation.dependency.component; - -import android.content.Context; -import android.content.SharedPreferences; - -import com.jordifierro.androidbase.data.net.RestApi; -import com.jordifierro.androidbase.domain.executor.PostExecutionThread; -import com.jordifierro.androidbase.domain.executor.ThreadExecutor; -import com.jordifierro.androidbase.domain.repository.NoteRepository; -import com.jordifierro.androidbase.domain.repository.SessionRepository; -import com.jordifierro.androidbase.domain.repository.UserRepository; -import com.jordifierro.androidbase.domain.repository.VersionRepository; -import com.jordifierro.androidbase.presentation.dependency.module.ApplicationModule; -import com.jordifierro.androidbase.presentation.dependency.module.DataModule; - -import javax.inject.Singleton; - -import dagger.Component; - -@Singleton -@Component(modules = { ApplicationModule.class, DataModule.class }) -public interface ApplicationComponent { - - Context context(); - SharedPreferences sharedPreferences(); - ThreadExecutor threadExecutor(); - PostExecutionThread postExecutionThread(); - - SessionRepository sessionRepository(); - RestApi restApi(); - UserRepository userRepository(); - NoteRepository noteRepository(); - VersionRepository versionRepository(); - -} diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/DemoActivityInjector.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/DemoActivityInjector.java new file mode 100644 index 0000000..8cec29d --- /dev/null +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/DemoActivityInjector.java @@ -0,0 +1,8 @@ +package com.jordifierro.androidbase.presentation.dependency.component; + +import dagger.Module; + +@Module +public abstract class DemoActivityInjector { + +} diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/DemoApplicationComponent.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/DemoApplicationComponent.java new file mode 100644 index 0000000..e303d4a --- /dev/null +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/DemoApplicationComponent.java @@ -0,0 +1,38 @@ +package com.jordifierro.androidbase.presentation.dependency.component; + +import android.app.Application; + +import com.jordifierro.androidbase.presentation.BaseApplication; +import com.jordifierro.androidbase.presentation.dependency.ApplicationScope; +import com.jordifierro.androidbase.presentation.dependency.module.ApplicationModule; +import com.jordifierro.androidbase.presentation.dependency.module.DataModule; +import com.jordifierro.androidbase.presentation.dependency.module.DemoApplicationModule; + +import dagger.BindsInstance; +import dagger.Component; +import dagger.android.AndroidInjectionModule; + +/** + + */ +@ApplicationScope +@Component(modules = { + DemoApplicationModule.class, + ApplicationModule.class, + AndroidInjectionModule.class, + DataModule.class, + DemoActivityInjector.class, + DemoFragmentInjector.class}) +public interface DemoApplicationComponent { + + void inject(BaseApplication app); + + @Component.Builder + interface Builder { + + @BindsInstance + Builder application(Application application); + + DemoApplicationComponent build(); + } +} diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/DemoFragmentInjector.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/DemoFragmentInjector.java new file mode 100644 index 0000000..058122e --- /dev/null +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/DemoFragmentInjector.java @@ -0,0 +1,59 @@ +package com.jordifierro.androidbase.presentation.dependency.component; + +import com.jordifierro.androidbase.presentation.dependency.FragmentScope; +import com.jordifierro.androidbase.presentation.dependency.module.LoginModule; +import com.jordifierro.androidbase.presentation.dependency.module.NoteCreateModule; +import com.jordifierro.androidbase.presentation.dependency.module.NoteDetailModule; +import com.jordifierro.androidbase.presentation.dependency.module.NoteEditModule; +import com.jordifierro.androidbase.presentation.dependency.module.NotesModule; +import com.jordifierro.androidbase.presentation.dependency.module.RegisterModule; +import com.jordifierro.androidbase.presentation.dependency.module.ResetPasswordModule; +import com.jordifierro.androidbase.presentation.dependency.module.SettingsModule; +import com.jordifierro.androidbase.presentation.view.fragment.LoginFragment; +import com.jordifierro.androidbase.presentation.view.fragment.NoteCreateFragment; +import com.jordifierro.androidbase.presentation.view.fragment.NoteDetailFragment; +import com.jordifierro.androidbase.presentation.view.fragment.NoteEditFragment; +import com.jordifierro.androidbase.presentation.view.fragment.NotesFragment; +import com.jordifierro.androidbase.presentation.view.fragment.RegisterFragment; +import com.jordifierro.androidbase.presentation.view.fragment.ResetPasswordFragment; +import com.jordifierro.androidbase.presentation.view.fragment.SettingsFragment; + +import dagger.Module; +import dagger.android.ContributesAndroidInjector; + +@Module +public abstract class DemoFragmentInjector { + + @FragmentScope + @ContributesAndroidInjector(modules = {LoginModule.class}) + abstract LoginFragment bindLoginFragment(); + + @FragmentScope + @ContributesAndroidInjector(modules = {RegisterModule.class}) + abstract RegisterFragment bindRegisterFragment(); + + @FragmentScope + @ContributesAndroidInjector(modules = {NotesModule.class}) + abstract NotesFragment bindNotesFragment(); + + @FragmentScope + @ContributesAndroidInjector(modules = {NoteDetailModule.class}) + abstract NoteDetailFragment bindNoteDetailFragment(); + + @FragmentScope + @ContributesAndroidInjector(modules = {NoteCreateModule.class}) + abstract NoteCreateFragment bindNoteCreateFragment(); + + @FragmentScope + @ContributesAndroidInjector(modules = {NoteEditModule.class}) + abstract NoteEditFragment bindNoteEditFragment(); + + @FragmentScope + @ContributesAndroidInjector(modules = {SettingsModule.class}) + abstract SettingsFragment bindSettingsFragment(); + + @FragmentScope + @ContributesAndroidInjector(modules = {ResetPasswordModule.class}) + abstract ResetPasswordFragment bindResetPasswordFragment(); + +} diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/FragmentInjector.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/FragmentInjector.java deleted file mode 100644 index 62b244d..0000000 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/FragmentInjector.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.jordifierro.androidbase.presentation.dependency.component; - -import com.jordifierro.androidbase.presentation.view.fragment.LoginFragment; -import com.jordifierro.androidbase.presentation.view.fragment.NoteCreateFragment; -import com.jordifierro.androidbase.presentation.view.fragment.NoteDetailFragment; -import com.jordifierro.androidbase.presentation.view.fragment.NoteEditFragment; -import com.jordifierro.androidbase.presentation.view.fragment.NotesFragment; -import com.jordifierro.androidbase.presentation.view.fragment.RegisterFragment; -import com.jordifierro.androidbase.presentation.view.fragment.ResetPasswordFragment; -import com.jordifierro.androidbase.presentation.view.fragment.SettingsFragment; - -public interface FragmentInjector { - - void inject(LoginFragment loginFragment); - void inject(RegisterFragment registerFragment); - void inject(NotesFragment notesFragment); - void inject(NoteDetailFragment noteDetailFragment); - void inject(NoteCreateFragment noteCreateFragment); - void inject(NoteEditFragment noteEditFragment); - void inject(SettingsFragment settingsFragment); - void inject(ResetPasswordFragment resetPasswordFragment); - -} diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/ApplicationModule.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/ApplicationModule.java index e81709c..6d4e684 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/ApplicationModule.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/ApplicationModule.java @@ -5,12 +5,10 @@ import com.jordifierro.androidbase.domain.executor.PostExecutionThread; import com.jordifierro.androidbase.domain.executor.ThreadExecutor; -import com.jordifierro.androidbase.presentation.BaseApplication; +import com.jordifierro.androidbase.presentation.dependency.ApplicationScope; import com.jordifierro.androidbase.presentation.executor.JobExecutor; import com.jordifierro.androidbase.presentation.executor.UIThread; -import javax.inject.Singleton; - import dagger.Module; import dagger.Provides; @@ -19,32 +17,20 @@ public class ApplicationModule { private static final String SHARED_PACKAGE = "base_shared_preferences"; - private final BaseApplication baseApplication; - - public ApplicationModule(BaseApplication baseApplication) { - this.baseApplication = baseApplication; - } - - @Provides - @Singleton - Context provideApplicationContext() { - return this.baseApplication; - } - @Provides - @Singleton + @ApplicationScope SharedPreferences provideSharedPreferences(Context context) { return context.getSharedPreferences(SHARED_PACKAGE, Context.MODE_PRIVATE); } @Provides - @Singleton + @ApplicationScope ThreadExecutor provideThreadExecutor(JobExecutor jobExecutor) { return jobExecutor; } @Provides - @Singleton + @ApplicationScope PostExecutionThread providePostExecutionThread(UIThread uiThread) { return uiThread; } diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/DataModule.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/DataModule.java index 4d63949..ef9d5a2 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/DataModule.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/DataModule.java @@ -14,8 +14,7 @@ import com.jordifierro.androidbase.domain.repository.SessionRepository; import com.jordifierro.androidbase.domain.repository.UserRepository; import com.jordifierro.androidbase.domain.repository.VersionRepository; - -import javax.inject.Singleton; +import com.jordifierro.androidbase.presentation.dependency.ApplicationScope; import dagger.Module; import dagger.Provides; @@ -28,13 +27,13 @@ public class DataModule { @Provides - @Singleton + @ApplicationScope SessionRepository provideSessionRepository(SharedPreferences sharedPreferences) { return new SessionDataRepository(sharedPreferences); } @Provides - @Singleton + @ApplicationScope RestApi provideRestApi() { OkHttpClient client = new OkHttpClient().newBuilder() .addInterceptor(new HttpInterceptor()) @@ -53,19 +52,19 @@ RestApi provideRestApi() { } @Provides - @Singleton + @ApplicationScope UserRepository provideUserRepository(RestApi restApi) { return new UserDataRepository(restApi); } @Provides - @Singleton + @ApplicationScope NoteRepository provideNoteRepository(RestApi restApi) { return new NoteDataRepository(restApi); } @Provides - @Singleton + @ApplicationScope VersionRepository provideVersionRepository(RestApi restApi) { return new VersionDataRepository(restApi); } diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/DemoApplicationModule.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/DemoApplicationModule.java new file mode 100644 index 0000000..e9ae69b --- /dev/null +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/DemoApplicationModule.java @@ -0,0 +1,17 @@ +package com.jordifierro.androidbase.presentation.dependency.module; + +import android.app.Application; +import android.content.Context; + +import dagger.Module; +import dagger.Provides; + +@Module +public class DemoApplicationModule { + + @Provides + Context provideContext(Application application) { + return application; + } + +} diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/LoginModule.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/LoginModule.java new file mode 100644 index 0000000..37e4dad --- /dev/null +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/LoginModule.java @@ -0,0 +1,19 @@ +package com.jordifierro.androidbase.presentation.dependency.module; + +import com.jordifierro.androidbase.presentation.dependency.FragmentScope; +import com.jordifierro.androidbase.presentation.view.LoginView; +import com.jordifierro.androidbase.presentation.view.fragment.LoginFragment; + +import dagger.Module; +import dagger.Provides; + +@Module +public class LoginModule { + + @FragmentScope + @Provides + LoginView provideLoginView(LoginFragment loginFragment) { + return loginFragment; + } + +} diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/NoteCreateModule.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/NoteCreateModule.java new file mode 100644 index 0000000..2b3318d --- /dev/null +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/NoteCreateModule.java @@ -0,0 +1,17 @@ +package com.jordifierro.androidbase.presentation.dependency.module; + +import com.jordifierro.androidbase.presentation.view.NoteCreateView; +import com.jordifierro.androidbase.presentation.view.fragment.NoteCreateFragment; + +import dagger.Module; +import dagger.Provides; + +@Module +public class NoteCreateModule { + + @Provides + NoteCreateView provideNoteCreateView(NoteCreateFragment noteCreateFragment) { + return noteCreateFragment; + } + +} diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/NoteDetailModule.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/NoteDetailModule.java new file mode 100644 index 0000000..dcfcf54 --- /dev/null +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/NoteDetailModule.java @@ -0,0 +1,19 @@ +package com.jordifierro.androidbase.presentation.dependency.module; + +import com.jordifierro.androidbase.presentation.dependency.FragmentScope; +import com.jordifierro.androidbase.presentation.view.NoteDetailView; +import com.jordifierro.androidbase.presentation.view.fragment.NoteDetailFragment; + +import dagger.Module; +import dagger.Provides; + +@Module +public class NoteDetailModule { + + @FragmentScope + @Provides + NoteDetailView provideDetailFragmentView(NoteDetailFragment noteDetailFragment) { + return noteDetailFragment; + } + +} diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/NoteEditModule.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/NoteEditModule.java new file mode 100644 index 0000000..a453057 --- /dev/null +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/NoteEditModule.java @@ -0,0 +1,17 @@ +package com.jordifierro.androidbase.presentation.dependency.module; + +import com.jordifierro.androidbase.presentation.view.NoteEditView; +import com.jordifierro.androidbase.presentation.view.fragment.NoteEditFragment; + +import dagger.Module; +import dagger.Provides; + +@Module +public class NoteEditModule { + + @Provides + NoteEditView provideNoteCreateView(NoteEditFragment noteEditFragment) { + return noteEditFragment; + } + +} diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/NotesModule.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/NotesModule.java new file mode 100644 index 0000000..acc1b09 --- /dev/null +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/NotesModule.java @@ -0,0 +1,19 @@ +package com.jordifierro.androidbase.presentation.dependency.module; + +import com.jordifierro.androidbase.presentation.dependency.FragmentScope; +import com.jordifierro.androidbase.presentation.view.NotesView; +import com.jordifierro.androidbase.presentation.view.fragment.NotesFragment; + +import dagger.Module; +import dagger.Provides; + +@Module +public class NotesModule { + + @FragmentScope + @Provides + NotesView provideRegisterView(NotesFragment notesFragment) { + return notesFragment; + } + +} diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/RegisterModule.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/RegisterModule.java new file mode 100644 index 0000000..d183793 --- /dev/null +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/RegisterModule.java @@ -0,0 +1,19 @@ +package com.jordifierro.androidbase.presentation.dependency.module; + +import com.jordifierro.androidbase.presentation.dependency.FragmentScope; +import com.jordifierro.androidbase.presentation.view.RegisterView; +import com.jordifierro.androidbase.presentation.view.fragment.RegisterFragment; + +import dagger.Module; +import dagger.Provides; + +@Module +public class RegisterModule { + + @FragmentScope + @Provides + RegisterView provideRegisterView(RegisterFragment registerFragment) { + return registerFragment; + } + +} diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/ResetPasswordModule.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/ResetPasswordModule.java new file mode 100644 index 0000000..349e4f0 --- /dev/null +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/ResetPasswordModule.java @@ -0,0 +1,19 @@ +package com.jordifierro.androidbase.presentation.dependency.module; + +import com.jordifierro.androidbase.presentation.dependency.FragmentScope; +import com.jordifierro.androidbase.presentation.view.ResetPasswordView; +import com.jordifierro.androidbase.presentation.view.fragment.ResetPasswordFragment; + +import dagger.Module; +import dagger.Provides; + +@Module +public class ResetPasswordModule { + + @FragmentScope + @Provides + ResetPasswordView provideResetPasswordView(ResetPasswordFragment resetPasswordFragment) { + return resetPasswordFragment; + } + +} diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/SettingsModule.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/SettingsModule.java new file mode 100644 index 0000000..eab7d05 --- /dev/null +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/SettingsModule.java @@ -0,0 +1,19 @@ +package com.jordifierro.androidbase.presentation.dependency.module; + +import com.jordifierro.androidbase.presentation.dependency.FragmentScope; +import com.jordifierro.androidbase.presentation.view.SettingsView; +import com.jordifierro.androidbase.presentation.view.fragment.SettingsFragment; + +import dagger.Module; +import dagger.Provides; + +@Module +public class SettingsModule { + + @FragmentScope + @Provides + SettingsView provideSettingsView(SettingsFragment settingsFragment) { + return settingsFragment; + } + +} diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/executor/JobExecutor.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/executor/JobExecutor.java index e3f7fed..f8fb28d 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/executor/JobExecutor.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/executor/JobExecutor.java @@ -3,6 +3,7 @@ import android.support.annotation.NonNull; import com.jordifierro.androidbase.domain.executor.ThreadExecutor; +import com.jordifierro.androidbase.presentation.dependency.ApplicationScope; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue; @@ -11,9 +12,8 @@ import java.util.concurrent.TimeUnit; import javax.inject.Inject; -import javax.inject.Singleton; -@Singleton +@ApplicationScope public class JobExecutor implements ThreadExecutor { static final int INITIAL_POOL_SIZE = 3; diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/executor/UIThread.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/executor/UIThread.java index a288fb8..6478fa6 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/executor/UIThread.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/executor/UIThread.java @@ -1,14 +1,14 @@ package com.jordifierro.androidbase.presentation.executor; import com.jordifierro.androidbase.domain.executor.PostExecutionThread; +import com.jordifierro.androidbase.presentation.dependency.ApplicationScope; import javax.inject.Inject; -import javax.inject.Singleton; import io.reactivex.Scheduler; import io.reactivex.android.schedulers.AndroidSchedulers; -@Singleton +@ApplicationScope public class UIThread implements PostExecutionThread { @Inject diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/BasePresenter.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/BasePresenter.java index de49e4b..f79ef35 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/BasePresenter.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/BasePresenter.java @@ -7,34 +7,40 @@ public class BasePresenter implements Presenter { - BaseView view; + private BaseView view; private UseCase useCase0, useCase1, useCase2; - public BasePresenter(UseCase useCase0) { + public BasePresenter(BaseView view, UseCase useCase0) { this.useCase0 = useCase0; + this.view = view; } - public BasePresenter(UseCase useCase0, UseCase useCase1) { + public BasePresenter(BaseView view, UseCase useCase0, UseCase useCase1) { + this.view = view; this.useCase0 = useCase0; this.useCase1 = useCase1; } - public BasePresenter(UseCase useCase0, UseCase useCase1, UseCase useCase2) { + public BasePresenter(BaseView view, UseCase useCase0, UseCase useCase1, UseCase useCase2) { + this.view = view; this.useCase0 = useCase0; this.useCase1 = useCase1; this.useCase2 = useCase2; } + @Override - public void initWithView(BaseView view) { - this.view = view; + public void create() { + } @Override - public void resume() {} + public void resume() { + } @Override - public void pause() {} + public void pause() { + } @Override public void destroy() { @@ -60,19 +66,26 @@ public void showMessage(String message) { this.view.showMessage(message); } + public BaseView view() { + return view; + } + protected class BaseSubscriber extends DisposableObserver { - @Override public void onComplete() { + @Override + public void onComplete() { BasePresenter.this.hideLoader(); } - @Override public void onError(Throwable e) { + @Override + public void onError(Throwable e) { BasePresenter.this.hideLoader(); BasePresenter.this.handleError(e); e.printStackTrace(); } - @Override public void onNext(T t) { + @Override + public void onNext(T t) { BasePresenter.this.hideLoader(); //BasePresenter.this.showMessage(t.toString()); } diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/LoginPresenter.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/LoginPresenter.java index da2a526..a9d058c 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/LoginPresenter.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/LoginPresenter.java @@ -2,36 +2,22 @@ import com.jordifierro.androidbase.domain.entity.UserEntity; import com.jordifierro.androidbase.domain.interactor.user.DoLoginUseCase; -import com.jordifierro.androidbase.presentation.dependency.ActivityScope; -import com.jordifierro.androidbase.presentation.view.BaseView; import com.jordifierro.androidbase.presentation.view.LoginView; import javax.inject.Inject; -@ActivityScope public class LoginPresenter extends BasePresenter implements Presenter { + private final LoginView loginView; private DoLoginUseCase doLoginUseCase; - LoginView loginView; @Inject - public LoginPresenter(DoLoginUseCase doLoginUseCase) { - super(doLoginUseCase); + public LoginPresenter(LoginView loginView, DoLoginUseCase doLoginUseCase) { + super(loginView, doLoginUseCase); + this.loginView = loginView; this.doLoginUseCase = doLoginUseCase; } - @Override - public void initWithView(BaseView view) { - super.initWithView(view); - this.loginView = (LoginView) view; - } - - @Override - public void destroy() { - super.destroy(); - this.loginView = null; - } - public void loginUser(String email, String password) { UserEntity user = new UserEntity(email); user.setPassword(password); @@ -41,6 +27,11 @@ public void loginUser(String email, String password) { this.doLoginUseCase.execute(new LoginSubscriber()); } + @Override + public void create() { + + } + protected class LoginSubscriber extends BaseSubscriber { @Override diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/NoteCreatePresenter.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/NoteCreatePresenter.java index 62178ac..dc2b873 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/NoteCreatePresenter.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/NoteCreatePresenter.java @@ -2,36 +2,22 @@ import com.jordifierro.androidbase.domain.entity.NoteEntity; import com.jordifierro.androidbase.domain.interactor.note.CreateNoteUseCase; -import com.jordifierro.androidbase.presentation.dependency.ActivityScope; -import com.jordifierro.androidbase.presentation.view.BaseView; import com.jordifierro.androidbase.presentation.view.NoteCreateView; import javax.inject.Inject; -@ActivityScope public class NoteCreatePresenter extends BasePresenter implements Presenter { + private final NoteCreateView noteCreateView; private CreateNoteUseCase createNoteUseCase; - NoteCreateView noteCreateView; @Inject - public NoteCreatePresenter(CreateNoteUseCase createNoteUseCase) { - super(createNoteUseCase); + public NoteCreatePresenter(NoteCreateView noteCreateView, CreateNoteUseCase createNoteUseCase) { + super(noteCreateView, createNoteUseCase); + this.noteCreateView = noteCreateView; this.createNoteUseCase = createNoteUseCase; } - @Override - public void initWithView(BaseView view) { - super.initWithView(view); - this.noteCreateView = (NoteCreateView) view; - } - - @Override - public void destroy() { - super.destroy(); - this.noteCreateView = null; - } - public void createButtonPressed(String title, String content) { NoteEntity note = new NoteEntity(title, content); @@ -40,9 +26,15 @@ public void createButtonPressed(String title, String content) { this.createNoteUseCase.execute(new NoteCreateSubscriber()); } + @Override + public void create() { + + } + protected class NoteCreateSubscriber extends BaseSubscriber { - @Override public void onNext(NoteEntity note) { + @Override + public void onNext(NoteEntity note) { NoteCreatePresenter.this.hideLoader(); NoteCreatePresenter.this.noteCreateView.close(); } diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/NoteDetailPresenter.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/NoteDetailPresenter.java index 0724295..5aa1625 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/NoteDetailPresenter.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/NoteDetailPresenter.java @@ -2,28 +2,25 @@ import com.jordifierro.androidbase.domain.entity.NoteEntity; import com.jordifierro.androidbase.domain.interactor.note.GetNoteUseCase; -import com.jordifierro.androidbase.presentation.dependency.ActivityScope; -import com.jordifierro.androidbase.presentation.view.BaseView; import com.jordifierro.androidbase.presentation.view.NoteDetailView; import javax.inject.Inject; -@ActivityScope public class NoteDetailPresenter extends BasePresenter implements Presenter { + private final NoteDetailView noteDetailView; private GetNoteUseCase getNoteUseCase; - NoteDetailView noteDetailView; @Inject - public NoteDetailPresenter(GetNoteUseCase getNoteUseCase) { - super(getNoteUseCase); + public NoteDetailPresenter(NoteDetailView noteDetailView, GetNoteUseCase getNoteUseCase) { + super(noteDetailView, getNoteUseCase); + this.noteDetailView = noteDetailView; this.getNoteUseCase = getNoteUseCase; } @Override - public void initWithView(BaseView view) { - super.initWithView(view); - this.noteDetailView = (NoteDetailView) view; + public void create() { + } @Override @@ -33,12 +30,6 @@ public void resume() { this.getNoteUseCase.execute(new NoteDetailSubscriber()); } - @Override - public void destroy() { - super.destroy(); - this.noteDetailView = null; - } - protected class NoteDetailSubscriber extends BaseSubscriber { @Override @@ -47,7 +38,8 @@ public void onError(Throwable e) { NoteDetailPresenter.this.noteDetailView.close(); } - @Override public void onNext(NoteEntity note) { + @Override + public void onNext(NoteEntity note) { NoteDetailPresenter.this.hideLoader(); NoteDetailPresenter.this.noteDetailView.showNote(note); } diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/NoteEditPresenter.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/NoteEditPresenter.java index 02a04fb..8d29a58 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/NoteEditPresenter.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/NoteEditPresenter.java @@ -5,45 +5,32 @@ import com.jordifierro.androidbase.domain.interactor.note.DeleteNoteUseCase; import com.jordifierro.androidbase.domain.interactor.note.GetNoteUseCase; import com.jordifierro.androidbase.domain.interactor.note.UpdateNoteUseCase; -import com.jordifierro.androidbase.presentation.dependency.ActivityScope; -import com.jordifierro.androidbase.presentation.view.BaseView; import com.jordifierro.androidbase.presentation.view.NoteEditView; import javax.inject.Inject; -@ActivityScope public class NoteEditPresenter extends BasePresenter implements Presenter { private UpdateNoteUseCase updateNoteUseCase; private GetNoteUseCase getNoteUseCase; private DeleteNoteUseCase deleteNoteUseCase; - NoteEditView noteEditView; + private final NoteEditView noteEditView; @Inject - public NoteEditPresenter(UpdateNoteUseCase updateNoteUseCase, - GetNoteUseCase getNoteUseCase, DeleteNoteUseCase deleteNoteUseCase) { - super(updateNoteUseCase, getNoteUseCase, deleteNoteUseCase); + public NoteEditPresenter(NoteEditView noteEditView, GetNoteUseCase getNoteUseCase, DeleteNoteUseCase deleteNoteUseCase, UpdateNoteUseCase updateNoteUseCase) { + super(noteEditView, updateNoteUseCase, getNoteUseCase, deleteNoteUseCase); + this.noteEditView = noteEditView; this.updateNoteUseCase = updateNoteUseCase; this.getNoteUseCase = getNoteUseCase; this.deleteNoteUseCase = deleteNoteUseCase; } - @Override - public void initWithView(BaseView view) { - super.initWithView(view); - this.noteEditView = (NoteEditView) view; - + public void create() { this.showLoader(); this.getNoteUseCase.setParams(this.noteEditView.getNoteId()); this.getNoteUseCase.execute(new GetNoteSubscriber()); } - @Override - public void destroy() { - super.destroy(); - this.noteEditView = null; - } - protected class GetNoteSubscriber extends BaseSubscriber { @Override public void onNext(NoteEntity note) { diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/NotesPresenter.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/NotesPresenter.java index d5b5b4e..58448d4 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/NotesPresenter.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/NotesPresenter.java @@ -4,33 +4,28 @@ import com.jordifierro.androidbase.domain.entity.VersionEntity; import com.jordifierro.androidbase.domain.interactor.CheckVersionExpirationUseCase; import com.jordifierro.androidbase.domain.interactor.note.GetNotesUseCase; -import com.jordifierro.androidbase.presentation.dependency.ActivityScope; -import com.jordifierro.androidbase.presentation.view.BaseView; import com.jordifierro.androidbase.presentation.view.NotesView; import java.util.List; import javax.inject.Inject; -@ActivityScope public class NotesPresenter extends BasePresenter implements Presenter { + private final NotesView notesView; private GetNotesUseCase getNotesUseCase; private CheckVersionExpirationUseCase checkVersionExpirationUseCase; - NotesView notesView; @Inject - public NotesPresenter(GetNotesUseCase getNotesUseCase, - CheckVersionExpirationUseCase checkVersionExpirationUseCase) { - super(getNotesUseCase, checkVersionExpirationUseCase); + public NotesPresenter(NotesView notesView, CheckVersionExpirationUseCase checkVersionExpirationUseCase, GetNotesUseCase getNotesUseCase) { + super(notesView, getNotesUseCase, checkVersionExpirationUseCase); + this.notesView = notesView; this.getNotesUseCase = getNotesUseCase; this.checkVersionExpirationUseCase = checkVersionExpirationUseCase; } @Override - public void initWithView(BaseView view) { - super.initWithView(view); - this.notesView = (NotesView) view; + public void create() { this.checkVersionExpirationUseCase.execute(new VersionExpirationSubscriber()); } @@ -40,15 +35,10 @@ public void resume() { this.getNotesUseCase.execute(new NotesSubscriber()); } - @Override - public void destroy() { - super.destroy(); - this.notesView = null; - } - protected class NotesSubscriber extends BaseSubscriber> { - @Override public void onNext(List notes) { + @Override + public void onNext(List notes) { NotesPresenter.this.hideLoader(); NotesPresenter.this.notesView.showNotes(notes); } @@ -56,7 +46,8 @@ protected class NotesSubscriber extends BaseSubscriber> { protected class VersionExpirationSubscriber extends BaseSubscriber { - @Override public void onNext(VersionEntity version) { + @Override + public void onNext(VersionEntity version) { NotesPresenter.this.hideLoader(); if (version.isWarned()) NotesPresenter.this.notesView.showExpirationWarning(); } diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/Presenter.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/Presenter.java index cc24847..2a5ee84 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/Presenter.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/Presenter.java @@ -1,10 +1,8 @@ package com.jordifierro.androidbase.presentation.presenter; -import com.jordifierro.androidbase.presentation.view.BaseView; - public interface Presenter { - void initWithView(BaseView view); + void create(); void resume(); void pause(); void destroy(); diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/RegisterPresenter.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/RegisterPresenter.java index ab411da..10871e5 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/RegisterPresenter.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/RegisterPresenter.java @@ -2,36 +2,28 @@ import com.jordifierro.androidbase.domain.entity.UserEntity; import com.jordifierro.androidbase.domain.interactor.user.CreateUserUseCase; -import com.jordifierro.androidbase.presentation.dependency.ActivityScope; -import com.jordifierro.androidbase.presentation.view.BaseView; import com.jordifierro.androidbase.presentation.view.RegisterView; import javax.inject.Inject; -@ActivityScope public class RegisterPresenter extends BasePresenter implements Presenter { + private final RegisterView registerView; private CreateUserUseCase createUserUseCase; - RegisterView registerView; @Inject - public RegisterPresenter(CreateUserUseCase createUserUseCase) { - super(createUserUseCase); + public RegisterPresenter(RegisterView registerView, CreateUserUseCase createUserUseCase) { + super(registerView, createUserUseCase); + this.registerView = registerView; this.createUserUseCase = createUserUseCase; } @Override - public void initWithView(BaseView view) { - super.initWithView(view); - this.registerView = (RegisterView) view; - } + public void create() { - @Override - public void destroy() { - super.destroy(); - this.registerView = null; } + public void registerUser(String email, String password, String passwordConfirmation) { UserEntity user = new UserEntity(email); user.setPassword(password); diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/ResetPasswordPresenter.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/ResetPasswordPresenter.java index 5b91caa..fcb37be 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/ResetPasswordPresenter.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/ResetPasswordPresenter.java @@ -3,36 +3,22 @@ import com.jordifierro.androidbase.domain.entity.MessageEntity; import com.jordifierro.androidbase.domain.entity.UserEntity; import com.jordifierro.androidbase.domain.interactor.user.ResetPasswordUseCase; -import com.jordifierro.androidbase.presentation.dependency.ActivityScope; -import com.jordifierro.androidbase.presentation.view.BaseView; import com.jordifierro.androidbase.presentation.view.ResetPasswordView; import javax.inject.Inject; -@ActivityScope public class ResetPasswordPresenter extends BasePresenter implements Presenter { + private final ResetPasswordView resetPasswordView; private ResetPasswordUseCase resetPasswordUseCase; - ResetPasswordView resetPasswordView; @Inject - public ResetPasswordPresenter(ResetPasswordUseCase resetPasswordUseCase) { - super(resetPasswordUseCase); + public ResetPasswordPresenter(ResetPasswordView resetPasswordView, ResetPasswordUseCase resetPasswordUseCase) { + super(resetPasswordView, resetPasswordUseCase); + this.resetPasswordView = resetPasswordView; this.resetPasswordUseCase = resetPasswordUseCase; } - @Override - public void initWithView(BaseView view) { - super.initWithView(view); - this.resetPasswordView = (ResetPasswordView) view; - } - - @Override - public void destroy() { - super.destroy(); - this.resetPasswordView = null; - } - public void resetPassword(String email, String newPassword, String newPasswordConfirmation) { UserEntity user = new UserEntity(email); user.setNewPassword(newPassword); diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/SettingsPresenter.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/SettingsPresenter.java index 5bd3e61..6c03643 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/SettingsPresenter.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/presenter/SettingsPresenter.java @@ -2,38 +2,24 @@ import com.jordifierro.androidbase.domain.interactor.user.DeleteUserUseCase; import com.jordifierro.androidbase.domain.interactor.user.DoLogoutUseCase; -import com.jordifierro.androidbase.presentation.dependency.ActivityScope; -import com.jordifierro.androidbase.presentation.view.BaseView; import com.jordifierro.androidbase.presentation.view.SettingsView; import javax.inject.Inject; -@ActivityScope public class SettingsPresenter extends BasePresenter implements Presenter { + private final SettingsView settingsView; private DoLogoutUseCase doLogoutUseCase; private DeleteUserUseCase deleteUserUseCase; - SettingsView settingsView; @Inject - public SettingsPresenter(DoLogoutUseCase doLogoutUseCase, DeleteUserUseCase deleteUserUseCase) { - super(doLogoutUseCase, deleteUserUseCase); + public SettingsPresenter(SettingsView settingsView, DoLogoutUseCase doLogoutUseCase, DeleteUserUseCase deleteUserUseCase) { + super(settingsView, doLogoutUseCase, deleteUserUseCase); + this.settingsView = settingsView; this.doLogoutUseCase = doLogoutUseCase; this.deleteUserUseCase = deleteUserUseCase; } - @Override - public void initWithView(BaseView view) { - super.initWithView(view); - this.settingsView = (SettingsView) view; - } - - @Override - public void destroy() { - super.destroy(); - this.settingsView = null; - } - public void logoutUserButtonPressed() { this.doLogoutUseCase.execute(new BaseSubscriber<>()); this.settingsView.closeAndDisplayLogin(); diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/activity/base/CleanActivity.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/activity/base/CleanActivity.java index 57a55ca..92f2f21 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/activity/base/CleanActivity.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/activity/base/CleanActivity.java @@ -3,38 +3,16 @@ import android.content.DialogInterface; import android.content.Intent; import android.net.Uri; -import android.os.Bundle; -import android.support.annotation.Nullable; import android.support.v7.app.AlertDialog; import android.widget.Toast; import com.jordifierro.androidbase.data.net.error.RestApiErrorException; -import com.jordifierro.androidbase.presentation.BaseApplication; import com.jordifierro.androidbase.presentation.R; -import com.jordifierro.androidbase.presentation.dependency.component.FragmentInjector; import com.jordifierro.androidbase.presentation.view.BaseView; import com.jordifierro.androidbase.presentation.view.activity.LoginActivity; public abstract class CleanActivity extends BaseActivity implements BaseView { - private FragmentInjector fragmentInjector; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - this.initializeActivityComponent(); - super.onCreate(savedInstanceState); - } - - public FragmentInjector getFragmentInjector() { - return this.fragmentInjector; - } - - private void initializeActivityComponent() { - if (this.fragmentInjector == null) { - this.fragmentInjector = ((BaseApplication)getApplication()).getFragmentInjector(); - } - } - @Override public void handleError(Throwable error) { if (error instanceof RestApiErrorException) { diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/BaseFragment.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/BaseFragment.java index 89414d7..1f21c93 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/BaseFragment.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/BaseFragment.java @@ -9,24 +9,21 @@ import android.view.ViewGroup; import android.widget.Toast; -import com.jordifierro.androidbase.presentation.dependency.component.FragmentInjector; import com.jordifierro.androidbase.presentation.presenter.BasePresenter; import com.jordifierro.androidbase.presentation.view.BaseView; -import com.jordifierro.androidbase.presentation.view.activity.base.BaseActivity; import com.jordifierro.androidbase.presentation.view.activity.base.CleanActivity; import butterknife.ButterKnife; +import dagger.android.AndroidInjection; public abstract class BaseFragment extends Fragment implements BaseView { private ProgressDialog progressDialog; - protected abstract void callInjection(); - @Override public void onCreate(Bundle savedInstanceState) { + AndroidInjection.inject(this); super.onCreate(savedInstanceState); - callInjection(); } protected abstract int layoutId(); @@ -44,7 +41,7 @@ public View onCreateView(LayoutInflater inflater, ViewGroup container, @Override public void onViewCreated(View view, Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); - presenter().initWithView(this); + presenter().create(); } @Override @@ -100,7 +97,4 @@ public void closeAndDisplayLogin() { ((CleanActivity)getActivity()).closeAndDisplayLogin(); } - protected FragmentInjector getFragmentInjector() { - return ((CleanActivity)getActivity()).getFragmentInjector(); - } } diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/LoginFragment.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/LoginFragment.java index 4d2c714..d01a695 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/LoginFragment.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/LoginFragment.java @@ -17,13 +17,10 @@ public class LoginFragment extends BaseFragment implements LoginView { @Inject LoginPresenter loginPresenter; - @BindView(R.id.et_email) EditText emailEditText; - @BindView(R.id.et_password) EditText passwordEditText; - - @Override - protected void callInjection() { - this.getFragmentInjector().inject(this); - } + @BindView(R.id.et_email) + EditText emailEditText; + @BindView(R.id.et_password) + EditText passwordEditText; @Override protected int layoutId() { @@ -41,28 +38,30 @@ public LoginPresenter getLoginPresenter() { @OnClick(R.id.btn_login) public void loginButtonPressed() { - this.loginPresenter.loginUser( emailEditText.getText().toString(), - passwordEditText.getText().toString()); + this.loginPresenter.loginUser(emailEditText.getText().toString(), + passwordEditText.getText().toString()); } @Override public void viewNotes() { - ((Listener)getActivity()).viewNotes(); + ((Listener) getActivity()).viewNotes(); } @OnClick(R.id.btn_register) public void registerButtonPressed() { - ((Listener)getActivity()).displayRegister(); + ((Listener) getActivity()).displayRegister(); } @OnClick(R.id.tv_forgot_password) public void forgotPasswordPressed() { - ((Listener)getActivity()).forgotPassword(); + ((Listener) getActivity()).forgotPassword(); } public interface Listener { void viewNotes(); + void displayRegister(); + void forgotPassword(); } } diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NoteCreateFragment.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NoteCreateFragment.java index c5b9305..afe351b 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NoteCreateFragment.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NoteCreateFragment.java @@ -6,8 +6,6 @@ import com.jordifierro.androidbase.presentation.presenter.BasePresenter; import com.jordifierro.androidbase.presentation.presenter.NoteCreatePresenter; import com.jordifierro.androidbase.presentation.view.NoteCreateView; -import com.jordifierro.androidbase.presentation.view.activity.base.BaseActivity; -import com.jordifierro.androidbase.presentation.view.activity.base.CleanActivity; import javax.inject.Inject; @@ -22,11 +20,6 @@ public class NoteCreateFragment extends BaseFragment implements NoteCreateView { @BindView(R.id.et_title) TextView titleET; @BindView(R.id.et_content) TextView contentET; - @Override - protected void callInjection() { - this.getFragmentInjector().inject(this); - } - @Override protected int layoutId() { return R.layout.fragment_note_create_edit; diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NoteDetailFragment.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NoteDetailFragment.java index 91e3000..b4c56b0 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NoteDetailFragment.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NoteDetailFragment.java @@ -20,11 +20,6 @@ public class NoteDetailFragment extends BaseFragment implements NoteDetailView { @BindView(R.id.tv_title) TextView titleTV; @BindView(R.id.tv_content) TextView contentTV; - @Override - protected void callInjection() { - this.getFragmentInjector().inject(this); - } - @Override protected int layoutId() { return R.layout.fragment_note_detail; diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NoteEditFragment.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NoteEditFragment.java index 8a347b7..19d8d96 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NoteEditFragment.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NoteEditFragment.java @@ -12,7 +12,6 @@ import com.jordifierro.androidbase.presentation.presenter.BasePresenter; import com.jordifierro.androidbase.presentation.presenter.NoteEditPresenter; import com.jordifierro.androidbase.presentation.view.NoteEditView; -import com.jordifierro.androidbase.presentation.view.activity.base.BaseActivity; import javax.inject.Inject; @@ -28,11 +27,6 @@ public class NoteEditFragment extends BaseFragment implements NoteEditView { @BindView(R.id.et_content) EditText contentET; @BindView(R.id.btn_submit) Button submitButton; - @Override - protected void callInjection() { - this.getFragmentInjector().inject(this); - } - @Override protected int layoutId() { return R.layout.fragment_note_create_edit; diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NotesFragment.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NotesFragment.java index 995fd0f..6fb4117 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NotesFragment.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/NotesFragment.java @@ -7,7 +7,6 @@ import com.jordifierro.androidbase.presentation.presenter.BasePresenter; import com.jordifierro.androidbase.presentation.presenter.NotesPresenter; import com.jordifierro.androidbase.presentation.view.NotesView; -import com.jordifierro.androidbase.presentation.view.activity.base.BaseActivity; import com.jordifierro.androidbase.presentation.view.adapter.NotesAdapter; import java.util.List; @@ -24,11 +23,6 @@ public class NotesFragment extends BaseFragment implements NotesView { @BindView(R.id.listview) ListView listView; - @Override - protected void callInjection() { - this.getFragmentInjector().inject(this); - } - @Override protected int layoutId() { return R.layout.fragment_notes; diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/RegisterFragment.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/RegisterFragment.java index 16f44aa..cd8d4a8 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/RegisterFragment.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/RegisterFragment.java @@ -6,7 +6,6 @@ import com.jordifierro.androidbase.presentation.presenter.BasePresenter; import com.jordifierro.androidbase.presentation.presenter.RegisterPresenter; import com.jordifierro.androidbase.presentation.view.RegisterView; -import com.jordifierro.androidbase.presentation.view.activity.base.BaseActivity; import javax.inject.Inject; @@ -22,11 +21,6 @@ public class RegisterFragment extends BaseFragment implements RegisterView { @BindView(R.id.et_password) EditText passwordEditText; @BindView(R.id.et_password_confirmation) EditText passwordConfirmationEditText; - @Override - protected void callInjection() { - this.getFragmentInjector().inject(this); - } - @Override protected int layoutId() { return R.layout.fragment_register; diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/ResetPasswordFragment.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/ResetPasswordFragment.java index e96530b..fea083e 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/ResetPasswordFragment.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/ResetPasswordFragment.java @@ -4,9 +4,7 @@ import com.jordifierro.androidbase.presentation.R; import com.jordifierro.androidbase.presentation.presenter.BasePresenter; -import com.jordifierro.androidbase.presentation.presenter.RegisterPresenter; import com.jordifierro.androidbase.presentation.presenter.ResetPasswordPresenter; -import com.jordifierro.androidbase.presentation.view.RegisterView; import com.jordifierro.androidbase.presentation.view.ResetPasswordView; import javax.inject.Inject; @@ -23,11 +21,6 @@ public class ResetPasswordFragment extends BaseFragment implements ResetPassword @BindView(R.id.et_password) EditText passwordEditText; @BindView(R.id.et_password_confirmation) EditText passwordConfirmationEditText; - @Override - protected void callInjection() { - this.getFragmentInjector().inject(this); - } - @Override protected int layoutId() { return R.layout.fragment_reset_password; diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/SettingsFragment.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/SettingsFragment.java index 0d6ca43..c78d018 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/SettingsFragment.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/view/fragment/SettingsFragment.java @@ -4,7 +4,6 @@ import com.jordifierro.androidbase.presentation.presenter.BasePresenter; import com.jordifierro.androidbase.presentation.presenter.SettingsPresenter; import com.jordifierro.androidbase.presentation.view.SettingsView; -import com.jordifierro.androidbase.presentation.view.activity.base.BaseActivity; import javax.inject.Inject; @@ -14,11 +13,6 @@ public class SettingsFragment extends BaseFragment implements SettingsView { @Inject SettingsPresenter settingsPresenter; - @Override - protected void callInjection() { - this.getFragmentInjector().inject(this); - } - @Override protected int layoutId() { return R.layout.fragment_settings; diff --git a/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/LoginPresenterTest.java b/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/LoginPresenterTest.java index 60a3186..0e7d64b 100644 --- a/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/LoginPresenterTest.java +++ b/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/LoginPresenterTest.java @@ -10,17 +10,16 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import io.reactivex.Observable; - import static junit.framework.Assert.assertNull; import static org.mockito.Matchers.any; import static org.mockito.Mockito.verify; public class LoginPresenterTest { - @Mock DoLoginUseCase mockDoLoginUseCase; - @Mock LoginView mockLoginView; - @Mock Observable mockObservable; + @Mock + DoLoginUseCase mockDoLoginUseCase; + @Mock + LoginView mockLoginView; private LoginPresenter loginPresenter; private LoginPresenter.LoginSubscriber loginSubscriber; @@ -28,8 +27,8 @@ public class LoginPresenterTest { @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - this.loginPresenter = new LoginPresenter(this.mockDoLoginUseCase); - this.loginPresenter.initWithView(this.mockLoginView); + this.loginPresenter = new LoginPresenter(mockLoginView, this.mockDoLoginUseCase); + this.loginPresenter.create(); this.loginSubscriber = this.loginPresenter.new LoginSubscriber(); } @@ -39,8 +38,7 @@ public void testDestroy() { this.loginPresenter.destroy(); verify(this.mockDoLoginUseCase).unsubscribe(); - assertNull(this.loginPresenter.loginView); - assertNull(this.loginPresenter.view); + assertNull(this.loginPresenter.view()); } @Test diff --git a/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/NoteCreatePresenterTest.java b/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/NoteCreatePresenterTest.java index ed47d0f..6d4b637 100644 --- a/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/NoteCreatePresenterTest.java +++ b/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/NoteCreatePresenterTest.java @@ -10,17 +10,16 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import io.reactivex.Observable; - import static junit.framework.Assert.assertNull; import static org.mockito.Matchers.any; import static org.mockito.Mockito.verify; public class NoteCreatePresenterTest { - @Mock CreateNoteUseCase createNoteUseCase; - @Mock NoteCreateView mockNoteCreateView; - @Mock Observable mockObservable; + @Mock + CreateNoteUseCase createNoteUseCase; + @Mock + NoteCreateView mockNoteCreateView; private NoteCreatePresenter noteCreatePresenter; private NoteCreatePresenter.NoteCreateSubscriber noteCreateSubscriber; @@ -28,8 +27,8 @@ public class NoteCreatePresenterTest { @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - this.noteCreatePresenter = new NoteCreatePresenter(this.createNoteUseCase); - this.noteCreatePresenter.initWithView(this.mockNoteCreateView); + this.noteCreatePresenter = new NoteCreatePresenter(mockNoteCreateView, this.createNoteUseCase); + this.noteCreatePresenter.create(); this.noteCreateSubscriber = this.noteCreatePresenter.new NoteCreateSubscriber(); } @@ -39,8 +38,7 @@ public void testDestroy() { this.noteCreatePresenter.destroy(); verify(this.createNoteUseCase).unsubscribe(); - assertNull(this.noteCreatePresenter.noteCreateView); - assertNull(this.noteCreatePresenter.view); + assertNull(this.noteCreatePresenter.view()); } @Test diff --git a/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/NoteDetailPresenterTest.java b/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/NoteDetailPresenterTest.java index 370455f..536f96e 100644 --- a/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/NoteDetailPresenterTest.java +++ b/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/NoteDetailPresenterTest.java @@ -10,17 +10,16 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import io.reactivex.Observable; - import static junit.framework.Assert.assertNull; import static org.mockito.Matchers.any; import static org.mockito.Mockito.verify; public class NoteDetailPresenterTest { - @Mock GetNoteUseCase getNoteUseCase; - @Mock NoteDetailView mockNoteDetailView; - @Mock Observable mockObservable; + @Mock + GetNoteUseCase getNoteUseCase; + @Mock + NoteDetailView mockNoteDetailView; private NoteDetailPresenter noteDetailPresenter; private NoteDetailPresenter.NoteDetailSubscriber noteDetailSubscriber; @@ -29,8 +28,8 @@ public class NoteDetailPresenterTest { public void setUp() throws Exception { MockitoAnnotations.initMocks(this); this.noteDetailPresenter = - new NoteDetailPresenter(this.getNoteUseCase); - this.noteDetailPresenter.initWithView(this.mockNoteDetailView); + new NoteDetailPresenter(mockNoteDetailView, this.getNoteUseCase); + this.noteDetailPresenter.create(); this.noteDetailSubscriber = this.noteDetailPresenter.new NoteDetailSubscriber(); } @@ -40,8 +39,7 @@ public void testDestroy() { this.noteDetailPresenter.destroy(); verify(this.getNoteUseCase).unsubscribe(); - assertNull(this.noteDetailPresenter.noteDetailView); - assertNull(this.noteDetailPresenter.view); + assertNull(this.noteDetailPresenter.view()); } @Test diff --git a/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/NoteEditPresenterTest.java b/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/NoteEditPresenterTest.java index ada2885..4f899cf 100644 --- a/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/NoteEditPresenterTest.java +++ b/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/NoteEditPresenterTest.java @@ -12,8 +12,6 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import io.reactivex.Observable; - import static junit.framework.Assert.assertNull; import static org.mockito.Matchers.any; import static org.mockito.Matchers.anyInt; @@ -22,11 +20,14 @@ public class NoteEditPresenterTest { - @Mock GetNoteUseCase getNoteUseCase; - @Mock UpdateNoteUseCase updateNoteUseCase; - @Mock DeleteNoteUseCase deleteNoteUseCase; - @Mock NoteEditView mockNoteEditView; - @Mock Observable mockObservable; + @Mock + GetNoteUseCase getNoteUseCase; + @Mock + UpdateNoteUseCase updateNoteUseCase; + @Mock + DeleteNoteUseCase deleteNoteUseCase; + @Mock + NoteEditView mockNoteEditView; private NoteEditPresenter noteEditPresenter; private NoteEditPresenter.GetNoteSubscriber getNoteSubscriber; @@ -36,9 +37,9 @@ public class NoteEditPresenterTest { @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - this.noteEditPresenter = new NoteEditPresenter(this.updateNoteUseCase, - this.getNoteUseCase, this.deleteNoteUseCase); - this.noteEditPresenter.initWithView(this.mockNoteEditView); + this.noteEditPresenter = new NoteEditPresenter(mockNoteEditView, this.getNoteUseCase, this.deleteNoteUseCase, this.updateNoteUseCase + ); + this.noteEditPresenter.create(); this.getNoteSubscriber = this.noteEditPresenter.new GetNoteSubscriber(); this.updateNoteSubscriber = this.noteEditPresenter.new UpdateNoteSubscriber(); this.deleteNoteSubscriber = this.noteEditPresenter.new DeleteNoteSubscriber(); @@ -51,8 +52,7 @@ public void testDestroy() { verify(this.getNoteUseCase).unsubscribe(); verify(this.updateNoteUseCase).unsubscribe(); - assertNull(this.noteEditPresenter.noteEditView); - assertNull(this.noteEditPresenter.view); + assertNull(this.noteEditPresenter.view()); } @Test diff --git a/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/NotesPresenterTest.java b/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/NotesPresenterTest.java index 58c2ca5..a5364d3 100644 --- a/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/NotesPresenterTest.java +++ b/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/NotesPresenterTest.java @@ -15,8 +15,6 @@ import java.util.ArrayList; import java.util.List; -import io.reactivex.Observable; - import static junit.framework.Assert.assertNull; import static org.mockito.Matchers.any; import static org.mockito.Mockito.verify; @@ -24,10 +22,12 @@ public class NotesPresenterTest { - @Mock GetNotesUseCase getNotesUseCase; - @Mock CheckVersionExpirationUseCase checkVersionExpirationUseCase; - @Mock NotesView mockNotesView; - @Mock Observable mockObservable; + @Mock + GetNotesUseCase getNotesUseCase; + @Mock + CheckVersionExpirationUseCase checkVersionExpirationUseCase; + @Mock + NotesView mockNotesView; private NotesPresenter notesPresenter; private NotesPresenter.NotesSubscriber notesSubscriber; @@ -36,9 +36,9 @@ public class NotesPresenterTest { @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - this.notesPresenter = new NotesPresenter(this.getNotesUseCase, - this.checkVersionExpirationUseCase); - this.notesPresenter.initWithView(this.mockNotesView); + this.notesPresenter = new NotesPresenter(mockNotesView, this.checkVersionExpirationUseCase, this.getNotesUseCase + ); + this.notesPresenter.create(); this.notesSubscriber = this.notesPresenter.new NotesSubscriber(); this.versionExpirationSubscriber = this.notesPresenter.new VersionExpirationSubscriber(); } @@ -50,8 +50,7 @@ public void testDestroy() { verify(this.getNotesUseCase).unsubscribe(); verify(this.checkVersionExpirationUseCase).unsubscribe(); - assertNull(this.notesPresenter.notesView); - assertNull(this.notesPresenter.view); + assertNull(this.notesPresenter.view()); } @Test diff --git a/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/RegisterPresenterTest.java b/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/RegisterPresenterTest.java index 3bce0d3..8f13f98 100644 --- a/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/RegisterPresenterTest.java +++ b/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/RegisterPresenterTest.java @@ -10,17 +10,16 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import io.reactivex.Observable; - import static junit.framework.Assert.assertNull; import static org.mockito.Matchers.any; import static org.mockito.Mockito.verify; public class RegisterPresenterTest { - @Mock CreateUserUseCase mockCreateUserUseCase; - @Mock RegisterView mockRegisterView; - @Mock Observable mockObservable; + @Mock + CreateUserUseCase mockCreateUserUseCase; + @Mock + RegisterView mockRegisterView; private RegisterPresenter registerPresenter; private RegisterPresenter.RegisterSubscriber registerSubscriber; @@ -28,8 +27,8 @@ public class RegisterPresenterTest { @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - this.registerPresenter = new RegisterPresenter(this.mockCreateUserUseCase); - this.registerPresenter.initWithView(this.mockRegisterView); + this.registerPresenter = new RegisterPresenter(mockRegisterView, this.mockCreateUserUseCase); + this.registerPresenter.create(); this.registerSubscriber = this.registerPresenter.new RegisterSubscriber(); } @@ -39,8 +38,7 @@ public void testDestroy() { this.registerPresenter.destroy(); verify(this.mockCreateUserUseCase).unsubscribe(); - assertNull(this.registerPresenter.registerView); - assertNull(this.registerPresenter.view); + assertNull(this.registerPresenter.view()); } @Test diff --git a/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/ResetPasswordPresenterTest.java b/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/ResetPasswordPresenterTest.java index 7951399..f7392c3 100644 --- a/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/ResetPasswordPresenterTest.java +++ b/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/ResetPasswordPresenterTest.java @@ -23,7 +23,8 @@ public class ResetPasswordPresenterTest { ResetPasswordUseCase mockResetPasswordUseCase; @Mock ResetPasswordView mockResetPasswordView; - @Mock Observable mockObservable; + @Mock + Observable mockObservable; private ResetPasswordPresenter resetPasswordPresenter; private ResetPasswordPresenter.ResetPasswordSubscriber resetPasswordSubscriber; @@ -31,8 +32,7 @@ public class ResetPasswordPresenterTest { @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); - this.resetPasswordPresenter = new ResetPasswordPresenter(this.mockResetPasswordUseCase); - this.resetPasswordPresenter.initWithView(this.mockResetPasswordView); + this.resetPasswordPresenter = new ResetPasswordPresenter(mockResetPasswordView, this.mockResetPasswordUseCase); this.resetPasswordSubscriber = this.resetPasswordPresenter.new ResetPasswordSubscriber(); } @@ -42,8 +42,7 @@ public void testDestroy() { this.resetPasswordPresenter.destroy(); verify(this.mockResetPasswordUseCase).unsubscribe(); - assertNull(this.resetPasswordPresenter.resetPasswordView); - assertNull(this.resetPasswordPresenter.view); + assertNull(this.resetPasswordPresenter.view()); } @Test diff --git a/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/SettingsPresenterTest.java b/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/SettingsPresenterTest.java index a30a9a1..81d33bf 100644 --- a/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/SettingsPresenterTest.java +++ b/presentation/src/test/java/com/jordifierro/androidbase/presentation/presenter/SettingsPresenterTest.java @@ -9,18 +9,18 @@ import org.mockito.Mock; import org.mockito.MockitoAnnotations; -import io.reactivex.Observable; - import static junit.framework.Assert.assertNull; import static org.mockito.Matchers.any; import static org.mockito.Mockito.verify; public class SettingsPresenterTest { - @Mock DoLogoutUseCase mockDoLogoutUseCase; - @Mock DeleteUserUseCase mockDeleteUserUseCase; - @Mock SettingsView mockSettingsView; - @Mock Observable mockObservable; + @Mock + DoLogoutUseCase mockDoLogoutUseCase; + @Mock + DeleteUserUseCase mockDeleteUserUseCase; + @Mock + SettingsView mockSettingsView; private SettingsPresenter settingsPresenter; @@ -28,8 +28,8 @@ public class SettingsPresenterTest { public void setUp() throws Exception { MockitoAnnotations.initMocks(this); this.settingsPresenter = - new SettingsPresenter(this.mockDoLogoutUseCase, this.mockDeleteUserUseCase); - this.settingsPresenter.initWithView(this.mockSettingsView); + new SettingsPresenter(mockSettingsView, this.mockDoLogoutUseCase, this.mockDeleteUserUseCase); + this.settingsPresenter.create(); } @Test @@ -39,8 +39,7 @@ public void testDestroy() { verify(this.mockDoLogoutUseCase).unsubscribe(); verify(this.mockDeleteUserUseCase).unsubscribe(); - assertNull(this.settingsPresenter.settingsView); - assertNull(this.settingsPresenter.view); + assertNull(this.settingsPresenter.view()); } @Test From 9cb210ad19f34f2d56c85b172c4d29b72607536a Mon Sep 17 00:00:00 2001 From: ztang Date: Thu, 18 Jan 2018 12:38:10 -0500 Subject: [PATCH 4/6] add sample test case for testing the presenter behavior when the fragment called onPause & onResume. --- .../view/activity/LoginActivityTest.java | 27 +++++++++++++++---- 1 file changed, 22 insertions(+), 5 deletions(-) diff --git a/presentation/src/androidTest/java/com/jordifierro/androidbase/presentation/view/activity/LoginActivityTest.java b/presentation/src/androidTest/java/com/jordifierro/androidbase/presentation/view/activity/LoginActivityTest.java index 75120e2..7a77d60 100644 --- a/presentation/src/androidTest/java/com/jordifierro/androidbase/presentation/view/activity/LoginActivityTest.java +++ b/presentation/src/androidTest/java/com/jordifierro/androidbase/presentation/view/activity/LoginActivityTest.java @@ -4,9 +4,7 @@ import android.support.test.espresso.intent.Intents; import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; -import android.support.v7.widget.Toolbar; import android.test.suitebuilder.annotation.SmallTest; -import android.widget.TextView; import com.jordifierro.androidbase.presentation.R; import com.jordifierro.androidbase.presentation.view.fragment.LoginFragment; @@ -23,13 +21,12 @@ import static android.support.test.espresso.assertion.ViewAssertions.matches; import static android.support.test.espresso.intent.Intents.intended; import static android.support.test.espresso.intent.matcher.IntentMatchers.hasComponent; -import static android.support.test.espresso.matcher.ViewMatchers.isAssignableFrom; import static android.support.test.espresso.matcher.ViewMatchers.withHint; import static android.support.test.espresso.matcher.ViewMatchers.withId; -import static android.support.test.espresso.matcher.ViewMatchers.withParent; import static android.support.test.espresso.matcher.ViewMatchers.withText; -import static org.hamcrest.Matchers.allOf; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoMoreInteractions; @RunWith(AndroidJUnit4.class) @SmallTest @@ -64,6 +61,26 @@ public void testLoginButton() { onView(withId(R.id.btn_login)).perform(click()); verify(this.loginFragment.getLoginPresenter()).loginUser("email@test.com", "87654321"); + verify(this.loginFragment.getLoginPresenter()).create(); + verify(this.loginFragment.getLoginPresenter()).resume(); + verifyNoMoreInteractions(this.loginFragment.getLoginPresenter()); + } + + @Test + public void testPause() { + this.loginFragment.onPause(); + verify(this.loginFragment.getLoginPresenter()).resume(); + verify(this.loginFragment.getLoginPresenter()).pause(); + verify(this.loginFragment.getLoginPresenter()).create(); + verifyNoMoreInteractions(this.loginFragment.getLoginPresenter()); + } + + @Test + public void testResume() { + this.loginFragment.onResume(); + verify(this.loginFragment.getLoginPresenter(),times(2)).resume(); + verify(this.loginFragment.getLoginPresenter()).create(); + verifyNoMoreInteractions(this.loginFragment.getLoginPresenter()); } @Test From 06dcba35dd4276a061a7dd3912473adda42a13ed Mon Sep 17 00:00:00 2001 From: ztang Date: Thu, 18 Jan 2018 15:11:28 -0500 Subject: [PATCH 5/6] make it simpler by making all real module into AndroidBaseModule.java class. --- .../presentation/TestMockerComponent.java | 35 +++---------------- .../component/DemoApplicationComponent.java | 16 ++------- .../dependency/module/AndroidBaseModule.java | 20 +++++++++++ 3 files changed, 27 insertions(+), 44 deletions(-) create mode 100644 presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/AndroidBaseModule.java diff --git a/presentation/src/androidTest/java/com/jordifierro/androidbase/presentation/TestMockerComponent.java b/presentation/src/androidTest/java/com/jordifierro/androidbase/presentation/TestMockerComponent.java index 623d3c8..0e97e60 100644 --- a/presentation/src/androidTest/java/com/jordifierro/androidbase/presentation/TestMockerComponent.java +++ b/presentation/src/androidTest/java/com/jordifierro/androidbase/presentation/TestMockerComponent.java @@ -1,41 +1,16 @@ package com.jordifierro.androidbase.presentation; -import android.app.Application; - import com.jordifierro.androidbase.presentation.dependency.ApplicationScope; -import com.jordifierro.androidbase.presentation.dependency.component.DemoActivityInjector; -import com.jordifierro.androidbase.presentation.dependency.component.DemoFragmentInjector; -import com.jordifierro.androidbase.presentation.dependency.module.ApplicationModule; -import com.jordifierro.androidbase.presentation.dependency.module.DataModule; -import com.jordifierro.androidbase.presentation.dependency.module.DemoApplicationModule; +import com.jordifierro.androidbase.presentation.dependency.component.DemoApplicationComponent; +import com.jordifierro.androidbase.presentation.dependency.module.AndroidBaseModule; -import dagger.BindsInstance; import dagger.Component; -import dagger.android.AndroidInjectionModule; - -/** - */ @ApplicationScope -@Component(modules = { - DemoApplicationModule.class, - ApplicationModule.class, - AndroidInjectionModule.class, - DataModule.class, - DemoActivityInjector.class, - DemoFragmentInjector.class, - TestMockerModule.class -}) -public interface TestMockerComponent { - - void inject(BaseApplication app); +@Component(modules = {AndroidBaseModule.class, TestMockerModule.class}) +public interface TestMockerComponent extends DemoApplicationComponent { @Component.Builder - interface Builder { - - @BindsInstance - Builder application(Application application); - - TestMockerComponent build(); + interface Builder extends DemoApplicationComponent.Builder { } } diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/DemoApplicationComponent.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/DemoApplicationComponent.java index e303d4a..98a41c4 100644 --- a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/DemoApplicationComponent.java +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/component/DemoApplicationComponent.java @@ -4,25 +4,13 @@ import com.jordifierro.androidbase.presentation.BaseApplication; import com.jordifierro.androidbase.presentation.dependency.ApplicationScope; -import com.jordifierro.androidbase.presentation.dependency.module.ApplicationModule; -import com.jordifierro.androidbase.presentation.dependency.module.DataModule; -import com.jordifierro.androidbase.presentation.dependency.module.DemoApplicationModule; +import com.jordifierro.androidbase.presentation.dependency.module.AndroidBaseModule; import dagger.BindsInstance; import dagger.Component; -import dagger.android.AndroidInjectionModule; -/** - - */ @ApplicationScope -@Component(modules = { - DemoApplicationModule.class, - ApplicationModule.class, - AndroidInjectionModule.class, - DataModule.class, - DemoActivityInjector.class, - DemoFragmentInjector.class}) +@Component(modules = {AndroidBaseModule.class}) public interface DemoApplicationComponent { void inject(BaseApplication app); diff --git a/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/AndroidBaseModule.java b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/AndroidBaseModule.java new file mode 100644 index 0000000..bfef266 --- /dev/null +++ b/presentation/src/main/java/com/jordifierro/androidbase/presentation/dependency/module/AndroidBaseModule.java @@ -0,0 +1,20 @@ +package com.jordifierro.androidbase.presentation.dependency.module; + +import com.jordifierro.androidbase.presentation.dependency.component.DemoActivityInjector; +import com.jordifierro.androidbase.presentation.dependency.component.DemoFragmentInjector; + +import dagger.Module; +import dagger.android.AndroidInjectionModule; + +@Module(includes = { + DemoApplicationModule.class, + ApplicationModule.class, + AndroidInjectionModule.class, + DataModule.class, + DemoActivityInjector.class, + DemoFragmentInjector.class +}) +public class AndroidBaseModule { + + +} From d2bf7df3a0c0de0726541594be568a1dc424b0e2 Mon Sep 17 00:00:00 2001 From: ztang Date: Tue, 6 Feb 2018 10:41:42 -0500 Subject: [PATCH 6/6] add a timer use case with test. --- dependencies.gradle | 3 + domain/build.gradle | 5 +- .../androidbase/domain/entity/VoidEntity.java | 10 ++ .../domain/interactor/TimerUseCase.java | 77 +++++++++ .../domain/interactor/TimerUseCaseTest.java | 147 ++++++++++++++++++ .../user/DeleteUserUseCaseTest.java | 2 +- 6 files changed, 241 insertions(+), 3 deletions(-) create mode 100644 domain/src/main/java/com/jordifierro/androidbase/domain/interactor/TimerUseCase.java create mode 100644 domain/src/test/java/com/jordifierro/androidbase/domain/interactor/TimerUseCaseTest.java diff --git a/dependencies.gradle b/dependencies.gradle index 589a38c..e6d5f51 100644 --- a/dependencies.gradle +++ b/dependencies.gradle @@ -25,6 +25,8 @@ ext { //Testing jUnitVersion = '4.10' + truthVersion = '0.34' + mockitoVersion = '1.9.5'//'2.0.43-beta', wait for dexmaker dexmakerVersion = '1.4' mockWebServerVersion = '3.2.0' @@ -42,6 +44,7 @@ ext { domainTestDependencies = [ junit: "junit:junit:${jUnitVersion}", + truth : "com.google.truth:truth:${truthVersion}", mockito: "org.mockito:mockito-core:${mockitoVersion}", jetAnnotations: "org.jetbrains:annotations-java5:${jetAnnotationVersion}" ] diff --git a/domain/build.gradle b/domain/build.gradle index d04105e..d34a085 100644 --- a/domain/build.gradle +++ b/domain/build.gradle @@ -1,7 +1,7 @@ apply plugin: "java" -sourceCompatibility = 1.7 -targetCompatibility = 1.7 +sourceCompatibility = 1.8 +targetCompatibility = 1.8 dependencies { def domainDependencies = rootProject.ext.domainDependencies @@ -10,6 +10,7 @@ dependencies { compile domainDependencies.javaxInject compile domainDependencies.rxJava + testCompile domainTestDependencies.truth testCompile domainTestDependencies.junit testCompile domainTestDependencies.mockito testCompile domainTestDependencies.jetAnnotations diff --git a/domain/src/main/java/com/jordifierro/androidbase/domain/entity/VoidEntity.java b/domain/src/main/java/com/jordifierro/androidbase/domain/entity/VoidEntity.java index 225b6bf..a9f8715 100644 --- a/domain/src/main/java/com/jordifierro/androidbase/domain/entity/VoidEntity.java +++ b/domain/src/main/java/com/jordifierro/androidbase/domain/entity/VoidEntity.java @@ -5,4 +5,14 @@ */ public class VoidEntity { + + private static VoidEntity voidEntity = new VoidEntity(); + + private VoidEntity() { + + } + + public static VoidEntity getInstance() { + return voidEntity; + } } diff --git a/domain/src/main/java/com/jordifierro/androidbase/domain/interactor/TimerUseCase.java b/domain/src/main/java/com/jordifierro/androidbase/domain/interactor/TimerUseCase.java new file mode 100644 index 0000000..61c490d --- /dev/null +++ b/domain/src/main/java/com/jordifierro/androidbase/domain/interactor/TimerUseCase.java @@ -0,0 +1,77 @@ +package com.jordifierro.androidbase.domain.interactor; + + +import com.jordifierro.androidbase.domain.entity.VoidEntity; +import com.jordifierro.androidbase.domain.executor.PostExecutionThread; + +import java.util.concurrent.TimeUnit; + +import javax.inject.Inject; + +import io.reactivex.Observable; +import io.reactivex.Scheduler; +import io.reactivex.disposables.Disposable; +import io.reactivex.disposables.Disposables; +import io.reactivex.observers.DisposableObserver; + +public class TimerUseCase { + + public static final int DEFAULT_DELAY = 1; + public static final TimeUnit DEFAULT_TIME_UNIT = TimeUnit.SECONDS; + private final Scheduler scheduler; + private final PostExecutionThread postExecutionThread; + protected Disposable disposable = Disposables.empty(); + private int delay = DEFAULT_DELAY; + private TimeUnit timeUnit = DEFAULT_TIME_UNIT; + + @Inject + public TimerUseCase(Scheduler scheduler, PostExecutionThread postExecutionThread) { + this.scheduler = scheduler; + this.postExecutionThread = postExecutionThread; + } + + public Observable buildUseCaseObservable() { + return Observable.timer(delay, timeUnit, scheduler).map(aLong -> VoidEntity.getInstance()); + } + + public void execute(DisposableObserver useCaseDisposable) { + this.disposable = this.buildUseCaseObservable() + .subscribeOn(scheduler) + .observeOn(postExecutionThread.getScheduler()) + .subscribeWith(useCaseDisposable); + } + + public void unsubscribe() { + if (!isUnsubscribed()) { + this.disposable.dispose(); + } + } + + public boolean isUnsubscribed() { + return this.disposable.isDisposed(); + } + + public TimerUseCase setParam(int delay) { + return setParam(delay, TimeUnit.SECONDS); + } + + public TimerUseCase setParam(int delay, TimeUnit timeUnit) { + checkDelayParams(delay); + this.delay = delay; + this.timeUnit = timeUnit; + return this; + } + + + private void checkDelayParams(int delay) { + if (isInvalidParam(delay)) { + throw new RuntimeException("Illegal Params."); + } + } + + private boolean isInvalidParam(int delay) { + return delay <= 0; + } + + +} diff --git a/domain/src/test/java/com/jordifierro/androidbase/domain/interactor/TimerUseCaseTest.java b/domain/src/test/java/com/jordifierro/androidbase/domain/interactor/TimerUseCaseTest.java new file mode 100644 index 0000000..f6ca809 --- /dev/null +++ b/domain/src/test/java/com/jordifierro/androidbase/domain/interactor/TimerUseCaseTest.java @@ -0,0 +1,147 @@ +package com.jordifierro.androidbase.domain.interactor; + +import com.jordifierro.androidbase.domain.entity.VoidEntity; +import com.jordifierro.androidbase.domain.executor.PostExecutionThread; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; + +import java.util.concurrent.TimeUnit; + +import io.reactivex.Observable; +import io.reactivex.observers.DisposableObserver; +import io.reactivex.observers.TestObserver; +import io.reactivex.schedulers.TestScheduler; + +import static com.google.common.truth.Truth.assertThat; +import static org.junit.Assert.assertEquals; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyZeroInteractions; + +public class TimerUseCaseTest { + + @Rule + public ExpectedException expectedEx = ExpectedException.none(); + @Mock + private PostExecutionThread mockPostExecutionThread; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + } + + @Test + public void demo_test_scheduler() throws Exception { + TestScheduler scheduler = new TestScheduler(); + TestObserver testObserver = new TestObserver<>(); + Observable.interval(1, TimeUnit.SECONDS, scheduler).take(5).observeOn(scheduler).subscribeOn(scheduler).subscribe(testObserver); + testObserver.assertNoValues(); + scheduler.advanceTimeBy(2, TimeUnit.SECONDS); + testObserver.assertValues(0L, 1L); + scheduler.advanceTimeBy(10, TimeUnit.SECONDS); + testObserver.assertComplete(); + } + + @Test + public void build_use_case_observable() { + TestScheduler scheduler = new TestScheduler(); + TestObserver testObserver = new TestObserver<>(); + TimerUseCase timerUseCase = new TimerUseCase(scheduler, mockPostExecutionThread); + timerUseCase.setParam(10).buildUseCaseObservable().subscribeWith(testObserver); + testObserver.assertNoValues(); + scheduler.advanceTimeBy(10, TimeUnit.SECONDS); + testObserver.assertValues(VoidEntity.getInstance()); + testObserver.assertComplete(); + verifyZeroInteractions(mockPostExecutionThread); + } + + @Test + public void build_use_case_observable_unit() { + TestScheduler scheduler = new TestScheduler(); + TestObserver testObserver = new TestObserver<>(); + TimerUseCase timerUseCase = new TimerUseCase(scheduler, mockPostExecutionThread); + timerUseCase.setParam(10, TimeUnit.DAYS).buildUseCaseObservable().subscribeWith(testObserver); + testObserver.assertNoValues(); + scheduler.advanceTimeBy(10, TimeUnit.SECONDS); + testObserver.assertNoValues(); + scheduler.advanceTimeBy(10, TimeUnit.HOURS); + testObserver.assertNoValues(); + scheduler.advanceTimeBy(14, TimeUnit.HOURS); + testObserver.assertNoValues(); + scheduler.advanceTimeBy(9, TimeUnit.DAYS); + testObserver.assertValues(VoidEntity.getInstance()); + testObserver.assertComplete(); + verifyZeroInteractions(mockPostExecutionThread); + } + + @Test + public void execute() { + TestScheduler scheduler = new TestScheduler(); + + given(mockPostExecutionThread.getScheduler()).willReturn(scheduler); + + TestDisposableObserver testObserver = new TestDisposableObserver<>(); + TimerUseCase timerUseCase = new TimerUseCase(scheduler, mockPostExecutionThread); + timerUseCase.setParam(10).execute(testObserver); + + assertThat(testObserver.valuesCount).isEqualTo(0); + assertThat(testObserver.completed).isFalse(); + scheduler.advanceTimeBy(10, TimeUnit.SECONDS); + assertThat(testObserver.valuesCount).isEqualTo(1); + assertThat(testObserver.completed).isTrue(); + verify(mockPostExecutionThread).getScheduler(); + + } + + @Test + public void unsubscribe() { + TestScheduler scheduler = new TestScheduler(); + TestObserver testObserver = new TestObserver<>(); + TimerUseCase timerUseCase = new TimerUseCase(scheduler, mockPostExecutionThread); + timerUseCase.setParam(10).buildUseCaseObservable().subscribeWith(testObserver); + testObserver.assertNoValues(); + assertEquals(timerUseCase.isUnsubscribed(), false); + timerUseCase.unsubscribe(); + assertEquals(timerUseCase.isUnsubscribed(), true); + + } + + @Test + public void exception_on_less_than_minimum_value() { + + expectedEx.expect(RuntimeException.class); + expectedEx.expectMessage("Illegal Params."); + TestScheduler scheduler = new TestScheduler(); + TimerUseCase timerUseCase = new TimerUseCase(scheduler, mockPostExecutionThread); + timerUseCase.setParam(0); + } + + + private static class TestDisposableObserver extends DisposableObserver { + private int valuesCount = 0; + private boolean completed; + + @Override + public void onNext(T value) { + valuesCount++; + } + + @Override + public void onError(Throwable e) { + // no-op by default. + } + + @Override + public void onComplete() { + // no-op by default. + completed = true; + } + } + + +} \ No newline at end of file diff --git a/domain/src/test/java/com/jordifierro/androidbase/domain/interactor/user/DeleteUserUseCaseTest.java b/domain/src/test/java/com/jordifierro/androidbase/domain/interactor/user/DeleteUserUseCaseTest.java index 419456e..03cd377 100644 --- a/domain/src/test/java/com/jordifierro/androidbase/domain/interactor/user/DeleteUserUseCaseTest.java +++ b/domain/src/test/java/com/jordifierro/androidbase/domain/interactor/user/DeleteUserUseCaseTest.java @@ -37,7 +37,7 @@ public void testDeleteUserUseCaseSuccess() { mockPostExecutionThread, mockUserRepository, mockSessionRepository); given(mockSessionRepository.getCurrentUser()).willReturn(mockUser); given(mockUserRepository.deleteUser(mockUser)) - .willReturn(Observable.just(new VoidEntity())); + .willReturn(Observable.just(VoidEntity.getInstance())); TestScheduler testScheduler = new TestScheduler(); deleteUserUseCase.buildUseCaseObservable()