From 919640dfb118bffe09d7f6be5532f706223aa884 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 8 Feb 2015 15:50:35 +0100 Subject: [PATCH 001/332] Deleted gitignore --- PausableSubscription/.gitignore | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 PausableSubscription/.gitignore diff --git a/PausableSubscription/.gitignore b/PausableSubscription/.gitignore deleted file mode 100644 index d0b97c6..0000000 --- a/PausableSubscription/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/build -*.iml \ No newline at end of file From f5964b70431eb85d26be47b0d401133b8c955d7d Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 8 Feb 2015 15:55:22 +0100 Subject: [PATCH 002/332] Create README.md --- README.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..3774915 --- /dev/null +++ b/README.md @@ -0,0 +1,5 @@ +# CoseNonJavisteAndroidApp +Android app of blog cosenonjaviste.it + +[![Build Status](https://travis-ci.org/fabioCollini/CoseNonJavisteAndroidApp.svg?branch=master)](https://travis-ci.org/fabioCollini/CoseNonJavisteAndroidApp) +[![Coverage Status](https://coveralls.io/repos/fabioCollini/CoseNonJavisteAndroidApp/badge.svg?branch=master)](https://coveralls.io/r/fabioCollini/CoseNonJavisteAndroidApp?branch=master) From 0a4aa0ba304ac0cd34449625c8690c22f0637d0e Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 8 Feb 2015 22:02:44 +0100 Subject: [PATCH 003/332] Junit rules in AuthorListTest --- .../androidtest/AuthorListTest.java | 38 ++++-- .../androidtest/MainActivityTest.java | 49 +++++++ .../cosenonjaviste/androidtest/PageTest.java | 10 -- .../androidtest/PostListTest.java | 15 ++- .../androidtest/base/ActivityRule.java | 123 ++++++++++++++++++ .../androidtest/base/DaggerRule.java | 77 +++++++++++ .../androidtest/base/FragmentRule.java | 32 +++++ .../base/MvpEspressoTestModule.java | 9 ++ .../utils/SingleFragmentActivity.java | 9 +- .../it/cosenonjaviste/stubs/JsonStubs.java | 16 ++- .../stubs/MockWebServerWrapper.java | 4 + 11 files changed, 354 insertions(+), 28 deletions(-) create mode 100644 app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java create mode 100644 app/src/androidTest/java/it/cosenonjaviste/androidtest/base/ActivityRule.java create mode 100644 app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java create mode 100644 app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java index 82ab3e0..201c210 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java @@ -1,34 +1,46 @@ package it.cosenonjaviste.androidtest; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.RuleChain; +import org.junit.rules.TestRule; +import org.junit.runner.RunWith; + import javax.inject.Inject; import dagger.Module; -import it.cosenonjaviste.androidtest.base.CnjFragmentTest; +import it.cosenonjaviste.androidtest.base.DaggerRule; +import it.cosenonjaviste.androidtest.base.FragmentRule; import it.cosenonjaviste.androidtest.base.MvpEspressoTestModule; import it.cosenonjaviste.author.AuthorListFragment; import it.cosenonjaviste.author.AuthorListModel; import it.cosenonjaviste.stubs.JsonStubs; import it.cosenonjaviste.stubs.MockWebServerWrapper; -public class AuthorListTest extends CnjFragmentTest { +@RunWith(AndroidJUnit4.class) +public class AuthorListTest { @Inject MockWebServerWrapper server; - public AuthorListTest() { - super(AuthorListFragment.class, new AuthorListModel()); - } + private final FragmentRule fragmentRule = FragmentRule.create(AuthorListFragment.class, new AuthorListModel()); - @Override protected Object getTestModule() { - return new TestModule(); - } - - @Override protected void initAfterInject() { - super.initAfterInject(); + private final DaggerRule daggerRule = new DaggerRule(new TestModule(), objectGraph -> { + objectGraph.inject(this); server.initDispatcher(JsonStubs.AUTHORS); - } + }); + + @Rule public TestRule chain = RuleChain.outerRule(daggerRule).around(fragmentRule); + @Test public void testAuthorList() { - showUi(); + try { + Thread.sleep(10000); + } catch (InterruptedException e) { + e.printStackTrace(); + } +// showUi(); } @Module(injects = AuthorListTest.class, includes = MvpEspressoTestModule.class, overrides = true, library = true) diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java new file mode 100644 index 0000000..7956313 --- /dev/null +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java @@ -0,0 +1,49 @@ +package it.cosenonjaviste.androidtest; + +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.RuleChain; +import org.junit.rules.TestRule; +import org.junit.runner.RunWith; + +import javax.inject.Inject; + +import dagger.Module; +import it.cosenonjaviste.MainActivity; +import it.cosenonjaviste.androidtest.base.ActivityRule; +import it.cosenonjaviste.androidtest.base.DaggerRule; +import it.cosenonjaviste.androidtest.base.MvpEspressoTestModule; +import it.cosenonjaviste.model.Post; +import it.cosenonjaviste.stubs.JsonStubs; +import it.cosenonjaviste.stubs.MockWebServerWrapper; + +import static android.support.test.espresso.Espresso.onData; +import static android.support.test.espresso.action.ViewActions.click; +import static android.support.test.espresso.matcher.ViewMatchers.withId; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.is; + +@RunWith(AndroidJUnit4.class) +public class MainActivityTest { + @Inject MockWebServerWrapper server; + + private final ActivityRule fragmentRule = new ActivityRule<>(MainActivity.class); + + private final DaggerRule daggerRule = new DaggerRule(new TestModule(), objectGraph -> { + objectGraph.inject(this); + JsonStubs.initAllStubs(); + }); + + @Rule public TestRule chain = RuleChain.outerRule(daggerRule).around(fragmentRule); + + @Test public void showMainActivity() { + onData(is(instanceOf(Post.class))).inAdapterView(withId(android.R.id.list)) + .atPosition(3).perform(click()); + } + + @Module(injects = MainActivityTest.class, includes = MvpEspressoTestModule.class, overrides = true, library = true) + public static class TestModule { + } +} diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java index e2c0435..107f223 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java @@ -1,15 +1,12 @@ package it.cosenonjaviste.androidtest; import javax.inject.Inject; -import javax.inject.Singleton; import dagger.Module; -import dagger.Provides; import it.cosenonjaviste.androidtest.base.CnjFragmentTest; import it.cosenonjaviste.androidtest.base.MvpEspressoTestModule; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; -import it.cosenonjaviste.page.PageUrlManager; import it.cosenonjaviste.stubs.MockWebServerWrapper; public class PageTest extends CnjFragmentTest { @@ -35,12 +32,5 @@ public void testDetailFragment() { @Module(injects = {PageTest.class}, includes = MvpEspressoTestModule.class, library = true) public static class TestModule { - @Provides @Singleton PageUrlManager providePostDetailUrlManager(MockWebServerWrapper server) { - return new PageUrlManager() { - @Override public String getUrl(String url) { - return server.getUrl(true); - } - }; - } } } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java index c2e5ff4..721e83e 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java @@ -5,12 +5,18 @@ import dagger.Module; import it.cosenonjaviste.androidtest.base.CnjFragmentTest; import it.cosenonjaviste.androidtest.base.MvpEspressoTestModule; -import it.cosenonjaviste.model.WordPressService; +import it.cosenonjaviste.model.Post; import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.stubs.JsonStubs; import it.cosenonjaviste.stubs.MockWebServerWrapper; +import static android.support.test.espresso.Espresso.onData; +import static android.support.test.espresso.action.ViewActions.click; +import static android.support.test.espresso.matcher.ViewMatchers.withId; +import static org.hamcrest.Matchers.instanceOf; +import static org.hamcrest.Matchers.is; + public class PostListTest extends CnjFragmentTest { @Inject MockWebServerWrapper server; @@ -25,13 +31,18 @@ public PostListTest() { @Override protected void initAfterInject() { super.initAfterInject(); - server.initDispatcher(JsonStubs.getPostList(WordPressService.POST_PAGE_SIZE)); + JsonStubs.initAllStubs(); } public void testPostList() throws InterruptedException { showUi(); } + public void testGoToPostDetail() { + onData(is(instanceOf(Post.class))).inAdapterView(withId(android.R.id.list)) + .atPosition(3).perform(click()); + } + @Module(injects = {PostListTest.class}, includes = MvpEspressoTestModule.class) public static class TestModule { } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/ActivityRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/ActivityRule.java new file mode 100644 index 0000000..a39fd0a --- /dev/null +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/ActivityRule.java @@ -0,0 +1,123 @@ +/* + * Copyright (C) 2015 Jake Wharton + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package it.cosenonjaviste.androidtest.base; + +import android.app.Activity; +import android.app.Instrumentation; +import android.content.Intent; +import android.support.test.InstrumentationRegistry; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; + +/** + * A JUnit {@link Rule @Rule} which launches an activity when your test starts. Stop extending + * gross {@code ActivityInstrumentationBarfCase2}! + *

+ * Usage: + *

{@code
+ * @Rule
+ * public final ActivityRule example =
+ *     new ActivityRule<>(ExampleActivity.class);
+ * }
+ * + * This will automatically launch the activity for each test method. The instance will also be + * created sooner should you need to use it in a {@link Before @Before} method. + *

+ * You can also customize the way in which the activity is launched by overriding + * {@link #getLaunchIntent(String, Class)} and customizing or replacing the {@link Intent}. + *

{@code
+ * @Rule
+ * public final ActivityRule example =
+ *     new ActivityRule(ExampleActivity.class) {
+ *       @Override
+ *       protected Intent getLaunchIntent(String packageName, Class activityClass) {
+ *         Intent intent = super.getLaunchIntent(packageName, activityClass);
+ *         intent.putExtra("Hello", "World!");
+ *         return intent;
+ *       }
+ *     };
+ * }
+ */ +public class ActivityRule implements TestRule { + private final Class activityClass; + + private T activity; + private Instrumentation instrumentation; + + public ActivityRule(Class activityClass) { + this.activityClass = activityClass; + } + + protected Intent getLaunchIntent(String targetPackage, Class activityClass) { + Intent intent = new Intent(Intent.ACTION_MAIN); + intent.setClassName(targetPackage, activityClass.getName()); + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + return intent; + } + + /** + * Get the running instance of the specified activity. This will launch it if it is not already + * running. + */ + public final T get() { + launchActivity(); + return activity; + } + + /** Get the {@link Instrumentation} instance for this test. */ + public final Instrumentation instrumentation() { + launchActivity(); + return instrumentation; + } + + @Override public final Statement apply(final Statement base, Description description) { + return new Statement() { + @Override public void evaluate() throws Throwable { + launchActivity(); + + base.evaluate(); + + if (!activity.isFinishing()) { + activity.finish(); + } + activity = null; // Eager reference kill in case someone leaked our reference. + } + }; + } + + private Instrumentation fetchInstrumentation() { + Instrumentation result = instrumentation; + return result != null ? result + : (instrumentation = InstrumentationRegistry.getInstrumentation()); + } + + @SuppressWarnings("unchecked") // Guarded by generics at the constructor. + private void launchActivity() { + if (activity != null) return; + + Instrumentation instrumentation = fetchInstrumentation(); + + String targetPackage = instrumentation.getTargetContext().getPackageName(); + Intent intent = getLaunchIntent(targetPackage, activityClass); + + activity = (T) instrumentation.startActivitySync(intent); + instrumentation.waitForIdleSync(); + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java new file mode 100644 index 0000000..e1e515a --- /dev/null +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java @@ -0,0 +1,77 @@ +package it.cosenonjaviste.androidtest.base; + +import org.junit.rules.TestRule; +import org.junit.runner.Description; +import org.junit.runners.model.Statement; +import org.mockito.MockitoAnnotations; + +import dagger.ObjectGraph; +import it.cosenonjaviste.lib.mvp.dagger.ObjectGraphHolder; +import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; +import rx.functions.Action1; +import rx.schedulers.Schedulers; + +import static android.support.test.espresso.Espresso.registerIdlingResources; + +public class DaggerRule implements TestRule { + + private Object testModule; + + private Action1 afterInjectAction; + + public DaggerRule(Object testModule, Action1 afterInjectAction) { + this.testModule = testModule; + this.afterInjectAction = afterInjectAction; + } + + @Override public Statement apply(Statement base, Description description) { + return new Statement() { + @Override public void evaluate() throws Throwable { + + setupDexmaker(); + + //TODO + MockitoAnnotations.initMocks(this); + + final EspressoExecutor espressoExecutor = EspressoExecutor.newCachedThreadPool(); + + ObjectGraphHolder.forceObjectGraphCreator(app -> { + Object[] modules = mergeArrays(app.getModules(), new Object[]{testModule}); + ObjectGraph objectGraph = ObjectGraph.create(modules); + if (afterInjectAction != null) { + afterInjectAction.call(objectGraph); + } + return objectGraph; + }); + + registerIdlingResources(espressoExecutor); + + SchedulerManager.setIo(Schedulers.from(espressoExecutor)); + + base.evaluate(); + + } + }; + } + + /** + * Workaround for Mockito and JB-MR2 incompatibility to avoid + * java.lang.IllegalArgumentException: dexcache == null + * + * @see + * https://code.google.com/p/dexmaker/issues/detail?id=2 + */ + private void setupDexmaker() { +// // Explicitly set the Dexmaker cache, so tests that use mockito work +// final String dexCache = getInstrumentation().getTargetContext().getCacheDir().getPath(); +// System.setProperty("dexmaker.dexcache", dexCache); + } + + private Object[] mergeArrays(Object[] appModules, Object[] testModules) { + Object[] modules = new Object[testModules.length + appModules.length]; + System.arraycopy(appModules, 0, modules, 0, appModules.length); + System.arraycopy(testModules, 0, modules, appModules.length, testModules.length); + return modules; + } + +} diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java new file mode 100644 index 0000000..8ff73ad --- /dev/null +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java @@ -0,0 +1,32 @@ +package it.cosenonjaviste.androidtest.base; + +import android.content.Intent; + +import org.parceler.Parcels; + +import it.cosenonjaviste.lib.mvp.MvpFragment; +import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.utils.SingleFragmentActivity; + +public class FragmentRule extends ActivityRule { + + private final Class> viewClass; + + private Object model; + + public static FragmentRule create(Class> viewClass, M model) { + return new FragmentRule(viewClass, model); + } + + private FragmentRule(Class> viewClass, Object model) { + super(SingleFragmentActivity.class); + this.viewClass = viewClass; + this.model = model; + } + + @Override protected Intent getLaunchIntent(String targetPackage, Class activityClass) { + Intent intent = SingleFragmentActivity.populateIntent(super.getLaunchIntent(targetPackage, activityClass), viewClass); + intent.putExtra(MvpFragment.MODEL, Parcels.wrap(model)); + return intent; + } +} diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java index a0e6222..fcb9bb5 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java @@ -8,6 +8,7 @@ import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.model.WordPressServiceFactory; +import it.cosenonjaviste.page.PageUrlManager; import it.cosenonjaviste.stubs.MockWebServerWrapper; @Module(library = true, overrides = true, includes = MvpTestModule.class) @@ -20,4 +21,12 @@ public class MvpEspressoTestModule { @Provides @Singleton SchedulerManager provideSchedulerManager() { return new SchedulerManager(); } + + @Provides @Singleton PageUrlManager providePostDetailUrlManager(MockWebServerWrapper server) { + return new PageUrlManager() { + @Override public String getUrl(String url) { + return server.getUrl(true) + url; + } + }; + } } diff --git a/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java b/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java index 9e2e474..3c5f80b 100644 --- a/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java +++ b/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java @@ -15,15 +15,20 @@ public class SingleFragmentActivity extends ActionBarActivity { private static final String VIEW_CLASS = "viewClass"; + public static Intent populateIntent(Intent intent, Class> viewClass) { + intent.putExtra(VIEW_CLASS, viewClass.getName()); + return intent; + } + public static Intent createIntent(Context context, Class> viewClass) { Intent intent = new Intent(context, SingleFragmentActivity.class); - intent.putExtra(VIEW_CLASS, viewClass.getName()); + populateIntent(intent, viewClass); return intent; } public static Intent createIntent(Class> viewClass) { Intent intent = new Intent(); - intent.putExtra(VIEW_CLASS, viewClass.getName()); + populateIntent(intent, viewClass); return intent; } diff --git a/mvp-test/src/main/java/it/cosenonjaviste/stubs/JsonStubs.java b/mvp-test/src/main/java/it/cosenonjaviste/stubs/JsonStubs.java index 6727912..50fe4f6 100644 --- a/mvp-test/src/main/java/it/cosenonjaviste/stubs/JsonStubs.java +++ b/mvp-test/src/main/java/it/cosenonjaviste/stubs/JsonStubs.java @@ -1,11 +1,13 @@ package it.cosenonjaviste.stubs; +import com.squareup.okhttp.mockwebserver.MockResponse; + public class JsonStubs { private static final String SINGLE_POST = "{\n" + "id: 11213,\n" + "type: \"post\",\n" + "slug: \"decorator-patten-corretto-lambda-con-java-8\",\n" + - "url: \"http://www.cosenonjaviste.it/decorator-patten-corretto-lambda-con-java-8/\",\n" + + "url: \"post-url/\",\n" + "status: \"publish\",\n" + "title: \"Decorator patten corretto lambda con Java 8\",\n" + "date: \"2014-05-29 10:30:36\",\n" + @@ -135,4 +137,16 @@ public static String getPostList(int numberOfPost) { "}" + "]" + "}"; + + public static void initAllStubs() { + MockWebServerWrapper.initDispatcher(req -> { + String path = req.getPath(); + if (path.matches("/\\?json=get_recent_posts.*page=0.*")) { + return new MockResponse().setBody(getPostList(10)); + } else if (path.matches("/post-url/")) { + return new MockResponse().setBody("CoseNonJaviste"); + } + return null; + }); + } } diff --git a/mvp-test/src/main/java/it/cosenonjaviste/stubs/MockWebServerWrapper.java b/mvp-test/src/main/java/it/cosenonjaviste/stubs/MockWebServerWrapper.java index 4bdada6..de639c7 100644 --- a/mvp-test/src/main/java/it/cosenonjaviste/stubs/MockWebServerWrapper.java +++ b/mvp-test/src/main/java/it/cosenonjaviste/stubs/MockWebServerWrapper.java @@ -36,6 +36,10 @@ public class MockWebServerWrapper { } } + public static void initDispatcher(Func1 dispatchFunction) { + MockWebServerWrapper.dispatchFunction = dispatchFunction; + } + public void initDispatcher(String responseBody) { dispatchFunction = recordedRequest -> new MockResponse().setBody(responseBody); requests = new LinkedList<>(); From ba7ed1c7716f7177a64bad9a9f348c6c9647d818 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 8 Feb 2015 22:43:30 +0100 Subject: [PATCH 004/332] Click on navigation drawer --- .../androidtest/AuthorListTest.java | 5 ----- .../androidtest/MainActivityTest.java | 22 ++++++++++++++++--- .../it/cosenonjaviste/stubs/JsonStubs.java | 2 ++ 3 files changed, 21 insertions(+), 8 deletions(-) diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java index 201c210..dbfca92 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java @@ -35,11 +35,6 @@ public class AuthorListTest { @Test public void testAuthorList() { - try { - Thread.sleep(10000); - } catch (InterruptedException e) { - e.printStackTrace(); - } // showUi(); } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java index 7956313..091ad64 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java @@ -12,16 +12,22 @@ import dagger.Module; import it.cosenonjaviste.MainActivity; +import it.cosenonjaviste.R; import it.cosenonjaviste.androidtest.base.ActivityRule; import it.cosenonjaviste.androidtest.base.DaggerRule; import it.cosenonjaviste.androidtest.base.MvpEspressoTestModule; -import it.cosenonjaviste.model.Post; import it.cosenonjaviste.stubs.JsonStubs; import it.cosenonjaviste.stubs.MockWebServerWrapper; import static android.support.test.espresso.Espresso.onData; +import static android.support.test.espresso.Espresso.onView; import static android.support.test.espresso.action.ViewActions.click; +import static android.support.test.espresso.assertion.ViewAssertions.matches; +import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; +import static android.support.test.espresso.matcher.ViewMatchers.withClassName; import static android.support.test.espresso.matcher.ViewMatchers.withId; +import static android.support.test.espresso.matcher.ViewMatchers.withText; +import static org.hamcrest.Matchers.endsWith; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; @@ -39,8 +45,18 @@ public class MainActivityTest { @Rule public TestRule chain = RuleChain.outerRule(daggerRule).around(fragmentRule); @Test public void showMainActivity() { - onData(is(instanceOf(Post.class))).inAdapterView(withId(android.R.id.list)) - .atPosition(3).perform(click()); + } + + @Test public void showCategories() { + clickOnDrawer(1); + + onView(withText("Agile")).check(matches(isDisplayed())); + } + + private void clickOnDrawer(int position) { + onView(withClassName(endsWith("ImageButton"))).perform(click()); + onData(is(instanceOf(String.class))).inAdapterView(withId(R.id.left_drawer)) + .atPosition(position).perform(click()); } @Module(injects = MainActivityTest.class, includes = MvpEspressoTestModule.class, overrides = true, library = true) diff --git a/mvp-test/src/main/java/it/cosenonjaviste/stubs/JsonStubs.java b/mvp-test/src/main/java/it/cosenonjaviste/stubs/JsonStubs.java index 50fe4f6..0eb3171 100644 --- a/mvp-test/src/main/java/it/cosenonjaviste/stubs/JsonStubs.java +++ b/mvp-test/src/main/java/it/cosenonjaviste/stubs/JsonStubs.java @@ -145,6 +145,8 @@ public static void initAllStubs() { return new MockResponse().setBody(getPostList(10)); } else if (path.matches("/post-url/")) { return new MockResponse().setBody("CoseNonJaviste"); + } else if (path.matches("/\\?json=get_category_index")) { + return new MockResponse().setBody(CATEGORIES); } return null; }); From 009cc2bb4ab60a50ce9d0b3a7e6a844dba187aa8 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 8 Feb 2015 23:00:09 +0100 Subject: [PATCH 005/332] Click on all items of navigation drawer --- .../androidtest/MainActivityTest.java | 15 ++++++++++++++- .../cosenonjaviste/stubs/TwitterServiceStub.java | 2 +- .../java/it/cosenonjaviste/stubs/JsonStubs.java | 4 ++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java index 091ad64..1ddfe9c 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java @@ -49,10 +49,23 @@ public class MainActivityTest { @Test public void showCategories() { clickOnDrawer(1); - onView(withText("Agile")).check(matches(isDisplayed())); } + @Test public void showAuthors() { + clickOnDrawer(2); + onView(withText("Gabriele")).check(matches(isDisplayed())); + } + + @Test public void showTweets() { + clickOnDrawer(3); + onView(withText("tweet text 1")).check(matches(isDisplayed())); + } + + @Test public void showContactForm() { + clickOnDrawer(4); + } + private void clickOnDrawer(int position) { onView(withClassName(endsWith("ImageButton"))).perform(click()); onData(is(instanceOf(String.class))).inAdapterView(withId(R.id.left_drawer)) diff --git a/app/src/debug/java/it/cosenonjaviste/stubs/TwitterServiceStub.java b/app/src/debug/java/it/cosenonjaviste/stubs/TwitterServiceStub.java index c9223b9..e565595 100644 --- a/app/src/debug/java/it/cosenonjaviste/stubs/TwitterServiceStub.java +++ b/app/src/debug/java/it/cosenonjaviste/stubs/TwitterServiceStub.java @@ -22,7 +22,7 @@ public class TwitterServiceStub implements TwitterService { tweet.setId(123); tweet.setAuthor("author"); tweet.setCreatedAt(new Date()); - tweet.setText("text"); + tweet.setText("tweet text " + i); list.add(tweet); } return Observable.just(list); diff --git a/mvp-test/src/main/java/it/cosenonjaviste/stubs/JsonStubs.java b/mvp-test/src/main/java/it/cosenonjaviste/stubs/JsonStubs.java index 0eb3171..dc73686 100644 --- a/mvp-test/src/main/java/it/cosenonjaviste/stubs/JsonStubs.java +++ b/mvp-test/src/main/java/it/cosenonjaviste/stubs/JsonStubs.java @@ -147,6 +147,10 @@ public static void initAllStubs() { return new MockResponse().setBody("CoseNonJaviste"); } else if (path.matches("/\\?json=get_category_index")) { return new MockResponse().setBody(CATEGORIES); + } else if (path.matches("/\\?json=get_author_index.*")) { + return new MockResponse().setBody(AUTHORS); + } else if (path.matches(".*contatti.*")) { + return new MockResponse().setBody("Contact form"); } return null; }); From e1197f71609e40af79da532898cec91d80e59b0e Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 8 Feb 2015 23:02:11 +0100 Subject: [PATCH 006/332] Private constructor to avoid instantations --- app/src/main/java/it/cosenonjaviste/utils/DateFormatter.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/app/src/main/java/it/cosenonjaviste/utils/DateFormatter.java b/app/src/main/java/it/cosenonjaviste/utils/DateFormatter.java index 9c47052..ae06ae2 100644 --- a/app/src/main/java/it/cosenonjaviste/utils/DateFormatter.java +++ b/app/src/main/java/it/cosenonjaviste/utils/DateFormatter.java @@ -5,6 +5,10 @@ import java.util.Date; public class DateFormatter { + + private DateFormatter() { + } + public static CharSequence formatDate(Date date) { return DateUtils.getRelativeTimeSpanString(date.getTime(), System.currentTimeMillis(), DateUtils.DAY_IN_MILLIS, DateUtils.FORMAT_SHOW_YEAR); } From fb0e2f099754069690854db3e479e90ac37b6172 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 8 Feb 2015 23:05:41 +0100 Subject: [PATCH 007/332] Deleted unused method --- .../main/java/it/cosenonjaviste/utils/CircleTransform.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/src/main/java/it/cosenonjaviste/utils/CircleTransform.java b/app/src/main/java/it/cosenonjaviste/utils/CircleTransform.java index 7cbe9a5..d893a2c 100644 --- a/app/src/main/java/it/cosenonjaviste/utils/CircleTransform.java +++ b/app/src/main/java/it/cosenonjaviste/utils/CircleTransform.java @@ -16,10 +16,6 @@ public class CircleTransform implements Transformation { private int borderColor; private int imageSize; - public static CircleTransform create(Context context, int dimensionResource) { - return new CircleTransform(context, dimensionResource, false, 0, 0); - } - public static CircleTransform createWithBorder(Context context, int dimensionResource, int colorRes, int borderSizeResource) { return new CircleTransform(context, dimensionResource, true, colorRes, borderSizeResource); } From 2d9dfb21aecdf90ebdbabfc8e75ffc1f4a977193 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 8 Feb 2015 23:26:49 +0100 Subject: [PATCH 008/332] Test for load more posts --- .../it/cosenonjaviste/androidtest/PostListTest.java | 12 +++++++++++- .../it/cosenonjaviste/post/PostListPresenter.java | 2 +- .../main/java/it/cosenonjaviste/stubs/JsonStubs.java | 12 +++++++++--- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java index 721e83e..e944bd9 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java @@ -12,8 +12,12 @@ import it.cosenonjaviste.stubs.MockWebServerWrapper; import static android.support.test.espresso.Espresso.onData; +import static android.support.test.espresso.Espresso.onView; import static android.support.test.espresso.action.ViewActions.click; +import static android.support.test.espresso.assertion.ViewAssertions.matches; +import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; import static android.support.test.espresso.matcher.ViewMatchers.withId; +import static android.support.test.espresso.matcher.ViewMatchers.withText; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; @@ -35,7 +39,7 @@ public PostListTest() { } public void testPostList() throws InterruptedException { - showUi(); + onView(withText("post title 1")).check(matches(isDisplayed())); } public void testGoToPostDetail() { @@ -43,6 +47,12 @@ public void testGoToPostDetail() { .atPosition(3).perform(click()); } + public void testLoadMore() { + onData(is(instanceOf(Post.class))).inAdapterView(withId(android.R.id.list)) + .atPosition(9).check(matches(isDisplayed())); + onView(withText("post title 12")).check(matches(isDisplayed())); + } + @Module(injects = {PostListTest.class}, includes = MvpEspressoTestModule.class) public static class TestModule { } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index 77afe44..3bef1d5 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -34,7 +34,7 @@ public class PostListPresenter extends RxMvpPresenter { } public void reloadData() { - Observable> observable = getObservable(0); + Observable> observable = getObservable(1); subscribe(observable, () -> { diff --git a/mvp-test/src/main/java/it/cosenonjaviste/stubs/JsonStubs.java b/mvp-test/src/main/java/it/cosenonjaviste/stubs/JsonStubs.java index dc73686..64a02cc 100644 --- a/mvp-test/src/main/java/it/cosenonjaviste/stubs/JsonStubs.java +++ b/mvp-test/src/main/java/it/cosenonjaviste/stubs/JsonStubs.java @@ -9,7 +9,7 @@ public class JsonStubs { "slug: \"decorator-patten-corretto-lambda-con-java-8\",\n" + "url: \"post-url/\",\n" + "status: \"publish\",\n" + - "title: \"Decorator patten corretto lambda con Java 8\",\n" + + "title: \"%TITLE%\",\n" + "date: \"2014-05-29 10:30:36\",\n" + "modified: \"2014-08-11 07:35:33\",\n" + "categories: [\n" + @@ -68,12 +68,16 @@ public class JsonStubs { "}"; public static String getPostList(int numberOfPost) { + return getPostList(0, numberOfPost); + } + + public static String getPostList(int firstPost, int numberOfPost) { StringBuffer b = new StringBuffer(); for (int i = 0; i < numberOfPost; i++) { if (i > 0) { b.append(','); } - b.append(SINGLE_POST); + b.append(SINGLE_POST.replace("%TITLE%", "post title " + (firstPost + i))); } return String.format(POSTS, b.toString()); } @@ -141,8 +145,10 @@ public static String getPostList(int numberOfPost) { public static void initAllStubs() { MockWebServerWrapper.initDispatcher(req -> { String path = req.getPath(); - if (path.matches("/\\?json=get_recent_posts.*page=0.*")) { + if (path.matches("/\\?json=get_recent_posts.*page=1.*")) { return new MockResponse().setBody(getPostList(10)); + } else if (path.matches("/\\?json=get_recent_posts.*page=2.*")) { + return new MockResponse().setBody(getPostList(10, 3)); } else if (path.matches("/post-url/")) { return new MockResponse().setBody("CoseNonJaviste"); } else if (path.matches("/\\?json=get_category_index")) { From 54228c49bab45bc088a26c50a06bd5263f449608 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 8 Feb 2015 23:43:46 +0100 Subject: [PATCH 009/332] Fix test load more posts --- .../java/it/cosenonjaviste/androidtest/PostListTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java index e944bd9..ea773d8 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java @@ -50,7 +50,7 @@ public void testGoToPostDetail() { public void testLoadMore() { onData(is(instanceOf(Post.class))).inAdapterView(withId(android.R.id.list)) .atPosition(9).check(matches(isDisplayed())); - onView(withText("post title 12")).check(matches(isDisplayed())); + onView(withText("post title 10")).check(matches(isDisplayed())); } @Module(injects = {PostListTest.class}, includes = MvpEspressoTestModule.class) From ff0d7f2e7f0419f3498581a202c2ddb363869131 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 14 Feb 2015 17:22:33 +0100 Subject: [PATCH 010/332] Unit test refactoring --- .../base/MvpEspressoTestModule.java | 5 +- .../java/it/cosenonjaviste/MvpTestModule.java | 2 +- .../java/it/cosenonjaviste/AppModule.java | 22 +------ .../java/it/cosenonjaviste/BaseModule.java | 34 +++++++++++ .../cosenonjaviste/model/AuthorResponse.java | 7 +++ .../model/CategoryResponse.java | 7 +++ .../java/it/cosenonjaviste/model/Post.java | 12 ++++ .../it/cosenonjaviste/model/PostResponse.java | 7 +++ .../model/WordPressServiceFactory.java | 6 +- .../post/PostListPresenter.java | 3 +- .../model/WordPressServiceTest.java | 44 +++++--------- .../mvp/MvpJUnitTestModule.java | 10 ++-- .../java/it/cosenonjaviste/mvp/TestData.java | 48 +++++++++++++++ .../mvp/author/AuthorListPresenterTest.java | 11 ++-- .../category/CategoryListPresenterTest.java | 17 ++++-- .../mvp/post/AuthorPostListPresenterTest.java | 21 ++++--- ...CategoryPostListPresenterLoadMoreTest.java | 60 ------------------- .../post/CategoryPostListPresenterTest.java | 26 +++++--- .../mvp/post/PostListPresenterBaseTest.java | 36 ----------- .../mvp/post/PostListPresenterTest.java | 39 ++++++------ build.gradle | 2 +- 21 files changed, 216 insertions(+), 203 deletions(-) create mode 100644 app/src/main/java/it/cosenonjaviste/BaseModule.java create mode 100644 app/src/test/java/it/cosenonjaviste/mvp/TestData.java delete mode 100644 app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterLoadMoreTest.java delete mode 100644 app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterBaseTest.java diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java index fcb9bb5..61d9a22 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java @@ -1,5 +1,7 @@ package it.cosenonjaviste.androidtest.base; +import com.google.gson.GsonBuilder; + import javax.inject.Singleton; import dagger.Module; @@ -10,12 +12,13 @@ import it.cosenonjaviste.model.WordPressServiceFactory; import it.cosenonjaviste.page.PageUrlManager; import it.cosenonjaviste.stubs.MockWebServerWrapper; +import retrofit.converter.GsonConverter; @Module(library = true, overrides = true, includes = MvpTestModule.class) public class MvpEspressoTestModule { @Provides @Singleton WordPressService provideWordPressService(MockWebServerWrapper mockWebServer) { - return WordPressServiceFactory.create(mockWebServer.getUrl(true), true); + return WordPressServiceFactory.create(mockWebServer.getUrl(true), true, new GsonConverter(new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create())); } @Provides @Singleton SchedulerManager provideSchedulerManager() { diff --git a/app/src/debug/java/it/cosenonjaviste/MvpTestModule.java b/app/src/debug/java/it/cosenonjaviste/MvpTestModule.java index b3812d2..d652a60 100644 --- a/app/src/debug/java/it/cosenonjaviste/MvpTestModule.java +++ b/app/src/debug/java/it/cosenonjaviste/MvpTestModule.java @@ -7,7 +7,7 @@ import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.stubs.TwitterServiceStub; -@Module(library = true, overrides = true) +@Module(library = true, overrides = true, includes = BaseModule.class) public class MvpTestModule { @Provides @Singleton TwitterService provideTwitterService(TwitterServiceStub twitterServiceStub) { return twitterServiceStub; diff --git a/app/src/main/java/it/cosenonjaviste/AppModule.java b/app/src/main/java/it/cosenonjaviste/AppModule.java index 04409bd..6cf3113 100644 --- a/app/src/main/java/it/cosenonjaviste/AppModule.java +++ b/app/src/main/java/it/cosenonjaviste/AppModule.java @@ -2,20 +2,12 @@ import android.app.Application; -import javax.inject.Singleton; - import dagger.Module; -import dagger.Provides; import it.cosenonjaviste.author.AuthorListFragment; import it.cosenonjaviste.category.CategoryListFragment; -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; -import it.cosenonjaviste.model.TwitterService; -import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.model.WordPressServiceFactory; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.twitter.TweetListFragment; -import it.cosenonjaviste.twitter.Twitter4JService; @Module(injects = { MainActivity.class, @@ -24,7 +16,7 @@ AuthorListFragment.class, CategoryListFragment.class, TweetListFragment.class -}, library = true) +}, library = true, includes = BaseModule.class) public class AppModule { private Application application; @@ -32,16 +24,4 @@ public class AppModule { public AppModule(Application application) { this.application = application; } - - @Provides @Singleton WordPressService provideGitHubService() { - return WordPressServiceFactory.create("http://www.cosenonjaviste.it/", BuildConfig.DEBUG); - } - - @Provides TwitterService provideTwitterService() { - return new Twitter4JService(); - } - - @Provides @Singleton SchedulerManager provideSchedulerManager() { - return new SchedulerManager(); - } } diff --git a/app/src/main/java/it/cosenonjaviste/BaseModule.java b/app/src/main/java/it/cosenonjaviste/BaseModule.java new file mode 100644 index 0000000..fd043ac --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/BaseModule.java @@ -0,0 +1,34 @@ +package it.cosenonjaviste; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; + +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; +import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; +import it.cosenonjaviste.model.TwitterService; +import it.cosenonjaviste.model.WordPressService; +import it.cosenonjaviste.model.WordPressServiceFactory; +import it.cosenonjaviste.twitter.Twitter4JService; +import retrofit.converter.GsonConverter; + +@Module(library = true) +public class BaseModule { + @Provides @Singleton Gson provideGson() { + return new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create(); + } + + @Provides @Singleton WordPressService provideGitHubService(Gson gson) { + return WordPressServiceFactory.create("http://www.cosenonjaviste.it/", BuildConfig.DEBUG, new GsonConverter(gson)); + } + + @Provides TwitterService provideTwitterService() { + return new Twitter4JService(); + } + + @Provides @Singleton SchedulerManager provideSchedulerManager() { + return new SchedulerManager(); + } +} diff --git a/app/src/main/java/it/cosenonjaviste/model/AuthorResponse.java b/app/src/main/java/it/cosenonjaviste/model/AuthorResponse.java index c1e1d63..7b248f0 100644 --- a/app/src/main/java/it/cosenonjaviste/model/AuthorResponse.java +++ b/app/src/main/java/it/cosenonjaviste/model/AuthorResponse.java @@ -5,6 +5,13 @@ public class AuthorResponse { private List authors; + public AuthorResponse() { + } + + public AuthorResponse(List authors) { + this.authors = authors; + } + public List getAuthors() { return authors; } diff --git a/app/src/main/java/it/cosenonjaviste/model/CategoryResponse.java b/app/src/main/java/it/cosenonjaviste/model/CategoryResponse.java index 8ce2493..4cb2c9d 100644 --- a/app/src/main/java/it/cosenonjaviste/model/CategoryResponse.java +++ b/app/src/main/java/it/cosenonjaviste/model/CategoryResponse.java @@ -5,6 +5,13 @@ public class CategoryResponse { private List categories; + public CategoryResponse() { + } + + public CategoryResponse(List categories) { + this.categories = categories; + } + public List getCategories() { return categories; } diff --git a/app/src/main/java/it/cosenonjaviste/model/Post.java b/app/src/main/java/it/cosenonjaviste/model/Post.java index 9510797..042223c 100644 --- a/app/src/main/java/it/cosenonjaviste/model/Post.java +++ b/app/src/main/java/it/cosenonjaviste/model/Post.java @@ -13,6 +13,18 @@ public class Post { String url; String excerpt; + public Post() { + } + + public Post(long id, Author author, String title, Date date, String url, String excerpt) { + this.id = id; + this.author = author; + this.title = title; + this.date = date; + this.url = url; + this.excerpt = excerpt; + } + public long getId() { return id; } diff --git a/app/src/main/java/it/cosenonjaviste/model/PostResponse.java b/app/src/main/java/it/cosenonjaviste/model/PostResponse.java index 4d523a8..7a33bcb 100644 --- a/app/src/main/java/it/cosenonjaviste/model/PostResponse.java +++ b/app/src/main/java/it/cosenonjaviste/model/PostResponse.java @@ -5,6 +5,13 @@ public class PostResponse { private List posts; + public PostResponse() { + } + + public PostResponse(List posts) { + this.posts = posts; + } + public List getPosts() { return posts; } diff --git a/app/src/main/java/it/cosenonjaviste/model/WordPressServiceFactory.java b/app/src/main/java/it/cosenonjaviste/model/WordPressServiceFactory.java index ed3e299..a032ef8 100644 --- a/app/src/main/java/it/cosenonjaviste/model/WordPressServiceFactory.java +++ b/app/src/main/java/it/cosenonjaviste/model/WordPressServiceFactory.java @@ -1,17 +1,15 @@ package it.cosenonjaviste.model; -import com.google.gson.GsonBuilder; - import retrofit.RestAdapter; import retrofit.converter.GsonConverter; public class WordPressServiceFactory { - public static WordPressService create(String endpoint, boolean debug) { + public static WordPressService create(String endpoint, boolean debug, GsonConverter converter) { RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint(endpoint) //http calls are executed in background thread using SchedulerManager .setExecutors(Runnable::run, null) - .setConverter(new GsonConverter(new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create())) + .setConverter(converter) .build(); if (debug) { restAdapter.setLogLevel(RestAdapter.LogLevel.FULL); diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index 3bef1d5..eced8f8 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -1,5 +1,6 @@ package it.cosenonjaviste.post; +import java.util.ArrayList; import java.util.List; import javax.inject.Inject; @@ -42,7 +43,7 @@ public void reloadData() { getView().startLoading(model.getItems().isEmpty()); }, posts -> { - model.getItems().done(posts); + model.getItems().done(new ArrayList<>(posts)); model.setMoreDataAvailable(posts.size() == WordPressService.POST_PAGE_SIZE); view.update(model); }, throwable -> { diff --git a/app/src/test/java/it/cosenonjaviste/model/WordPressServiceTest.java b/app/src/test/java/it/cosenonjaviste/model/WordPressServiceTest.java index 2270d53..ff71b16 100644 --- a/app/src/test/java/it/cosenonjaviste/model/WordPressServiceTest.java +++ b/app/src/test/java/it/cosenonjaviste/model/WordPressServiceTest.java @@ -1,6 +1,7 @@ package it.cosenonjaviste.model; -import org.junit.After; +import com.google.gson.Gson; + import org.junit.Before; import org.junit.Test; @@ -13,46 +14,33 @@ import dagger.ObjectGraph; import it.cosenonjaviste.mvp.MvpJUnitTestModule; import it.cosenonjaviste.stubs.JsonStubs; -import it.cosenonjaviste.stubs.MockWebServerWrapper; -import rx.functions.Action1; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; public class WordPressServiceTest { - @Inject MockWebServerWrapper server; - - @Inject WordPressService service; + @Inject Gson gson; @Before public void init() throws IOException { ObjectGraph.create(new TestModule()).inject(this); - server.initDispatcher(JsonStubs.getPostList(1)); } @Test - public void testLoad() throws IOException { - service.listPosts(0).subscribe(new Action1() { - @Override public void call(PostResponse repoResponse) { - List posts = repoResponse.getPosts(); - assertEquals(1, posts.size()); - Post post = posts.get(0); - assertEquals(11213, post.getId()); - assertNotNull(post.getDate()); - assertNotNull(post.getTitle()); - assertNotNull(post.getUrl()); - assertNotNull(post.getAuthor()); - assertNotNull(post.getAuthor().getImageUrl()); - assertEquals(8, post.getAuthor().getId()); - assertNotNull(post.getAuthor().getName()); - } - }); - } - - @After - public void shutdown() throws IOException { -// server.shutdown(); + public void testLoadPosts() throws IOException { + PostResponse postResponse = gson.fromJson(JsonStubs.getPostList(1), PostResponse.class); + List posts = postResponse.getPosts(); + assertEquals(1, posts.size()); + Post post = posts.get(0); + assertEquals(11213, post.getId()); + assertNotNull(post.getDate()); + assertNotNull(post.getTitle()); + assertNotNull(post.getUrl()); + assertNotNull(post.getAuthor()); + assertNotNull(post.getAuthor().getImageUrl()); + assertEquals(8, post.getAuthor().getId()); + assertNotNull(post.getAuthor().getName()); } @Module(injects = WordPressServiceTest.class, includes = MvpJUnitTestModule.class) diff --git a/app/src/test/java/it/cosenonjaviste/mvp/MvpJUnitTestModule.java b/app/src/test/java/it/cosenonjaviste/mvp/MvpJUnitTestModule.java index 8dd6494..2b7b259 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/MvpJUnitTestModule.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/MvpJUnitTestModule.java @@ -1,21 +1,21 @@ package it.cosenonjaviste.mvp; +import org.mockito.Mockito; + import javax.inject.Singleton; import dagger.Module; import dagger.Provides; import it.cosenonjaviste.MvpTestModule; -import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.model.WordPressServiceFactory; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; -import it.cosenonjaviste.stubs.MockWebServerWrapper; +import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.stubs.TestSchedulerManager; @Module(library = true, overrides = true, includes = MvpTestModule.class) public class MvpJUnitTestModule { - @Provides @Singleton WordPressService provideWordPressService(MockWebServerWrapper mockWebServer) { - return WordPressServiceFactory.create(mockWebServer.getUrl(false), true); + @Provides @Singleton WordPressService provideWordPressService() { + return Mockito.mock(WordPressService.class); } @Provides @Singleton SchedulerManager provideSchedulerManager(TestSchedulerManager testSchedulerManager) { diff --git a/app/src/test/java/it/cosenonjaviste/mvp/TestData.java b/app/src/test/java/it/cosenonjaviste/mvp/TestData.java new file mode 100644 index 0000000..5b790f1 --- /dev/null +++ b/app/src/test/java/it/cosenonjaviste/mvp/TestData.java @@ -0,0 +1,48 @@ +package it.cosenonjaviste.mvp; + +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import it.cosenonjaviste.model.Author; +import it.cosenonjaviste.model.AuthorResponse; +import it.cosenonjaviste.model.Category; +import it.cosenonjaviste.model.CategoryResponse; +import it.cosenonjaviste.model.Post; +import it.cosenonjaviste.model.PostResponse; +import rx.Observable; + +public class TestData { + + public static Observable postResponse(int size) { + List posts = new ArrayList<>(); + for (int i = 0; i < size; i++) { + posts.add(new Post(i, createAuthor(i), "title " + i, new Date(), "url " + i, "excerpt " + i)); + } + return Observable.just(new PostResponse(posts)); + } + + public static Author createAuthor(int i) { + return new Author(i, "name " + i, "last name " + i); + } + + public static Observable authorResponse(int size) { + List authors = new ArrayList<>(); + for (int i = 0; i < size; i++) { + authors.add(createAuthor(i)); + } + return Observable.just(new AuthorResponse(authors)); + } + + public static Observable categoryResponse(int size) { + List categories = new ArrayList<>(); + for (int i = 0; i < size; i++) { + categories.add(createCategory(i)); + } + return Observable.just(new CategoryResponse(categories)); + } + + private static Category createCategory(int i) { + return new Category(i, "cat " + i, 10 + i); + } +} diff --git a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java index 4991d47..802d3d1 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java @@ -12,17 +12,18 @@ import dagger.Module; import dagger.ObjectGraph; +import it.cosenonjaviste.author.AuthorListFragment; import it.cosenonjaviste.author.AuthorListModel; import it.cosenonjaviste.author.AuthorListPresenter; -import it.cosenonjaviste.author.AuthorListFragment; +import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.MvpJUnitTestModule; +import it.cosenonjaviste.mvp.TestData; import it.cosenonjaviste.post.PostListModel; -import it.cosenonjaviste.stubs.JsonStubs; -import it.cosenonjaviste.stubs.MockWebServerWrapper; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class AuthorListPresenterTest { @@ -31,14 +32,14 @@ public class AuthorListPresenterTest { @Inject AuthorListPresenter presenter; - @Inject MockWebServerWrapper server; + @Inject WordPressService wordPressService; @Captor ArgumentCaptor modelCaptor; @Before public void setup() { ObjectGraph.create(new TestModule()).inject(this); - server.initDispatcher(JsonStubs.AUTHORS); + when(wordPressService.listAuthors()).thenReturn(TestData.authorResponse(2)); } @Test diff --git a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java index 1d062ca..8721696 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java @@ -16,19 +16,23 @@ import it.cosenonjaviste.category.CategoryListModel; import it.cosenonjaviste.category.CategoryListPresenter; import it.cosenonjaviste.model.Category; +import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.MvpJUnitTestModule; +import it.cosenonjaviste.mvp.TestData; import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.stubs.JsonStubs; import it.cosenonjaviste.stubs.MockWebServerWrapper; +import static it.cosenonjaviste.mvp.TestData.*; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class CategoryListPresenterTest { - @Inject MockWebServerWrapper server; + @Inject WordPressService wordPressService; @Inject CategoryListPresenter presenter; @@ -39,7 +43,8 @@ public class CategoryListPresenterTest { @Before public void setup() { ObjectGraph.create(new TestModule()).inject(this); - server.initDispatcher(JsonStubs.CATEGORIES); + when(wordPressService.listCategories()) + .thenReturn(categoryResponse(3)); } @Test @@ -47,10 +52,10 @@ public void testLoad() { presenter.initAndSubscribe(new CategoryListModel(), view); CategoryListModel model = presenter.getModel(); assertThat(model.size()).isEqualTo(3); - Category category = model.get(0); - assertThat(category.getId()).isEqualTo(602); - assertThat(category.getTitle()).isEqualTo("Agile"); - assertThat(category.getPostCount()).isEqualTo(4); + Category category = model.get(2); + assertThat(category.getId()).isEqualTo(2); + assertThat(category.getTitle()).isEqualTo("cat 2"); + assertThat(category.getPostCount()).isEqualTo(12); } @Test diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java index 6332b42..3d38f77 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java @@ -10,16 +10,19 @@ import dagger.Module; import dagger.ObjectGraph; -import it.cosenonjaviste.model.Author; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.MvpJUnitTestModule; +import it.cosenonjaviste.mvp.TestData; import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.post.PostListPresenter; -import it.cosenonjaviste.stubs.JsonStubs; -import it.cosenonjaviste.stubs.MockWebServerWrapper; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.anyLong; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class AuthorPostListPresenterTest { @@ -28,12 +31,11 @@ public class AuthorPostListPresenterTest { @Inject PostListPresenter presenter; - @Inject MockWebServerWrapper server; + @Inject WordPressService wordPressService; @Before public void setup() { ObjectGraph.create(getTestModule()).inject(this); - server.initDispatcher(JsonStubs.getPostList(1)); } protected Object getTestModule() { @@ -42,14 +44,15 @@ protected Object getTestModule() { @Test public void testLoad() throws InterruptedException { - PostListModel model = new PostListModel(new Author(145, "a", "b")); + when(wordPressService.listAuthorPosts(anyLong(), anyInt())) + .thenReturn(TestData.postResponse(1)); + + PostListModel model = new PostListModel(TestData.createAuthor(145)); presenter.initAndSubscribe(model, view); assertThat(model.getItems().size()).isEqualTo(1); - String lastUrl = server.getLastUrl(); - assertThat(lastUrl).startsWith(WordPressService.AUTHOR_POSTS_URL); - assertThat(lastUrl).contains("id=145"); + verify(wordPressService).listAuthorPosts(eq(145L), eq(1)); } @Module(injects = {AuthorPostListPresenterTest.class}, includes = MvpJUnitTestModule.class) diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterLoadMoreTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterLoadMoreTest.java deleted file mode 100644 index d3a0aa1..0000000 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterLoadMoreTest.java +++ /dev/null @@ -1,60 +0,0 @@ -package it.cosenonjaviste.mvp.post; - -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.Mock; -import org.mockito.runners.MockitoJUnitRunner; - -import javax.inject.Inject; - -import dagger.Module; -import dagger.ObjectGraph; -import it.cosenonjaviste.model.Category; -import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.mvp.MvpJUnitTestModule; -import it.cosenonjaviste.post.PostListFragment; -import it.cosenonjaviste.post.PostListModel; -import it.cosenonjaviste.post.PostListPresenter; -import it.cosenonjaviste.stubs.JsonStubs; -import it.cosenonjaviste.stubs.MockWebServerWrapper; - -import static org.assertj.core.api.Assertions.assertThat; - -@RunWith(MockitoJUnitRunner.class) -public class CategoryPostListPresenterLoadMoreTest { - - @Mock PostListFragment view; - - @Inject PostListPresenter presenter; - - @Inject MockWebServerWrapper server; - - @Before - public void setup() { - ObjectGraph.create(getTestModule()).inject(this); - server.initDispatcher(JsonStubs.getPostList(1)); - } - - protected Object getTestModule() { - return new TestModule(); - } - - @Test - public void testLoadMore() { - server.initDispatcher(JsonStubs.getPostList(20)); - PostListModel model = new PostListModel(new Category(1, "cat", 10)); - presenter.initAndSubscribe(model, view); - server.initDispatcher(JsonStubs.getPostList(5)); - presenter.loadNextPage(); - assertThat(model.getItems().size()).isEqualTo(25); - String lastUrl = server.getLastUrl(); - assertThat(lastUrl).startsWith(WordPressService.CATEGORY_POSTS_URL); - assertThat(lastUrl).contains("id=1"); - } - - @Module(injects = {CategoryPostListPresenterLoadMoreTest.class}, includes = MvpJUnitTestModule.class) - public static class TestModule { - } - -} \ No newline at end of file diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java index 5091a41..a628438 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java @@ -13,13 +13,14 @@ import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.MvpJUnitTestModule; +import it.cosenonjaviste.mvp.TestData; import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.post.PostListPresenter; -import it.cosenonjaviste.stubs.JsonStubs; -import it.cosenonjaviste.stubs.MockWebServerWrapper; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class CategoryPostListPresenterTest { @@ -28,12 +29,11 @@ public class CategoryPostListPresenterTest { @Inject PostListPresenter presenter; - @Inject MockWebServerWrapper server; + @Inject WordPressService wordPressService; @Before public void setup() { ObjectGraph.create(getTestModule()).inject(this); - server.initDispatcher(JsonStubs.getPostList(1)); } protected Object getTestModule() { @@ -42,12 +42,24 @@ protected Object getTestModule() { @Test public void testLoad() throws InterruptedException { + when(wordPressService.listCategoryPosts(eq(1L), eq(1))) + .thenReturn(TestData.postResponse(1)); PostListModel model = new PostListModel(new Category(1, "cat", 10)); presenter.initAndSubscribe(model, view); assertThat(model.getItems().size()).isEqualTo(1); - String lastUrl = server.getLastUrl(); - assertThat(lastUrl).startsWith(WordPressService.CATEGORY_POSTS_URL); - assertThat(lastUrl).contains("id=1"); + } + + @Test + public void testLoadMore() { + when(wordPressService.listCategoryPosts(eq(1L), eq(1))) + .thenReturn(TestData.postResponse(10)); + when(wordPressService.listCategoryPosts(eq(1L), eq(2))) + .thenReturn(TestData.postResponse(5)); + + PostListModel model = new PostListModel(new Category(1, "cat", 10)); + presenter.initAndSubscribe(model, view); + presenter.loadNextPage(); + assertThat(model.getItems().size()).isEqualTo(15); } @Module(injects = {CategoryPostListPresenterTest.class}, includes = MvpJUnitTestModule.class) diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterBaseTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterBaseTest.java deleted file mode 100644 index f0d7216..0000000 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterBaseTest.java +++ /dev/null @@ -1,36 +0,0 @@ -package it.cosenonjaviste.mvp.post; - -import org.junit.After; -import org.junit.Before; -import org.mockito.Mock; - -import java.io.IOException; - -import javax.inject.Inject; - -import dagger.ObjectGraph; -import it.cosenonjaviste.post.PostListFragment; -import it.cosenonjaviste.post.PostListPresenter; -import it.cosenonjaviste.stubs.JsonStubs; -import it.cosenonjaviste.stubs.MockWebServerWrapper; - -public abstract class PostListPresenterBaseTest { - - @Mock PostListFragment view; - - @Inject PostListPresenter presenter; - - @Inject MockWebServerWrapper server; - - @After public void shutdownServer() throws IOException { -// server.shutdown(); - } - - @Before - public void setup() { - ObjectGraph.create(getTestModule()).inject(this); - server.initDispatcher(JsonStubs.getPostList(1)); - } - - protected abstract Object getTestModule(); -} diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java index 7ea6511..df1a53a 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java @@ -12,19 +12,21 @@ import dagger.Module; import dagger.ObjectGraph; +import it.cosenonjaviste.lib.mvp.utils.OptionalList; import it.cosenonjaviste.model.Post; +import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.MvpJUnitTestModule; -import it.cosenonjaviste.lib.mvp.utils.OptionalList; import it.cosenonjaviste.page.PageModel; import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.post.PostListPresenter; -import it.cosenonjaviste.stubs.JsonStubs; -import it.cosenonjaviste.stubs.MockWebServerWrapper; +import static it.cosenonjaviste.mvp.TestData.postResponse; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class PostListPresenterTest { @@ -33,45 +35,46 @@ public class PostListPresenterTest { @Inject PostListPresenter presenter; - @Inject MockWebServerWrapper server; + @Inject WordPressService wordPressService; @Before public void setup() { - ObjectGraph.create(getTestModule()).inject(this); + ObjectGraph.create(new TestModule()).inject(this); } @Captor ArgumentCaptor modelCaptor; - protected Object getTestModule() { - return new TestModule(); - } - @Test public void testLoad() throws InterruptedException { - server.initDispatcher(JsonStubs.getPostList(1)); + when(wordPressService.listPosts(eq(1))) + .thenReturn(postResponse(1)); + PostListModel model = new PostListModel(); presenter.initAndSubscribe(model, view); + assertThat(model.getItems().size()).isEqualTo(1); - String lastUrl = server.getLastUrl(); -// int requestCount = server.getRequestCount(); -// System.out.println(recordedRequest); } @Test public void testLoadMore() { - server.initDispatcher(JsonStubs.getPostList(20)); + when(wordPressService.listPosts(eq(1))) + .thenReturn(postResponse(10)); + when(wordPressService.listPosts(eq(2))) + .thenReturn(postResponse(6)); + PostListModel model = new PostListModel(); presenter.initAndSubscribe(model, view); - server.initDispatcher(JsonStubs.getPostList(5)); presenter.loadNextPage(); + OptionalList items = model.getItems(); - int size = items.size(); - assertThat(size).isEqualTo(25); + assertThat(items.size()).isEqualTo(16); } @Test public void testGoToDetails() { - server.initDispatcher(JsonStubs.getPostList(1)); + when(wordPressService.listPosts(eq(1))) + .thenReturn(postResponse(1)); + PostListModel model = new PostListModel(); presenter.initAndSubscribe(model, view); Post firstPost = model.getItems().get(0); diff --git a/build.gradle b/build.gradle index 21e5e59..460f5eb 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.1.0-rc2' + classpath 'com.android.tools.build:gradle:1.1.0-rc3' classpath 'me.tatarka:gradle-retrolambda:2.5.0' // NOTE: Do not place your application dependencies here; they belong From a64ad4172a16860060b2771a359350cc6d6d8a34 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 14 Feb 2015 18:07:48 +0100 Subject: [PATCH 011/332] Espresso test refactoring --- .../androidtest/AuthorListTest.java | 11 ++++--- .../androidtest/CategoryListTest.java | 11 ++++--- .../androidtest/MainActivityTest.java | 29 ++++++++++++++++--- .../androidtest/PostListTest.java | 13 ++++++--- .../base/MvpEspressoTestModule.java | 6 ++-- .../java/it/cosenonjaviste}/TestData.java | 12 +++++--- .../java/it/cosenonjaviste/model/Author.java | 3 +- .../category/CategoryListPresenterTest.java | 3 -- 8 files changed, 60 insertions(+), 28 deletions(-) rename app/src/{test/java/it/cosenonjaviste/mvp => debug/java/it/cosenonjaviste}/TestData.java (77%) diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java index dbfca92..ddac097 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java @@ -11,24 +11,27 @@ import javax.inject.Inject; import dagger.Module; +import it.cosenonjaviste.TestData; import it.cosenonjaviste.androidtest.base.DaggerRule; import it.cosenonjaviste.androidtest.base.FragmentRule; import it.cosenonjaviste.androidtest.base.MvpEspressoTestModule; import it.cosenonjaviste.author.AuthorListFragment; import it.cosenonjaviste.author.AuthorListModel; -import it.cosenonjaviste.stubs.JsonStubs; -import it.cosenonjaviste.stubs.MockWebServerWrapper; +import it.cosenonjaviste.model.WordPressService; + +import static org.mockito.Mockito.when; @RunWith(AndroidJUnit4.class) public class AuthorListTest { - @Inject MockWebServerWrapper server; + @Inject WordPressService wordPressService; private final FragmentRule fragmentRule = FragmentRule.create(AuthorListFragment.class, new AuthorListModel()); private final DaggerRule daggerRule = new DaggerRule(new TestModule(), objectGraph -> { objectGraph.inject(this); - server.initDispatcher(JsonStubs.AUTHORS); + when(wordPressService.listAuthors()) + .thenReturn(TestData.authorResponse(2)); }); @Rule public TestRule chain = RuleChain.outerRule(daggerRule).around(fragmentRule); diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java index 09e5110..3da8abb 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java @@ -3,16 +3,18 @@ import javax.inject.Inject; import dagger.Module; +import it.cosenonjaviste.TestData; import it.cosenonjaviste.androidtest.base.CnjFragmentTest; import it.cosenonjaviste.androidtest.base.MvpEspressoTestModule; import it.cosenonjaviste.category.CategoryListFragment; import it.cosenonjaviste.category.CategoryListModel; -import it.cosenonjaviste.stubs.JsonStubs; -import it.cosenonjaviste.stubs.MockWebServerWrapper; +import it.cosenonjaviste.model.WordPressService; + +import static org.mockito.Mockito.when; public class CategoryListTest extends CnjFragmentTest { - @Inject MockWebServerWrapper server; + @Inject WordPressService wordPressService; public CategoryListTest() { super(CategoryListFragment.class, new CategoryListModel()); @@ -24,7 +26,8 @@ public CategoryListTest() { @Override protected void initAfterInject() { super.initAfterInject(); - server.initDispatcher(JsonStubs.CATEGORIES); + when(wordPressService.listCategories()) + .thenReturn(TestData.categoryResponse(3)); } public void testCategoryList() throws InterruptedException { diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java index 1ddfe9c..3ef6dd5 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java @@ -13,10 +13,11 @@ import dagger.Module; import it.cosenonjaviste.MainActivity; import it.cosenonjaviste.R; +import it.cosenonjaviste.TestData; import it.cosenonjaviste.androidtest.base.ActivityRule; import it.cosenonjaviste.androidtest.base.DaggerRule; import it.cosenonjaviste.androidtest.base.MvpEspressoTestModule; -import it.cosenonjaviste.stubs.JsonStubs; +import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.stubs.MockWebServerWrapper; import static android.support.test.espresso.Espresso.onData; @@ -30,16 +31,32 @@ import static org.hamcrest.Matchers.endsWith; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.anyLong; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.when; @RunWith(AndroidJUnit4.class) public class MainActivityTest { + @Inject WordPressService wordPressService; + @Inject MockWebServerWrapper server; private final ActivityRule fragmentRule = new ActivityRule<>(MainActivity.class); private final DaggerRule daggerRule = new DaggerRule(new TestModule(), objectGraph -> { objectGraph.inject(this); - JsonStubs.initAllStubs(); + + when(wordPressService.listPosts(eq(1))) + .thenReturn(TestData.postResponse(10)); + when(wordPressService.listCategories()) + .thenReturn(TestData.categoryResponse(3)); + when(wordPressService.listAuthors()) + .thenReturn(TestData.authorResponse(2)); + when(wordPressService.listAuthorPosts(anyLong(), anyInt())) + .thenReturn(TestData.postResponse(1)); + + server.initDispatcher("CoseNonJaviste"); }); @Rule public TestRule chain = RuleChain.outerRule(daggerRule).around(fragmentRule); @@ -49,12 +66,12 @@ public class MainActivityTest { @Test public void showCategories() { clickOnDrawer(1); - onView(withText("Agile")).check(matches(isDisplayed())); + onView(withText("cat 0")).check(matches(isDisplayed())); } @Test public void showAuthors() { clickOnDrawer(2); - onView(withText("Gabriele")).check(matches(isDisplayed())); + onView(withText("name 0")).check(matches(isDisplayed())); } @Test public void showTweets() { @@ -68,6 +85,10 @@ public class MainActivityTest { private void clickOnDrawer(int position) { onView(withClassName(endsWith("ImageButton"))).perform(click()); + try { + Thread.sleep(500); + } catch (InterruptedException ignored) { + } onData(is(instanceOf(String.class))).inAdapterView(withId(R.id.left_drawer)) .atPosition(position).perform(click()); } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java index ea773d8..c2edf55 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java @@ -3,13 +3,13 @@ import javax.inject.Inject; import dagger.Module; +import it.cosenonjaviste.TestData; import it.cosenonjaviste.androidtest.base.CnjFragmentTest; import it.cosenonjaviste.androidtest.base.MvpEspressoTestModule; import it.cosenonjaviste.model.Post; +import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; -import it.cosenonjaviste.stubs.JsonStubs; -import it.cosenonjaviste.stubs.MockWebServerWrapper; import static android.support.test.espresso.Espresso.onData; import static android.support.test.espresso.Espresso.onView; @@ -20,10 +20,12 @@ import static android.support.test.espresso.matcher.ViewMatchers.withText; import static org.hamcrest.Matchers.instanceOf; import static org.hamcrest.Matchers.is; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.when; public class PostListTest extends CnjFragmentTest { - @Inject MockWebServerWrapper server; + @Inject WordPressService wordPressService; public PostListTest() { super(PostListFragment.class, new PostListModel()); @@ -35,7 +37,10 @@ public PostListTest() { @Override protected void initAfterInject() { super.initAfterInject(); - JsonStubs.initAllStubs(); + when(wordPressService.listPosts(eq(1))) + .thenReturn(TestData.postResponse(0, 10)); + when(wordPressService.listPosts(eq(2))) + .thenReturn(TestData.postResponse(10, 10)); } public void testPostList() throws InterruptedException { diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java index 61d9a22..3f148cd 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java @@ -1,6 +1,6 @@ package it.cosenonjaviste.androidtest.base; -import com.google.gson.GsonBuilder; +import org.mockito.Mockito; import javax.inject.Singleton; @@ -9,16 +9,14 @@ import it.cosenonjaviste.MvpTestModule; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.model.WordPressServiceFactory; import it.cosenonjaviste.page.PageUrlManager; import it.cosenonjaviste.stubs.MockWebServerWrapper; -import retrofit.converter.GsonConverter; @Module(library = true, overrides = true, includes = MvpTestModule.class) public class MvpEspressoTestModule { @Provides @Singleton WordPressService provideWordPressService(MockWebServerWrapper mockWebServer) { - return WordPressServiceFactory.create(mockWebServer.getUrl(true), true, new GsonConverter(new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create())); + return Mockito.mock(WordPressService.class); } @Provides @Singleton SchedulerManager provideSchedulerManager() { diff --git a/app/src/test/java/it/cosenonjaviste/mvp/TestData.java b/app/src/debug/java/it/cosenonjaviste/TestData.java similarity index 77% rename from app/src/test/java/it/cosenonjaviste/mvp/TestData.java rename to app/src/debug/java/it/cosenonjaviste/TestData.java index 5b790f1..95e3cfc 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/TestData.java +++ b/app/src/debug/java/it/cosenonjaviste/TestData.java @@ -1,4 +1,4 @@ -package it.cosenonjaviste.mvp; +package it.cosenonjaviste; import java.util.ArrayList; import java.util.Date; @@ -15,15 +15,19 @@ public class TestData { public static Observable postResponse(int size) { + return postResponse(0, size); + } + + public static Observable postResponse(int start, int size) { List posts = new ArrayList<>(); - for (int i = 0; i < size; i++) { - posts.add(new Post(i, createAuthor(i), "title " + i, new Date(), "url " + i, "excerpt " + i)); + for (int i = start; i < start + size; i++) { + posts.add(new Post(i, createAuthor(i), "post title " + i, new Date(), "url " + i, "excerpt " + i)); } return Observable.just(new PostResponse(posts)); } public static Author createAuthor(int i) { - return new Author(i, "name " + i, "last name " + i); + return new Author(i, "name " + i, "last name " + i, "desc " + i); } public static Observable authorResponse(int size) { diff --git a/app/src/main/java/it/cosenonjaviste/model/Author.java b/app/src/main/java/it/cosenonjaviste/model/Author.java index 71b3939..fbb1ded 100644 --- a/app/src/main/java/it/cosenonjaviste/model/Author.java +++ b/app/src/main/java/it/cosenonjaviste/model/Author.java @@ -25,10 +25,11 @@ public class Author implements Comparable { public Author() { } - public Author(long id, String firstName, String lastName) { + public Author(long id, String firstName, String lastName, String description) { this.id = id; this.firstName = firstName; this.lastName = lastName; + this.description = description; } public long getId() { diff --git a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java index 8721696..436a830 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java @@ -18,10 +18,7 @@ import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.MvpJUnitTestModule; -import it.cosenonjaviste.mvp.TestData; import it.cosenonjaviste.post.PostListModel; -import it.cosenonjaviste.stubs.JsonStubs; -import it.cosenonjaviste.stubs.MockWebServerWrapper; import static it.cosenonjaviste.mvp.TestData.*; import static org.assertj.core.api.Assertions.assertThat; From 4e1179578dfb260e84f7a52e5ec907d4aeb6377a Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 14 Feb 2015 18:14:00 +0100 Subject: [PATCH 012/332] Fix compilation errors in tests --- .../it/cosenonjaviste/model}/JsonStubs.java | 23 +------------------ .../model/WordPressServiceTest.java | 1 - .../mvp/author/AuthorListPresenterTest.java | 2 +- .../category/CategoryListPresenterTest.java | 2 +- .../mvp/post/AuthorPostListPresenterTest.java | 2 +- .../post/CategoryPostListPresenterTest.java | 2 +- .../mvp/post/PostListPresenterTest.java | 2 +- 7 files changed, 6 insertions(+), 28 deletions(-) rename {mvp-test/src/main/java/it/cosenonjaviste/stubs => app/src/test/java/it/cosenonjaviste/model}/JsonStubs.java (80%) diff --git a/mvp-test/src/main/java/it/cosenonjaviste/stubs/JsonStubs.java b/app/src/test/java/it/cosenonjaviste/model/JsonStubs.java similarity index 80% rename from mvp-test/src/main/java/it/cosenonjaviste/stubs/JsonStubs.java rename to app/src/test/java/it/cosenonjaviste/model/JsonStubs.java index 64a02cc..064b07f 100644 --- a/mvp-test/src/main/java/it/cosenonjaviste/stubs/JsonStubs.java +++ b/app/src/test/java/it/cosenonjaviste/model/JsonStubs.java @@ -1,6 +1,4 @@ -package it.cosenonjaviste.stubs; - -import com.squareup.okhttp.mockwebserver.MockResponse; +package it.cosenonjaviste.model; public class JsonStubs { private static final String SINGLE_POST = "{\n" + @@ -142,23 +140,4 @@ public static String getPostList(int firstPost, int numberOfPost) { "]" + "}"; - public static void initAllStubs() { - MockWebServerWrapper.initDispatcher(req -> { - String path = req.getPath(); - if (path.matches("/\\?json=get_recent_posts.*page=1.*")) { - return new MockResponse().setBody(getPostList(10)); - } else if (path.matches("/\\?json=get_recent_posts.*page=2.*")) { - return new MockResponse().setBody(getPostList(10, 3)); - } else if (path.matches("/post-url/")) { - return new MockResponse().setBody("CoseNonJaviste"); - } else if (path.matches("/\\?json=get_category_index")) { - return new MockResponse().setBody(CATEGORIES); - } else if (path.matches("/\\?json=get_author_index.*")) { - return new MockResponse().setBody(AUTHORS); - } else if (path.matches(".*contatti.*")) { - return new MockResponse().setBody("Contact form"); - } - return null; - }); - } } diff --git a/app/src/test/java/it/cosenonjaviste/model/WordPressServiceTest.java b/app/src/test/java/it/cosenonjaviste/model/WordPressServiceTest.java index ff71b16..1dd8e66 100644 --- a/app/src/test/java/it/cosenonjaviste/model/WordPressServiceTest.java +++ b/app/src/test/java/it/cosenonjaviste/model/WordPressServiceTest.java @@ -13,7 +13,6 @@ import dagger.Module; import dagger.ObjectGraph; import it.cosenonjaviste.mvp.MvpJUnitTestModule; -import it.cosenonjaviste.stubs.JsonStubs; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; diff --git a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java index 802d3d1..f9ba5de 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java @@ -12,12 +12,12 @@ import dagger.Module; import dagger.ObjectGraph; +import it.cosenonjaviste.TestData; import it.cosenonjaviste.author.AuthorListFragment; import it.cosenonjaviste.author.AuthorListModel; import it.cosenonjaviste.author.AuthorListPresenter; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.MvpJUnitTestModule; -import it.cosenonjaviste.mvp.TestData; import it.cosenonjaviste.post.PostListModel; import static org.assertj.core.api.Assertions.assertThat; diff --git a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java index 436a830..8bf8b90 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java @@ -20,7 +20,7 @@ import it.cosenonjaviste.mvp.MvpJUnitTestModule; import it.cosenonjaviste.post.PostListModel; -import static it.cosenonjaviste.mvp.TestData.*; +import static it.cosenonjaviste.TestData.categoryResponse; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Mockito.verify; diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java index 3d38f77..1071fe2 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java @@ -10,9 +10,9 @@ import dagger.Module; import dagger.ObjectGraph; +import it.cosenonjaviste.TestData; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.MvpJUnitTestModule; -import it.cosenonjaviste.mvp.TestData; import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.post.PostListPresenter; diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java index a628438..57a238a 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java @@ -10,10 +10,10 @@ import dagger.Module; import dagger.ObjectGraph; +import it.cosenonjaviste.TestData; import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.MvpJUnitTestModule; -import it.cosenonjaviste.mvp.TestData; import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.post.PostListPresenter; diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java index df1a53a..1c981f9 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java @@ -21,7 +21,7 @@ import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.post.PostListPresenter; -import static it.cosenonjaviste.mvp.TestData.postResponse; +import static it.cosenonjaviste.TestData.postResponse; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; From c075f93bde58310f79a549f236412c223b988bc8 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 14 Feb 2015 18:24:04 +0100 Subject: [PATCH 013/332] Deleted mpp-test module --- app/build.gradle | 8 +-- .../androidtest/MainActivityTest.java | 2 +- .../cosenonjaviste/androidtest/PageTest.java | 2 +- .../base}/MockWebServerWrapper.java | 2 +- .../base/MvpEspressoTestModule.java | 1 - mvp-test/.gitignore | 1 - mvp-test/build.gradle | 49 ------------------- settings.gradle | 2 +- 8 files changed, 5 insertions(+), 62 deletions(-) rename {mvp-test/src/main/java/it/cosenonjaviste/stubs => app/src/androidTest/java/it/cosenonjaviste/androidtest/base}/MockWebServerWrapper.java (98%) delete mode 100644 mvp-test/.gitignore delete mode 100644 mvp-test/build.gradle diff --git a/app/build.gradle b/app/build.gradle index 4ce69d5..6a6f80c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -98,12 +98,6 @@ dependencies { apt 'org.parceler:parceler:0.2.14' androidTestApt 'com.squareup.dagger:dagger-compiler:1.2.2' - androidTestCompile(project(':mvp-test')) { - exclude group: 'com.squareup.dagger' - exclude group: 'org.mockito' - exclude group: 'io.reactivex' - exclude group: 'com.squareup.okhttp', module: 'okhttp' - } androidTestCompile 'com.google.dexmaker:dexmaker:1.0' androidTestCompile('com.google.dexmaker:dexmaker-mockito:1.0') { exclude group: 'org.hamcrest', module: 'hamcrest-core' @@ -114,8 +108,8 @@ dependencies { exclude group: 'com.squareup', module: 'javawriter' } androidTestCompile 'com.android.support.test:testing-support-lib:0.1' + androidTestCompile 'com.squareup.okhttp:mockwebserver:2.0.0' - testCompile project(':mvp-test') testCompile 'junit:junit:4.12' testCompile 'org.mockito:mockito-core:1.9.5' testCompile 'org.assertj:assertj-core:1.7.0' diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java index 3ef6dd5..47b4621 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java @@ -16,9 +16,9 @@ import it.cosenonjaviste.TestData; import it.cosenonjaviste.androidtest.base.ActivityRule; import it.cosenonjaviste.androidtest.base.DaggerRule; +import it.cosenonjaviste.androidtest.base.MockWebServerWrapper; import it.cosenonjaviste.androidtest.base.MvpEspressoTestModule; import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.stubs.MockWebServerWrapper; import static android.support.test.espresso.Espresso.onData; import static android.support.test.espresso.Espresso.onView; diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java index 107f223..60bdd6a 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java @@ -4,10 +4,10 @@ import dagger.Module; import it.cosenonjaviste.androidtest.base.CnjFragmentTest; +import it.cosenonjaviste.androidtest.base.MockWebServerWrapper; import it.cosenonjaviste.androidtest.base.MvpEspressoTestModule; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; -import it.cosenonjaviste.stubs.MockWebServerWrapper; public class PageTest extends CnjFragmentTest { diff --git a/mvp-test/src/main/java/it/cosenonjaviste/stubs/MockWebServerWrapper.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MockWebServerWrapper.java similarity index 98% rename from mvp-test/src/main/java/it/cosenonjaviste/stubs/MockWebServerWrapper.java rename to app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MockWebServerWrapper.java index de639c7..8301895 100644 --- a/mvp-test/src/main/java/it/cosenonjaviste/stubs/MockWebServerWrapper.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MockWebServerWrapper.java @@ -1,4 +1,4 @@ -package it.cosenonjaviste.stubs; +package it.cosenonjaviste.androidtest.base; import com.squareup.okhttp.mockwebserver.Dispatcher; import com.squareup.okhttp.mockwebserver.MockResponse; diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java index 3f148cd..c573bb7 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java @@ -10,7 +10,6 @@ import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.page.PageUrlManager; -import it.cosenonjaviste.stubs.MockWebServerWrapper; @Module(library = true, overrides = true, includes = MvpTestModule.class) public class MvpEspressoTestModule { diff --git a/mvp-test/.gitignore b/mvp-test/.gitignore deleted file mode 100644 index 796b96d..0000000 --- a/mvp-test/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/build diff --git a/mvp-test/build.gradle b/mvp-test/build.gradle deleted file mode 100644 index 72f7921..0000000 --- a/mvp-test/build.gradle +++ /dev/null @@ -1,49 +0,0 @@ -apply plugin: 'java' - -apply plugin: 'me.tatarka.retrolambda' - -apply plugin: "jacoco" - -apply plugin: 'com.github.kt3k.coveralls' - -coveralls.sourceDirs = ['mvp/src/main/java'] - -buildscript { - repositories { - mavenCentral() - } - - dependencies { - classpath 'org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.0.1x' - } -} - -jacocoTestReport { - reports { - xml.enabled = true // coveralls plugin depends on xml format report - html.enabled = true - } -} - -retrolambda { - oldJdk '/usr/lib/jvm/java-7-oracle/' -// oldJdk '/usr/lib/jvm/jdk1.7.0' -} - -dependencies { - compile 'io.reactivex:rxandroid:0.24.0' - compile 'com.squareup.dagger:dagger-compiler:1.2.2' - compile 'com.squareup.okhttp:mockwebserver:2.0.0' - testCompile 'junit:junit:4.10' - compile 'org.mockito:mockito-core:1.9.5' - testCompile 'org.assertj:assertj-core:1.7.0' -} - -jacoco { - toolVersion = "0.7.2.201409121644" -} - -jacocoTestReport { - additionalSourceDirs = files("../mvp/src/main/java") - additionalClassDirs = files("../mvp/build/classes") -} \ No newline at end of file diff --git a/settings.gradle b/settings.gradle index cf0c5c2..fd23c59 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':androidMvp', ':SuperListviewLibrary', ':mvp-test', ':app', 'ObjectGraphHolder' +include ':androidMvp', ':SuperListviewLibrary', ':app', 'ObjectGraphHolder' From 4f9e89f67938697ea1abd89be313e8b825c72412 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 14 Feb 2015 18:41:23 +0100 Subject: [PATCH 014/332] Fix build.gradle --- app/build.gradle | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 6a6f80c..48b1e72 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -7,14 +7,11 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.jakewharton.sdkmanager:gradle-plugin:0.12.+' classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4' classpath 'org.kt3k.gradle.plugin:coveralls-gradle-plugin:2.0.1x' } } -apply plugin: 'android-sdk-manager' - apply plugin: 'com.android.application' apply plugin: 'me.tatarka.retrolambda' @@ -98,6 +95,7 @@ dependencies { apt 'org.parceler:parceler:0.2.14' androidTestApt 'com.squareup.dagger:dagger-compiler:1.2.2' + testCompile 'com.squareup.dagger:dagger-compiler:1.2.2' androidTestCompile 'com.google.dexmaker:dexmaker:1.0' androidTestCompile('com.google.dexmaker:dexmaker-mockito:1.0') { exclude group: 'org.hamcrest', module: 'hamcrest-core' From 63a6f9812c0059dc974c0f651bb2ff8b2cd1f5b0 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 14 Feb 2015 18:47:50 +0100 Subject: [PATCH 015/332] Deleted WordPressServiceFactory class --- .../java/it/cosenonjaviste/BaseModule.java | 13 +++++++++++-- .../model/WordPressServiceFactory.java | 19 ------------------- 2 files changed, 11 insertions(+), 21 deletions(-) delete mode 100644 app/src/main/java/it/cosenonjaviste/model/WordPressServiceFactory.java diff --git a/app/src/main/java/it/cosenonjaviste/BaseModule.java b/app/src/main/java/it/cosenonjaviste/BaseModule.java index fd043ac..e400224 100644 --- a/app/src/main/java/it/cosenonjaviste/BaseModule.java +++ b/app/src/main/java/it/cosenonjaviste/BaseModule.java @@ -10,8 +10,8 @@ import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.model.WordPressServiceFactory; import it.cosenonjaviste.twitter.Twitter4JService; +import retrofit.RestAdapter; import retrofit.converter.GsonConverter; @Module(library = true) @@ -21,7 +21,16 @@ public class BaseModule { } @Provides @Singleton WordPressService provideGitHubService(Gson gson) { - return WordPressServiceFactory.create("http://www.cosenonjaviste.it/", BuildConfig.DEBUG, new GsonConverter(gson)); + RestAdapter restAdapter = new RestAdapter.Builder() + .setEndpoint("http://www.cosenonjaviste.it/") + //http calls are executed in background thread using SchedulerManager + .setExecutors(Runnable::run, null) + .setConverter(new GsonConverter(gson)) + .build(); + if (BuildConfig.DEBUG) { + restAdapter.setLogLevel(RestAdapter.LogLevel.FULL); + } + return restAdapter.create(WordPressService.class); } @Provides TwitterService provideTwitterService() { diff --git a/app/src/main/java/it/cosenonjaviste/model/WordPressServiceFactory.java b/app/src/main/java/it/cosenonjaviste/model/WordPressServiceFactory.java deleted file mode 100644 index a032ef8..0000000 --- a/app/src/main/java/it/cosenonjaviste/model/WordPressServiceFactory.java +++ /dev/null @@ -1,19 +0,0 @@ -package it.cosenonjaviste.model; - -import retrofit.RestAdapter; -import retrofit.converter.GsonConverter; - -public class WordPressServiceFactory { - public static WordPressService create(String endpoint, boolean debug, GsonConverter converter) { - RestAdapter restAdapter = new RestAdapter.Builder() - .setEndpoint(endpoint) - //http calls are executed in background thread using SchedulerManager - .setExecutors(Runnable::run, null) - .setConverter(converter) - .build(); - if (debug) { - restAdapter.setLogLevel(RestAdapter.LogLevel.FULL); - } - return restAdapter.create(WordPressService.class); - } -} From 661bba156710c391ca86530fca89e01e265f63d2 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 14 Feb 2015 19:14:16 +0100 Subject: [PATCH 016/332] Removed extra implements --- app/src/main/java/it/cosenonjaviste/page/PageFragment.java | 3 +-- app/src/main/java/it/cosenonjaviste/post/PostListFragment.java | 3 +-- .../main/java/it/cosenonjaviste/twitter/TweetListFragment.java | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index 8d400ba..017dc95 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -16,9 +16,8 @@ import butterknife.InjectView; import it.cosenonjaviste.CnjFragment; import it.cosenonjaviste.R; -import it.cosenonjaviste.lib.mvp.MvpView; -public class PageFragment extends CnjFragment implements MvpView { +public class PageFragment extends CnjFragment { @InjectView(R.id.web_view) WebView webView; diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index 21cfa7f..8be738b 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -12,10 +12,9 @@ import butterknife.OnClick; import it.cosenonjaviste.CnjFragment; import it.cosenonjaviste.R; -import it.cosenonjaviste.lib.mvp.MvpView; import rx.functions.Actions; -public class PostListFragment extends CnjFragment implements MvpView { +public class PostListFragment extends CnjFragment { @InjectView(R.id.list) SuperListview list; diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index 28ea204..f96b07e 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -12,10 +12,9 @@ import butterknife.OnClick; import it.cosenonjaviste.CnjFragment; import it.cosenonjaviste.R; -import it.cosenonjaviste.lib.mvp.MvpView; import rx.functions.Actions; -public class TweetListFragment extends CnjFragment implements MvpView { +public class TweetListFragment extends CnjFragment { @InjectView(R.id.list) SuperListview list; From 265871efceddd087ce0a2d335b8dba819d2e4324 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 14 Feb 2015 19:21:07 +0100 Subject: [PATCH 017/332] Tweet as immutable class --- .../stubs/TwitterServiceStub.java | 7 +----- .../java/it/cosenonjaviste/model/Tweet.java | 25 ++++++------------- .../twitter/Twitter4JService.java | 10 +------- .../cosenonjaviste/utils/DateFormatter.java | 4 --- 4 files changed, 10 insertions(+), 36 deletions(-) diff --git a/app/src/debug/java/it/cosenonjaviste/stubs/TwitterServiceStub.java b/app/src/debug/java/it/cosenonjaviste/stubs/TwitterServiceStub.java index e565595..23bbe4a 100644 --- a/app/src/debug/java/it/cosenonjaviste/stubs/TwitterServiceStub.java +++ b/app/src/debug/java/it/cosenonjaviste/stubs/TwitterServiceStub.java @@ -18,12 +18,7 @@ public class TwitterServiceStub implements TwitterService { @Override public Observable> loadTweets(int page) { List list = new ArrayList<>(); for (int i = 0; i < 10; i++) { - Tweet tweet = new Tweet(); - tweet.setId(123); - tweet.setAuthor("author"); - tweet.setCreatedAt(new Date()); - tweet.setText("tweet text " + i); - list.add(tweet); + list.add(new Tweet(123, "tweet text " + i, new Date(), "image", "author")); } return Observable.just(list); } diff --git a/app/src/main/java/it/cosenonjaviste/model/Tweet.java b/app/src/main/java/it/cosenonjaviste/model/Tweet.java index 100d834..920c783 100644 --- a/app/src/main/java/it/cosenonjaviste/model/Tweet.java +++ b/app/src/main/java/it/cosenonjaviste/model/Tweet.java @@ -12,42 +12,33 @@ public class Tweet { String userImage; String author; - public void setId(long id) { + public Tweet() { + } + + public Tweet(long id, String text, Date createdAt, String userImage, String author) { this.id = id; + this.text = text; + this.createdAt = createdAt; + this.userImage = userImage; + this.author = author; } public long getId() { return id; } - public void setText(String text) { - this.text = text; - } - public String getText() { return text; } - public void setCreatedAt(Date createdAt) { - this.createdAt = createdAt; - } - public Date getCreatedAt() { return createdAt; } - public void setUserImage(String userImage) { - this.userImage = userImage; - } - public String getUserImage() { return userImage; } - public void setAuthor(String author) { - this.author = author; - } - public String getAuthor() { return author; } diff --git a/app/src/main/java/it/cosenonjaviste/twitter/Twitter4JService.java b/app/src/main/java/it/cosenonjaviste/twitter/Twitter4JService.java index fda60a0..89d4c8e 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/Twitter4JService.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/Twitter4JService.java @@ -43,15 +43,7 @@ public Twitter4JService() { } private Tweet createTweet(Status s) { - Tweet tweet = new Tweet(); - tweet.setId(s.getId()); - tweet.setText(s.getText()); - tweet.setCreatedAt(s.getCreatedAt()); - User user = s.getUser(); - tweet.setAuthor(user.getName()); - tweet.setUserImage(user.getProfileImageURL()); - - return tweet; + return new Tweet(s.getId(), s.getText(), s.getCreatedAt(), user.getProfileImageURL(), user.getName()); } } diff --git a/app/src/main/java/it/cosenonjaviste/utils/DateFormatter.java b/app/src/main/java/it/cosenonjaviste/utils/DateFormatter.java index ae06ae2..9c47052 100644 --- a/app/src/main/java/it/cosenonjaviste/utils/DateFormatter.java +++ b/app/src/main/java/it/cosenonjaviste/utils/DateFormatter.java @@ -5,10 +5,6 @@ import java.util.Date; public class DateFormatter { - - private DateFormatter() { - } - public static CharSequence formatDate(Date date) { return DateUtils.getRelativeTimeSpanString(date.getTime(), System.currentTimeMillis(), DateUtils.DAY_IN_MILLIS, DateUtils.FORMAT_SHOW_YEAR); } From 412e9b52c2221a7b432c3bde57138005db510f05 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 14 Feb 2015 19:45:02 +0100 Subject: [PATCH 018/332] Retry after erro tests --- .../author/AuthorListFragment.java | 1 - .../author/AuthorListPresenter.java | 8 ----- .../mvp/author/AuthorListPresenterTest.java | 31 ++++++++++++++++--- .../category/CategoryListPresenterTest.java | 29 ++++++++++++++--- .../mvp/post/PostListPresenterTest.java | 19 ++++++++++++ 5 files changed, 70 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index fa61689..e0af8b4 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -43,7 +43,6 @@ public class AuthorListFragment extends CnjFragment { grid.showList(); adapter.reloadData(authors); diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index 28bb477..5dab069 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -57,14 +57,6 @@ public void goToAuthorDetail(int position) { getView().open(PostListFragment.class, new PostListModel(author)); } - public void testFromJUnit() { - System.out.println(123); - } - - public void testFromFragment() { - System.out.println(123); - } - @Override public AuthorListFragment getView() { return (AuthorListFragment) super.getView(); } diff --git a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java index f9ba5de..f13f575 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java @@ -12,14 +12,15 @@ import dagger.Module; import dagger.ObjectGraph; -import it.cosenonjaviste.TestData; import it.cosenonjaviste.author.AuthorListFragment; import it.cosenonjaviste.author.AuthorListModel; import it.cosenonjaviste.author.AuthorListPresenter; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.MvpJUnitTestModule; import it.cosenonjaviste.post.PostListModel; +import rx.Observable; +import static it.cosenonjaviste.TestData.authorResponse; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Matchers.any; import static org.mockito.Mockito.verify; @@ -39,19 +40,39 @@ public class AuthorListPresenterTest { @Before public void setup() { ObjectGraph.create(new TestModule()).inject(this); - when(wordPressService.listAuthors()).thenReturn(TestData.authorResponse(2)); } @Test public void testLoad() { - presenter.testFromJUnit(); - presenter.initAndSubscribe(new AuthorListModel(), view); - AuthorListModel model = presenter.getModel(); + when(wordPressService.listAuthors()) + .thenReturn(authorResponse(2)); + + AuthorListModel model = new AuthorListModel(); + presenter.initAndSubscribe(model, view); + assertThat(model.size()).isEqualTo(2); + } + + @Test + public void testRetryAfterError() { + when(wordPressService.listAuthors()) + .thenReturn(Observable.error(new RuntimeException())); + + AuthorListModel model = new AuthorListModel(); + presenter.initAndSubscribe(model, view); + + when(wordPressService.listAuthors()) + .thenReturn(authorResponse(2)); + + presenter.loadAuthors(); + assertThat(model.size()).isEqualTo(2); } @Test public void testGoToDetail() { + when(wordPressService.listAuthors()) + .thenReturn(authorResponse(2)); + presenter.initAndSubscribe(new AuthorListModel(), view); presenter.goToAuthorDetail(1); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java index 8bf8b90..37e43ba 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java @@ -19,6 +19,7 @@ import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.MvpJUnitTestModule; import it.cosenonjaviste.post.PostListModel; +import rx.Observable; import static it.cosenonjaviste.TestData.categoryResponse; import static org.assertj.core.api.Assertions.assertThat; @@ -40,14 +41,15 @@ public class CategoryListPresenterTest { @Before public void setup() { ObjectGraph.create(new TestModule()).inject(this); - when(wordPressService.listCategories()) - .thenReturn(categoryResponse(3)); } @Test public void testLoad() { - presenter.initAndSubscribe(new CategoryListModel(), view); - CategoryListModel model = presenter.getModel(); + when(wordPressService.listCategories()) + .thenReturn(categoryResponse(3)); + + CategoryListModel model = new CategoryListModel(); + presenter.initAndSubscribe(model, view); assertThat(model.size()).isEqualTo(3); Category category = model.get(2); assertThat(category.getId()).isEqualTo(2); @@ -55,8 +57,27 @@ public void testLoad() { assertThat(category.getPostCount()).isEqualTo(12); } + @Test + public void testRetryAfterError() { + when(wordPressService.listCategories()) + .thenReturn(Observable.error(new RuntimeException())); + + CategoryListModel model = new CategoryListModel(); + presenter.initAndSubscribe(model, view); + + when(wordPressService.listCategories()) + .thenReturn(categoryResponse(3)); + + presenter.loadData(); + + assertThat(model.size()).isEqualTo(3); + } + @Test public void testGoToPosts() { + when(wordPressService.listCategories()) + .thenReturn(categoryResponse(3)); + presenter.initAndSubscribe(new CategoryListModel(), view); presenter.goToPosts(1); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java index 1c981f9..8c1a612 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java @@ -20,6 +20,7 @@ import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.post.PostListPresenter; +import rx.Observable; import static it.cosenonjaviste.TestData.postResponse; import static org.assertj.core.api.Assertions.assertThat; @@ -70,6 +71,24 @@ public void testLoadMore() { assertThat(items.size()).isEqualTo(16); } + @Test + public void testRetryAfterError() { + when(wordPressService.listPosts(eq(1))) + .thenReturn(Observable.error(new RuntimeException())); + + PostListModel model = new PostListModel(); + presenter.initAndSubscribe(model, view); + assertThat(model.getItems().isError()).isTrue(); + + when(wordPressService.listPosts(eq(1))) + .thenReturn(postResponse(6)); + + presenter.reloadData(); + + assertThat(model.getItems().isError()).isFalse(); + assertThat(model.getItems().size()).isEqualTo(6); + } + @Test public void testGoToDetails() { when(wordPressService.listPosts(eq(1))) From 45c3f3febac34af643d83ceda4069a6d0e1e87d8 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 14 Feb 2015 20:02:55 +0100 Subject: [PATCH 019/332] Deleted unused methods --- .../java/it/cosenonjaviste/model/Category.java | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/app/src/main/java/it/cosenonjaviste/model/Category.java b/app/src/main/java/it/cosenonjaviste/model/Category.java index c64b992..c12da40 100644 --- a/app/src/main/java/it/cosenonjaviste/model/Category.java +++ b/app/src/main/java/it/cosenonjaviste/model/Category.java @@ -33,21 +33,4 @@ public String getTitle() { public int getPostCount() { return postCount; } - - @Override - public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; - - Category category = (Category) o; - - if (id != category.id) return false; - - return true; - } - - @Override - public int hashCode() { - return (int) (id ^ (id >>> 32)); - } } From 37c2ecbe048e14039b98cae188c233cf65c598aa Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 15 Feb 2015 00:29:52 +0100 Subject: [PATCH 020/332] Deleted TwitterServiceStub class --- .../androidtest/MainActivityTest.java | 6 +++ .../androidtest/TweetListTest.java | 45 +++++++++++++---- .../base/MvpEspressoTestModule.java | 9 +++- .../java/it/cosenonjaviste/MvpTestModule.java | 15 ------ .../java/it/cosenonjaviste/TestData.java | 9 ++++ .../stubs/TwitterServiceStub.java | 25 ---------- .../java/it/cosenonjaviste/BaseModule.java | 3 +- .../cosenonjaviste/model/TwitterService.java | 43 ++++++++++++++-- .../twitter/TweetListModel.java | 4 ++ .../twitter/Twitter4JService.java | 49 ------------------- .../mvp/MvpJUnitTestModule.java | 9 +++- .../mvp/twitter/TweetListPresenterTest.java | 36 +++++++++++++- 12 files changed, 143 insertions(+), 110 deletions(-) delete mode 100644 app/src/debug/java/it/cosenonjaviste/MvpTestModule.java delete mode 100644 app/src/debug/java/it/cosenonjaviste/stubs/TwitterServiceStub.java delete mode 100644 app/src/main/java/it/cosenonjaviste/twitter/Twitter4JService.java diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java index 47b4621..4418c5d 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java @@ -18,6 +18,7 @@ import it.cosenonjaviste.androidtest.base.DaggerRule; import it.cosenonjaviste.androidtest.base.MockWebServerWrapper; import it.cosenonjaviste.androidtest.base.MvpEspressoTestModule; +import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.model.WordPressService; import static android.support.test.espresso.Espresso.onData; @@ -42,6 +43,8 @@ public class MainActivityTest { @Inject MockWebServerWrapper server; + @Inject TwitterService twitterService; + private final ActivityRule fragmentRule = new ActivityRule<>(MainActivity.class); private final DaggerRule daggerRule = new DaggerRule(new TestModule(), objectGraph -> { @@ -56,6 +59,9 @@ public class MainActivityTest { when(wordPressService.listAuthorPosts(anyLong(), anyInt())) .thenReturn(TestData.postResponse(1)); + when(twitterService.loadTweets(eq(1))) + .thenReturn(TestData.tweets()); + server.initDispatcher("CoseNonJaviste"); }); diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java index 4ae3af6..af1d56a 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java @@ -1,23 +1,48 @@ package it.cosenonjaviste.androidtest; +import android.support.test.runner.AndroidJUnit4; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.RuleChain; +import org.junit.rules.TestRule; +import org.junit.runner.RunWith; + +import javax.inject.Inject; + import dagger.Module; -import it.cosenonjaviste.androidtest.base.CnjFragmentTest; +import it.cosenonjaviste.TestData; +import it.cosenonjaviste.androidtest.base.DaggerRule; +import it.cosenonjaviste.androidtest.base.FragmentRule; import it.cosenonjaviste.androidtest.base.MvpEspressoTestModule; +import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.twitter.TweetListFragment; import it.cosenonjaviste.twitter.TweetListModel; -public class TweetListTest extends CnjFragmentTest { +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.assertion.ViewAssertions.matches; +import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; +import static android.support.test.espresso.matcher.ViewMatchers.withText; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.when; - public TweetListTest() { - super(TweetListFragment.class, new TweetListModel()); - } +@RunWith(AndroidJUnit4.class) +public class TweetListTest { - @Override protected Object getTestModule() { - return new TestModule(); - } + @Inject TwitterService twitterService; + + private final FragmentRule fragmentRule = FragmentRule.create(TweetListFragment.class, new TweetListModel()); + + private final DaggerRule daggerRule = new DaggerRule(new TestModule(), objectGraph -> { + objectGraph.inject(this); + when(twitterService.loadTweets(eq(1))) + .thenReturn(TestData.tweets()); + }); + + @Rule public TestRule chain = RuleChain.outerRule(daggerRule).around(fragmentRule); - public void testPostList() throws InterruptedException { - showUi(); + @Test public void testPostList() { + onView(withText("tweet text 1")).check(matches(isDisplayed())); } @Module(injects = TweetListTest.class, includes = MvpEspressoTestModule.class) diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java index c573bb7..a00c229 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java @@ -6,12 +6,13 @@ import dagger.Module; import dagger.Provides; -import it.cosenonjaviste.MvpTestModule; +import it.cosenonjaviste.BaseModule; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; +import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.page.PageUrlManager; -@Module(library = true, overrides = true, includes = MvpTestModule.class) +@Module(library = true, overrides = true, includes = BaseModule.class) public class MvpEspressoTestModule { @Provides @Singleton WordPressService provideWordPressService(MockWebServerWrapper mockWebServer) { @@ -29,4 +30,8 @@ public class MvpEspressoTestModule { } }; } + + @Provides @Singleton TwitterService provideTwitterService() { + return Mockito.mock(TwitterService.class); + } } diff --git a/app/src/debug/java/it/cosenonjaviste/MvpTestModule.java b/app/src/debug/java/it/cosenonjaviste/MvpTestModule.java deleted file mode 100644 index d652a60..0000000 --- a/app/src/debug/java/it/cosenonjaviste/MvpTestModule.java +++ /dev/null @@ -1,15 +0,0 @@ -package it.cosenonjaviste; - -import javax.inject.Singleton; - -import dagger.Module; -import dagger.Provides; -import it.cosenonjaviste.model.TwitterService; -import it.cosenonjaviste.stubs.TwitterServiceStub; - -@Module(library = true, overrides = true, includes = BaseModule.class) -public class MvpTestModule { - @Provides @Singleton TwitterService provideTwitterService(TwitterServiceStub twitterServiceStub) { - return twitterServiceStub; - } -} diff --git a/app/src/debug/java/it/cosenonjaviste/TestData.java b/app/src/debug/java/it/cosenonjaviste/TestData.java index 95e3cfc..e6ee352 100644 --- a/app/src/debug/java/it/cosenonjaviste/TestData.java +++ b/app/src/debug/java/it/cosenonjaviste/TestData.java @@ -10,6 +10,7 @@ import it.cosenonjaviste.model.CategoryResponse; import it.cosenonjaviste.model.Post; import it.cosenonjaviste.model.PostResponse; +import it.cosenonjaviste.model.Tweet; import rx.Observable; public class TestData { @@ -49,4 +50,12 @@ public static Observable categoryResponse(int size) { private static Category createCategory(int i) { return new Category(i, "cat " + i, 10 + i); } + + public static Observable> tweets() { + List list = new ArrayList<>(); + for (int i = 0; i < 10; i++) { + list.add(new Tweet(123, "tweet text " + i, new Date(), "image", "author")); + } + return Observable.just(list); + } } diff --git a/app/src/debug/java/it/cosenonjaviste/stubs/TwitterServiceStub.java b/app/src/debug/java/it/cosenonjaviste/stubs/TwitterServiceStub.java deleted file mode 100644 index 23bbe4a..0000000 --- a/app/src/debug/java/it/cosenonjaviste/stubs/TwitterServiceStub.java +++ /dev/null @@ -1,25 +0,0 @@ -package it.cosenonjaviste.stubs; - -import java.util.ArrayList; -import java.util.Date; -import java.util.List; - -import javax.inject.Inject; - -import it.cosenonjaviste.model.Tweet; -import it.cosenonjaviste.model.TwitterService; -import rx.Observable; - -public class TwitterServiceStub implements TwitterService { - - @Inject public TwitterServiceStub() { - } - - @Override public Observable> loadTweets(int page) { - List list = new ArrayList<>(); - for (int i = 0; i < 10; i++) { - list.add(new Tweet(123, "tweet text " + i, new Date(), "image", "author")); - } - return Observable.just(list); - } -} diff --git a/app/src/main/java/it/cosenonjaviste/BaseModule.java b/app/src/main/java/it/cosenonjaviste/BaseModule.java index e400224..2a51733 100644 --- a/app/src/main/java/it/cosenonjaviste/BaseModule.java +++ b/app/src/main/java/it/cosenonjaviste/BaseModule.java @@ -10,7 +10,6 @@ import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.twitter.Twitter4JService; import retrofit.RestAdapter; import retrofit.converter.GsonConverter; @@ -34,7 +33,7 @@ public class BaseModule { } @Provides TwitterService provideTwitterService() { - return new Twitter4JService(); + return new TwitterService(); } @Provides @Singleton SchedulerManager provideSchedulerManager() { diff --git a/app/src/main/java/it/cosenonjaviste/model/TwitterService.java b/app/src/main/java/it/cosenonjaviste/model/TwitterService.java index 9c23007..3b0564f 100644 --- a/app/src/main/java/it/cosenonjaviste/model/TwitterService.java +++ b/app/src/main/java/it/cosenonjaviste/model/TwitterService.java @@ -2,11 +2,48 @@ import java.util.List; +import it.cosenonjaviste.BuildConfig; import rx.Observable; +import rx.Subscriber; +import twitter4j.Paging; +import twitter4j.Status; +import twitter4j.Twitter; +import twitter4j.TwitterException; +import twitter4j.TwitterFactory; +import twitter4j.User; +import twitter4j.conf.ConfigurationBuilder; -public interface TwitterService { +public class TwitterService { - int PAGE_SIZE = 20; + public static final int PAGE_SIZE = 20; - Observable> loadTweets(int page); + private final Twitter twitter; + + public TwitterService() { + ConfigurationBuilder cb = new ConfigurationBuilder(); + cb.setDebugEnabled(true) + .setOAuthConsumerKey(BuildConfig.CONSUMER_KEY) + .setOAuthConsumerSecret(BuildConfig.CONSUMER_SECRET) + .setOAuthAccessToken(BuildConfig.ACCESS_TOKEN) + .setOAuthAccessTokenSecret(BuildConfig.ACCESS_TOKEN_SECRET); + TwitterFactory tf = new TwitterFactory(cb.build()); + twitter = tf.getInstance(); + } + + public Observable> loadTweets(int page) { + return Observable.create((Subscriber> subscriber) -> { + try { + List statuses = twitter.getUserTimeline(251259751, new Paging(page, PAGE_SIZE)); + subscriber.onNext(statuses); + subscriber.onCompleted(); + } catch (TwitterException e) { + subscriber.onError(e); + } + }).flatMap(Observable::from).map(this::createTweet).toList(); + } + + private Tweet createTweet(Status s) { + User user = s.getUser(); + return new Tweet(s.getId(), s.getText(), s.getCreatedAt(), user.getProfileImageURL(), user.getName()); + } } diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListModel.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListModel.java index d1b4d0a..7ddcf70 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListModel.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListModel.java @@ -43,6 +43,10 @@ public int size() { return list.size(); } + public boolean isError() { + return list.isError(); + } + public void append(List object) { list.append(object); } diff --git a/app/src/main/java/it/cosenonjaviste/twitter/Twitter4JService.java b/app/src/main/java/it/cosenonjaviste/twitter/Twitter4JService.java deleted file mode 100644 index 89d4c8e..0000000 --- a/app/src/main/java/it/cosenonjaviste/twitter/Twitter4JService.java +++ /dev/null @@ -1,49 +0,0 @@ -package it.cosenonjaviste.twitter; - -import java.util.List; - -import it.cosenonjaviste.BuildConfig; -import it.cosenonjaviste.model.Tweet; -import it.cosenonjaviste.model.TwitterService; -import rx.Observable; -import rx.Subscriber; -import twitter4j.Paging; -import twitter4j.Status; -import twitter4j.Twitter; -import twitter4j.TwitterException; -import twitter4j.TwitterFactory; -import twitter4j.User; -import twitter4j.conf.ConfigurationBuilder; - -public class Twitter4JService implements TwitterService { - - private final Twitter twitter; - - public Twitter4JService() { - ConfigurationBuilder cb = new ConfigurationBuilder(); - cb.setDebugEnabled(true) - .setOAuthConsumerKey(BuildConfig.CONSUMER_KEY) - .setOAuthConsumerSecret(BuildConfig.CONSUMER_SECRET) - .setOAuthAccessToken(BuildConfig.ACCESS_TOKEN) - .setOAuthAccessTokenSecret(BuildConfig.ACCESS_TOKEN_SECRET); - TwitterFactory tf = new TwitterFactory(cb.build()); - twitter = tf.getInstance(); - } - - @Override public Observable> loadTweets(int page) { - return Observable.create((Subscriber> subscriber) -> { - try { - List statuses = twitter.getUserTimeline(251259751, new Paging(page, PAGE_SIZE)); - subscriber.onNext(statuses); - subscriber.onCompleted(); - } catch (TwitterException e) { - subscriber.onError(e); - } - }).flatMap(Observable::from).map(this::createTweet).toList(); - } - - private Tweet createTweet(Status s) { - User user = s.getUser(); - return new Tweet(s.getId(), s.getText(), s.getCreatedAt(), user.getProfileImageURL(), user.getName()); - } -} diff --git a/app/src/test/java/it/cosenonjaviste/mvp/MvpJUnitTestModule.java b/app/src/test/java/it/cosenonjaviste/mvp/MvpJUnitTestModule.java index 2b7b259..b6a8d56 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/MvpJUnitTestModule.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/MvpJUnitTestModule.java @@ -6,12 +6,13 @@ import dagger.Module; import dagger.Provides; -import it.cosenonjaviste.MvpTestModule; +import it.cosenonjaviste.BaseModule; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; +import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.stubs.TestSchedulerManager; -@Module(library = true, overrides = true, includes = MvpTestModule.class) +@Module(library = true, overrides = true, includes = BaseModule.class) public class MvpJUnitTestModule { @Provides @Singleton WordPressService provideWordPressService() { @@ -21,4 +22,8 @@ public class MvpJUnitTestModule { @Provides @Singleton SchedulerManager provideSchedulerManager(TestSchedulerManager testSchedulerManager) { return testSchedulerManager; } + + @Provides @Singleton TwitterService provideTwitterService() { + return Mockito.mock(TwitterService.class); + } } diff --git a/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java index eeea72f..c5f9967 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java @@ -10,12 +10,17 @@ import dagger.Module; import dagger.ObjectGraph; +import it.cosenonjaviste.TestData; +import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.mvp.MvpJUnitTestModule; import it.cosenonjaviste.twitter.TweetListFragment; import it.cosenonjaviste.twitter.TweetListModel; import it.cosenonjaviste.twitter.TweetListPresenter; +import rx.Observable; import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class TweetListPresenterTest { @@ -24,17 +29,44 @@ public class TweetListPresenterTest { @Inject TweetListPresenter presenter; + @Inject TwitterService twitterService; + @Before public void setup() { ObjectGraph.create(new TestModule()).inject(this); } @Test public void testLoadTweets() { - presenter.initAndSubscribe(new TweetListModel(), view); - assertThat(presenter.getModel().size()).isEqualTo(10); + when(twitterService.loadTweets(eq(1))) + .thenReturn(TestData.tweets()); + + TweetListModel model = new TweetListModel(); + presenter.initAndSubscribe(model, view); + assertThat(model.size()).isEqualTo(10); + } + + @Test public void testRetryAfterError() { + when(twitterService.loadTweets(eq(1))) + .thenReturn(Observable.error(new RuntimeException())); + + TweetListModel model = new TweetListModel(); + presenter.initAndSubscribe(model, view); + + assertThat(model.isError()).isTrue(); + + when(twitterService.loadTweets(eq(1))) + .thenReturn(TestData.tweets()); + + presenter.reloadData(); + + assertThat(model.isError()).isFalse(); + assertThat(model.size()).isEqualTo(10); } @Test public void testLoadMoreTweets() { + when(twitterService.loadTweets(eq(1))) + .thenReturn(TestData.tweets()); + presenter.initAndSubscribe(new TweetListModel(), view); presenter.loadNextPage(); From 19594997a58115046acccb566427844fa8b59597 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 15 Feb 2015 00:42:42 +0100 Subject: [PATCH 021/332] Invoked default constructor --- app/src/main/java/it/cosenonjaviste/model/Author.java | 1 + app/src/main/java/it/cosenonjaviste/model/AuthorResponse.java | 1 + app/src/main/java/it/cosenonjaviste/model/Category.java | 1 + app/src/main/java/it/cosenonjaviste/model/CategoryResponse.java | 1 + app/src/main/java/it/cosenonjaviste/model/Post.java | 1 + app/src/main/java/it/cosenonjaviste/model/PostResponse.java | 1 + app/src/main/java/it/cosenonjaviste/model/Tweet.java | 1 + 7 files changed, 7 insertions(+) diff --git a/app/src/main/java/it/cosenonjaviste/model/Author.java b/app/src/main/java/it/cosenonjaviste/model/Author.java index fbb1ded..e0e0778 100644 --- a/app/src/main/java/it/cosenonjaviste/model/Author.java +++ b/app/src/main/java/it/cosenonjaviste/model/Author.java @@ -26,6 +26,7 @@ public Author() { } public Author(long id, String firstName, String lastName, String description) { + this(); this.id = id; this.firstName = firstName; this.lastName = lastName; diff --git a/app/src/main/java/it/cosenonjaviste/model/AuthorResponse.java b/app/src/main/java/it/cosenonjaviste/model/AuthorResponse.java index 7b248f0..8bb2a7f 100644 --- a/app/src/main/java/it/cosenonjaviste/model/AuthorResponse.java +++ b/app/src/main/java/it/cosenonjaviste/model/AuthorResponse.java @@ -9,6 +9,7 @@ public AuthorResponse() { } public AuthorResponse(List authors) { + this(); this.authors = authors; } diff --git a/app/src/main/java/it/cosenonjaviste/model/Category.java b/app/src/main/java/it/cosenonjaviste/model/Category.java index c12da40..4c59ea4 100644 --- a/app/src/main/java/it/cosenonjaviste/model/Category.java +++ b/app/src/main/java/it/cosenonjaviste/model/Category.java @@ -17,6 +17,7 @@ public Category() { } public Category(long id, String title, int postCount) { + this(); this.id = id; this.title = title; this.postCount = postCount; diff --git a/app/src/main/java/it/cosenonjaviste/model/CategoryResponse.java b/app/src/main/java/it/cosenonjaviste/model/CategoryResponse.java index 4cb2c9d..c5c9a8f 100644 --- a/app/src/main/java/it/cosenonjaviste/model/CategoryResponse.java +++ b/app/src/main/java/it/cosenonjaviste/model/CategoryResponse.java @@ -9,6 +9,7 @@ public CategoryResponse() { } public CategoryResponse(List categories) { + this(); this.categories = categories; } diff --git a/app/src/main/java/it/cosenonjaviste/model/Post.java b/app/src/main/java/it/cosenonjaviste/model/Post.java index 042223c..1f94e1b 100644 --- a/app/src/main/java/it/cosenonjaviste/model/Post.java +++ b/app/src/main/java/it/cosenonjaviste/model/Post.java @@ -17,6 +17,7 @@ public Post() { } public Post(long id, Author author, String title, Date date, String url, String excerpt) { + this(); this.id = id; this.author = author; this.title = title; diff --git a/app/src/main/java/it/cosenonjaviste/model/PostResponse.java b/app/src/main/java/it/cosenonjaviste/model/PostResponse.java index 7a33bcb..46e65c0 100644 --- a/app/src/main/java/it/cosenonjaviste/model/PostResponse.java +++ b/app/src/main/java/it/cosenonjaviste/model/PostResponse.java @@ -9,6 +9,7 @@ public PostResponse() { } public PostResponse(List posts) { + this(); this.posts = posts; } diff --git a/app/src/main/java/it/cosenonjaviste/model/Tweet.java b/app/src/main/java/it/cosenonjaviste/model/Tweet.java index 920c783..11d8191 100644 --- a/app/src/main/java/it/cosenonjaviste/model/Tweet.java +++ b/app/src/main/java/it/cosenonjaviste/model/Tweet.java @@ -16,6 +16,7 @@ public Tweet() { } public Tweet(long id, String text, Date createdAt, String userImage, String author) { + this(); this.id = id; this.text = text; this.createdAt = createdAt; From 49cf4ce78b91e441d09f6df92991ef810bd0b543 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 21 Feb 2015 19:26:29 +0100 Subject: [PATCH 022/332] Build tools 1.1.0 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 460f5eb..4ae5f72 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.1.0-rc3' + classpath 'com.android.tools.build:gradle:1.1.0' classpath 'me.tatarka:gradle-retrolambda:2.5.0' // NOTE: Do not place your application dependencies here; they belong From 41f0f6d5d2a989794b2fc6a60d2e9348f296d2f7 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 21 Feb 2015 20:37:25 +0100 Subject: [PATCH 023/332] Porting to Dagger 2 --- ObjectGraphHolder/.gitignore | 2 - ObjectGraphHolder/build.gradle | 32 ----- .../src/main/AndroidManifest.xml | 8 -- .../lib/mvp/dagger/DaggerApplication.java | 18 --- .../lib/mvp/dagger/ObjectGraphCreator.java | 7 - .../lib/mvp/dagger/ObjectGraphHolder.java | 44 ------ app/build.gradle | 10 +- .../androidtest/AuthorListTest.java | 10 +- .../androidtest/CategoryListTest.java | 36 +++-- .../androidtest/MainActivityTest.java | 10 +- .../cosenonjaviste/androidtest/PageTest.java | 34 +++-- .../androidtest/PostListTest.java | 38 +++--- .../androidtest/TweetListTest.java | 8 +- .../androidtest/base/BaseActivityTest.java | 125 ------------------ .../androidtest/base/BaseFragmentTest.java | 23 ---- .../androidtest/base/CnjFragmentTest.java | 29 ---- .../androidtest/base/DaggerRule.java | 32 ++--- .../androidtest/base/DaggerUtils.java | 7 + .../base/MvpEspressoTestModule.java | 3 +- .../androidtest/base/TestComponent.java | 30 +++++ .../java/it/cosenonjaviste/AppModule.java | 47 +++++-- .../cosenonjaviste/ApplicationComponent.java | 42 ++++++ .../java/it/cosenonjaviste/BaseModule.java | 26 ---- .../java/it/cosenonjaviste/CnjFragment.java | 7 +- .../it/cosenonjaviste/CoseNonJavisteApp.java | 16 ++- .../java/it/cosenonjaviste/MainActivity.java | 4 +- .../author/AuthorListFragment.java | 13 +- .../category/CategoryListFragment.java | 13 +- .../it/cosenonjaviste/page/PageFragment.java | 11 +- .../it/cosenonjaviste/page/PagePresenter.java | 3 + .../cosenonjaviste/post/PostListFragment.java | 13 +- .../twitter/TweetListFragment.java | 13 +- .../java/it/cosenonjaviste/DaggerUtils.java | 7 + .../java/it/cosenonjaviste/TestComponent.java | 35 +++++ .../model/WordPressServiceTest.java | 10 +- .../mvp/MvpJUnitTestModule.java | 4 +- .../mvp/author/AuthorListPresenterTest.java | 10 +- .../category/CategoryListPresenterTest.java | 10 +- .../mvp/page/PagePresenterTest.java | 10 +- .../mvp/post/AuthorPostListPresenterTest.java | 14 +- .../post/CategoryPostListPresenterTest.java | 15 +-- .../mvp/post/PostListPresenterTest.java | 11 +- .../mvp/twitter/TweetListPresenterTest.java | 10 +- build.gradle | 1 + settings.gradle | 2 +- 45 files changed, 300 insertions(+), 553 deletions(-) delete mode 100644 ObjectGraphHolder/.gitignore delete mode 100644 ObjectGraphHolder/build.gradle delete mode 100644 ObjectGraphHolder/src/main/AndroidManifest.xml delete mode 100644 ObjectGraphHolder/src/main/java/it/cosenonjaviste/lib/mvp/dagger/DaggerApplication.java delete mode 100644 ObjectGraphHolder/src/main/java/it/cosenonjaviste/lib/mvp/dagger/ObjectGraphCreator.java delete mode 100644 ObjectGraphHolder/src/main/java/it/cosenonjaviste/lib/mvp/dagger/ObjectGraphHolder.java delete mode 100644 app/src/androidTest/java/it/cosenonjaviste/androidtest/base/BaseActivityTest.java delete mode 100644 app/src/androidTest/java/it/cosenonjaviste/androidtest/base/BaseFragmentTest.java delete mode 100644 app/src/androidTest/java/it/cosenonjaviste/androidtest/base/CnjFragmentTest.java create mode 100644 app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerUtils.java create mode 100644 app/src/androidTest/java/it/cosenonjaviste/androidtest/base/TestComponent.java create mode 100644 app/src/main/java/it/cosenonjaviste/ApplicationComponent.java create mode 100644 app/src/test/java/it/cosenonjaviste/DaggerUtils.java create mode 100644 app/src/test/java/it/cosenonjaviste/TestComponent.java diff --git a/ObjectGraphHolder/.gitignore b/ObjectGraphHolder/.gitignore deleted file mode 100644 index e8fa30f..0000000 --- a/ObjectGraphHolder/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -/build -*.iml diff --git a/ObjectGraphHolder/build.gradle b/ObjectGraphHolder/build.gradle deleted file mode 100644 index d105428..0000000 --- a/ObjectGraphHolder/build.gradle +++ /dev/null @@ -1,32 +0,0 @@ -apply plugin: 'com.android.library' - -apply plugin: 'me.tatarka.retrolambda' - -android { - compileSdkVersion 21 - buildToolsVersion "21.1.2" - - defaultConfig { - minSdkVersion 9 - targetSdkVersion 21 - versionCode 1 - versionName "1.0" - } - - compileOptions { - sourceCompatibility JavaVersion.VERSION_1_7 - targetCompatibility JavaVersion.VERSION_1_7 - } - buildTypes { - release { - minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' - } - } - lintOptions { - abortOnError false - } -} -dependencies { - compile 'com.squareup.dagger:dagger:1.2.2' -} \ No newline at end of file diff --git a/ObjectGraphHolder/src/main/AndroidManifest.xml b/ObjectGraphHolder/src/main/AndroidManifest.xml deleted file mode 100644 index 048b558..0000000 --- a/ObjectGraphHolder/src/main/AndroidManifest.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - diff --git a/ObjectGraphHolder/src/main/java/it/cosenonjaviste/lib/mvp/dagger/DaggerApplication.java b/ObjectGraphHolder/src/main/java/it/cosenonjaviste/lib/mvp/dagger/DaggerApplication.java deleted file mode 100644 index c744a6a..0000000 --- a/ObjectGraphHolder/src/main/java/it/cosenonjaviste/lib/mvp/dagger/DaggerApplication.java +++ /dev/null @@ -1,18 +0,0 @@ -package it.cosenonjaviste.lib.mvp.dagger; - -import android.app.Application; - -import dagger.ObjectGraph; - -public abstract class DaggerApplication extends Application { - @Override public void onCreate() { - ObjectGraphHolder.setObjectGraphCreator(new ObjectGraphCreator() { - @Override public ObjectGraph create(DaggerApplication app) { - return ObjectGraph.create(app.getModules()); - } - }); - super.onCreate(); - } - - public abstract Object[] getModules(); -} diff --git a/ObjectGraphHolder/src/main/java/it/cosenonjaviste/lib/mvp/dagger/ObjectGraphCreator.java b/ObjectGraphHolder/src/main/java/it/cosenonjaviste/lib/mvp/dagger/ObjectGraphCreator.java deleted file mode 100644 index 321defc..0000000 --- a/ObjectGraphHolder/src/main/java/it/cosenonjaviste/lib/mvp/dagger/ObjectGraphCreator.java +++ /dev/null @@ -1,7 +0,0 @@ -package it.cosenonjaviste.lib.mvp.dagger; - -import dagger.ObjectGraph; - -public interface ObjectGraphCreator { - ObjectGraph create(DaggerApplication app); -} \ No newline at end of file diff --git a/ObjectGraphHolder/src/main/java/it/cosenonjaviste/lib/mvp/dagger/ObjectGraphHolder.java b/ObjectGraphHolder/src/main/java/it/cosenonjaviste/lib/mvp/dagger/ObjectGraphHolder.java deleted file mode 100644 index 7d8a4a7..0000000 --- a/ObjectGraphHolder/src/main/java/it/cosenonjaviste/lib/mvp/dagger/ObjectGraphHolder.java +++ /dev/null @@ -1,44 +0,0 @@ -package it.cosenonjaviste.lib.mvp.dagger; - -import dagger.ObjectGraph; - -public class ObjectGraphHolder { - private static ObjectGraph objectGraph; - - private static ObjectGraphCreator objectGraphCreator; - - private static OnCreateListener onCreateListener; - - public static ObjectGraph getObjectGraph(DaggerApplication application) { - if (objectGraph == null) { - objectGraph = objectGraphCreator.create(application); - if (onCreateListener != null) { - onCreateListener.onCreate(objectGraph); - } - } - return objectGraph; - } - - public static void setObjectGraphCreator(ObjectGraphCreator objectGraphCreator) { - if (ObjectGraphHolder.objectGraphCreator == null) { - ObjectGraphHolder.objectGraphCreator = objectGraphCreator; - } - } - - public static void forceObjectGraphCreator(ObjectGraphCreator objectGraphCreator) { - ObjectGraphHolder.objectGraphCreator = objectGraphCreator; - objectGraph = null; - } - - public static void setOnCreateListener(OnCreateListener onCreateListener) { - ObjectGraphHolder.onCreateListener = onCreateListener; - } - - public interface OnCreateListener { - void onCreate(ObjectGraph objectGraph); - } - - public static void inject(DaggerApplication app, Object obj) { - ObjectGraphHolder.getObjectGraph(app).inject(obj); - } -} \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index 48b1e72..5aafb5a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -81,21 +81,21 @@ android { dependencies { compile project(':androidMvp') - compile project(':ObjectGraphHolder') compile project(':SuperListviewLibrary') compile 'com.squareup.okhttp:okhttp:2.0.0' compile 'com.squareup.retrofit:retrofit:1.9.0' - compile 'com.squareup.dagger:dagger:1.2.2' + compile 'com.google.dagger:dagger:2.0-SNAPSHOT' compile 'org.twitter4j:twitter4j-core:4.0.2' compile 'com.android.support:cardview-v7:21.0.3' compile 'io.reactivex:rxandroid-framework:0.24.0' compile 'com.jakewharton:butterknife:6.1.0' compile 'com.squareup.picasso:picasso:2.5.0' - apt 'com.squareup.dagger:dagger-compiler:1.2.2' + compile 'org.glassfish:javax.annotation:10.0-b28' + apt 'com.google.dagger:dagger-compiler:2.0-SNAPSHOT' apt 'org.parceler:parceler:0.2.14' - androidTestApt 'com.squareup.dagger:dagger-compiler:1.2.2' - testCompile 'com.squareup.dagger:dagger-compiler:1.2.2' + androidTestApt 'com.google.dagger:dagger-compiler:2.0-SNAPSHOT' + testCompile 'com.google.dagger:dagger-compiler:2.0-SNAPSHOT' androidTestCompile 'com.google.dexmaker:dexmaker:1.0' androidTestCompile('com.google.dexmaker:dexmaker-mockito:1.0') { exclude group: 'org.hamcrest', module: 'hamcrest-core' diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java index ddac097..cbfbaa6 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java @@ -10,11 +10,9 @@ import javax.inject.Inject; -import dagger.Module; import it.cosenonjaviste.TestData; import it.cosenonjaviste.androidtest.base.DaggerRule; import it.cosenonjaviste.androidtest.base.FragmentRule; -import it.cosenonjaviste.androidtest.base.MvpEspressoTestModule; import it.cosenonjaviste.author.AuthorListFragment; import it.cosenonjaviste.author.AuthorListModel; import it.cosenonjaviste.model.WordPressService; @@ -28,8 +26,8 @@ public class AuthorListTest { private final FragmentRule fragmentRule = FragmentRule.create(AuthorListFragment.class, new AuthorListModel()); - private final DaggerRule daggerRule = new DaggerRule(new TestModule(), objectGraph -> { - objectGraph.inject(this); + private final DaggerRule daggerRule = new DaggerRule(component -> { + component.inject(this); when(wordPressService.listAuthors()) .thenReturn(TestData.authorResponse(2)); }); @@ -40,8 +38,4 @@ public class AuthorListTest { public void testAuthorList() { // showUi(); } - - @Module(injects = AuthorListTest.class, includes = MvpEspressoTestModule.class, overrides = true, library = true) - public static class TestModule { - } } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java index 3da8abb..1eddee7 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java @@ -1,40 +1,34 @@ package it.cosenonjaviste.androidtest; +import org.junit.Rule; +import org.junit.rules.RuleChain; +import org.junit.rules.TestRule; + import javax.inject.Inject; -import dagger.Module; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.androidtest.base.CnjFragmentTest; -import it.cosenonjaviste.androidtest.base.MvpEspressoTestModule; -import it.cosenonjaviste.category.CategoryListFragment; -import it.cosenonjaviste.category.CategoryListModel; +import it.cosenonjaviste.androidtest.base.DaggerRule; +import it.cosenonjaviste.androidtest.base.FragmentRule; +import it.cosenonjaviste.author.AuthorListFragment; +import it.cosenonjaviste.author.AuthorListModel; import it.cosenonjaviste.model.WordPressService; import static org.mockito.Mockito.when; -public class CategoryListTest extends CnjFragmentTest { +public class CategoryListTest { @Inject WordPressService wordPressService; - public CategoryListTest() { - super(CategoryListFragment.class, new CategoryListModel()); - } - - @Override protected Object getTestModule() { - return new TestModule(); - } + private final FragmentRule fragmentRule = FragmentRule.create(AuthorListFragment.class, new AuthorListModel()); - @Override protected void initAfterInject() { - super.initAfterInject(); + private final DaggerRule daggerRule = new DaggerRule(component -> { + component.inject(this); when(wordPressService.listCategories()) .thenReturn(TestData.categoryResponse(3)); - } + }); - public void testCategoryList() throws InterruptedException { - showUi(); - } + @Rule public TestRule chain = RuleChain.outerRule(daggerRule).around(fragmentRule); - @Module(injects = {CategoryListTest.class}, includes = MvpEspressoTestModule.class) - public static class TestModule { + public void testCategoryList() throws InterruptedException { } } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java index 4418c5d..faba389 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java @@ -10,14 +10,12 @@ import javax.inject.Inject; -import dagger.Module; import it.cosenonjaviste.MainActivity; import it.cosenonjaviste.R; import it.cosenonjaviste.TestData; import it.cosenonjaviste.androidtest.base.ActivityRule; import it.cosenonjaviste.androidtest.base.DaggerRule; import it.cosenonjaviste.androidtest.base.MockWebServerWrapper; -import it.cosenonjaviste.androidtest.base.MvpEspressoTestModule; import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.model.WordPressService; @@ -47,8 +45,8 @@ public class MainActivityTest { private final ActivityRule fragmentRule = new ActivityRule<>(MainActivity.class); - private final DaggerRule daggerRule = new DaggerRule(new TestModule(), objectGraph -> { - objectGraph.inject(this); + private final DaggerRule daggerRule = new DaggerRule(component -> { + component.inject(this); when(wordPressService.listPosts(eq(1))) .thenReturn(TestData.postResponse(10)); @@ -98,8 +96,4 @@ private void clickOnDrawer(int position) { onData(is(instanceOf(String.class))).inAdapterView(withId(R.id.left_drawer)) .atPosition(position).perform(click()); } - - @Module(injects = MainActivityTest.class, includes = MvpEspressoTestModule.class, overrides = true, library = true) - public static class TestModule { - } } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java index 60bdd6a..4b29889 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java @@ -1,36 +1,32 @@ package it.cosenonjaviste.androidtest; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.RuleChain; +import org.junit.rules.TestRule; + import javax.inject.Inject; -import dagger.Module; -import it.cosenonjaviste.androidtest.base.CnjFragmentTest; +import it.cosenonjaviste.androidtest.base.DaggerRule; +import it.cosenonjaviste.androidtest.base.FragmentRule; import it.cosenonjaviste.androidtest.base.MockWebServerWrapper; -import it.cosenonjaviste.androidtest.base.MvpEspressoTestModule; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; -public class PageTest extends CnjFragmentTest { +public class PageTest { @Inject MockWebServerWrapper server; - public PageTest() { - super(PageFragment.class, new PageModel("url")); - } + private final FragmentRule fragmentRule = FragmentRule.create(PageFragment.class, new PageModel("url")); - @Override protected void initAfterInject() { - super.initAfterInject(); + private final DaggerRule daggerRule = new DaggerRule(component -> { + component.inject(this); server.initDispatcher("CoseNonJaviste"); - } + }); - @Override protected Object getTestModule() { - return new TestModule(); - } - - public void testDetailFragment() { - showUi(); - } + @Rule public TestRule chain = RuleChain.outerRule(daggerRule).around(fragmentRule); - @Module(injects = {PageTest.class}, includes = MvpEspressoTestModule.class, library = true) - public static class TestModule { + @Test public void testDetailFragment() { +// showUi(); } } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java index c2edf55..c7458d3 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java @@ -1,11 +1,15 @@ package it.cosenonjaviste.androidtest; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.RuleChain; +import org.junit.rules.TestRule; + import javax.inject.Inject; -import dagger.Module; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.androidtest.base.CnjFragmentTest; -import it.cosenonjaviste.androidtest.base.MvpEspressoTestModule; +import it.cosenonjaviste.androidtest.base.DaggerRule; +import it.cosenonjaviste.androidtest.base.FragmentRule; import it.cosenonjaviste.model.Post; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.post.PostListFragment; @@ -23,42 +27,34 @@ import static org.mockito.Matchers.eq; import static org.mockito.Mockito.when; -public class PostListTest extends CnjFragmentTest { +public class PostListTest { @Inject WordPressService wordPressService; - public PostListTest() { - super(PostListFragment.class, new PostListModel()); - } - - @Override protected Object getTestModule() { - return new TestModule(); - } + private final FragmentRule fragmentRule = FragmentRule.create(PostListFragment.class, new PostListModel()); - @Override protected void initAfterInject() { - super.initAfterInject(); + private final DaggerRule daggerRule = new DaggerRule(component -> { + component.inject(this); when(wordPressService.listPosts(eq(1))) .thenReturn(TestData.postResponse(0, 10)); when(wordPressService.listPosts(eq(2))) .thenReturn(TestData.postResponse(10, 10)); - } + }); + + @Rule public TestRule chain = RuleChain.outerRule(daggerRule).around(fragmentRule); - public void testPostList() throws InterruptedException { + @Test public void testPostList() throws InterruptedException { onView(withText("post title 1")).check(matches(isDisplayed())); } - public void testGoToPostDetail() { + @Test public void testGoToPostDetail() { onData(is(instanceOf(Post.class))).inAdapterView(withId(android.R.id.list)) .atPosition(3).perform(click()); } - public void testLoadMore() { + @Test public void testLoadMore() { onData(is(instanceOf(Post.class))).inAdapterView(withId(android.R.id.list)) .atPosition(9).check(matches(isDisplayed())); onView(withText("post title 10")).check(matches(isDisplayed())); } - - @Module(injects = {PostListTest.class}, includes = MvpEspressoTestModule.class) - public static class TestModule { - } } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java index af1d56a..740aebf 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java @@ -10,11 +10,9 @@ import javax.inject.Inject; -import dagger.Module; import it.cosenonjaviste.TestData; import it.cosenonjaviste.androidtest.base.DaggerRule; import it.cosenonjaviste.androidtest.base.FragmentRule; -import it.cosenonjaviste.androidtest.base.MvpEspressoTestModule; import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.twitter.TweetListFragment; import it.cosenonjaviste.twitter.TweetListModel; @@ -33,7 +31,7 @@ public class TweetListTest { private final FragmentRule fragmentRule = FragmentRule.create(TweetListFragment.class, new TweetListModel()); - private final DaggerRule daggerRule = new DaggerRule(new TestModule(), objectGraph -> { + private final DaggerRule daggerRule = new DaggerRule(objectGraph -> { objectGraph.inject(this); when(twitterService.loadTweets(eq(1))) .thenReturn(TestData.tweets()); @@ -44,8 +42,4 @@ public class TweetListTest { @Test public void testPostList() { onView(withText("tweet text 1")).check(matches(isDisplayed())); } - - @Module(injects = TweetListTest.class, includes = MvpEspressoTestModule.class) - public static class TestModule { - } } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/BaseActivityTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/BaseActivityTest.java deleted file mode 100644 index 7be1280..0000000 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/BaseActivityTest.java +++ /dev/null @@ -1,125 +0,0 @@ -package it.cosenonjaviste.androidtest.base; - -import android.app.Activity; -import android.content.Intent; -import android.test.ActivityInstrumentationTestCase2; - -import org.mockito.MockitoAnnotations; - -import dagger.ObjectGraph; -import it.cosenonjaviste.lib.mvp.dagger.DaggerApplication; -import it.cosenonjaviste.lib.mvp.dagger.ObjectGraphCreator; -import it.cosenonjaviste.lib.mvp.dagger.ObjectGraphHolder; -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; -import rx.schedulers.Schedulers; - -import static android.support.test.espresso.Espresso.onView; -import static android.support.test.espresso.Espresso.registerIdlingResources; -import static android.support.test.espresso.action.ViewActions.click; -import static android.support.test.espresso.action.ViewActions.scrollTo; -import static android.support.test.espresso.action.ViewActions.typeText; -import static android.support.test.espresso.matcher.ViewMatchers.withId; - -public class BaseActivityTest extends ActivityInstrumentationTestCase2 { - - private final boolean injectTest; - - public BaseActivityTest(Class activityClass) { - this(activityClass, false); - } - - public BaseActivityTest(Class activityClass, boolean injectTest) { - super(activityClass); - this.injectTest = injectTest; - } - - public void setUp() throws Exception { - super.setUp(); - Intent activityIntent = createActivityIntent(); - if (activityIntent != null) { - setActivityIntent(activityIntent); - } - setupDexmaker(); - - MockitoAnnotations.initMocks(this); - - final EspressoExecutor espressoExecutor = EspressoExecutor.newCachedThreadPool(); - - ObjectGraphHolder.forceObjectGraphCreator(new ObjectGraphCreator() { - @Override public ObjectGraph create(DaggerApplication app) { - Object[] modules = mergeArrays(app.getModules(), getTestModules()); - ObjectGraph objectGraph = ObjectGraph.create(modules); - if (injectTest) { - objectGraph.inject(BaseActivityTest.this); - initAfterInject(); - } - return objectGraph; - } - }); - - registerIdlingResources(espressoExecutor); - - SchedulerManager.setIo(Schedulers.from(espressoExecutor)); - - // Espresso will not launch our activity for us, we must launch it via getActivity(). - getActivity(); - } - - protected Intent createActivityIntent() { - return null; - } - - protected void initAfterInject() { - } - - @Override public T getActivity() { - return super.getActivity(); - } - - private Object[] mergeArrays(Object[] appModules, Object[] testModules) { - Object[] modules = new Object[testModules.length + appModules.length]; - System.arraycopy(appModules, 0, modules, 0, appModules.length); - System.arraycopy(testModules, 0, modules, appModules.length, testModules.length); - return modules; - } - - protected Object[] getTestModules() { - return new Object[0]; - } - - /** - * Workaround for Mockito and JB-MR2 incompatibility to avoid - * java.lang.IllegalArgumentException: dexcache == null - * - * @see - * https://code.google.com/p/dexmaker/issues/detail?id=2 - */ - private void setupDexmaker() { - // Explicitly set the Dexmaker cache, so tests that use mockito work - final String dexCache = getInstrumentation().getTargetContext().getCacheDir().getPath(); - System.setProperty("dexmaker.dexcache", dexCache); - } - - protected void clickOnView(int id) { - onView(withId(id)).perform(scrollTo(), click()); - } - - protected void clickOnViewNoScroll(int id) { - onView(withId(id)).perform(click()); - } - - protected void enterText(int id, String text) { - onView(withId(id)).perform(scrollTo(), typeText(text)); - } - - protected void showUi() { -// if (BuildConfig.ESPRESSO_DEBUG) -// { -// try { -// Thread.sleep(60000); -// } catch (InterruptedException e) { -// e.printStackTrace(); -// } -// } - } -} diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/BaseFragmentTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/BaseFragmentTest.java deleted file mode 100644 index 8e7aa7e..0000000 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/BaseFragmentTest.java +++ /dev/null @@ -1,23 +0,0 @@ -package it.cosenonjaviste.androidtest.base; - -import android.content.Intent; - -import it.cosenonjaviste.lib.mvp.MvpView; -import it.cosenonjaviste.utils.SingleFragmentActivity; - -public abstract class BaseFragmentTest extends BaseActivityTest { - private final Class> viewClass; - - public BaseFragmentTest(Class> viewClass) { - this(viewClass, false); - } - - public BaseFragmentTest(Class> viewClass, boolean injectTest) { - super(SingleFragmentActivity.class, injectTest); - this.viewClass = viewClass; - } - - @Override protected Intent createActivityIntent() { - return SingleFragmentActivity.createIntent(viewClass); - } -} \ No newline at end of file diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/CnjFragmentTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/CnjFragmentTest.java deleted file mode 100644 index 8439693..0000000 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/CnjFragmentTest.java +++ /dev/null @@ -1,29 +0,0 @@ -package it.cosenonjaviste.androidtest.base; - -import android.content.Intent; - -import org.parceler.Parcels; - -import it.cosenonjaviste.lib.mvp.MvpFragment; -import it.cosenonjaviste.lib.mvp.MvpView; - -public abstract class CnjFragmentTest extends BaseFragmentTest { - private final M model; - - public CnjFragmentTest(Class> viewClass, M model) { - super(viewClass, true); - this.model = model; - } - - @Override protected final Object[] getTestModules() { - return new Object[]{getTestModule()}; - } - - @Override protected Intent createActivityIntent() { - Intent activityIntent = super.createActivityIntent(); - activityIntent.putExtra(MvpFragment.MODEL, Parcels.wrap(model)); - return activityIntent; - } - - protected abstract Object getTestModule(); -} diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java index e1e515a..5419664 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java @@ -5,8 +5,7 @@ import org.junit.runners.model.Statement; import org.mockito.MockitoAnnotations; -import dagger.ObjectGraph; -import it.cosenonjaviste.lib.mvp.dagger.ObjectGraphHolder; +import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import rx.functions.Action1; import rx.schedulers.Schedulers; @@ -15,12 +14,9 @@ public class DaggerRule implements TestRule { - private Object testModule; + private Action1 afterInjectAction; - private Action1 afterInjectAction; - - public DaggerRule(Object testModule, Action1 afterInjectAction) { - this.testModule = testModule; + public DaggerRule(Action1 afterInjectAction) { this.afterInjectAction = afterInjectAction; } @@ -35,14 +31,20 @@ public DaggerRule(Object testModule, Action1 afterInjectAction) { final EspressoExecutor espressoExecutor = EspressoExecutor.newCachedThreadPool(); - ObjectGraphHolder.forceObjectGraphCreator(app -> { - Object[] modules = mergeArrays(app.getModules(), new Object[]{testModule}); - ObjectGraph objectGraph = ObjectGraph.create(modules); - if (afterInjectAction != null) { - afterInjectAction.call(objectGraph); - } - return objectGraph; - }); + TestComponent component = DaggerUtils.getComponent(); + if (afterInjectAction != null) { + afterInjectAction.call(component); + } + CoseNonJavisteApp.component = component; + +// ObjectGraphHolder.forceObjectGraphCreator(app -> { +// Object[] modules = mergeArrays(app.getModules(), new Object[]{testModule}); +// ObjectGraph objectGraph = ObjectGraph.create(modules); +// if (afterInjectAction != null) { +// afterInjectAction.call(objectGraph); +// } +// return objectGraph; +// }); registerIdlingResources(espressoExecutor); diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerUtils.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerUtils.java new file mode 100644 index 0000000..8df26e3 --- /dev/null +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerUtils.java @@ -0,0 +1,7 @@ +package it.cosenonjaviste.androidtest.base; + +public class DaggerUtils { + public static TestComponent getComponent() { + return Dagger_TestComponent.builder().build(); + } +} diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java index a00c229..74cb1da 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java @@ -6,13 +6,12 @@ import dagger.Module; import dagger.Provides; -import it.cosenonjaviste.BaseModule; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.page.PageUrlManager; -@Module(library = true, overrides = true, includes = BaseModule.class) +@Module public class MvpEspressoTestModule { @Provides @Singleton WordPressService provideWordPressService(MockWebServerWrapper mockWebServer) { diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/TestComponent.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/TestComponent.java new file mode 100644 index 0000000..7e12514 --- /dev/null +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/TestComponent.java @@ -0,0 +1,30 @@ +package it.cosenonjaviste.androidtest.base; + +import javax.inject.Singleton; + +import dagger.Component; +import it.cosenonjaviste.ApplicationComponent; +import it.cosenonjaviste.BaseModule; +import it.cosenonjaviste.androidtest.AuthorListTest; +import it.cosenonjaviste.androidtest.CategoryListTest; +import it.cosenonjaviste.androidtest.MainActivityTest; +import it.cosenonjaviste.androidtest.PageTest; +import it.cosenonjaviste.androidtest.PostListTest; +import it.cosenonjaviste.androidtest.TweetListTest; + +@Singleton +@Component(modules = {MvpEspressoTestModule.class, BaseModule.class}) +public interface TestComponent extends ApplicationComponent { + + void inject(AuthorListTest authorListTest); + + void inject(MainActivityTest mainActivityTest); + + void inject(PageTest pageTest); + + void inject(CategoryListTest categoryListTest); + + void inject(PostListTest postListTest); + + void inject(TweetListTest tweetListTest); +} diff --git a/app/src/main/java/it/cosenonjaviste/AppModule.java b/app/src/main/java/it/cosenonjaviste/AppModule.java index 6cf3113..172f87f 100644 --- a/app/src/main/java/it/cosenonjaviste/AppModule.java +++ b/app/src/main/java/it/cosenonjaviste/AppModule.java @@ -2,21 +2,19 @@ import android.app.Application; +import com.google.gson.Gson; + +import javax.inject.Singleton; + import dagger.Module; -import it.cosenonjaviste.author.AuthorListFragment; -import it.cosenonjaviste.category.CategoryListFragment; -import it.cosenonjaviste.page.PageFragment; -import it.cosenonjaviste.post.PostListFragment; -import it.cosenonjaviste.twitter.TweetListFragment; - -@Module(injects = { - MainActivity.class, - PostListFragment.class, - PageFragment.class, - AuthorListFragment.class, - CategoryListFragment.class, - TweetListFragment.class -}, library = true, includes = BaseModule.class) +import dagger.Provides; +import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; +import it.cosenonjaviste.model.TwitterService; +import it.cosenonjaviste.model.WordPressService; +import retrofit.RestAdapter; +import retrofit.converter.GsonConverter; + +@Module(library = true, includes = BaseModule.class) public class AppModule { private Application application; @@ -24,4 +22,25 @@ public class AppModule { public AppModule(Application application) { this.application = application; } + + @Provides @Singleton WordPressService provideGitHubService(Gson gson) { + RestAdapter restAdapter = new RestAdapter.Builder() + .setEndpoint("http://www.cosenonjaviste.it/") + //http calls are executed in background thread using SchedulerManager + .setExecutors(Runnable::run, null) + .setConverter(new GsonConverter(gson)) + .build(); + if (BuildConfig.DEBUG) { + restAdapter.setLogLevel(RestAdapter.LogLevel.FULL); + } + return restAdapter.create(WordPressService.class); + } + + @Provides TwitterService provideTwitterService() { + return new TwitterService(); + } + + @Provides @Singleton SchedulerManager provideSchedulerManager() { + return new SchedulerManager(); + } } diff --git a/app/src/main/java/it/cosenonjaviste/ApplicationComponent.java b/app/src/main/java/it/cosenonjaviste/ApplicationComponent.java new file mode 100644 index 0000000..7e04839 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/ApplicationComponent.java @@ -0,0 +1,42 @@ +package it.cosenonjaviste; + +import javax.inject.Singleton; + +import dagger.Component; +import it.cosenonjaviste.author.AuthorListFragment; +import it.cosenonjaviste.author.AuthorListPresenter; +import it.cosenonjaviste.category.CategoryListFragment; +import it.cosenonjaviste.category.CategoryListPresenter; +import it.cosenonjaviste.page.PageFragment; +import it.cosenonjaviste.page.PagePresenter; +import it.cosenonjaviste.post.PostListFragment; +import it.cosenonjaviste.post.PostListPresenter; +import it.cosenonjaviste.twitter.TweetListFragment; +import it.cosenonjaviste.twitter.TweetListPresenter; + +@Singleton +@Component(modules = {AppModule.class}) +public interface ApplicationComponent { + + void inject(MainActivity activity); + + void inject(PostListFragment fragment); + + void inject(PageFragment fragment); + + void inject(AuthorListFragment fragment); + + void inject(CategoryListFragment fragment); + + void inject(TweetListFragment fragment); + + PostListPresenter getPostListProvider(); + + PagePresenter getPagePresenter(); + + TweetListPresenter getTweetListPresenter(); + + CategoryListPresenter getCategoryListPresenter(); + + AuthorListPresenter getAuthorListPresenter(); +} diff --git a/app/src/main/java/it/cosenonjaviste/BaseModule.java b/app/src/main/java/it/cosenonjaviste/BaseModule.java index 2a51733..332f644 100644 --- a/app/src/main/java/it/cosenonjaviste/BaseModule.java +++ b/app/src/main/java/it/cosenonjaviste/BaseModule.java @@ -7,36 +7,10 @@ import dagger.Module; import dagger.Provides; -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; -import it.cosenonjaviste.model.TwitterService; -import it.cosenonjaviste.model.WordPressService; -import retrofit.RestAdapter; -import retrofit.converter.GsonConverter; @Module(library = true) public class BaseModule { @Provides @Singleton Gson provideGson() { return new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create(); } - - @Provides @Singleton WordPressService provideGitHubService(Gson gson) { - RestAdapter restAdapter = new RestAdapter.Builder() - .setEndpoint("http://www.cosenonjaviste.it/") - //http calls are executed in background thread using SchedulerManager - .setExecutors(Runnable::run, null) - .setConverter(new GsonConverter(gson)) - .build(); - if (BuildConfig.DEBUG) { - restAdapter.setLogLevel(RestAdapter.LogLevel.FULL); - } - return restAdapter.create(WordPressService.class); - } - - @Provides TwitterService provideTwitterService() { - return new TwitterService(); - } - - @Provides @Singleton SchedulerManager provideSchedulerManager() { - return new SchedulerManager(); - } } diff --git a/app/src/main/java/it/cosenonjaviste/CnjFragment.java b/app/src/main/java/it/cosenonjaviste/CnjFragment.java index 5560755..edfd515 100644 --- a/app/src/main/java/it/cosenonjaviste/CnjFragment.java +++ b/app/src/main/java/it/cosenonjaviste/CnjFragment.java @@ -16,15 +16,12 @@ import it.cosenonjaviste.lib.mvp.MvpFragment; import it.cosenonjaviste.lib.mvp.MvpPresenter; import it.cosenonjaviste.lib.mvp.MvpView; -import it.cosenonjaviste.lib.mvp.dagger.DaggerApplication; -import it.cosenonjaviste.lib.mvp.dagger.ObjectGraphHolder; import it.cosenonjaviste.utils.SingleFragmentActivity; public abstract class CnjFragment

, M> extends MvpFragment { - @Override public void onCreate(Bundle savedInstanceState) { - ObjectGraphHolder.inject((DaggerApplication) getActivity().getApplication(), this); - super.onCreate(savedInstanceState); + protected ApplicationComponent getComponent() { + return ((CoseNonJavisteApp) getActivity().getApplication()).getComponent(); } @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java b/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java index 9f1a43f..43bcc31 100644 --- a/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java +++ b/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java @@ -1,11 +1,19 @@ package it.cosenonjaviste; -import it.cosenonjaviste.lib.mvp.dagger.DaggerApplication; +import android.app.Application; -public class CoseNonJavisteApp extends DaggerApplication { +public class CoseNonJavisteApp extends Application { - @Override public Object[] getModules() { - return new Object[]{new AppModule(this)}; + public static ApplicationComponent component; + + @Override public void onCreate() { + super.onCreate(); + component = Dagger_ApplicationComponent.builder() + .appModule(new AppModule(this)) + .build(); } + public ApplicationComponent getComponent() { + return component; + } } diff --git a/app/src/main/java/it/cosenonjaviste/MainActivity.java b/app/src/main/java/it/cosenonjaviste/MainActivity.java index 5c8d8b2..e85f3b0 100755 --- a/app/src/main/java/it/cosenonjaviste/MainActivity.java +++ b/app/src/main/java/it/cosenonjaviste/MainActivity.java @@ -18,8 +18,6 @@ import it.cosenonjaviste.author.AuthorListModel; import it.cosenonjaviste.category.CategoryListFragment; import it.cosenonjaviste.category.CategoryListModel; -import it.cosenonjaviste.lib.mvp.dagger.DaggerApplication; -import it.cosenonjaviste.lib.mvp.dagger.ObjectGraphHolder; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; import it.cosenonjaviste.post.PostListFragment; @@ -36,7 +34,7 @@ public class MainActivity extends ActionBarActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - ObjectGraphHolder.inject((DaggerApplication) getApplication(), this); + ((CoseNonJavisteApp) getApplication()).getComponent().inject(this); setContentView(R.layout.activity_main); diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index e0af8b4..9f566f5 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -1,13 +1,11 @@ package it.cosenonjaviste.author; import android.annotation.SuppressLint; +import android.os.Bundle; import android.view.View; import com.quentindommerc.superlistview.SuperGridview; -import javax.inject.Inject; -import javax.inject.Provider; - import butterknife.InjectView; import butterknife.OnClick; import it.cosenonjaviste.CnjFragment; @@ -18,12 +16,15 @@ public class AuthorListFragment extends CnjFragment presenterProvider; - private AuthorAdapter adapter; + @Override public void onCreate(Bundle state) { + super.onCreate(state); + getComponent().inject(this); + } + @Override protected AuthorListPresenter createPresenter() { - return presenterProvider.get(); + return getComponent().getAuthorListPresenter(); } @Override protected int getLayoutId() { diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java index bd0fb2e..6639186 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java @@ -1,13 +1,11 @@ package it.cosenonjaviste.category; import android.annotation.SuppressLint; +import android.os.Bundle; import android.view.View; import com.quentindommerc.superlistview.SuperGridview; -import javax.inject.Inject; -import javax.inject.Provider; - import butterknife.InjectView; import butterknife.OnClick; import it.cosenonjaviste.CnjFragment; @@ -18,12 +16,15 @@ public class CategoryListFragment extends CnjFragment presenterProvider; - private CategoryAdapter adapter; + @Override public void onCreate(Bundle state) { + super.onCreate(state); + getComponent().inject(this); + } + @Override protected CategoryListPresenter createPresenter() { - return presenterProvider.get(); + return getComponent().getCategoryListPresenter(); } @Override protected int getLayoutId() { diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index 017dc95..2caf248 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -1,6 +1,7 @@ package it.cosenonjaviste.page; import android.annotation.SuppressLint; +import android.os.Bundle; import android.view.View; import android.webkit.WebResourceResponse; import android.webkit.WebSettings; @@ -10,9 +11,6 @@ import java.io.File; import java.io.IOException; -import javax.inject.Inject; -import javax.inject.Provider; - import butterknife.InjectView; import it.cosenonjaviste.CnjFragment; import it.cosenonjaviste.R; @@ -23,10 +21,13 @@ public class PageFragment extends CnjFragment { @InjectView(R.id.progress_detail) View progressBar; - @Inject Provider presenterProvider; + @Override public void onCreate(Bundle state) { + super.onCreate(state); + getComponent().inject(this); + } @Override protected PagePresenter createPresenter() { - return presenterProvider.get(); + return getComponent().getPagePresenter(); } @SuppressLint("SetJavaScriptEnabled") @Override protected void initView(View view) { diff --git a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java index c7d2818..1fc7b16 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java +++ b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java @@ -8,6 +8,9 @@ public class PagePresenter extends MvpPresenter { @Inject PageUrlManager pageUrlManager; + @Inject public PagePresenter() { + } + public String getPostUrl() { return pageUrlManager.getUrl(model.getUrl()); } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index 8be738b..5925e59 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -1,13 +1,11 @@ package it.cosenonjaviste.post; import android.annotation.SuppressLint; +import android.os.Bundle; import android.view.View; import com.quentindommerc.superlistview.SuperListview; -import javax.inject.Inject; -import javax.inject.Provider; - import butterknife.InjectView; import butterknife.OnClick; import it.cosenonjaviste.CnjFragment; @@ -18,18 +16,21 @@ public class PostListFragment extends CnjFragment presenterProvider; - private PostAdapter adapter; @Override protected PostListPresenter createPresenter() { - return presenterProvider.get(); + return getComponent().getPostListProvider(); } @Override protected int getLayoutId() { return R.layout.super_list; } + @Override public void onCreate(Bundle state) { + super.onCreate(state); + getComponent().inject(this); + } + @SuppressLint("ResourceAsColor") @Override protected void initView(View view) { super.initView(view); adapter = new PostAdapter(getActivity()); diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index f96b07e..cf54c5f 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -1,13 +1,11 @@ package it.cosenonjaviste.twitter; import android.annotation.SuppressLint; +import android.os.Bundle; import android.view.View; import com.quentindommerc.superlistview.SuperListview; -import javax.inject.Inject; -import javax.inject.Provider; - import butterknife.InjectView; import butterknife.OnClick; import it.cosenonjaviste.CnjFragment; @@ -18,12 +16,15 @@ public class TweetListFragment extends CnjFragment presenterProvider; - private TweetAdapter adapter; + @Override public void onCreate(Bundle state) { + super.onCreate(state); + getComponent().inject(this); + } + @Override protected TweetListPresenter createPresenter() { - return presenterProvider.get(); + return getComponent().getTweetListPresenter(); } @Override protected int getLayoutId() { diff --git a/app/src/test/java/it/cosenonjaviste/DaggerUtils.java b/app/src/test/java/it/cosenonjaviste/DaggerUtils.java new file mode 100644 index 0000000..225c2c9 --- /dev/null +++ b/app/src/test/java/it/cosenonjaviste/DaggerUtils.java @@ -0,0 +1,7 @@ +package it.cosenonjaviste; + +public class DaggerUtils { + public static TestComponent getComponent() { + return Dagger_TestComponent.builder().build(); + } +} diff --git a/app/src/test/java/it/cosenonjaviste/TestComponent.java b/app/src/test/java/it/cosenonjaviste/TestComponent.java new file mode 100644 index 0000000..b86714d --- /dev/null +++ b/app/src/test/java/it/cosenonjaviste/TestComponent.java @@ -0,0 +1,35 @@ +package it.cosenonjaviste; + +import javax.inject.Singleton; + +import dagger.Component; +import it.cosenonjaviste.model.WordPressServiceTest; +import it.cosenonjaviste.mvp.MvpJUnitTestModule; +import it.cosenonjaviste.mvp.author.AuthorListPresenterTest; +import it.cosenonjaviste.mvp.category.CategoryListPresenterTest; +import it.cosenonjaviste.mvp.page.PagePresenterTest; +import it.cosenonjaviste.mvp.post.AuthorPostListPresenterTest; +import it.cosenonjaviste.mvp.post.CategoryPostListPresenterTest; +import it.cosenonjaviste.mvp.post.PostListPresenterTest; +import it.cosenonjaviste.mvp.twitter.TweetListPresenterTest; + +@Singleton +@Component(modules = {MvpJUnitTestModule.class, BaseModule.class}) +public interface TestComponent { + void inject(WordPressServiceTest test); + + void inject(TweetListPresenterTest tweetListPresenterTest); + + void inject(AuthorListPresenterTest authorListPresenterTest); + + void inject(CategoryListPresenterTest categoryListPresenterTest); + + void inject(PagePresenterTest pagePresenterTest); + + void inject(AuthorPostListPresenterTest authorPostListPresenterTest); + + void inject(CategoryPostListPresenterTest categoryPostListPresenterTest); + + void inject(PostListPresenterTest postListPresenterTest); + +} diff --git a/app/src/test/java/it/cosenonjaviste/model/WordPressServiceTest.java b/app/src/test/java/it/cosenonjaviste/model/WordPressServiceTest.java index 1dd8e66..5421610 100644 --- a/app/src/test/java/it/cosenonjaviste/model/WordPressServiceTest.java +++ b/app/src/test/java/it/cosenonjaviste/model/WordPressServiceTest.java @@ -10,9 +10,7 @@ import javax.inject.Inject; -import dagger.Module; -import dagger.ObjectGraph; -import it.cosenonjaviste.mvp.MvpJUnitTestModule; +import it.cosenonjaviste.DaggerUtils; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; @@ -23,7 +21,7 @@ public class WordPressServiceTest { @Before public void init() throws IOException { - ObjectGraph.create(new TestModule()).inject(this); + DaggerUtils.getComponent().inject(this); } @Test @@ -41,8 +39,4 @@ public void testLoadPosts() throws IOException { assertEquals(8, post.getAuthor().getId()); assertNotNull(post.getAuthor().getName()); } - - @Module(injects = WordPressServiceTest.class, includes = MvpJUnitTestModule.class) - public static class TestModule { - } } diff --git a/app/src/test/java/it/cosenonjaviste/mvp/MvpJUnitTestModule.java b/app/src/test/java/it/cosenonjaviste/mvp/MvpJUnitTestModule.java index b6a8d56..60c790a 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/MvpJUnitTestModule.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/MvpJUnitTestModule.java @@ -6,15 +6,13 @@ import dagger.Module; import dagger.Provides; -import it.cosenonjaviste.BaseModule; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.stubs.TestSchedulerManager; -@Module(library = true, overrides = true, includes = BaseModule.class) +@Module public class MvpJUnitTestModule { - @Provides @Singleton WordPressService provideWordPressService() { return Mockito.mock(WordPressService.class); } diff --git a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java index f13f575..2b73efb 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java @@ -10,13 +10,11 @@ import javax.inject.Inject; -import dagger.Module; -import dagger.ObjectGraph; +import it.cosenonjaviste.DaggerUtils; import it.cosenonjaviste.author.AuthorListFragment; import it.cosenonjaviste.author.AuthorListModel; import it.cosenonjaviste.author.AuthorListPresenter; import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.mvp.MvpJUnitTestModule; import it.cosenonjaviste.post.PostListModel; import rx.Observable; @@ -39,7 +37,7 @@ public class AuthorListPresenterTest { @Before public void setup() { - ObjectGraph.create(new TestModule()).inject(this); + DaggerUtils.getComponent().inject(this); } @Test @@ -81,8 +79,4 @@ public void testGoToDetail() { PostListModel model = modelCaptor.getValue(); assertThat(model.getAuthor()).isEqualTo(presenter.getModel().get(1)); } - - @Module(injects = AuthorListPresenterTest.class, includes = MvpJUnitTestModule.class) - public static class TestModule { - } } \ No newline at end of file diff --git a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java index 37e43ba..b9aa121 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java @@ -10,14 +10,12 @@ import javax.inject.Inject; -import dagger.Module; -import dagger.ObjectGraph; +import it.cosenonjaviste.DaggerUtils; import it.cosenonjaviste.category.CategoryListFragment; import it.cosenonjaviste.category.CategoryListModel; import it.cosenonjaviste.category.CategoryListPresenter; import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.mvp.MvpJUnitTestModule; import it.cosenonjaviste.post.PostListModel; import rx.Observable; @@ -40,7 +38,7 @@ public class CategoryListPresenterTest { @Before public void setup() { - ObjectGraph.create(new TestModule()).inject(this); + DaggerUtils.getComponent().inject(this); } @Test @@ -85,8 +83,4 @@ public void testGoToPosts() { assertThat(modelCaptor.getValue().getCategory()).isEqualTo(presenter.getModel().get(1)); } - - @Module(injects = {CategoryListPresenterTest.class}, includes = MvpJUnitTestModule.class) - public static class TestModule { - } } \ No newline at end of file diff --git a/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java index 79415e9..1565202 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java @@ -10,9 +10,7 @@ import javax.inject.Inject; -import dagger.Module; -import dagger.ObjectGraph; -import it.cosenonjaviste.mvp.MvpJUnitTestModule; +import it.cosenonjaviste.DaggerUtils; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; import it.cosenonjaviste.page.PagePresenter; @@ -31,7 +29,7 @@ public class PagePresenterTest { @Before public void setup() { - ObjectGraph.create(new TestModule()).inject(this); + DaggerUtils.getComponent().inject(this); presenter.initAndSubscribe(new PageModel("url"), view); } @@ -39,8 +37,4 @@ public void setup() { public void testLoad() { assertThat(presenter.getPostUrl()).isEqualTo("url"); } - - @Module(injects = {PagePresenterTest.class}, includes = MvpJUnitTestModule.class) - public static class TestModule { - } } \ No newline at end of file diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java index 1071fe2..91fe327 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java @@ -8,11 +8,9 @@ import javax.inject.Inject; -import dagger.Module; -import dagger.ObjectGraph; +import it.cosenonjaviste.DaggerUtils; import it.cosenonjaviste.TestData; import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.mvp.MvpJUnitTestModule; import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.post.PostListPresenter; @@ -35,11 +33,7 @@ public class AuthorPostListPresenterTest { @Before public void setup() { - ObjectGraph.create(getTestModule()).inject(this); - } - - protected Object getTestModule() { - return new TestModule(); + DaggerUtils.getComponent().inject(this); } @Test @@ -54,8 +48,4 @@ public void testLoad() throws InterruptedException { assertThat(model.getItems().size()).isEqualTo(1); verify(wordPressService).listAuthorPosts(eq(145L), eq(1)); } - - @Module(injects = {AuthorPostListPresenterTest.class}, includes = MvpJUnitTestModule.class) - public static class TestModule { - } } \ No newline at end of file diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java index 57a238a..a246e22 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java @@ -8,12 +8,10 @@ import javax.inject.Inject; -import dagger.Module; -import dagger.ObjectGraph; +import it.cosenonjaviste.DaggerUtils; import it.cosenonjaviste.TestData; import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.mvp.MvpJUnitTestModule; import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.post.PostListPresenter; @@ -33,11 +31,7 @@ public class CategoryPostListPresenterTest { @Before public void setup() { - ObjectGraph.create(getTestModule()).inject(this); - } - - protected Object getTestModule() { - return new TestModule(); + DaggerUtils.getComponent().inject(this); } @Test @@ -61,9 +55,4 @@ public void testLoadMore() { presenter.loadNextPage(); assertThat(model.getItems().size()).isEqualTo(15); } - - @Module(injects = {CategoryPostListPresenterTest.class}, includes = MvpJUnitTestModule.class) - public static class TestModule { - } - } \ No newline at end of file diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java index 8c1a612..d2a7d93 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java @@ -10,12 +10,10 @@ import javax.inject.Inject; -import dagger.Module; -import dagger.ObjectGraph; +import it.cosenonjaviste.DaggerUtils; import it.cosenonjaviste.lib.mvp.utils.OptionalList; import it.cosenonjaviste.model.Post; import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.mvp.MvpJUnitTestModule; import it.cosenonjaviste.page.PageModel; import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; @@ -40,7 +38,7 @@ public class PostListPresenterTest { @Before public void setup() { - ObjectGraph.create(new TestModule()).inject(this); + DaggerUtils.getComponent().inject(this); } @Captor ArgumentCaptor modelCaptor; @@ -108,9 +106,4 @@ public void testGoToDetails() { assertThat(url).isNotNull(); assertThat(url).isEqualTo(firstPost.getUrl()); } - - @Module(injects = {PostListPresenterTest.class}, includes = MvpJUnitTestModule.class) - public static class TestModule { - } - } \ No newline at end of file diff --git a/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java index c5f9967..2f79e0f 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java @@ -8,11 +8,9 @@ import javax.inject.Inject; -import dagger.Module; -import dagger.ObjectGraph; +import it.cosenonjaviste.DaggerUtils; import it.cosenonjaviste.TestData; import it.cosenonjaviste.model.TwitterService; -import it.cosenonjaviste.mvp.MvpJUnitTestModule; import it.cosenonjaviste.twitter.TweetListFragment; import it.cosenonjaviste.twitter.TweetListModel; import it.cosenonjaviste.twitter.TweetListPresenter; @@ -33,7 +31,7 @@ public class TweetListPresenterTest { @Before public void setup() { - ObjectGraph.create(new TestModule()).inject(this); + DaggerUtils.getComponent().inject(this); } @Test public void testLoadTweets() { @@ -73,8 +71,4 @@ public void setup() { assertThat(presenter.getModel().size()).isEqualTo(20); } - - @Module(injects = {TweetListPresenterTest.class}, includes = MvpJUnitTestModule.class) - public static class TestModule { - } } diff --git a/build.gradle b/build.gradle index 4ae5f72..c28ce4b 100644 --- a/build.gradle +++ b/build.gradle @@ -16,5 +16,6 @@ buildscript { allprojects { repositories { jcenter() + maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } } } diff --git a/settings.gradle b/settings.gradle index fd23c59..295baa7 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':androidMvp', ':SuperListviewLibrary', ':app', 'ObjectGraphHolder' +include ':androidMvp', ':SuperListviewLibrary', ':app' From b5996d66ef5ecd31395a8100a2c25839e2d4274b Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 21 Feb 2015 21:17:49 +0100 Subject: [PATCH 024/332] Author list component --- .../lib/mvp/Dagger2MvpFragment.java | 55 +++++++++++++++++++ .../cosenonjaviste/ApplicationComponent.java | 10 ++-- .../it/cosenonjaviste/Dagger2CnjFragment.java | 52 ++++++++++++++++++ .../author/AuthorListComponent.java | 11 ++++ .../author/AuthorListFragment.java | 22 +++++--- .../author/AuthorListPresenter.java | 2 + .../cosenonjaviste/utils/PresenterScope.java | 12 ++++ 7 files changed, 152 insertions(+), 12 deletions(-) create mode 100644 androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java create mode 100644 app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java create mode 100644 app/src/main/java/it/cosenonjaviste/author/AuthorListComponent.java create mode 100644 app/src/main/java/it/cosenonjaviste/utils/PresenterScope.java diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java new file mode 100644 index 0000000..51aee6b --- /dev/null +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java @@ -0,0 +1,55 @@ +package it.cosenonjaviste.lib.mvp; + +import android.os.Bundle; +import android.support.v4.app.Fragment; + +import org.parceler.Parcels; + +public abstract class Dagger2MvpFragment

, M> extends Fragment implements MvpView { + + private static final String PRESENTER_ID = "presenterId"; + public static final String MODEL = "model"; + +// protected P presenter; + + @Override public void onCreate(Bundle state) { + super.onCreate(state); + + long presenterId = 0; + M restoredModel = null; + if (state != null) { + presenterId = state.getLong(PRESENTER_ID, 0); + restoredModel = Parcels.unwrap(state.getParcelable(MODEL)); + } + if (restoredModel == null && getArguments() != null) { + restoredModel = Parcels.unwrap(getArguments().getParcelable(MODEL)); + } + +// presenter = PresenterSaverFragment.

load(getFragmentManager(), presenterId); +// if (presenter == null) { +// presenter = createPresenter(); +// } + getPresenter().init(restoredModel); + +// PresenterSaverFragment.save(getFragmentManager(), presenter); + } + + public abstract P getPresenter(); + + @Override public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + outState.putParcelable(MODEL, Parcels.wrap(getPresenter().getModel())); + outState.putLong(PRESENTER_ID, getPresenter().getId()); + } + + @Override public void onStart() { + super.onStart(); + getPresenter().subscribe(this); + } + + @Override public void onStop() { + getPresenter().pause(); + super.onStop(); + } + +} diff --git a/app/src/main/java/it/cosenonjaviste/ApplicationComponent.java b/app/src/main/java/it/cosenonjaviste/ApplicationComponent.java index 7e04839..9b05f84 100644 --- a/app/src/main/java/it/cosenonjaviste/ApplicationComponent.java +++ b/app/src/main/java/it/cosenonjaviste/ApplicationComponent.java @@ -3,10 +3,10 @@ import javax.inject.Singleton; import dagger.Component; -import it.cosenonjaviste.author.AuthorListFragment; -import it.cosenonjaviste.author.AuthorListPresenter; import it.cosenonjaviste.category.CategoryListFragment; import it.cosenonjaviste.category.CategoryListPresenter; +import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; +import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PagePresenter; import it.cosenonjaviste.post.PostListFragment; @@ -24,8 +24,6 @@ public interface ApplicationComponent { void inject(PageFragment fragment); - void inject(AuthorListFragment fragment); - void inject(CategoryListFragment fragment); void inject(TweetListFragment fragment); @@ -38,5 +36,7 @@ public interface ApplicationComponent { CategoryListPresenter getCategoryListPresenter(); - AuthorListPresenter getAuthorListPresenter(); + SchedulerManager providesSchedulerManager(); + + WordPressService providesWordPressService(); } diff --git a/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java b/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java new file mode 100644 index 0000000..73c222e --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java @@ -0,0 +1,52 @@ +package it.cosenonjaviste; + +import android.content.Context; +import android.content.Intent; +import android.os.Bundle; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import org.parceler.Parcels; + +import butterknife.ButterKnife; +import it.cosenonjaviste.lib.mvp.Dagger2MvpFragment; +import it.cosenonjaviste.lib.mvp.MvpPresenter; +import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.utils.SingleFragmentActivity; + +public abstract class Dagger2CnjFragment

, M> extends Dagger2MvpFragment { + + protected ApplicationComponent getComponent() { + return ((CoseNonJavisteApp) getActivity().getApplication()).getComponent(); + } + + @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(getLayoutId(), container, false); + initView(view); + return view; + } + + protected void initView(View view) { + ButterKnife.inject(this, view); + } + + protected abstract int getLayoutId(); + + @Override public void open(Class> viewClass, MM model) { + Intent intent = SingleFragmentActivity.createIntent(getActivity(), viewClass); + intent.putExtra(MODEL, Parcels.wrap(model)); + getActivity().startActivity(intent); + } + + public static T createView(@NonNull Context context, @NonNull Class> viewClass, @NonNull M model) { + Fragment fragment = Fragment.instantiate(context, viewClass.getName()); + Bundle bundle = new Bundle(); + bundle.putParcelable(MODEL, Parcels.wrap(model)); + fragment.setArguments(bundle); + return (T) fragment; + } +} diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListComponent.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListComponent.java new file mode 100644 index 0000000..0746dcb --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListComponent.java @@ -0,0 +1,11 @@ +package it.cosenonjaviste.author; + +import dagger.Component; +import it.cosenonjaviste.ApplicationComponent; +import it.cosenonjaviste.utils.PresenterScope; + +@PresenterScope +@Component(dependencies = ApplicationComponent.class) +public interface AuthorListComponent { + void inject(AuthorListFragment fragment); +} diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index 9f566f5..7063563 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -6,25 +6,33 @@ import com.quentindommerc.superlistview.SuperGridview; +import javax.inject.Inject; + import butterknife.InjectView; import butterknife.OnClick; -import it.cosenonjaviste.CnjFragment; +import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.R; import rx.functions.Actions; -public class AuthorListFragment extends CnjFragment { +public class AuthorListFragment extends Dagger2CnjFragment { @InjectView(R.id.grid) SuperGridview grid; + @Inject AuthorListPresenter presenter; + private AuthorAdapter adapter; - @Override public void onCreate(Bundle state) { - super.onCreate(state); - getComponent().inject(this); + @Override public AuthorListPresenter getPresenter() { + return presenter; } - @Override protected AuthorListPresenter createPresenter() { - return getComponent().getAuthorListPresenter(); + protected AuthorListComponent getPresenterComponent() { + return Dagger_AuthorListComponent.builder().applicationComponent(getComponent()).build(); + } + + @Override public void onCreate(Bundle state) { + getPresenterComponent().inject(this); + super.onCreate(state); } @Override protected int getLayoutId() { diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index 5dab069..39e1bb5 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -13,8 +13,10 @@ import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; +import it.cosenonjaviste.utils.PresenterScope; import rx.Observable; +@PresenterScope public class AuthorListPresenter extends RxMvpPresenter { @Inject WordPressService wordPressService; diff --git a/app/src/main/java/it/cosenonjaviste/utils/PresenterScope.java b/app/src/main/java/it/cosenonjaviste/utils/PresenterScope.java new file mode 100644 index 0000000..67e7aac --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/utils/PresenterScope.java @@ -0,0 +1,12 @@ +package it.cosenonjaviste.utils; + +import java.lang.annotation.Retention; + +import javax.inject.Scope; + +import static java.lang.annotation.RetentionPolicy.RUNTIME; + +@Scope +@Retention(RUNTIME) +public @interface PresenterScope { +} \ No newline at end of file From dfb817f18b23aa9f093c41cb321f86f372c17faf Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 21 Feb 2015 21:31:58 +0100 Subject: [PATCH 025/332] Post list component --- .../cosenonjaviste/ApplicationComponent.java | 6 ------ .../cosenonjaviste/post/PostListComponent.java | 11 +++++++++++ .../cosenonjaviste/post/PostListFragment.java | 18 +++++++++++++----- 3 files changed, 24 insertions(+), 11 deletions(-) create mode 100644 app/src/main/java/it/cosenonjaviste/post/PostListComponent.java diff --git a/app/src/main/java/it/cosenonjaviste/ApplicationComponent.java b/app/src/main/java/it/cosenonjaviste/ApplicationComponent.java index 9b05f84..cef378e 100644 --- a/app/src/main/java/it/cosenonjaviste/ApplicationComponent.java +++ b/app/src/main/java/it/cosenonjaviste/ApplicationComponent.java @@ -9,8 +9,6 @@ import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PagePresenter; -import it.cosenonjaviste.post.PostListFragment; -import it.cosenonjaviste.post.PostListPresenter; import it.cosenonjaviste.twitter.TweetListFragment; import it.cosenonjaviste.twitter.TweetListPresenter; @@ -20,16 +18,12 @@ public interface ApplicationComponent { void inject(MainActivity activity); - void inject(PostListFragment fragment); - void inject(PageFragment fragment); void inject(CategoryListFragment fragment); void inject(TweetListFragment fragment); - PostListPresenter getPostListProvider(); - PagePresenter getPagePresenter(); TweetListPresenter getTweetListPresenter(); diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListComponent.java b/app/src/main/java/it/cosenonjaviste/post/PostListComponent.java new file mode 100644 index 0000000..5cce721 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/post/PostListComponent.java @@ -0,0 +1,11 @@ +package it.cosenonjaviste.post; + +import dagger.Component; +import it.cosenonjaviste.ApplicationComponent; +import it.cosenonjaviste.utils.PresenterScope; + +@PresenterScope +@Component(dependencies = ApplicationComponent.class) +public interface PostListComponent { + void inject(PostListFragment fragment); +} diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index 5925e59..c9d0406 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -6,20 +6,28 @@ import com.quentindommerc.superlistview.SuperListview; +import javax.inject.Inject; + import butterknife.InjectView; import butterknife.OnClick; -import it.cosenonjaviste.CnjFragment; +import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.R; import rx.functions.Actions; -public class PostListFragment extends CnjFragment { +public class PostListFragment extends Dagger2CnjFragment { @InjectView(R.id.list) SuperListview list; + @Inject PostListPresenter presenter; + private PostAdapter adapter; - @Override protected PostListPresenter createPresenter() { - return getComponent().getPostListProvider(); + @Override public PostListPresenter getPresenter() { + return presenter; + } + + protected PostListComponent getPresenterComponent() { + return Dagger_PostListComponent.builder().applicationComponent(getComponent()).build(); } @Override protected int getLayoutId() { @@ -27,8 +35,8 @@ public class PostListFragment extends CnjFragment Date: Sun, 22 Feb 2015 12:57:47 +0100 Subject: [PATCH 026/332] Other components --- .../lib/mvp/Dagger2MvpFragment.java | 6 +- .../cosenonjaviste/ApplicationComponent.java | 24 ++------ .../it/cosenonjaviste/Dagger2CnjFragment.java | 15 ++++- .../ObjectsMapRetainedFragment.java | 59 +++++++++++++++++++ .../author/AuthorListFragment.java | 20 +++---- .../category/CategoryListComponent.java | 11 ++++ .../category/CategoryListFragment.java | 22 ++++--- .../category/CategoryListPresenter.java | 2 + .../it/cosenonjaviste/page/PageComponent.java | 11 ++++ .../it/cosenonjaviste/page/PageFragment.java | 23 +++++--- .../it/cosenonjaviste/page/PagePresenter.java | 2 + .../cosenonjaviste/post/PostListFragment.java | 20 +++---- .../post/PostListPresenter.java | 2 + .../twitter/TweetListComponent.java | 11 ++++ .../twitter/TweetListFragment.java | 23 +++++--- .../twitter/TweetListPresenter.java | 2 + 16 files changed, 179 insertions(+), 74 deletions(-) create mode 100644 app/src/main/java/it/cosenonjaviste/ObjectsMapRetainedFragment.java create mode 100644 app/src/main/java/it/cosenonjaviste/category/CategoryListComponent.java create mode 100644 app/src/main/java/it/cosenonjaviste/page/PageComponent.java create mode 100644 app/src/main/java/it/cosenonjaviste/twitter/TweetListComponent.java diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java index 51aee6b..3468689 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java @@ -5,13 +5,11 @@ import org.parceler.Parcels; -public abstract class Dagger2MvpFragment

, M> extends Fragment implements MvpView { +public abstract class Dagger2MvpFragment extends Fragment implements MvpView { private static final String PRESENTER_ID = "presenterId"; public static final String MODEL = "model"; -// protected P presenter; - @Override public void onCreate(Bundle state) { super.onCreate(state); @@ -34,7 +32,7 @@ public abstract class Dagger2MvpFragment

, M> extends F // PresenterSaverFragment.save(getFragmentManager(), presenter); } - public abstract P getPresenter(); + public abstract MvpPresenter getPresenter(); @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); diff --git a/app/src/main/java/it/cosenonjaviste/ApplicationComponent.java b/app/src/main/java/it/cosenonjaviste/ApplicationComponent.java index cef378e..50be71d 100644 --- a/app/src/main/java/it/cosenonjaviste/ApplicationComponent.java +++ b/app/src/main/java/it/cosenonjaviste/ApplicationComponent.java @@ -3,14 +3,10 @@ import javax.inject.Singleton; import dagger.Component; -import it.cosenonjaviste.category.CategoryListFragment; -import it.cosenonjaviste.category.CategoryListPresenter; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; +import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.page.PageFragment; -import it.cosenonjaviste.page.PagePresenter; -import it.cosenonjaviste.twitter.TweetListFragment; -import it.cosenonjaviste.twitter.TweetListPresenter; +import it.cosenonjaviste.page.PageUrlManager; @Singleton @Component(modules = {AppModule.class}) @@ -18,19 +14,11 @@ public interface ApplicationComponent { void inject(MainActivity activity); - void inject(PageFragment fragment); - - void inject(CategoryListFragment fragment); - - void inject(TweetListFragment fragment); - - PagePresenter getPagePresenter(); - - TweetListPresenter getTweetListPresenter(); - - CategoryListPresenter getCategoryListPresenter(); - SchedulerManager providesSchedulerManager(); WordPressService providesWordPressService(); + + PageUrlManager providesPageUrlManager(); + + TwitterService providesTwitterService(); } diff --git a/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java b/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java index 73c222e..ee48677 100644 --- a/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java +++ b/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java @@ -18,12 +18,25 @@ import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.utils.SingleFragmentActivity; -public abstract class Dagger2CnjFragment

, M> extends Dagger2MvpFragment { +public abstract class Dagger2CnjFragment extends Dagger2MvpFragment { + + private MvpPresenter presenter; + + @Override public final MvpPresenter getPresenter() { + return presenter; + } protected ApplicationComponent getComponent() { return ((CoseNonJavisteApp) getActivity().getApplication()).getComponent(); } + @Override public void onCreate(Bundle state) { + presenter = injectAndCreatePresenter(); + super.onCreate(state); + } + + protected abstract MvpPresenter injectAndCreatePresenter(); + @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { View view = inflater.inflate(getLayoutId(), container, false); initView(view); diff --git a/app/src/main/java/it/cosenonjaviste/ObjectsMapRetainedFragment.java b/app/src/main/java/it/cosenonjaviste/ObjectsMapRetainedFragment.java new file mode 100644 index 0000000..a9d11e2 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/ObjectsMapRetainedFragment.java @@ -0,0 +1,59 @@ +package it.cosenonjaviste; + +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentManager; + +import java.util.HashMap; +import java.util.Map; + +import rx.functions.Func0; + +public class ObjectsMapRetainedFragment extends Fragment { + + private static final String TAG = ObjectsMapRetainedFragment.class.getName(); + + private Map map = new HashMap<>(); + + public ObjectsMapRetainedFragment() { + setRetainInstance(true); + } + + public static void save(FragmentManager fragmentManager, String key, Object obj) { + ObjectsMapRetainedFragment fragment = getSaverFragment(fragmentManager); + fragment.map.put(key, obj); + } + + private static ObjectsMapRetainedFragment getSaverFragment(FragmentManager fragmentManager) { + ObjectsMapRetainedFragment fragment = (ObjectsMapRetainedFragment) fragmentManager.findFragmentByTag(TAG); + if (fragment == null) { + fragment = new ObjectsMapRetainedFragment(); + fragmentManager.beginTransaction().add(fragment, TAG).commit(); + } + return fragment; + } + + public static

P load(FragmentManager fragmentManager, String key) { + if (key != null) { + ObjectsMapRetainedFragment fragment = getSaverFragment(fragmentManager); + return (P) fragment.map.get(key); + } else { + return null; + } + } + + public static C getOrCreate(FragmentManager fragmentManager, String key, Func0 componentFactory) { + C component = ObjectsMapRetainedFragment.load(fragmentManager, key); + if (component == null) { + component = componentFactory.call(); + ObjectsMapRetainedFragment.save(fragmentManager, key, component); + } + return component; + } + + @Override public void onDestroy() { + super.onDestroy(); +// for (MvpPresenter presenter : map.values()) { +// presenter.destroy(); +// } + } +} diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index 7063563..597dbd7 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -1,7 +1,6 @@ package it.cosenonjaviste.author; import android.annotation.SuppressLint; -import android.os.Bundle; import android.view.View; import com.quentindommerc.superlistview.SuperGridview; @@ -11,10 +10,11 @@ import butterknife.InjectView; import butterknife.OnClick; import it.cosenonjaviste.Dagger2CnjFragment; +import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; import rx.functions.Actions; -public class AuthorListFragment extends Dagger2CnjFragment { +public class AuthorListFragment extends Dagger2CnjFragment { @InjectView(R.id.grid) SuperGridview grid; @@ -22,19 +22,15 @@ public class AuthorListFragment extends Dagger2CnjFragment Dagger_AuthorListComponent.builder().applicationComponent(getComponent()).build() + ).inject(this); return presenter; } - protected AuthorListComponent getPresenterComponent() { - return Dagger_AuthorListComponent.builder().applicationComponent(getComponent()).build(); - } - - @Override public void onCreate(Bundle state) { - getPresenterComponent().inject(this); - super.onCreate(state); - } - @Override protected int getLayoutId() { return R.layout.super_grid; } diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListComponent.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListComponent.java new file mode 100644 index 0000000..390dbdb --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListComponent.java @@ -0,0 +1,11 @@ +package it.cosenonjaviste.category; + +import dagger.Component; +import it.cosenonjaviste.ApplicationComponent; +import it.cosenonjaviste.utils.PresenterScope; + +@PresenterScope +@Component(dependencies = ApplicationComponent.class) +public interface CategoryListComponent { + void inject(CategoryListFragment fragment); +} diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java index 6639186..6b8addf 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java @@ -1,30 +1,34 @@ package it.cosenonjaviste.category; import android.annotation.SuppressLint; -import android.os.Bundle; import android.view.View; import com.quentindommerc.superlistview.SuperGridview; +import javax.inject.Inject; + import butterknife.InjectView; import butterknife.OnClick; -import it.cosenonjaviste.CnjFragment; +import it.cosenonjaviste.Dagger2CnjFragment; +import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; import rx.functions.Actions; -public class CategoryListFragment extends CnjFragment { +public class CategoryListFragment extends Dagger2CnjFragment { @InjectView(R.id.grid) SuperGridview grid; private CategoryAdapter adapter; - @Override public void onCreate(Bundle state) { - super.onCreate(state); - getComponent().inject(this); - } + @Inject CategoryListPresenter presenter; - @Override protected CategoryListPresenter createPresenter() { - return getComponent().getCategoryListPresenter(); + @Override protected CategoryListPresenter injectAndCreatePresenter() { + ObjectsMapRetainedFragment.getOrCreate( + getFragmentManager(), + CategoryListFragment.class.getName(), + () -> Dagger_CategoryListComponent.builder().applicationComponent(getComponent()).build() + ).inject(this); + return presenter; } @Override protected int getLayoutId() { diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index f1e57d7..a0b9c0d 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -12,8 +12,10 @@ import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; +import it.cosenonjaviste.utils.PresenterScope; import rx.Observable; +@PresenterScope public class CategoryListPresenter extends RxMvpPresenter { @Inject WordPressService wordPressService; diff --git a/app/src/main/java/it/cosenonjaviste/page/PageComponent.java b/app/src/main/java/it/cosenonjaviste/page/PageComponent.java new file mode 100644 index 0000000..0a4a0f5 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/page/PageComponent.java @@ -0,0 +1,11 @@ +package it.cosenonjaviste.page; + +import dagger.Component; +import it.cosenonjaviste.ApplicationComponent; +import it.cosenonjaviste.utils.PresenterScope; + +@PresenterScope +@Component(dependencies = ApplicationComponent.class) +public interface PageComponent { + void inject(PageFragment fragment); +} diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index 2caf248..f7c242b 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -1,7 +1,6 @@ package it.cosenonjaviste.page; import android.annotation.SuppressLint; -import android.os.Bundle; import android.view.View; import android.webkit.WebResourceResponse; import android.webkit.WebSettings; @@ -11,23 +10,29 @@ import java.io.File; import java.io.IOException; +import javax.inject.Inject; + import butterknife.InjectView; -import it.cosenonjaviste.CnjFragment; +import it.cosenonjaviste.Dagger2CnjFragment; +import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; +import it.cosenonjaviste.lib.mvp.MvpPresenter; -public class PageFragment extends CnjFragment { +public class PageFragment extends Dagger2CnjFragment { @InjectView(R.id.web_view) WebView webView; @InjectView(R.id.progress_detail) View progressBar; - @Override public void onCreate(Bundle state) { - super.onCreate(state); - getComponent().inject(this); - } + @Inject PagePresenter presenter; - @Override protected PagePresenter createPresenter() { - return getComponent().getPagePresenter(); + @Override protected MvpPresenter injectAndCreatePresenter() { + ObjectsMapRetainedFragment.getOrCreate( + getFragmentManager(), + PageFragment.class.getName(), + () -> Dagger_PageComponent.builder().applicationComponent(getComponent()).build() + ).inject(this); + return presenter; } @SuppressLint("SetJavaScriptEnabled") @Override protected void initView(View view) { diff --git a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java index 1fc7b16..4e14540 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java +++ b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java @@ -3,7 +3,9 @@ import javax.inject.Inject; import it.cosenonjaviste.lib.mvp.MvpPresenter; +import it.cosenonjaviste.utils.PresenterScope; +@PresenterScope public class PagePresenter extends MvpPresenter { @Inject PageUrlManager pageUrlManager; diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index c9d0406..01adc01 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -1,7 +1,6 @@ package it.cosenonjaviste.post; import android.annotation.SuppressLint; -import android.os.Bundle; import android.view.View; import com.quentindommerc.superlistview.SuperListview; @@ -11,10 +10,11 @@ import butterknife.InjectView; import butterknife.OnClick; import it.cosenonjaviste.Dagger2CnjFragment; +import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; import rx.functions.Actions; -public class PostListFragment extends Dagger2CnjFragment { +public class PostListFragment extends Dagger2CnjFragment { @InjectView(R.id.list) SuperListview list; @@ -22,23 +22,19 @@ public class PostListFragment extends Dagger2CnjFragment Dagger_PostListComponent.builder().applicationComponent(getComponent()).build() + ).inject(this); return presenter; } - protected PostListComponent getPresenterComponent() { - return Dagger_PostListComponent.builder().applicationComponent(getComponent()).build(); - } - @Override protected int getLayoutId() { return R.layout.super_list; } - @Override public void onCreate(Bundle state) { - getPresenterComponent().inject(this); - super.onCreate(state); - } - @SuppressLint("ResourceAsColor") @Override protected void initView(View view) { super.initView(view); adapter = new PostAdapter(getActivity()); diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index eced8f8..f539754 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -15,8 +15,10 @@ import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; +import it.cosenonjaviste.utils.PresenterScope; import rx.Observable; +@PresenterScope public class PostListPresenter extends RxMvpPresenter { @Inject WordPressService wordPressService; diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListComponent.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListComponent.java new file mode 100644 index 0000000..38e6e53 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListComponent.java @@ -0,0 +1,11 @@ +package it.cosenonjaviste.twitter; + +import dagger.Component; +import it.cosenonjaviste.ApplicationComponent; +import it.cosenonjaviste.utils.PresenterScope; + +@PresenterScope +@Component(dependencies = ApplicationComponent.class) +public interface TweetListComponent { + void inject(TweetListFragment fragment); +} diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index cf54c5f..96da42f 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -1,30 +1,35 @@ package it.cosenonjaviste.twitter; import android.annotation.SuppressLint; -import android.os.Bundle; import android.view.View; import com.quentindommerc.superlistview.SuperListview; +import javax.inject.Inject; + import butterknife.InjectView; import butterknife.OnClick; -import it.cosenonjaviste.CnjFragment; +import it.cosenonjaviste.Dagger2CnjFragment; +import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; +import it.cosenonjaviste.lib.mvp.MvpPresenter; import rx.functions.Actions; -public class TweetListFragment extends CnjFragment { +public class TweetListFragment extends Dagger2CnjFragment { @InjectView(R.id.list) SuperListview list; private TweetAdapter adapter; - @Override public void onCreate(Bundle state) { - super.onCreate(state); - getComponent().inject(this); - } + @Inject TweetListPresenter presenter; - @Override protected TweetListPresenter createPresenter() { - return getComponent().getTweetListPresenter(); + @Override protected MvpPresenter injectAndCreatePresenter() { + ObjectsMapRetainedFragment.getOrCreate( + getFragmentManager(), + TweetListFragment.class.getName(), + () -> Dagger_TweetListComponent.builder().applicationComponent(getComponent()).build() + ).inject(this); + return presenter; } @Override protected int getLayoutId() { diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index af0fe38..3193557 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -9,8 +9,10 @@ import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.Tweet; import it.cosenonjaviste.model.TwitterService; +import it.cosenonjaviste.utils.PresenterScope; import rx.Observable; +@PresenterScope public class TweetListPresenter extends RxMvpPresenter { @Inject TwitterService twitterService; From dd3239bd4d55ccaf1d9c8f9c28792a4fbe088f2b Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 22 Feb 2015 14:47:31 +0100 Subject: [PATCH 027/332] Removed commented code --- .../it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java index 3468689..6b7870c 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java @@ -7,29 +7,20 @@ public abstract class Dagger2MvpFragment extends Fragment implements MvpView { - private static final String PRESENTER_ID = "presenterId"; public static final String MODEL = "model"; @Override public void onCreate(Bundle state) { super.onCreate(state); - long presenterId = 0; M restoredModel = null; if (state != null) { - presenterId = state.getLong(PRESENTER_ID, 0); restoredModel = Parcels.unwrap(state.getParcelable(MODEL)); } if (restoredModel == null && getArguments() != null) { restoredModel = Parcels.unwrap(getArguments().getParcelable(MODEL)); } -// presenter = PresenterSaverFragment.

load(getFragmentManager(), presenterId); -// if (presenter == null) { -// presenter = createPresenter(); -// } getPresenter().init(restoredModel); - -// PresenterSaverFragment.save(getFragmentManager(), presenter); } public abstract MvpPresenter getPresenter(); @@ -37,7 +28,6 @@ public abstract class Dagger2MvpFragment extends Fragment implements MvpView< @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable(MODEL, Parcels.wrap(getPresenter().getModel())); - outState.putLong(PRESENTER_ID, getPresenter().getId()); } @Override public void onStart() { From f3c03228a549b3cc39a58a497d405e784abb737d Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 22 Feb 2015 14:53:34 +0100 Subject: [PATCH 028/332] Removed Dagger Components in JUnit tests --- app/build.gradle | 1 - .../author/AuthorListPresenter.java | 5 +-- .../category/CategoryListPresenter.java | 5 +-- .../it/cosenonjaviste/page/PagePresenter.java | 5 +-- .../post/PostListPresenter.java | 5 +-- .../twitter/TweetListPresenter.java | 5 +-- .../java/it/cosenonjaviste/DaggerUtils.java | 7 ---- .../java/it/cosenonjaviste/TestComponent.java | 35 ------------------- .../model/WordPressServiceTest.java | 13 ++----- .../mvp/MvpJUnitTestModule.java | 27 -------------- .../mvp}/TestSchedulerManager.java | 2 +- .../mvp/author/AuthorListPresenterTest.java | 10 +++--- .../category/CategoryListPresenterTest.java | 10 +++--- .../mvp/page/PagePresenterTest.java | 8 ++--- .../mvp/post/AuthorPostListPresenterTest.java | 10 +++--- .../post/CategoryPostListPresenterTest.java | 10 +++--- .../mvp/post/PostListPresenterTest.java | 10 +++--- .../mvp/twitter/TweetListPresenterTest.java | 10 +++--- 18 files changed, 45 insertions(+), 133 deletions(-) delete mode 100644 app/src/test/java/it/cosenonjaviste/DaggerUtils.java delete mode 100644 app/src/test/java/it/cosenonjaviste/TestComponent.java delete mode 100644 app/src/test/java/it/cosenonjaviste/mvp/MvpJUnitTestModule.java rename app/src/{debug/java/it/cosenonjaviste/stubs => test/java/it/cosenonjaviste/mvp}/TestSchedulerManager.java (92%) diff --git a/app/build.gradle b/app/build.gradle index 5aafb5a..be88f6b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -95,7 +95,6 @@ dependencies { apt 'org.parceler:parceler:0.2.14' androidTestApt 'com.google.dagger:dagger-compiler:2.0-SNAPSHOT' - testCompile 'com.google.dagger:dagger-compiler:2.0-SNAPSHOT' androidTestCompile 'com.google.dexmaker:dexmaker:1.0' androidTestCompile('com.google.dexmaker:dexmaker-mockito:1.0') { exclude group: 'org.hamcrest', module: 'hamcrest-core' diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index 39e1bb5..1dab7a1 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -19,12 +19,13 @@ @PresenterScope public class AuthorListPresenter extends RxMvpPresenter { - @Inject WordPressService wordPressService; + private WordPressService wordPressService; private boolean loadStarted; - @Inject public AuthorListPresenter(SchedulerManager schedulerManager) { + @Inject public AuthorListPresenter(SchedulerManager schedulerManager, WordPressService wordPressService) { super(schedulerManager); + this.wordPressService = wordPressService; } public void loadAuthors() { diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index a0b9c0d..41ba648 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -18,12 +18,13 @@ @PresenterScope public class CategoryListPresenter extends RxMvpPresenter { - @Inject WordPressService wordPressService; + private WordPressService wordPressService; private boolean loadStarted; - @Inject public CategoryListPresenter(SchedulerManager schedulerManager) { + @Inject public CategoryListPresenter(SchedulerManager schedulerManager, WordPressService wordPressService) { super(schedulerManager); + this.wordPressService = wordPressService; } @Override public void subscribe(MvpView view) { diff --git a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java index 4e14540..e883836 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java +++ b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java @@ -8,9 +8,10 @@ @PresenterScope public class PagePresenter extends MvpPresenter { - @Inject PageUrlManager pageUrlManager; + private PageUrlManager pageUrlManager; - @Inject public PagePresenter() { + @Inject public PagePresenter(PageUrlManager pageUrlManager) { + this.pageUrlManager = pageUrlManager; } public String getPostUrl() { diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index f539754..90d6619 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -21,12 +21,13 @@ @PresenterScope public class PostListPresenter extends RxMvpPresenter { - @Inject WordPressService wordPressService; + private WordPressService wordPressService; private boolean loadStarted; - @Inject public PostListPresenter(SchedulerManager schedulerManager) { + @Inject public PostListPresenter(SchedulerManager schedulerManager, WordPressService wordPressService) { super(schedulerManager); + this.wordPressService = wordPressService; } @Override public void subscribe(MvpView view) { diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index 3193557..015e5cc 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -15,12 +15,13 @@ @PresenterScope public class TweetListPresenter extends RxMvpPresenter { - @Inject TwitterService twitterService; + private TwitterService twitterService; private boolean loadStarted; - @Inject public TweetListPresenter(SchedulerManager schedulerManager) { + @Inject public TweetListPresenter(SchedulerManager schedulerManager, TwitterService twitterService) { super(schedulerManager); + this.twitterService = twitterService; } public void reloadData() { diff --git a/app/src/test/java/it/cosenonjaviste/DaggerUtils.java b/app/src/test/java/it/cosenonjaviste/DaggerUtils.java deleted file mode 100644 index 225c2c9..0000000 --- a/app/src/test/java/it/cosenonjaviste/DaggerUtils.java +++ /dev/null @@ -1,7 +0,0 @@ -package it.cosenonjaviste; - -public class DaggerUtils { - public static TestComponent getComponent() { - return Dagger_TestComponent.builder().build(); - } -} diff --git a/app/src/test/java/it/cosenonjaviste/TestComponent.java b/app/src/test/java/it/cosenonjaviste/TestComponent.java deleted file mode 100644 index b86714d..0000000 --- a/app/src/test/java/it/cosenonjaviste/TestComponent.java +++ /dev/null @@ -1,35 +0,0 @@ -package it.cosenonjaviste; - -import javax.inject.Singleton; - -import dagger.Component; -import it.cosenonjaviste.model.WordPressServiceTest; -import it.cosenonjaviste.mvp.MvpJUnitTestModule; -import it.cosenonjaviste.mvp.author.AuthorListPresenterTest; -import it.cosenonjaviste.mvp.category.CategoryListPresenterTest; -import it.cosenonjaviste.mvp.page.PagePresenterTest; -import it.cosenonjaviste.mvp.post.AuthorPostListPresenterTest; -import it.cosenonjaviste.mvp.post.CategoryPostListPresenterTest; -import it.cosenonjaviste.mvp.post.PostListPresenterTest; -import it.cosenonjaviste.mvp.twitter.TweetListPresenterTest; - -@Singleton -@Component(modules = {MvpJUnitTestModule.class, BaseModule.class}) -public interface TestComponent { - void inject(WordPressServiceTest test); - - void inject(TweetListPresenterTest tweetListPresenterTest); - - void inject(AuthorListPresenterTest authorListPresenterTest); - - void inject(CategoryListPresenterTest categoryListPresenterTest); - - void inject(PagePresenterTest pagePresenterTest); - - void inject(AuthorPostListPresenterTest authorPostListPresenterTest); - - void inject(CategoryPostListPresenterTest categoryPostListPresenterTest); - - void inject(PostListPresenterTest postListPresenterTest); - -} diff --git a/app/src/test/java/it/cosenonjaviste/model/WordPressServiceTest.java b/app/src/test/java/it/cosenonjaviste/model/WordPressServiceTest.java index 5421610..82e4f70 100644 --- a/app/src/test/java/it/cosenonjaviste/model/WordPressServiceTest.java +++ b/app/src/test/java/it/cosenonjaviste/model/WordPressServiceTest.java @@ -1,28 +1,19 @@ package it.cosenonjaviste.model; import com.google.gson.Gson; +import com.google.gson.GsonBuilder; -import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.util.List; -import javax.inject.Inject; - -import it.cosenonjaviste.DaggerUtils; - import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; public class WordPressServiceTest { - @Inject Gson gson; - - @Before - public void init() throws IOException { - DaggerUtils.getComponent().inject(this); - } + private Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create(); @Test public void testLoadPosts() throws IOException { diff --git a/app/src/test/java/it/cosenonjaviste/mvp/MvpJUnitTestModule.java b/app/src/test/java/it/cosenonjaviste/mvp/MvpJUnitTestModule.java deleted file mode 100644 index 60c790a..0000000 --- a/app/src/test/java/it/cosenonjaviste/mvp/MvpJUnitTestModule.java +++ /dev/null @@ -1,27 +0,0 @@ -package it.cosenonjaviste.mvp; - -import org.mockito.Mockito; - -import javax.inject.Singleton; - -import dagger.Module; -import dagger.Provides; -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; -import it.cosenonjaviste.model.TwitterService; -import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.stubs.TestSchedulerManager; - -@Module -public class MvpJUnitTestModule { - @Provides @Singleton WordPressService provideWordPressService() { - return Mockito.mock(WordPressService.class); - } - - @Provides @Singleton SchedulerManager provideSchedulerManager(TestSchedulerManager testSchedulerManager) { - return testSchedulerManager; - } - - @Provides @Singleton TwitterService provideTwitterService() { - return Mockito.mock(TwitterService.class); - } -} diff --git a/app/src/debug/java/it/cosenonjaviste/stubs/TestSchedulerManager.java b/app/src/test/java/it/cosenonjaviste/mvp/TestSchedulerManager.java similarity index 92% rename from app/src/debug/java/it/cosenonjaviste/stubs/TestSchedulerManager.java rename to app/src/test/java/it/cosenonjaviste/mvp/TestSchedulerManager.java index 77bd308..668189a 100644 --- a/app/src/debug/java/it/cosenonjaviste/stubs/TestSchedulerManager.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/TestSchedulerManager.java @@ -1,4 +1,4 @@ -package it.cosenonjaviste.stubs; +package it.cosenonjaviste.mvp; import javax.inject.Inject; import javax.inject.Singleton; diff --git a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java index 2b73efb..93dc8dc 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java @@ -8,13 +8,11 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import javax.inject.Inject; - -import it.cosenonjaviste.DaggerUtils; import it.cosenonjaviste.author.AuthorListFragment; import it.cosenonjaviste.author.AuthorListModel; import it.cosenonjaviste.author.AuthorListPresenter; import it.cosenonjaviste.model.WordPressService; +import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.post.PostListModel; import rx.Observable; @@ -29,15 +27,15 @@ public class AuthorListPresenterTest { @Mock AuthorListFragment view; - @Inject AuthorListPresenter presenter; + private AuthorListPresenter presenter; - @Inject WordPressService wordPressService; + @Mock WordPressService wordPressService; @Captor ArgumentCaptor modelCaptor; @Before public void setup() { - DaggerUtils.getComponent().inject(this); + presenter = new AuthorListPresenter(new TestSchedulerManager(), wordPressService); } @Test diff --git a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java index b9aa121..112b357 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java @@ -8,14 +8,12 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import javax.inject.Inject; - -import it.cosenonjaviste.DaggerUtils; import it.cosenonjaviste.category.CategoryListFragment; import it.cosenonjaviste.category.CategoryListModel; import it.cosenonjaviste.category.CategoryListPresenter; import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.WordPressService; +import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.post.PostListModel; import rx.Observable; @@ -28,9 +26,9 @@ @RunWith(MockitoJUnitRunner.class) public class CategoryListPresenterTest { - @Inject WordPressService wordPressService; + @Mock WordPressService wordPressService; - @Inject CategoryListPresenter presenter; + private CategoryListPresenter presenter; @Mock CategoryListFragment view; @@ -38,7 +36,7 @@ public class CategoryListPresenterTest { @Before public void setup() { - DaggerUtils.getComponent().inject(this); + presenter = new CategoryListPresenter(new TestSchedulerManager(), wordPressService); } @Test diff --git a/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java index 1565202..2d791f0 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java @@ -8,12 +8,10 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import javax.inject.Inject; - -import it.cosenonjaviste.DaggerUtils; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; import it.cosenonjaviste.page.PagePresenter; +import it.cosenonjaviste.page.PageUrlManager; import it.cosenonjaviste.post.PostListModel; import static org.assertj.core.api.Assertions.assertThat; @@ -21,7 +19,7 @@ @RunWith(MockitoJUnitRunner.class) public class PagePresenterTest { - @Inject PagePresenter presenter; + private PagePresenter presenter; @Mock PageFragment view; @@ -29,7 +27,7 @@ public class PagePresenterTest { @Before public void setup() { - DaggerUtils.getComponent().inject(this); + presenter = new PagePresenter(new PageUrlManager()); presenter.initAndSubscribe(new PageModel("url"), view); } diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java index 91fe327..4a073ae 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java @@ -6,11 +6,9 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import javax.inject.Inject; - -import it.cosenonjaviste.DaggerUtils; import it.cosenonjaviste.TestData; import it.cosenonjaviste.model.WordPressService; +import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.post.PostListPresenter; @@ -27,13 +25,13 @@ public class AuthorPostListPresenterTest { @Mock PostListFragment view; - @Inject PostListPresenter presenter; + @Mock WordPressService wordPressService; - @Inject WordPressService wordPressService; + private PostListPresenter presenter; @Before public void setup() { - DaggerUtils.getComponent().inject(this); + presenter = new PostListPresenter(new TestSchedulerManager(), wordPressService); } @Test diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java index a246e22..61679f3 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java @@ -6,12 +6,10 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import javax.inject.Inject; - -import it.cosenonjaviste.DaggerUtils; import it.cosenonjaviste.TestData; import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.WordPressService; +import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.post.PostListPresenter; @@ -25,13 +23,13 @@ public class CategoryPostListPresenterTest { @Mock PostListFragment view; - @Inject PostListPresenter presenter; + @Mock WordPressService wordPressService; - @Inject WordPressService wordPressService; + private PostListPresenter presenter; @Before public void setup() { - DaggerUtils.getComponent().inject(this); + presenter = new PostListPresenter(new TestSchedulerManager(), wordPressService); } @Test diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java index d2a7d93..6629bd3 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java @@ -8,12 +8,10 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import javax.inject.Inject; - -import it.cosenonjaviste.DaggerUtils; import it.cosenonjaviste.lib.mvp.utils.OptionalList; import it.cosenonjaviste.model.Post; import it.cosenonjaviste.model.WordPressService; +import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.page.PageModel; import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; @@ -32,13 +30,13 @@ public class PostListPresenterTest { @Mock PostListFragment view; - @Inject PostListPresenter presenter; + @Mock WordPressService wordPressService; - @Inject WordPressService wordPressService; + private PostListPresenter presenter; @Before public void setup() { - DaggerUtils.getComponent().inject(this); + presenter = new PostListPresenter(new TestSchedulerManager(), wordPressService); } @Captor ArgumentCaptor modelCaptor; diff --git a/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java index 2f79e0f..253142f 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java @@ -6,11 +6,9 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import javax.inject.Inject; - -import it.cosenonjaviste.DaggerUtils; import it.cosenonjaviste.TestData; import it.cosenonjaviste.model.TwitterService; +import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.twitter.TweetListFragment; import it.cosenonjaviste.twitter.TweetListModel; import it.cosenonjaviste.twitter.TweetListPresenter; @@ -25,13 +23,13 @@ public class TweetListPresenterTest { @Mock TweetListFragment view; - @Inject TweetListPresenter presenter; + @Mock TwitterService twitterService; - @Inject TwitterService twitterService; + private TweetListPresenter presenter; @Before public void setup() { - DaggerUtils.getComponent().inject(this); + presenter = new TweetListPresenter(new TestSchedulerManager(), twitterService); } @Test public void testLoadTweets() { From 8bb23fde62226fa026b0551b5790a2b9c7f2f8ec Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 22 Feb 2015 15:06:41 +0100 Subject: [PATCH 029/332] Fix second click on a menu item --- .../main/java/it/cosenonjaviste/author/AuthorListFragment.java | 2 +- .../java/it/cosenonjaviste/category/CategoryListFragment.java | 2 +- app/src/main/java/it/cosenonjaviste/page/PageFragment.java | 2 +- app/src/main/java/it/cosenonjaviste/post/PostListFragment.java | 2 +- .../main/java/it/cosenonjaviste/twitter/TweetListFragment.java | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index 597dbd7..173d0be 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -24,7 +24,7 @@ public class AuthorListFragment extends Dagger2CnjFragment { @Override protected AuthorListPresenter injectAndCreatePresenter() { ObjectsMapRetainedFragment.getOrCreate( - getFragmentManager(), + getChildFragmentManager(), AuthorListFragment.class.getName(), () -> Dagger_AuthorListComponent.builder().applicationComponent(getComponent()).build() ).inject(this); diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java index 6b8addf..638779d 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java @@ -24,7 +24,7 @@ public class CategoryListFragment extends Dagger2CnjFragment @Override protected CategoryListPresenter injectAndCreatePresenter() { ObjectsMapRetainedFragment.getOrCreate( - getFragmentManager(), + getChildFragmentManager(), CategoryListFragment.class.getName(), () -> Dagger_CategoryListComponent.builder().applicationComponent(getComponent()).build() ).inject(this); diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index f7c242b..b7ce25e 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -28,7 +28,7 @@ public class PageFragment extends Dagger2CnjFragment { @Override protected MvpPresenter injectAndCreatePresenter() { ObjectsMapRetainedFragment.getOrCreate( - getFragmentManager(), + getChildFragmentManager(), PageFragment.class.getName(), () -> Dagger_PageComponent.builder().applicationComponent(getComponent()).build() ).inject(this); diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index 01adc01..4504ee1 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -24,7 +24,7 @@ public class PostListFragment extends Dagger2CnjFragment { @Override protected PostListPresenter injectAndCreatePresenter() { ObjectsMapRetainedFragment.getOrCreate( - getFragmentManager(), + getChildFragmentManager(), PostListFragment.class.getName(), () -> Dagger_PostListComponent.builder().applicationComponent(getComponent()).build() ).inject(this); diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index 96da42f..5fa3397 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -25,7 +25,7 @@ public class TweetListFragment extends Dagger2CnjFragment { @Override protected MvpPresenter injectAndCreatePresenter() { ObjectsMapRetainedFragment.getOrCreate( - getFragmentManager(), + getChildFragmentManager(), TweetListFragment.class.getName(), () -> Dagger_TweetListComponent.builder().applicationComponent(getComponent()).build() ).inject(this); From a91ea4b11c8c54a4c26f5f48f24c4eb3b5e01984 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Tue, 3 Mar 2015 22:37:58 +0100 Subject: [PATCH 030/332] Field and param rename --- .../it/cosenonjaviste/category/CategoryAdapter.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryAdapter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryAdapter.java index 941f29e..cdc3526 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryAdapter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryAdapter.java @@ -17,7 +17,7 @@ public class CategoryAdapter extends BaseAdapter { - private List authors = new ArrayList<>(); + private List categories = new ArrayList<>(); private Context context; @@ -26,11 +26,11 @@ public CategoryAdapter(Context context) { } @Override public int getCount() { - return authors.size(); + return categories.size(); } @Override public Category getItem(int position) { - return authors.get(position); + return categories.get(position); } @Override public long getItemId(int position) { @@ -51,8 +51,8 @@ public CategoryAdapter(Context context) { return convertView; } - public void reloadData(List posts) { - this.authors = posts; + public void reloadData(List categories) { + this.categories = categories; notifyDataSetChanged(); } From d29c1318b9e95395467c8aacacb683da8b1f880d Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Thu, 19 Mar 2015 23:04:05 +0100 Subject: [PATCH 031/332] Build tools 1.1.2 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index c28ce4b..057521a 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.1.0' + classpath 'com.android.tools.build:gradle:1.1.2' classpath 'me.tatarka:gradle-retrolambda:2.5.0' // NOTE: Do not place your application dependencies here; they belong From b5d4b34f7b52b7b0d2aa43e66d6cebfe1a42b57b Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 26 Apr 2015 11:06:13 +0200 Subject: [PATCH 032/332] Dagger 2.0 and retrolambda 3.0.1 --- app/build.gradle | 6 +++--- .../it/cosenonjaviste/androidtest/base/DaggerUtils.java | 2 +- app/src/main/java/it/cosenonjaviste/AppModule.java | 2 +- app/src/main/java/it/cosenonjaviste/BaseModule.java | 2 +- app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java | 2 +- .../java/it/cosenonjaviste/author/AuthorListFragment.java | 2 +- .../it/cosenonjaviste/category/CategoryListFragment.java | 2 +- app/src/main/java/it/cosenonjaviste/page/PageFragment.java | 2 +- .../main/java/it/cosenonjaviste/post/PostListFragment.java | 2 +- .../java/it/cosenonjaviste/twitter/TweetListFragment.java | 2 +- build.gradle | 5 ++--- 11 files changed, 14 insertions(+), 15 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index be88f6b..0c9255a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -84,17 +84,17 @@ dependencies { compile project(':SuperListviewLibrary') compile 'com.squareup.okhttp:okhttp:2.0.0' compile 'com.squareup.retrofit:retrofit:1.9.0' - compile 'com.google.dagger:dagger:2.0-SNAPSHOT' + compile 'com.google.dagger:dagger:2.0' compile 'org.twitter4j:twitter4j-core:4.0.2' compile 'com.android.support:cardview-v7:21.0.3' compile 'io.reactivex:rxandroid-framework:0.24.0' compile 'com.jakewharton:butterknife:6.1.0' compile 'com.squareup.picasso:picasso:2.5.0' compile 'org.glassfish:javax.annotation:10.0-b28' - apt 'com.google.dagger:dagger-compiler:2.0-SNAPSHOT' + apt 'com.google.dagger:dagger-compiler:2.0' apt 'org.parceler:parceler:0.2.14' - androidTestApt 'com.google.dagger:dagger-compiler:2.0-SNAPSHOT' + androidTestApt 'com.google.dagger:dagger-compiler:2.0' androidTestCompile 'com.google.dexmaker:dexmaker:1.0' androidTestCompile('com.google.dexmaker:dexmaker-mockito:1.0') { exclude group: 'org.hamcrest', module: 'hamcrest-core' diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerUtils.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerUtils.java index 8df26e3..9163503 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerUtils.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerUtils.java @@ -2,6 +2,6 @@ public class DaggerUtils { public static TestComponent getComponent() { - return Dagger_TestComponent.builder().build(); + return DaggerTestComponent.builder().build(); } } diff --git a/app/src/main/java/it/cosenonjaviste/AppModule.java b/app/src/main/java/it/cosenonjaviste/AppModule.java index 172f87f..7c9bdac 100644 --- a/app/src/main/java/it/cosenonjaviste/AppModule.java +++ b/app/src/main/java/it/cosenonjaviste/AppModule.java @@ -14,7 +14,7 @@ import retrofit.RestAdapter; import retrofit.converter.GsonConverter; -@Module(library = true, includes = BaseModule.class) +@Module(includes = BaseModule.class) public class AppModule { private Application application; diff --git a/app/src/main/java/it/cosenonjaviste/BaseModule.java b/app/src/main/java/it/cosenonjaviste/BaseModule.java index 332f644..e226261 100644 --- a/app/src/main/java/it/cosenonjaviste/BaseModule.java +++ b/app/src/main/java/it/cosenonjaviste/BaseModule.java @@ -8,7 +8,7 @@ import dagger.Module; import dagger.Provides; -@Module(library = true) +@Module public class BaseModule { @Provides @Singleton Gson provideGson() { return new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create(); diff --git a/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java b/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java index 43bcc31..237b07d 100644 --- a/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java +++ b/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java @@ -8,7 +8,7 @@ public class CoseNonJavisteApp extends Application { @Override public void onCreate() { super.onCreate(); - component = Dagger_ApplicationComponent.builder() + component = DaggerApplicationComponent.builder() .appModule(new AppModule(this)) .build(); } diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index 173d0be..19f8c20 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -26,7 +26,7 @@ public class AuthorListFragment extends Dagger2CnjFragment { ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), AuthorListFragment.class.getName(), - () -> Dagger_AuthorListComponent.builder().applicationComponent(getComponent()).build() + () -> DaggerAuthorListComponent.builder().applicationComponent(getComponent()).build() ).inject(this); return presenter; } diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java index 638779d..dc43bef 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java @@ -26,7 +26,7 @@ public class CategoryListFragment extends Dagger2CnjFragment ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), CategoryListFragment.class.getName(), - () -> Dagger_CategoryListComponent.builder().applicationComponent(getComponent()).build() + () -> DaggerCategoryListComponent.builder().applicationComponent(getComponent()).build() ).inject(this); return presenter; } diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index b7ce25e..4336f43 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -30,7 +30,7 @@ public class PageFragment extends Dagger2CnjFragment { ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), PageFragment.class.getName(), - () -> Dagger_PageComponent.builder().applicationComponent(getComponent()).build() + () -> DaggerPageComponent.builder().applicationComponent(getComponent()).build() ).inject(this); return presenter; } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index 4504ee1..06d9a5a 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -26,7 +26,7 @@ public class PostListFragment extends Dagger2CnjFragment { ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), PostListFragment.class.getName(), - () -> Dagger_PostListComponent.builder().applicationComponent(getComponent()).build() + () -> DaggerPostListComponent.builder().applicationComponent(getComponent()).build() ).inject(this); return presenter; } diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index 5fa3397..4469bbe 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -27,7 +27,7 @@ public class TweetListFragment extends Dagger2CnjFragment { ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), TweetListFragment.class.getName(), - () -> Dagger_TweetListComponent.builder().applicationComponent(getComponent()).build() + () -> DaggerTweetListComponent.builder().applicationComponent(getComponent()).build() ).inject(this); return presenter; } diff --git a/build.gradle b/build.gradle index 057521a..9c749c6 100644 --- a/build.gradle +++ b/build.gradle @@ -5,8 +5,8 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.1.2' - classpath 'me.tatarka:gradle-retrolambda:2.5.0' + classpath 'com.android.tools.build:gradle:1.1.3' + classpath 'me.tatarka:gradle-retrolambda:3.0.1' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files @@ -16,6 +16,5 @@ buildscript { allprojects { repositories { jcenter() - maven { url 'https://oss.sonatype.org/content/repositories/snapshots/' } } } From b275a15377a4641871bef29081b91f054a4b192d Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 26 Apr 2015 11:43:34 +0200 Subject: [PATCH 033/332] Moved onCreateView in fragments --- README.md | 4 +-- .../it/cosenonjaviste/Dagger2CnjFragment.java | 28 ------------------- .../author/AuthorListFragment.java | 15 ++++++---- .../category/CategoryListFragment.java | 15 ++++++---- .../it/cosenonjaviste/page/PageFragment.java | 27 ++++++++++-------- .../cosenonjaviste/post/PostListFragment.java | 15 ++++++---- .../twitter/TweetListFragment.java | 15 ++++++---- 7 files changed, 53 insertions(+), 66 deletions(-) diff --git a/README.md b/README.md index 3774915..ab8fefc 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # CoseNonJavisteAndroidApp Android app of blog cosenonjaviste.it -[![Build Status](https://travis-ci.org/fabioCollini/CoseNonJavisteAndroidApp.svg?branch=master)](https://travis-ci.org/fabioCollini/CoseNonJavisteAndroidApp) -[![Coverage Status](https://coveralls.io/repos/fabioCollini/CoseNonJavisteAndroidApp/badge.svg?branch=master)](https://coveralls.io/r/fabioCollini/CoseNonJavisteAndroidApp?branch=master) +[![Build Status](https://travis-ci.org/commit-non-javisti/CoseNonJavisteAndroidApp.svg?branch=master)](https://travis-ci.org/fabioCollini/CoseNonJavisteAndroidApp) +[![Coverage Status](https://coveralls.io/repos/commit-non-javisti/CoseNonJavisteAndroidApp/badge.svg?branch=master)](https://coveralls.io/r/fabioCollini/CoseNonJavisteAndroidApp?branch=master) diff --git a/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java b/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java index ee48677..af7cf9d 100644 --- a/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java +++ b/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java @@ -1,18 +1,10 @@ package it.cosenonjaviste; -import android.content.Context; import android.content.Intent; import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; import org.parceler.Parcels; -import butterknife.ButterKnife; import it.cosenonjaviste.lib.mvp.Dagger2MvpFragment; import it.cosenonjaviste.lib.mvp.MvpPresenter; import it.cosenonjaviste.lib.mvp.MvpView; @@ -37,29 +29,9 @@ protected ApplicationComponent getComponent() { protected abstract MvpPresenter injectAndCreatePresenter(); - @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(getLayoutId(), container, false); - initView(view); - return view; - } - - protected void initView(View view) { - ButterKnife.inject(this, view); - } - - protected abstract int getLayoutId(); - @Override public void open(Class> viewClass, MM model) { Intent intent = SingleFragmentActivity.createIntent(getActivity(), viewClass); intent.putExtra(MODEL, Parcels.wrap(model)); getActivity().startActivity(intent); } - - public static T createView(@NonNull Context context, @NonNull Class> viewClass, @NonNull M model) { - Fragment fragment = Fragment.instantiate(context, viewClass.getName()); - Bundle bundle = new Bundle(); - bundle.putParcelable(MODEL, Parcels.wrap(model)); - fragment.setArguments(bundle); - return (T) fragment; - } } diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index 19f8c20..1c76d80 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -1,12 +1,17 @@ package it.cosenonjaviste.author; import android.annotation.SuppressLint; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import com.quentindommerc.superlistview.SuperGridview; import javax.inject.Inject; +import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; import it.cosenonjaviste.Dagger2CnjFragment; @@ -31,16 +36,14 @@ public class AuthorListFragment extends Dagger2CnjFragment { return presenter; } - @Override protected int getLayoutId() { - return R.layout.super_grid; - } - - @SuppressLint("ResourceAsColor") @Override protected void initView(View view) { - super.initView(view); + @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.super_grid, container, false); + ButterKnife.inject(this, view); adapter = new AuthorAdapter(getActivity()); grid.getList().setNumColumns(2); grid.setAdapter(adapter); grid.setOnItemClickListener((parent, v, position, id) -> presenter.goToAuthorDetail(position)); + return view; } @OnClick(R.id.error_retry) void retry() { diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java index dc43bef..626f57b 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java @@ -1,12 +1,17 @@ package it.cosenonjaviste.category; import android.annotation.SuppressLint; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import com.quentindommerc.superlistview.SuperGridview; import javax.inject.Inject; +import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; import it.cosenonjaviste.Dagger2CnjFragment; @@ -31,17 +36,15 @@ public class CategoryListFragment extends Dagger2CnjFragment return presenter; } - @Override protected int getLayoutId() { - return R.layout.super_grid; - } - - @SuppressLint("ResourceAsColor") @Override protected void initView(View view) { - super.initView(view); + @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.super_grid, container, false); + ButterKnife.inject(this, view); adapter = new CategoryAdapter(getActivity()); grid.setAdapter(adapter); grid.getList().setNumColumns(2); grid.setRefreshingColor(android.R.color.holo_orange_light, android.R.color.holo_blue_light, android.R.color.holo_green_light, android.R.color.holo_red_light); grid.setOnItemClickListener((parent, v, position, id) -> presenter.goToPosts(position)); + return view; } @OnClick(R.id.error_retry) void retry() { diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index 4336f43..aa0e2ea 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -1,7 +1,11 @@ package it.cosenonjaviste.page; import android.annotation.SuppressLint; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import android.webkit.WebResourceResponse; import android.webkit.WebSettings; import android.webkit.WebView; @@ -12,6 +16,7 @@ import javax.inject.Inject; +import butterknife.ButterKnife; import butterknife.InjectView; import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.ObjectsMapRetainedFragment; @@ -35,8 +40,9 @@ public class PageFragment extends Dagger2CnjFragment { return presenter; } - @SuppressLint("SetJavaScriptEnabled") @Override protected void initView(View view) { - super.initView(view); + @SuppressLint("SetJavaScriptEnabled") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.post_detail, container, false); + ButterKnife.inject(this, view); WebSettings settings = webView.getSettings(); settings.setJavaScriptEnabled(true); @@ -50,12 +56,12 @@ public class PageFragment extends Dagger2CnjFragment { webView.setWebViewClient(new WebViewClient() { @Override - public boolean shouldOverrideUrlLoading(WebView view, String url) { - view.loadUrl(url); + public boolean shouldOverrideUrlLoading(WebView view11, String url) { + view11.loadUrl(url); return true; } - @Override public WebResourceResponse shouldInterceptRequest(WebView view, String url) { + @Override public WebResourceResponse shouldInterceptRequest(WebView view11, String url) { if (url.equalsIgnoreCase("http://www.cosenonjaviste.it/wp-content/themes/flexform/style.css")) { return getCssWebResourceResponseFromAsset(); } @@ -70,7 +76,7 @@ public boolean shouldOverrideUrlLoading(WebView view, String url) { ) { return null; } - return super.shouldInterceptRequest(view, url); + return super.shouldInterceptRequest(view11, url); } private WebResourceResponse getCssWebResourceResponseFromAsset() { @@ -82,16 +88,13 @@ private WebResourceResponse getCssWebResourceResponseFromAsset() { } @Override - public void onPageFinished(WebView view, String url) { - super.onPageFinished(view, url); + public void onPageFinished(WebView view11, String url) { + super.onPageFinished(view11, url); webView.setVisibility(View.VISIBLE); progressBar.setVisibility(View.INVISIBLE); } }); - } - - @Override protected int getLayoutId() { - return R.layout.post_detail; + return view; } @Override public void update(PageModel model) { diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index 06d9a5a..4ab1895 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -1,12 +1,17 @@ package it.cosenonjaviste.post; import android.annotation.SuppressLint; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import com.quentindommerc.superlistview.SuperListview; import javax.inject.Inject; +import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; import it.cosenonjaviste.Dagger2CnjFragment; @@ -31,18 +36,16 @@ public class PostListFragment extends Dagger2CnjFragment { return presenter; } - @Override protected int getLayoutId() { - return R.layout.super_list; - } - - @SuppressLint("ResourceAsColor") @Override protected void initView(View view) { - super.initView(view); + @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.super_list, container, false); + ButterKnife.inject(this, view); adapter = new PostAdapter(getActivity()); list.setAdapter(adapter); list.setRefreshingColor(android.R.color.holo_orange_light, android.R.color.holo_blue_light, android.R.color.holo_green_light, android.R.color.holo_red_light); list.setRefreshListener(presenter::reloadData); list.setOnItemClickListener((parent, v, position, id) -> presenter.goToDetail(adapter.getItem(position))); list.setupMoreListener((numberOfItems, numberBeforeMore, currentItemPos) -> presenter.loadNextPage(), 1); + return view; } @OnClick(R.id.error_retry) void retry() { diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index 4469bbe..e19c1bf 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -1,12 +1,17 @@ package it.cosenonjaviste.twitter; import android.annotation.SuppressLint; +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.view.LayoutInflater; import android.view.View; +import android.view.ViewGroup; import com.quentindommerc.superlistview.SuperListview; import javax.inject.Inject; +import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; import it.cosenonjaviste.Dagger2CnjFragment; @@ -32,17 +37,15 @@ public class TweetListFragment extends Dagger2CnjFragment { return presenter; } - @Override protected int getLayoutId() { - return R.layout.super_list; - } - - @SuppressLint("ResourceAsColor") @Override protected void initView(View view) { - super.initView(view); + @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.super_list, container, false); + ButterKnife.inject(this, view); adapter = new TweetAdapter(getActivity()); list.setAdapter(adapter); list.setRefreshingColor(android.R.color.holo_orange_light, android.R.color.holo_blue_light, android.R.color.holo_green_light, android.R.color.holo_red_light); list.setRefreshListener(presenter::reloadData); list.setupMoreListener((numberOfItems, numberBeforeMore, currentItemPos) -> presenter.loadNextPage(), 1); + return view; } @OnClick(R.id.error_retry) void retry() { From 0f8ba29f6ac006ca290c1c4600bc40175434724e Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 26 Apr 2015 11:49:00 +0200 Subject: [PATCH 034/332] Moved getComponent in Application --- .../androidtest/base/DaggerRule.java | 17 ----------------- .../it/cosenonjaviste/CoseNonJavisteApp.java | 5 +++++ .../it/cosenonjaviste/Dagger2CnjFragment.java | 4 ---- .../author/AuthorListFragment.java | 3 ++- .../category/CategoryListFragment.java | 3 ++- .../it/cosenonjaviste/page/PageFragment.java | 3 ++- .../cosenonjaviste/post/PostListFragment.java | 3 ++- .../twitter/TweetListFragment.java | 3 ++- 8 files changed, 15 insertions(+), 26 deletions(-) diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java index 5419664..34bda16 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java @@ -37,15 +37,6 @@ public DaggerRule(Action1 afterInjectAction) { } CoseNonJavisteApp.component = component; -// ObjectGraphHolder.forceObjectGraphCreator(app -> { -// Object[] modules = mergeArrays(app.getModules(), new Object[]{testModule}); -// ObjectGraph objectGraph = ObjectGraph.create(modules); -// if (afterInjectAction != null) { -// afterInjectAction.call(objectGraph); -// } -// return objectGraph; -// }); - registerIdlingResources(espressoExecutor); SchedulerManager.setIo(Schedulers.from(espressoExecutor)); @@ -68,12 +59,4 @@ private void setupDexmaker() { // final String dexCache = getInstrumentation().getTargetContext().getCacheDir().getPath(); // System.setProperty("dexmaker.dexcache", dexCache); } - - private Object[] mergeArrays(Object[] appModules, Object[] testModules) { - Object[] modules = new Object[testModules.length + appModules.length]; - System.arraycopy(appModules, 0, modules, 0, appModules.length); - System.arraycopy(testModules, 0, modules, appModules.length, testModules.length); - return modules; - } - } diff --git a/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java b/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java index 237b07d..a6ff631 100644 --- a/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java +++ b/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java @@ -1,6 +1,7 @@ package it.cosenonjaviste; import android.app.Application; +import android.content.Context; public class CoseNonJavisteApp extends Application { @@ -16,4 +17,8 @@ public class CoseNonJavisteApp extends Application { public ApplicationComponent getComponent() { return component; } + + public static ApplicationComponent getComponent(Context context) { + return ((CoseNonJavisteApp) context.getApplicationContext()).getComponent(); + } } diff --git a/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java b/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java index af7cf9d..0697c4f 100644 --- a/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java +++ b/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java @@ -18,10 +18,6 @@ public abstract class Dagger2CnjFragment extends Dagger2MvpFragment { return presenter; } - protected ApplicationComponent getComponent() { - return ((CoseNonJavisteApp) getActivity().getApplication()).getComponent(); - } - @Override public void onCreate(Bundle state) { presenter = injectAndCreatePresenter(); super.onCreate(state); diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index 1c76d80..1817b16 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -14,6 +14,7 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; +import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; @@ -31,7 +32,7 @@ public class AuthorListFragment extends Dagger2CnjFragment { ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), AuthorListFragment.class.getName(), - () -> DaggerAuthorListComponent.builder().applicationComponent(getComponent()).build() + () -> DaggerAuthorListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); return presenter; } diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java index 626f57b..1b4ad56 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java @@ -14,6 +14,7 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; +import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; @@ -31,7 +32,7 @@ public class CategoryListFragment extends Dagger2CnjFragment ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), CategoryListFragment.class.getName(), - () -> DaggerCategoryListComponent.builder().applicationComponent(getComponent()).build() + () -> DaggerCategoryListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); return presenter; } diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index aa0e2ea..e876107 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -18,6 +18,7 @@ import butterknife.ButterKnife; import butterknife.InjectView; +import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; @@ -35,7 +36,7 @@ public class PageFragment extends Dagger2CnjFragment { ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), PageFragment.class.getName(), - () -> DaggerPageComponent.builder().applicationComponent(getComponent()).build() + () -> DaggerPageComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); return presenter; } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index 4ab1895..73aaf29 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -14,6 +14,7 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; +import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; @@ -31,7 +32,7 @@ public class PostListFragment extends Dagger2CnjFragment { ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), PostListFragment.class.getName(), - () -> DaggerPostListComponent.builder().applicationComponent(getComponent()).build() + () -> DaggerPostListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); return presenter; } diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index e19c1bf..27207fa 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -14,6 +14,7 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; +import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; @@ -32,7 +33,7 @@ public class TweetListFragment extends Dagger2CnjFragment { ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), TweetListFragment.class.getName(), - () -> DaggerTweetListComponent.builder().applicationComponent(getComponent()).build() + () -> DaggerTweetListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); return presenter; } From 3c25e1005c10c80aad973a46bb30ef3b64995fb4 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Mon, 27 Apr 2015 21:31:51 +0200 Subject: [PATCH 035/332] New class RxHolder --- .../cosenonjaviste/lib/mvp/MvpFragment.java | 8 +- .../cosenonjaviste/lib/mvp/MvpPresenter.java | 14 --- .../lib/mvp/ObservableWithFactory.java | 16 +++ .../lib/mvp/RxMvpPresenter.java | 78 ++------------ .../lib/mvp/utils/PresenterSaverFragment.java | 19 ++-- .../lib/mvp/utils/RxHolder.java | 101 ++++++++++++++++++ 6 files changed, 132 insertions(+), 104 deletions(-) create mode 100644 androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/ObservableWithFactory.java create mode 100644 androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java index 4d6dd01..c0b03de 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java @@ -9,7 +9,6 @@ public abstract class MvpFragment

, M> extends Fragment implements MvpView { - private static final String PRESENTER_ID = "presenterId"; public static final String MODEL = "model"; protected P presenter; @@ -17,29 +16,26 @@ public abstract class MvpFragment

, M> extends Fragment @Override public void onCreate(Bundle state) { super.onCreate(state); - long presenterId = 0; M restoredModel = null; if (state != null) { - presenterId = state.getLong(PRESENTER_ID, 0); restoredModel = Parcels.unwrap(state.getParcelable(MODEL)); } if (restoredModel == null && getArguments() != null) { restoredModel = Parcels.unwrap(getArguments().getParcelable(MODEL)); } - presenter = PresenterSaverFragment.

load(getFragmentManager(), presenterId); + presenter = PresenterSaverFragment.

load(getChildFragmentManager()); if (presenter == null) { presenter = createPresenter(); } presenter.init(restoredModel); - PresenterSaverFragment.save(getFragmentManager(), presenter); + PresenterSaverFragment.save(getChildFragmentManager(), presenter); } @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putParcelable(MODEL, Parcels.wrap(presenter.getModel())); - outState.putLong(PRESENTER_ID, presenter.getId()); } @Override public void onStart() { diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpPresenter.java index a73f3ea..bca9159 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpPresenter.java @@ -1,20 +1,10 @@ package it.cosenonjaviste.lib.mvp; -import java.util.concurrent.atomic.AtomicLong; - public abstract class MvpPresenter { protected M model; protected MvpView view; - private long id; - - private static AtomicLong sequence = new AtomicLong(1); - - protected MvpPresenter() { - id = sequence.getAndIncrement(); - } - public void init(M model) { this.model = model; } @@ -24,10 +14,6 @@ public void initAndSubscribe(M model, MvpView view) { subscribe(view); } - public long getId() { - return id; - } - public M getModel() { return model; } diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/ObservableWithFactory.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/ObservableWithFactory.java new file mode 100644 index 0000000..001ac56 --- /dev/null +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/ObservableWithFactory.java @@ -0,0 +1,16 @@ +package it.cosenonjaviste.lib.mvp; + +import rx.Observable; +import rx.Subscriber; +import rx.functions.Func0; + +public class ObservableWithFactory { + public final Observable observable; + + public final Func0> subscriberFactory; + + public ObservableWithFactory(Observable observable, Func0> subscriberFactory) { + this.observable = observable; + this.subscriberFactory = subscriberFactory; + } +} diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index 79e69e1..30336a7 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -1,99 +1,35 @@ package it.cosenonjaviste.lib.mvp; -import java.util.ArrayList; -import java.util.List; - +import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import rx.Observable; -import rx.Subscriber; import rx.functions.Action0; import rx.functions.Action1; -import rx.functions.Actions; -import rx.functions.Func0; -import rx.observables.ConnectableObservable; -import rx.subscriptions.CompositeSubscription; public abstract class RxMvpPresenter extends MvpPresenter { - private SchedulerManager schedulerManager; - - private final CompositeSubscription connectableSubscriptions = new CompositeSubscription(); - - private CompositeSubscription subscriptions = new CompositeSubscription(); - - private final List observables = new ArrayList<>(); + private final RxHolder rxHolder; public RxMvpPresenter(SchedulerManager schedulerManager) { - this.schedulerManager = schedulerManager; + rxHolder = new RxHolder(schedulerManager); } public void pause() { super.pause(); - subscriptions.unsubscribe(); - subscriptions = new CompositeSubscription(); + rxHolder.pause(); } @Override public void subscribe(MvpView view) { super.subscribe(view); - for (ObservableWithFactory observableWithFactory : observables) { - subscribe(observableWithFactory); - } + rxHolder.resubscribePendingObservable(); } public void destroy() { - connectableSubscriptions.unsubscribe(); + rxHolder.destroy(); } protected void subscribe(Observable observable, Action0 onAttach, Action1 onNext, Action1 onError) { - ConnectableObservable replay = schedulerManager.bindObservable(observable).replay(); - connectableSubscriptions.add(replay.connect()); - Func0> factory = () -> new Subscriber() { - @Override public void onStart() { - if (onAttach != null) { - onAttach.call(); - } - } - - @Override public void onCompleted() { - - } - - @Override public void onError(Throwable e) { - if (onError != null) { - onError.call(e); - } - } - - @Override public void onNext(T t) { - if (onNext != null) { - onNext.call(t); - } - } - }; - ObservableWithFactory observableWithFactory = new ObservableWithFactory<>(replay, factory); - observables.add(observableWithFactory); - subscribe(observableWithFactory); - } - - private void subscribe(ObservableWithFactory observableWithFactory) { - Observable observable = observableWithFactory.observable; - Subscriber subscriber = observableWithFactory.subscriberFactory.call(); - subscriptions.add(observable.subscribe( - Actions.empty(), - t -> observables.remove(observableWithFactory), - () -> observables.remove(observableWithFactory))); - subscriptions.add(observable.subscribe(subscriber)); - } - - public static class ObservableWithFactory { - public final Observable observable; - - public final Func0> subscriberFactory; - - ObservableWithFactory(Observable observable, Func0> subscriberFactory) { - this.observable = observable; - this.subscriberFactory = subscriberFactory; - } + rxHolder.subscribePausable(observable, onAttach, onNext, onError, null); } } \ No newline at end of file diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java index 54ab192..90e3107 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java @@ -3,16 +3,13 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; -import java.util.HashMap; -import java.util.Map; - import it.cosenonjaviste.lib.mvp.MvpPresenter; public class PresenterSaverFragment extends Fragment { private static final String TAG = PresenterSaverFragment.class.getName(); - private Map> presenters = new HashMap<>(); + private MvpPresenter presenter; public PresenterSaverFragment() { setRetainInstance(true); @@ -20,7 +17,7 @@ public PresenterSaverFragment() { public static void save(FragmentManager fragmentManager, MvpPresenter presenter) { PresenterSaverFragment fragment = getPresenterSaverFragment(fragmentManager); - fragment.presenters.put(presenter.getId(), presenter); + fragment.presenter = presenter; } private static PresenterSaverFragment getPresenterSaverFragment(FragmentManager fragmentManager) { @@ -32,18 +29,14 @@ private static PresenterSaverFragment getPresenterSaverFragment(FragmentManager return fragment; } - public static

> P load(FragmentManager fragmentManager, long id) { - if (id != 0) { - PresenterSaverFragment fragment = getPresenterSaverFragment(fragmentManager); - return (P) fragment.presenters.get(id); - } else { - return null; - } + public static

> P load(FragmentManager fragmentManager) { + PresenterSaverFragment fragment = getPresenterSaverFragment(fragmentManager); + return (P) fragment.presenter; } @Override public void onDestroy() { super.onDestroy(); - for (MvpPresenter presenter : presenters.values()) { + if (presenter != null) { presenter.destroy(); } } diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java new file mode 100644 index 0000000..981ee4e --- /dev/null +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java @@ -0,0 +1,101 @@ +package it.cosenonjaviste.lib.mvp.utils; + +import java.util.ArrayList; +import java.util.List; + +import it.cosenonjaviste.lib.mvp.ObservableWithFactory; +import rx.Observable; +import rx.Subscriber; +import rx.functions.Action0; +import rx.functions.Action1; +import rx.functions.Actions; +import rx.functions.Func0; +import rx.observables.ConnectableObservable; +import rx.subscriptions.CompositeSubscription; + +public class RxHolder { + private SchedulerManager schedulerManager; + + private final CompositeSubscription connectableSubscriptions = new CompositeSubscription(); + + private CompositeSubscription subscriptions = new CompositeSubscription(); + + protected final List observables = new ArrayList<>(); + + public RxHolder(SchedulerManager schedulerManager) { + this.schedulerManager = schedulerManager; + } + + public void subscribePausable(Observable observable, Action0 onAttach, Action1 onNext, Action1 onError, Action0 onCompleted) { + ConnectableObservable replay = schedulerManager.bindObservable(observable).replay(); + connectableSubscriptions.add(replay.connect()); + Func0> factory = () -> new Subscriber() { + @Override public void onStart() { + if (onAttach != null) { + onAttach.call(); + } + } + + @Override public void onCompleted() { + if (onCompleted != null) { + onCompleted.call(); + } + } + + @Override public void onError(Throwable e) { + if (onError != null) { + onError.call(e); + } + } + + @Override public void onNext(T t) { + if (onNext != null) { + onNext.call(t); + } + } + }; + ObservableWithFactory observableWithFactory = new ObservableWithFactory<>(replay, factory); + observables.add(observableWithFactory); + subscribe(observableWithFactory); + } + + + private void subscribe(ObservableWithFactory observableWithFactory) { + Observable observable = observableWithFactory.observable; + Subscriber subscriber = observableWithFactory.subscriberFactory.call(); + subscriptions.add(observable.subscribe( + Actions.empty(), + t -> removeObservableFactory(observableWithFactory), + () -> removeObservableFactory(observableWithFactory))); + subscriptions.add(observable.subscribe(subscriber)); + } + + + private boolean removeObservableFactory(ObservableWithFactory observableWithFactory) { + return observables.remove(observableWithFactory); + } + + public void resubscribePendingObservable() { + ArrayList observableCopy = new ArrayList<>(observables); + for (ObservableWithFactory observableWithFactory : observableCopy) { + subscribe(observableWithFactory); + } + } + + public void pause() { + subscriptions.unsubscribe(); + subscriptions = new CompositeSubscription(); + } + + public void destroy() { + connectableSubscriptions.unsubscribe(); + } + + public CompositeSubscription getSubscriptions() { + return subscriptions; + } + + public boolean isTaskRunning() { + return !observables.isEmpty(); + } +} \ No newline at end of file From cd4370dfa7a721f0c05325c026053d36a073729c Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Mon, 27 Apr 2015 21:38:22 +0200 Subject: [PATCH 036/332] Deleted class MvpPresenter --- .../lib/mvp/Dagger2MvpFragment.java | 2 +- .../cosenonjaviste/lib/mvp/MvpFragment.java | 2 +- .../cosenonjaviste/lib/mvp/MvpPresenter.java | 36 ------------------- .../lib/mvp/RxMvpPresenter.java | 28 ++++++++++++--- .../lib/mvp/utils/PresenterSaverFragment.java | 9 ++--- .../java/it/cosenonjaviste/CnjFragment.java | 4 +-- .../it/cosenonjaviste/Dagger2CnjFragment.java | 8 ++--- .../it/cosenonjaviste/page/PageFragment.java | 4 +-- .../it/cosenonjaviste/page/PagePresenter.java | 8 +++-- .../twitter/TweetListFragment.java | 4 +-- 10 files changed, 46 insertions(+), 59 deletions(-) delete mode 100644 androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpPresenter.java diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java index 6b7870c..145db41 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java @@ -23,7 +23,7 @@ public abstract class Dagger2MvpFragment extends Fragment implements MvpView< getPresenter().init(restoredModel); } - public abstract MvpPresenter getPresenter(); + public abstract RxMvpPresenter getPresenter(); @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java index c0b03de..06aaa93 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java @@ -7,7 +7,7 @@ import it.cosenonjaviste.lib.mvp.utils.PresenterSaverFragment; -public abstract class MvpFragment

, M> extends Fragment implements MvpView { +public abstract class MvpFragment

, M> extends Fragment implements MvpView { public static final String MODEL = "model"; diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpPresenter.java deleted file mode 100644 index bca9159..0000000 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpPresenter.java +++ /dev/null @@ -1,36 +0,0 @@ -package it.cosenonjaviste.lib.mvp; - -public abstract class MvpPresenter { - protected M model; - - protected MvpView view; - - public void init(M model) { - this.model = model; - } - - public void initAndSubscribe(M model, MvpView view) { - init(model); - subscribe(view); - } - - public M getModel() { - return model; - } - - public void destroy() { - } - - public void subscribe(MvpView view) { - this.view = view; - view.update(model); - } - - public void pause() { - view = null; - } - - public MvpView getView() { - return view; - } -} diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index 30336a7..b912352 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -7,21 +7,24 @@ import rx.functions.Action0; import rx.functions.Action1; -public abstract class RxMvpPresenter extends MvpPresenter { +public abstract class RxMvpPresenter { private final RxHolder rxHolder; + protected M model; + protected MvpView view; public RxMvpPresenter(SchedulerManager schedulerManager) { rxHolder = new RxHolder(schedulerManager); } public void pause() { - super.pause(); + view = null; rxHolder.pause(); } - @Override public void subscribe(MvpView view) { - super.subscribe(view); + public void subscribe(MvpView view) { + this.view = view; + view.update(model); rxHolder.resubscribePendingObservable(); } @@ -32,4 +35,21 @@ public void destroy() { protected void subscribe(Observable observable, Action0 onAttach, Action1 onNext, Action1 onError) { rxHolder.subscribePausable(observable, onAttach, onNext, onError, null); } + + public void init(M model) { + this.model = model; + } + + public void initAndSubscribe(M model, MvpView view) { + init(model); + subscribe(view); + } + + public M getModel() { + return model; + } + + public MvpView getView() { + return view; + } } \ No newline at end of file diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java index 90e3107..75db5d8 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java @@ -3,19 +3,20 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; -import it.cosenonjaviste.lib.mvp.MvpPresenter; +import it.cosenonjaviste.lib.mvp.RxMvpPresenter; + public class PresenterSaverFragment extends Fragment { private static final String TAG = PresenterSaverFragment.class.getName(); - private MvpPresenter presenter; + private RxMvpPresenter presenter; public PresenterSaverFragment() { setRetainInstance(true); } - public static void save(FragmentManager fragmentManager, MvpPresenter presenter) { + public static void save(FragmentManager fragmentManager, RxMvpPresenter presenter) { PresenterSaverFragment fragment = getPresenterSaverFragment(fragmentManager); fragment.presenter = presenter; } @@ -29,7 +30,7 @@ private static PresenterSaverFragment getPresenterSaverFragment(FragmentManager return fragment; } - public static

> P load(FragmentManager fragmentManager) { + public static

> P load(FragmentManager fragmentManager) { PresenterSaverFragment fragment = getPresenterSaverFragment(fragmentManager); return (P) fragment.presenter; } diff --git a/app/src/main/java/it/cosenonjaviste/CnjFragment.java b/app/src/main/java/it/cosenonjaviste/CnjFragment.java index edfd515..520f2d7 100644 --- a/app/src/main/java/it/cosenonjaviste/CnjFragment.java +++ b/app/src/main/java/it/cosenonjaviste/CnjFragment.java @@ -14,11 +14,11 @@ import butterknife.ButterKnife; import it.cosenonjaviste.lib.mvp.MvpFragment; -import it.cosenonjaviste.lib.mvp.MvpPresenter; import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.utils.SingleFragmentActivity; -public abstract class CnjFragment

, M> extends MvpFragment { +public abstract class CnjFragment

, M> extends MvpFragment { protected ApplicationComponent getComponent() { return ((CoseNonJavisteApp) getActivity().getApplication()).getComponent(); diff --git a/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java b/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java index 0697c4f..a3cf861 100644 --- a/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java +++ b/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java @@ -6,15 +6,15 @@ import org.parceler.Parcels; import it.cosenonjaviste.lib.mvp.Dagger2MvpFragment; -import it.cosenonjaviste.lib.mvp.MvpPresenter; import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.utils.SingleFragmentActivity; public abstract class Dagger2CnjFragment extends Dagger2MvpFragment { - private MvpPresenter presenter; + private RxMvpPresenter presenter; - @Override public final MvpPresenter getPresenter() { + @Override public final RxMvpPresenter getPresenter() { return presenter; } @@ -23,7 +23,7 @@ public abstract class Dagger2CnjFragment extends Dagger2MvpFragment { super.onCreate(state); } - protected abstract MvpPresenter injectAndCreatePresenter(); + protected abstract RxMvpPresenter injectAndCreatePresenter(); @Override public void open(Class> viewClass, MM model) { Intent intent = SingleFragmentActivity.createIntent(getActivity(), viewClass); diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index e876107..f60f697 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -22,7 +22,7 @@ import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; -import it.cosenonjaviste.lib.mvp.MvpPresenter; +import it.cosenonjaviste.lib.mvp.RxMvpPresenter; public class PageFragment extends Dagger2CnjFragment { @@ -32,7 +32,7 @@ public class PageFragment extends Dagger2CnjFragment { @Inject PagePresenter presenter; - @Override protected MvpPresenter injectAndCreatePresenter() { + @Override protected RxMvpPresenter injectAndCreatePresenter() { ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), PageFragment.class.getName(), diff --git a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java index e883836..dab75f2 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java +++ b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java @@ -2,15 +2,17 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.MvpPresenter; +import it.cosenonjaviste.lib.mvp.RxMvpPresenter; +import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.utils.PresenterScope; @PresenterScope -public class PagePresenter extends MvpPresenter { +public class PagePresenter extends RxMvpPresenter { private PageUrlManager pageUrlManager; - @Inject public PagePresenter(PageUrlManager pageUrlManager) { + @Inject public PagePresenter(SchedulerManager schedulerManager, PageUrlManager pageUrlManager) { + super(schedulerManager); this.pageUrlManager = pageUrlManager; } diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index 27207fa..0a2ac40 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -18,7 +18,7 @@ import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; -import it.cosenonjaviste.lib.mvp.MvpPresenter; +import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import rx.functions.Actions; public class TweetListFragment extends Dagger2CnjFragment { @@ -29,7 +29,7 @@ public class TweetListFragment extends Dagger2CnjFragment { @Inject TweetListPresenter presenter; - @Override protected MvpPresenter injectAndCreatePresenter() { + @Override protected RxMvpPresenter injectAndCreatePresenter() { ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), TweetListFragment.class.getName(), From f4c1efc620b3b1c7e5bca0d17bab8a5ef6877586 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Mon, 27 Apr 2015 21:45:52 +0200 Subject: [PATCH 037/332] Deleted unused classes --- .../cosenonjaviste/lib/mvp/MvpFragment.java | 52 ------------------- .../lib/mvp/utils/PresenterSaverFragment.java | 44 ---------------- .../androidtest/base/FragmentRule.java | 4 +- .../java/it/cosenonjaviste/CnjFragment.java | 52 ------------------- .../java/it/cosenonjaviste/MainActivity.java | 23 ++++++-- 5 files changed, 20 insertions(+), 155 deletions(-) delete mode 100644 androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java delete mode 100644 androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java delete mode 100644 app/src/main/java/it/cosenonjaviste/CnjFragment.java diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java deleted file mode 100644 index 06aaa93..0000000 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpFragment.java +++ /dev/null @@ -1,52 +0,0 @@ -package it.cosenonjaviste.lib.mvp; - -import android.os.Bundle; -import android.support.v4.app.Fragment; - -import org.parceler.Parcels; - -import it.cosenonjaviste.lib.mvp.utils.PresenterSaverFragment; - -public abstract class MvpFragment

, M> extends Fragment implements MvpView { - - public static final String MODEL = "model"; - - protected P presenter; - - @Override public void onCreate(Bundle state) { - super.onCreate(state); - - M restoredModel = null; - if (state != null) { - restoredModel = Parcels.unwrap(state.getParcelable(MODEL)); - } - if (restoredModel == null && getArguments() != null) { - restoredModel = Parcels.unwrap(getArguments().getParcelable(MODEL)); - } - - presenter = PresenterSaverFragment.

load(getChildFragmentManager()); - if (presenter == null) { - presenter = createPresenter(); - } - presenter.init(restoredModel); - - PresenterSaverFragment.save(getChildFragmentManager(), presenter); - } - - @Override public void onSaveInstanceState(Bundle outState) { - super.onSaveInstanceState(outState); - outState.putParcelable(MODEL, Parcels.wrap(presenter.getModel())); - } - - @Override public void onStart() { - super.onStart(); - presenter.subscribe(this); - } - - @Override public void onStop() { - presenter.pause(); - super.onStop(); - } - - protected abstract P createPresenter(); -} diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java deleted file mode 100644 index 75db5d8..0000000 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/PresenterSaverFragment.java +++ /dev/null @@ -1,44 +0,0 @@ -package it.cosenonjaviste.lib.mvp.utils; - -import android.support.v4.app.Fragment; -import android.support.v4.app.FragmentManager; - -import it.cosenonjaviste.lib.mvp.RxMvpPresenter; - - -public class PresenterSaverFragment extends Fragment { - - private static final String TAG = PresenterSaverFragment.class.getName(); - - private RxMvpPresenter presenter; - - public PresenterSaverFragment() { - setRetainInstance(true); - } - - public static void save(FragmentManager fragmentManager, RxMvpPresenter presenter) { - PresenterSaverFragment fragment = getPresenterSaverFragment(fragmentManager); - fragment.presenter = presenter; - } - - private static PresenterSaverFragment getPresenterSaverFragment(FragmentManager fragmentManager) { - PresenterSaverFragment fragment = (PresenterSaverFragment) fragmentManager.findFragmentByTag(TAG); - if (fragment == null) { - fragment = new PresenterSaverFragment(); - fragmentManager.beginTransaction().add(fragment, TAG).commit(); - } - return fragment; - } - - public static

> P load(FragmentManager fragmentManager) { - PresenterSaverFragment fragment = getPresenterSaverFragment(fragmentManager); - return (P) fragment.presenter; - } - - @Override public void onDestroy() { - super.onDestroy(); - if (presenter != null) { - presenter.destroy(); - } - } -} diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java index 8ff73ad..b6667ad 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java @@ -4,7 +4,7 @@ import org.parceler.Parcels; -import it.cosenonjaviste.lib.mvp.MvpFragment; +import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.utils.SingleFragmentActivity; @@ -26,7 +26,7 @@ private FragmentRule(Class> viewClass, Object model) { @Override protected Intent getLaunchIntent(String targetPackage, Class activityClass) { Intent intent = SingleFragmentActivity.populateIntent(super.getLaunchIntent(targetPackage, activityClass), viewClass); - intent.putExtra(MvpFragment.MODEL, Parcels.wrap(model)); + intent.putExtra(Dagger2CnjFragment.MODEL, Parcels.wrap(model)); return intent; } } diff --git a/app/src/main/java/it/cosenonjaviste/CnjFragment.java b/app/src/main/java/it/cosenonjaviste/CnjFragment.java deleted file mode 100644 index 520f2d7..0000000 --- a/app/src/main/java/it/cosenonjaviste/CnjFragment.java +++ /dev/null @@ -1,52 +0,0 @@ -package it.cosenonjaviste; - -import android.content.Context; -import android.content.Intent; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.v4.app.Fragment; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; - -import org.parceler.Parcels; - -import butterknife.ButterKnife; -import it.cosenonjaviste.lib.mvp.MvpFragment; -import it.cosenonjaviste.lib.mvp.MvpView; -import it.cosenonjaviste.lib.mvp.RxMvpPresenter; -import it.cosenonjaviste.utils.SingleFragmentActivity; - -public abstract class CnjFragment

, M> extends MvpFragment { - - protected ApplicationComponent getComponent() { - return ((CoseNonJavisteApp) getActivity().getApplication()).getComponent(); - } - - @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(getLayoutId(), container, false); - initView(view); - return view; - } - - protected void initView(View view) { - ButterKnife.inject(this, view); - } - - protected abstract int getLayoutId(); - - @Override public void open(Class> viewClass, MM model) { - Intent intent = SingleFragmentActivity.createIntent(getActivity(), viewClass); - intent.putExtra(MODEL, Parcels.wrap(model)); - getActivity().startActivity(intent); - } - - public static T createView(@NonNull Context context, @NonNull Class> viewClass, @NonNull M model) { - Fragment fragment = Fragment.instantiate(context, viewClass.getName()); - Bundle bundle = new Bundle(); - bundle.putParcelable(MODEL, Parcels.wrap(model)); - fragment.setArguments(bundle); - return (T) fragment; - } -} diff --git a/app/src/main/java/it/cosenonjaviste/MainActivity.java b/app/src/main/java/it/cosenonjaviste/MainActivity.java index e85f3b0..6688b64 100755 --- a/app/src/main/java/it/cosenonjaviste/MainActivity.java +++ b/app/src/main/java/it/cosenonjaviste/MainActivity.java @@ -1,7 +1,9 @@ package it.cosenonjaviste; +import android.content.Context; import android.content.res.Configuration; import android.os.Bundle; +import android.support.annotation.NonNull; import android.support.v4.app.Fragment; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; @@ -12,12 +14,15 @@ import android.widget.ArrayAdapter; import android.widget.ListView; +import org.parceler.Parcels; + import butterknife.ButterKnife; import butterknife.InjectView; import it.cosenonjaviste.author.AuthorListFragment; import it.cosenonjaviste.author.AuthorListModel; import it.cosenonjaviste.category.CategoryListFragment; import it.cosenonjaviste.category.CategoryListModel; +import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; import it.cosenonjaviste.post.PostListFragment; @@ -84,18 +89,26 @@ private Fragment createFragment(int position) { //TODO activity title switch (position) { case 1: - return CnjFragment.createView(this, CategoryListFragment.class, new CategoryListModel()); + return createView(this, CategoryListFragment.class, new CategoryListModel()); case 2: - return CnjFragment.createView(this, AuthorListFragment.class, new AuthorListModel()); + return createView(this, AuthorListFragment.class, new AuthorListModel()); case 3: - return CnjFragment.createView(this, TweetListFragment.class, new TweetListModel()); + return createView(this, TweetListFragment.class, new TweetListModel()); case 4: - return CnjFragment.createView(this, PageFragment.class, new PageModel("http://www.cosenonjaviste.it/contatti/")); + return createView(this, PageFragment.class, new PageModel("http://www.cosenonjaviste.it/contatti/")); default: - return CnjFragment.createView(this, PostListFragment.class, new PostListModel()); + return createView(this, PostListFragment.class, new PostListModel()); } } + public static T createView(@NonNull Context context, @NonNull Class> viewClass, @NonNull M model) { + Fragment fragment = Fragment.instantiate(context, viewClass.getName()); + Bundle bundle = new Bundle(); + bundle.putParcelable(Dagger2CnjFragment.MODEL, Parcels.wrap(model)); + fragment.setArguments(bundle); + return (T) fragment; + } + @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); From 1fae6728fe568a0476fc80704ecf8f36dd61d76c Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Mon, 27 Apr 2015 21:48:35 +0200 Subject: [PATCH 038/332] Classes rename --- .../lib/mvp/{Dagger2MvpFragment.java => RxMvpFragment.java} | 2 +- .../java/it/cosenonjaviste/androidtest/base/FragmentRule.java | 4 ++-- .../{Dagger2CnjFragment.java => CnjRxFragment.java} | 4 ++-- app/src/main/java/it/cosenonjaviste/MainActivity.java | 2 +- .../java/it/cosenonjaviste/author/AuthorListFragment.java | 4 ++-- .../java/it/cosenonjaviste/category/CategoryListFragment.java | 4 ++-- app/src/main/java/it/cosenonjaviste/page/PageFragment.java | 4 ++-- .../main/java/it/cosenonjaviste/post/PostListFragment.java | 4 ++-- .../java/it/cosenonjaviste/twitter/TweetListFragment.java | 4 ++-- 9 files changed, 16 insertions(+), 16 deletions(-) rename androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/{Dagger2MvpFragment.java => RxMvpFragment.java} (92%) rename app/src/main/java/it/cosenonjaviste/{Dagger2CnjFragment.java => CnjRxFragment.java} (87%) diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java similarity index 92% rename from androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java rename to androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java index 145db41..8b5dee2 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/Dagger2MvpFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java @@ -5,7 +5,7 @@ import org.parceler.Parcels; -public abstract class Dagger2MvpFragment extends Fragment implements MvpView { +public abstract class RxMvpFragment extends Fragment implements MvpView { public static final String MODEL = "model"; diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java index b6667ad..a80474a 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java @@ -4,7 +4,7 @@ import org.parceler.Parcels; -import it.cosenonjaviste.Dagger2CnjFragment; +import it.cosenonjaviste.CnjRxFragment; import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.utils.SingleFragmentActivity; @@ -26,7 +26,7 @@ private FragmentRule(Class> viewClass, Object model) { @Override protected Intent getLaunchIntent(String targetPackage, Class activityClass) { Intent intent = SingleFragmentActivity.populateIntent(super.getLaunchIntent(targetPackage, activityClass), viewClass); - intent.putExtra(Dagger2CnjFragment.MODEL, Parcels.wrap(model)); + intent.putExtra(CnjRxFragment.MODEL, Parcels.wrap(model)); return intent; } } diff --git a/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java b/app/src/main/java/it/cosenonjaviste/CnjRxFragment.java similarity index 87% rename from app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java rename to app/src/main/java/it/cosenonjaviste/CnjRxFragment.java index a3cf861..51f0a18 100644 --- a/app/src/main/java/it/cosenonjaviste/Dagger2CnjFragment.java +++ b/app/src/main/java/it/cosenonjaviste/CnjRxFragment.java @@ -5,12 +5,12 @@ import org.parceler.Parcels; -import it.cosenonjaviste.lib.mvp.Dagger2MvpFragment; import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.RxMvpFragment; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.utils.SingleFragmentActivity; -public abstract class Dagger2CnjFragment extends Dagger2MvpFragment { +public abstract class CnjRxFragment extends RxMvpFragment { private RxMvpPresenter presenter; diff --git a/app/src/main/java/it/cosenonjaviste/MainActivity.java b/app/src/main/java/it/cosenonjaviste/MainActivity.java index 6688b64..f77cee7 100755 --- a/app/src/main/java/it/cosenonjaviste/MainActivity.java +++ b/app/src/main/java/it/cosenonjaviste/MainActivity.java @@ -104,7 +104,7 @@ private Fragment createFragment(int position) { public static T createView(@NonNull Context context, @NonNull Class> viewClass, @NonNull M model) { Fragment fragment = Fragment.instantiate(context, viewClass.getName()); Bundle bundle = new Bundle(); - bundle.putParcelable(Dagger2CnjFragment.MODEL, Parcels.wrap(model)); + bundle.putParcelable(CnjRxFragment.MODEL, Parcels.wrap(model)); fragment.setArguments(bundle); return (T) fragment; } diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index 1817b16..cdfdfa5 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -14,13 +14,13 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; +import it.cosenonjaviste.CnjRxFragment; import it.cosenonjaviste.CoseNonJavisteApp; -import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; import rx.functions.Actions; -public class AuthorListFragment extends Dagger2CnjFragment { +public class AuthorListFragment extends CnjRxFragment { @InjectView(R.id.grid) SuperGridview grid; diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java index 1b4ad56..1aae3da 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java @@ -14,13 +14,13 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; +import it.cosenonjaviste.CnjRxFragment; import it.cosenonjaviste.CoseNonJavisteApp; -import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; import rx.functions.Actions; -public class CategoryListFragment extends Dagger2CnjFragment { +public class CategoryListFragment extends CnjRxFragment { @InjectView(R.id.grid) SuperGridview grid; diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index f60f697..77438f4 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -18,13 +18,13 @@ import butterknife.ButterKnife; import butterknife.InjectView; +import it.cosenonjaviste.CnjRxFragment; import it.cosenonjaviste.CoseNonJavisteApp; -import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; -public class PageFragment extends Dagger2CnjFragment { +public class PageFragment extends CnjRxFragment { @InjectView(R.id.web_view) WebView webView; diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index 73aaf29..8e86c06 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -14,13 +14,13 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; +import it.cosenonjaviste.CnjRxFragment; import it.cosenonjaviste.CoseNonJavisteApp; -import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; import rx.functions.Actions; -public class PostListFragment extends Dagger2CnjFragment { +public class PostListFragment extends CnjRxFragment { @InjectView(R.id.list) SuperListview list; diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index 0a2ac40..5b44fd5 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -14,14 +14,14 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; +import it.cosenonjaviste.CnjRxFragment; import it.cosenonjaviste.CoseNonJavisteApp; -import it.cosenonjaviste.Dagger2CnjFragment; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import rx.functions.Actions; -public class TweetListFragment extends Dagger2CnjFragment { +public class TweetListFragment extends CnjRxFragment { @InjectView(R.id.list) SuperListview list; From 0791c5d96034111dcbd6459300216812124891ab Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Mon, 27 Apr 2015 22:07:26 +0200 Subject: [PATCH 039/332] Deleted CnjRxFragment --- .../it/cosenonjaviste/lib/mvp/MvpView.java | 2 -- .../cosenonjaviste/lib/mvp/RxMvpFragment.java | 8 +++++ .../androidtest/base/FragmentRule.java | 4 +-- .../java/it/cosenonjaviste/CnjRxFragment.java | 33 ------------------- .../java/it/cosenonjaviste/MainActivity.java | 3 +- .../ObjectsMapRetainedFragment.java | 27 ++++++--------- .../author/AuthorListFragment.java | 17 +++++++--- .../category/CategoryListFragment.java | 17 +++++++--- .../it/cosenonjaviste/page/PageFragment.java | 12 ++++--- .../cosenonjaviste/post/PostListFragment.java | 17 +++++++--- .../twitter/TweetListFragment.java | 12 ++++--- .../utils/SingleFragmentActivity.java | 10 ++++++ 12 files changed, 85 insertions(+), 77 deletions(-) delete mode 100644 app/src/main/java/it/cosenonjaviste/CnjRxFragment.java diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpView.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpView.java index 48f24d3..c9d6589 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpView.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpView.java @@ -2,6 +2,4 @@ public interface MvpView { void update(M model); - - void open(Class> viewClass, MM model); } diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java index 8b5dee2..e5e2f18 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java @@ -30,6 +30,14 @@ public abstract class RxMvpFragment extends Fragment implements MvpView { outState.putParcelable(MODEL, Parcels.wrap(getPresenter().getModel())); } + @Override public void onResume() { + super.onResume(); + } + + @Override public void onPause() { + super.onPause(); + } + @Override public void onStart() { super.onStart(); getPresenter().subscribe(this); diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java index a80474a..9b3c5c9 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java @@ -4,8 +4,8 @@ import org.parceler.Parcels; -import it.cosenonjaviste.CnjRxFragment; import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.RxMvpFragment; import it.cosenonjaviste.utils.SingleFragmentActivity; public class FragmentRule extends ActivityRule { @@ -26,7 +26,7 @@ private FragmentRule(Class> viewClass, Object model) { @Override protected Intent getLaunchIntent(String targetPackage, Class activityClass) { Intent intent = SingleFragmentActivity.populateIntent(super.getLaunchIntent(targetPackage, activityClass), viewClass); - intent.putExtra(CnjRxFragment.MODEL, Parcels.wrap(model)); + intent.putExtra(RxMvpFragment.MODEL, Parcels.wrap(model)); return intent; } } diff --git a/app/src/main/java/it/cosenonjaviste/CnjRxFragment.java b/app/src/main/java/it/cosenonjaviste/CnjRxFragment.java deleted file mode 100644 index 51f0a18..0000000 --- a/app/src/main/java/it/cosenonjaviste/CnjRxFragment.java +++ /dev/null @@ -1,33 +0,0 @@ -package it.cosenonjaviste; - -import android.content.Intent; -import android.os.Bundle; - -import org.parceler.Parcels; - -import it.cosenonjaviste.lib.mvp.MvpView; -import it.cosenonjaviste.lib.mvp.RxMvpFragment; -import it.cosenonjaviste.lib.mvp.RxMvpPresenter; -import it.cosenonjaviste.utils.SingleFragmentActivity; - -public abstract class CnjRxFragment extends RxMvpFragment { - - private RxMvpPresenter presenter; - - @Override public final RxMvpPresenter getPresenter() { - return presenter; - } - - @Override public void onCreate(Bundle state) { - presenter = injectAndCreatePresenter(); - super.onCreate(state); - } - - protected abstract RxMvpPresenter injectAndCreatePresenter(); - - @Override public void open(Class> viewClass, MM model) { - Intent intent = SingleFragmentActivity.createIntent(getActivity(), viewClass); - intent.putExtra(MODEL, Parcels.wrap(model)); - getActivity().startActivity(intent); - } -} diff --git a/app/src/main/java/it/cosenonjaviste/MainActivity.java b/app/src/main/java/it/cosenonjaviste/MainActivity.java index f77cee7..a104b00 100755 --- a/app/src/main/java/it/cosenonjaviste/MainActivity.java +++ b/app/src/main/java/it/cosenonjaviste/MainActivity.java @@ -23,6 +23,7 @@ import it.cosenonjaviste.category.CategoryListFragment; import it.cosenonjaviste.category.CategoryListModel; import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.RxMvpFragment; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; import it.cosenonjaviste.post.PostListFragment; @@ -104,7 +105,7 @@ private Fragment createFragment(int position) { public static T createView(@NonNull Context context, @NonNull Class> viewClass, @NonNull M model) { Fragment fragment = Fragment.instantiate(context, viewClass.getName()); Bundle bundle = new Bundle(); - bundle.putParcelable(CnjRxFragment.MODEL, Parcels.wrap(model)); + bundle.putParcelable(RxMvpFragment.MODEL, Parcels.wrap(model)); fragment.setArguments(bundle); return (T) fragment; } diff --git a/app/src/main/java/it/cosenonjaviste/ObjectsMapRetainedFragment.java b/app/src/main/java/it/cosenonjaviste/ObjectsMapRetainedFragment.java index a9d11e2..459d686 100644 --- a/app/src/main/java/it/cosenonjaviste/ObjectsMapRetainedFragment.java +++ b/app/src/main/java/it/cosenonjaviste/ObjectsMapRetainedFragment.java @@ -3,24 +3,21 @@ import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; -import java.util.HashMap; -import java.util.Map; - import rx.functions.Func0; public class ObjectsMapRetainedFragment extends Fragment { private static final String TAG = ObjectsMapRetainedFragment.class.getName(); - private Map map = new HashMap<>(); + private Object object; public ObjectsMapRetainedFragment() { setRetainInstance(true); } - public static void save(FragmentManager fragmentManager, String key, Object obj) { + public static void save(FragmentManager fragmentManager, Object obj) { ObjectsMapRetainedFragment fragment = getSaverFragment(fragmentManager); - fragment.map.put(key, obj); + fragment.object = obj; } private static ObjectsMapRetainedFragment getSaverFragment(FragmentManager fragmentManager) { @@ -32,27 +29,23 @@ private static ObjectsMapRetainedFragment getSaverFragment(FragmentManager fragm return fragment; } - public static

P load(FragmentManager fragmentManager, String key) { - if (key != null) { - ObjectsMapRetainedFragment fragment = getSaverFragment(fragmentManager); - return (P) fragment.map.get(key); - } else { - return null; - } + public static

P load(FragmentManager fragmentManager) { + ObjectsMapRetainedFragment fragment = getSaverFragment(fragmentManager); + return (P) fragment.object; } - public static C getOrCreate(FragmentManager fragmentManager, String key, Func0 componentFactory) { - C component = ObjectsMapRetainedFragment.load(fragmentManager, key); + public static C getOrCreate(FragmentManager fragmentManager, Func0 componentFactory) { + C component = ObjectsMapRetainedFragment.load(fragmentManager); if (component == null) { component = componentFactory.call(); - ObjectsMapRetainedFragment.save(fragmentManager, key, component); + ObjectsMapRetainedFragment.save(fragmentManager, component); } return component; } @Override public void onDestroy() { super.onDestroy(); -// for (MvpPresenter presenter : map.values()) { +// for (MvpPresenter presenter : object.values()) { // presenter.destroy(); // } } diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index cdfdfa5..ae4282f 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -14,13 +14,15 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; -import it.cosenonjaviste.CnjRxFragment; import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; +import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.RxMvpFragment; +import it.cosenonjaviste.utils.SingleFragmentActivity; import rx.functions.Actions; -public class AuthorListFragment extends CnjRxFragment { +public class AuthorListFragment extends RxMvpFragment { @InjectView(R.id.grid) SuperGridview grid; @@ -28,12 +30,15 @@ public class AuthorListFragment extends CnjRxFragment { private AuthorAdapter adapter; - @Override protected AuthorListPresenter injectAndCreatePresenter() { + @Override public void onCreate(Bundle state) { ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), - AuthorListFragment.class.getName(), () -> DaggerAuthorListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); + super.onCreate(state); + } + + @Override public AuthorListPresenter getPresenter() { return presenter; } @@ -61,4 +66,8 @@ public class AuthorListFragment extends CnjRxFragment { public void startLoading() { grid.showProgress(); } + + public void open(Class> viewClass, MM model) { + SingleFragmentActivity.open(getActivity(), viewClass, model); + } } diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java index 1aae3da..da3c9ef 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java @@ -14,13 +14,15 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; -import it.cosenonjaviste.CnjRxFragment; import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; +import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.RxMvpFragment; +import it.cosenonjaviste.utils.SingleFragmentActivity; import rx.functions.Actions; -public class CategoryListFragment extends CnjRxFragment { +public class CategoryListFragment extends RxMvpFragment { @InjectView(R.id.grid) SuperGridview grid; @@ -28,12 +30,15 @@ public class CategoryListFragment extends CnjRxFragment { @Inject CategoryListPresenter presenter; - @Override protected CategoryListPresenter injectAndCreatePresenter() { + @Override public void onCreate(Bundle state) { ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), - CategoryListFragment.class.getName(), () -> DaggerCategoryListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); + super.onCreate(state); + } + + @Override public CategoryListPresenter getPresenter() { return presenter; } @@ -69,4 +74,8 @@ public class CategoryListFragment extends CnjRxFragment { public void startLoading() { grid.showProgress(); } + + public void open(Class> viewClass, MM model) { + SingleFragmentActivity.open(getActivity(), viewClass, model); + } } diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index 77438f4..7e1eed6 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -18,13 +18,12 @@ import butterknife.ButterKnife; import butterknife.InjectView; -import it.cosenonjaviste.CnjRxFragment; import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; -import it.cosenonjaviste.lib.mvp.RxMvpPresenter; +import it.cosenonjaviste.lib.mvp.RxMvpFragment; -public class PageFragment extends CnjRxFragment { +public class PageFragment extends RxMvpFragment { @InjectView(R.id.web_view) WebView webView; @@ -32,12 +31,15 @@ public class PageFragment extends CnjRxFragment { @Inject PagePresenter presenter; - @Override protected RxMvpPresenter injectAndCreatePresenter() { + @Override public void onCreate(Bundle state) { ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), - PageFragment.class.getName(), () -> DaggerPageComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); + super.onCreate(state); + } + + @Override public PagePresenter getPresenter() { return presenter; } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index 8e86c06..0a73903 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -14,13 +14,15 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; -import it.cosenonjaviste.CnjRxFragment; import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; +import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.RxMvpFragment; +import it.cosenonjaviste.utils.SingleFragmentActivity; import rx.functions.Actions; -public class PostListFragment extends CnjRxFragment { +public class PostListFragment extends RxMvpFragment { @InjectView(R.id.list) SuperListview list; @@ -28,12 +30,15 @@ public class PostListFragment extends CnjRxFragment { private PostAdapter adapter; - @Override protected PostListPresenter injectAndCreatePresenter() { + @Override public void onCreate(Bundle state) { ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), - PostListFragment.class.getName(), () -> DaggerPostListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); + super.onCreate(state); + } + + @Override public PostListPresenter getPresenter() { return presenter; } @@ -78,4 +83,8 @@ public void startLoading(boolean showMainLoading) { public void startMoreItemsLoading() { list.showMoreProgress(); } + + public void open(Class> viewClass, MM model) { + SingleFragmentActivity.open(getActivity(), viewClass, model); + } } diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index 5b44fd5..0d5edef 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -14,14 +14,13 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; -import it.cosenonjaviste.CnjRxFragment; import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; -import it.cosenonjaviste.lib.mvp.RxMvpPresenter; +import it.cosenonjaviste.lib.mvp.RxMvpFragment; import rx.functions.Actions; -public class TweetListFragment extends CnjRxFragment { +public class TweetListFragment extends RxMvpFragment { @InjectView(R.id.list) SuperListview list; @@ -29,12 +28,15 @@ public class TweetListFragment extends CnjRxFragment { @Inject TweetListPresenter presenter; - @Override protected RxMvpPresenter injectAndCreatePresenter() { + @Override public void onCreate(Bundle state) { ObjectsMapRetainedFragment.getOrCreate( getChildFragmentManager(), - TweetListFragment.class.getName(), () -> DaggerTweetListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); + super.onCreate(state); + } + + @Override public TweetListPresenter getPresenter() { return presenter; } diff --git a/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java b/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java index 3c5f80b..9d3b699 100644 --- a/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java +++ b/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java @@ -4,12 +4,16 @@ import android.content.Intent; import android.os.Bundle; import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentActivity; import android.support.v7.app.ActionBarActivity; import android.support.v7.widget.Toolbar; import android.view.MenuItem; +import org.parceler.Parcels; + import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.RxMvpFragment; public class SingleFragmentActivity extends ActionBarActivity { @@ -32,6 +36,12 @@ public static Intent createIntent(Class> viewClass) { return intent; } + public static void open(FragmentActivity activity, Class> viewClass, MM model) { + Intent intent = createIntent(activity, viewClass); + intent.putExtra(RxMvpFragment.MODEL, Parcels.wrap(model)); + activity.startActivity(intent); + } + @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); From 1992490bfc6b73679e945d22ba5719ed0fb6f063 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Mon, 27 Apr 2015 22:12:19 +0200 Subject: [PATCH 040/332] Moved view assignment in init method --- .../java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java | 4 ++-- .../it/cosenonjaviste/lib/mvp/RxMvpPresenter.java | 11 +++++------ .../it/cosenonjaviste/author/AuthorListPresenter.java | 5 ++--- .../category/CategoryListPresenter.java | 5 ++--- .../it/cosenonjaviste/post/PostListPresenter.java | 5 ++--- .../it/cosenonjaviste/twitter/TweetListPresenter.java | 5 ++--- 6 files changed, 15 insertions(+), 20 deletions(-) diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java index e5e2f18..6791e24 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java @@ -20,7 +20,7 @@ public abstract class RxMvpFragment extends Fragment implements MvpView { restoredModel = Parcels.unwrap(getArguments().getParcelable(MODEL)); } - getPresenter().init(restoredModel); + getPresenter().init(restoredModel, this); } public abstract RxMvpPresenter getPresenter(); @@ -40,7 +40,7 @@ public abstract class RxMvpFragment extends Fragment implements MvpView { @Override public void onStart() { super.onStart(); - getPresenter().subscribe(this); + getPresenter().subscribe(); } @Override public void onStop() { diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index b912352..ad5797f 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -18,12 +18,10 @@ public RxMvpPresenter(SchedulerManager schedulerManager) { } public void pause() { - view = null; rxHolder.pause(); } - public void subscribe(MvpView view) { - this.view = view; + public void subscribe() { view.update(model); rxHolder.resubscribePendingObservable(); } @@ -36,13 +34,14 @@ protected void subscribe(Observable observable, Action0 onAttach, Action1 rxHolder.subscribePausable(observable, onAttach, onNext, onError, null); } - public void init(M model) { + public void init(M model, MvpView view) { this.model = model; + this.view = view; } public void initAndSubscribe(M model, MvpView view) { - init(model); - subscribe(view); + init(model, view); + subscribe(); } public M getModel() { diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index 1dab7a1..1d55f6d 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -5,7 +5,6 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.Author; @@ -48,8 +47,8 @@ public void loadAuthors() { }); } - @Override public void subscribe(MvpView view) { - super.subscribe(view); + @Override public void subscribe() { + super.subscribe(); if (model.isEmpty() && !loadStarted) { loadAuthors(); } diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index 41ba648..c2b86ac 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -4,7 +4,6 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.Category; @@ -27,8 +26,8 @@ public class CategoryListPresenter extends RxMvpPresenter { this.wordPressService = wordPressService; } - @Override public void subscribe(MvpView view) { - super.subscribe(view); + @Override public void subscribe() { + super.subscribe(); if (model.isEmpty() && !loadStarted) { loadData(); } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index 90d6619..944b930 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -5,7 +5,6 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.Author; @@ -30,8 +29,8 @@ public class PostListPresenter extends RxMvpPresenter { this.wordPressService = wordPressService; } - @Override public void subscribe(MvpView view) { - super.subscribe(view); + @Override public void subscribe() { + super.subscribe(); if (model.getItems().isEmpty() && !loadStarted) { reloadData(); } diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index 015e5cc..855c2db 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -4,7 +4,6 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.Tweet; @@ -42,8 +41,8 @@ public void reloadData() { }); } - @Override public void subscribe(MvpView view) { - super.subscribe(view); + @Override public void subscribe() { + super.subscribe(); if (model.isEmpty() && !loadStarted) { reloadData(); } From f2a097914fbd9fd71cf0d7b25f1ae6477036e4c8 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Mon, 27 Apr 2015 22:37:28 +0200 Subject: [PATCH 041/332] Introduced LifeCycle class --- .../it/cosenonjaviste/lib/mvp/LifeCycle.java | 41 +++++++++++++++++++ .../cosenonjaviste/lib/mvp/RxMvpFragment.java | 21 ++++------ .../lib/mvp/RxMvpPresenter.java | 22 ++++------ .../lib/mvp/utils/RxHolder.java | 5 ++- .../mvp/author/AuthorListPresenterTest.java | 5 ++- .../category/CategoryListPresenterTest.java | 5 ++- .../mvp/page/PagePresenterTest.java | 3 +- .../mvp/twitter/TweetListPresenterTest.java | 5 ++- 8 files changed, 74 insertions(+), 33 deletions(-) create mode 100644 androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java new file mode 100644 index 0000000..e3ef7e5 --- /dev/null +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java @@ -0,0 +1,41 @@ +package it.cosenonjaviste.lib.mvp; + +import rx.Observable; +import rx.Subscription; +import rx.functions.Action0; +import rx.functions.Action1; +import rx.functions.Func0; +import rx.subjects.PublishSubject; + +public class LifeCycle { + + private Func0 saveObjectFunc; + + public enum EventType { + RESUME, PAUSE, DESTROY_VIEW, DESTROY_ALL; + } + + private PublishSubject subject = PublishSubject.create(); + + public void emit(EventType eventType) { + subject.onNext(eventType); + } + + public Observable asObservable() { + return subject.asObservable(); + } + + public Subscription subscribe(EventType eventType, Action0 callback) { + return subject.asObservable().filter(t -> t == eventType).subscribe(t -> callback.call()); + } + + public void subscribeOnSaveInstanceState(Func0 saveObjectFunc) { + this.saveObjectFunc = saveObjectFunc; + } + + public void saveInstanceState(Action1 saver) { + if (saveObjectFunc != null) { + saver.call(saveObjectFunc.call()); + } + } +} diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java index 6791e24..d4605b4 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java @@ -8,6 +8,7 @@ public abstract class RxMvpFragment extends Fragment implements MvpView { public static final String MODEL = "model"; + private LifeCycle lifeCycle; @Override public void onCreate(Bundle state) { super.onCreate(state); @@ -21,31 +22,27 @@ public abstract class RxMvpFragment extends Fragment implements MvpView { } getPresenter().init(restoredModel, this); + lifeCycle = getPresenter().getLifeCycle(); } public abstract RxMvpPresenter getPresenter(); @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - outState.putParcelable(MODEL, Parcels.wrap(getPresenter().getModel())); + lifeCycle.saveInstanceState(obj -> { + if (obj != null) { + outState.putParcelable(MODEL, Parcels.wrap(obj)); + } + }); } @Override public void onResume() { super.onResume(); + lifeCycle.emit(LifeCycle.EventType.RESUME); } @Override public void onPause() { super.onPause(); + lifeCycle.emit(LifeCycle.EventType.PAUSE); } - - @Override public void onStart() { - super.onStart(); - getPresenter().subscribe(); - } - - @Override public void onStop() { - getPresenter().pause(); - super.onStop(); - } - } diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index ad5797f..c29db23 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -12,13 +12,13 @@ public abstract class RxMvpPresenter { private final RxHolder rxHolder; protected M model; protected MvpView view; + private LifeCycle lifeCycle = new LifeCycle(); public RxMvpPresenter(SchedulerManager schedulerManager) { - rxHolder = new RxHolder(schedulerManager); - } - - public void pause() { - rxHolder.pause(); + rxHolder = new RxHolder(schedulerManager, lifeCycle); + lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::subscribe); + lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); + lifeCycle.subscribeOnSaveInstanceState(() -> model); } public void subscribe() { @@ -26,10 +26,6 @@ public void subscribe() { rxHolder.resubscribePendingObservable(); } - public void destroy() { - rxHolder.destroy(); - } - protected void subscribe(Observable observable, Action0 onAttach, Action1 onNext, Action1 onError) { rxHolder.subscribePausable(observable, onAttach, onNext, onError, null); } @@ -44,11 +40,11 @@ public void initAndSubscribe(M model, MvpView view) { subscribe(); } - public M getModel() { - return model; - } - public MvpView getView() { return view; } + + public LifeCycle getLifeCycle() { + return lifeCycle; + } } \ No newline at end of file diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java index 981ee4e..bafe1bb 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java @@ -3,6 +3,7 @@ import java.util.ArrayList; import java.util.List; +import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.ObservableWithFactory; import rx.Observable; import rx.Subscriber; @@ -22,8 +23,10 @@ public class RxHolder { protected final List observables = new ArrayList<>(); - public RxHolder(SchedulerManager schedulerManager) { + public RxHolder(SchedulerManager schedulerManager, LifeCycle lifeCycle) { this.schedulerManager = schedulerManager; + lifeCycle.subscribe(LifeCycle.EventType.PAUSE, this::pause); + lifeCycle.subscribe(LifeCycle.EventType.DESTROY_ALL, this::destroy); } public void subscribePausable(Observable observable, Action0 onAttach, Action1 onNext, Action1 onError, Action0 onCompleted) { diff --git a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java index 93dc8dc..ebb4c07 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java @@ -69,12 +69,13 @@ public void testGoToDetail() { when(wordPressService.listAuthors()) .thenReturn(authorResponse(2)); - presenter.initAndSubscribe(new AuthorListModel(), view); + AuthorListModel authorListModel = new AuthorListModel(); + presenter.initAndSubscribe(authorListModel, view); presenter.goToAuthorDetail(1); verify(view).open(any(), modelCaptor.capture()); PostListModel model = modelCaptor.getValue(); - assertThat(model.getAuthor()).isEqualTo(presenter.getModel().get(1)); + assertThat(model.getAuthor()).isEqualTo(authorListModel.get(1)); } } \ No newline at end of file diff --git a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java index 112b357..0835c08 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java @@ -74,11 +74,12 @@ public void testGoToPosts() { when(wordPressService.listCategories()) .thenReturn(categoryResponse(3)); - presenter.initAndSubscribe(new CategoryListModel(), view); + CategoryListModel categoryListModel = new CategoryListModel(); + presenter.initAndSubscribe(categoryListModel, view); presenter.goToPosts(1); verify(view).open(any(), modelCaptor.capture()); - assertThat(modelCaptor.getValue().getCategory()).isEqualTo(presenter.getModel().get(1)); + assertThat(modelCaptor.getValue().getCategory()).isEqualTo(categoryListModel.get(1)); } } \ No newline at end of file diff --git a/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java index 2d791f0..e8cec62 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java @@ -8,6 +8,7 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; +import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; import it.cosenonjaviste.page.PagePresenter; @@ -27,7 +28,7 @@ public class PagePresenterTest { @Before public void setup() { - presenter = new PagePresenter(new PageUrlManager()); + presenter = new PagePresenter(new TestSchedulerManager(), new PageUrlManager()); presenter.initAndSubscribe(new PageModel("url"), view); } diff --git a/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java index 253142f..d357afb 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java @@ -63,10 +63,11 @@ public void setup() { when(twitterService.loadTweets(eq(1))) .thenReturn(TestData.tweets()); - presenter.initAndSubscribe(new TweetListModel(), view); + TweetListModel tweetListModel = new TweetListModel(); + presenter.initAndSubscribe(tweetListModel, view); presenter.loadNextPage(); - assertThat(presenter.getModel().size()).isEqualTo(20); + assertThat(tweetListModel.size()).isEqualTo(20); } } From 3ed8c8ed7480ddd802761526385cfa805487bbeb Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Mon, 27 Apr 2015 22:39:08 +0200 Subject: [PATCH 042/332] Method rename --- .../main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java | 2 +- .../main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java | 6 +++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index c29db23..a8a37cb 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -27,7 +27,7 @@ public void subscribe() { } protected void subscribe(Observable observable, Action0 onAttach, Action1 onNext, Action1 onError) { - rxHolder.subscribePausable(observable, onAttach, onNext, onError, null); + rxHolder.subscribe(observable, onAttach, onNext, onError); } public void init(M model, MvpView view) { diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java index bafe1bb..6407a4c 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java @@ -29,7 +29,11 @@ public RxHolder(SchedulerManager schedulerManager, LifeCycle lifeCycle) { lifeCycle.subscribe(LifeCycle.EventType.DESTROY_ALL, this::destroy); } - public void subscribePausable(Observable observable, Action0 onAttach, Action1 onNext, Action1 onError, Action0 onCompleted) { + public void subscribe(Observable observable, Action0 onAttach, Action1 onNext, Action1 onError) { + subscribe(observable, onAttach, onNext, onError, null); + } + + public void subscribe(Observable observable, Action0 onAttach, Action1 onNext, Action1 onError, Action0 onCompleted) { ConnectableObservable replay = schedulerManager.bindObservable(observable).replay(); connectableSubscriptions.add(replay.connect()); Func0> factory = () -> new Subscriber() { From 41b756c587c3f7c2f014d909270c82abed1f9621 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Tue, 28 Apr 2015 09:13:16 +0200 Subject: [PATCH 043/332] LifeCycle injected using Dagger --- androidMvp/build.gradle | 2 ++ .../it/cosenonjaviste/lib/mvp/LifeCycle.java | 11 ++++++- .../lib/mvp}/PresenterScope.java | 2 +- .../cosenonjaviste/lib/mvp/RxMvpFragment.java | 33 ++++++++++--------- .../lib/mvp/RxMvpPresenter.java | 11 ++++--- .../utils}/ObjectsMapRetainedFragment.java | 2 +- .../lib/mvp/utils/RxHolder.java | 6 +++- app/build.gradle | 2 -- .../author/AuthorListComponent.java | 4 +-- .../author/AuthorListFragment.java | 27 ++++++++------- .../author/AuthorListPresenter.java | 7 ++-- .../category/CategoryListComponent.java | 2 +- .../category/CategoryListFragment.java | 10 ++---- .../category/CategoryListPresenter.java | 4 +-- .../it/cosenonjaviste/page/PageComponent.java | 2 +- .../it/cosenonjaviste/page/PageFragment.java | 10 ++---- .../it/cosenonjaviste/page/PagePresenter.java | 3 +- .../post/PostListComponent.java | 2 +- .../cosenonjaviste/post/PostListFragment.java | 10 ++---- .../post/PostListPresenter.java | 4 +-- .../twitter/TweetListComponent.java | 2 +- .../twitter/TweetListFragment.java | 11 ++----- .../twitter/TweetListPresenter.java | 4 +-- 23 files changed, 88 insertions(+), 83 deletions(-) rename {app/src/main/java/it/cosenonjaviste/utils => androidMvp/src/main/java/it/cosenonjaviste/lib/mvp}/PresenterScope.java (84%) rename {app/src/main/java/it/cosenonjaviste => androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils}/ObjectsMapRetainedFragment.java (97%) diff --git a/androidMvp/build.gradle b/androidMvp/build.gradle index 5254892..a5fbe54 100644 --- a/androidMvp/build.gradle +++ b/androidMvp/build.gradle @@ -33,4 +33,6 @@ dependencies { compile 'com.android.support:appcompat-v7:21.0.3' compile 'com.android.support:support-annotations:20.0.0' compile 'org.parceler:parceler-api:0.2.14' + compile 'com.google.dagger:dagger:2.0' + compile 'org.glassfish:javax.annotation:10.0-b28' } diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java index e3ef7e5..f140388 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java @@ -1,5 +1,7 @@ package it.cosenonjaviste.lib.mvp; +import javax.inject.Inject; + import rx.Observable; import rx.Subscription; import rx.functions.Action0; @@ -7,6 +9,7 @@ import rx.functions.Func0; import rx.subjects.PublishSubject; +@PresenterScope public class LifeCycle { private Func0 saveObjectFunc; @@ -17,6 +20,9 @@ public enum EventType { private PublishSubject subject = PublishSubject.create(); + @Inject public LifeCycle() { + } + public void emit(EventType eventType) { subject.onNext(eventType); } @@ -35,7 +41,10 @@ public void subscribeOnSaveInstanceState(Func0 saveObjectFunc) { public void saveInstanceState(Action1 saver) { if (saveObjectFunc != null) { - saver.call(saveObjectFunc.call()); + Object obj = saveObjectFunc.call(); + if (obj != null) { + saver.call(obj); + } } } } diff --git a/app/src/main/java/it/cosenonjaviste/utils/PresenterScope.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/PresenterScope.java similarity index 84% rename from app/src/main/java/it/cosenonjaviste/utils/PresenterScope.java rename to androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/PresenterScope.java index 67e7aac..1f9aa54 100644 --- a/app/src/main/java/it/cosenonjaviste/utils/PresenterScope.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/PresenterScope.java @@ -1,4 +1,4 @@ -package it.cosenonjaviste.utils; +package it.cosenonjaviste.lib.mvp; import java.lang.annotation.Retention; diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java index d4605b4..954398d 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java @@ -5,35 +5,31 @@ import org.parceler.Parcels; +import javax.inject.Inject; + +import it.cosenonjaviste.lib.mvp.utils.ObjectsMapRetainedFragment; +import rx.functions.Func0; + public abstract class RxMvpFragment extends Fragment implements MvpView { public static final String MODEL = "model"; - private LifeCycle lifeCycle; - @Override public void onCreate(Bundle state) { - super.onCreate(state); + @Inject LifeCycle lifeCycle; + protected static M getRestoredModel(Bundle state, Bundle arguments) { M restoredModel = null; if (state != null) { restoredModel = Parcels.unwrap(state.getParcelable(MODEL)); } - if (restoredModel == null && getArguments() != null) { - restoredModel = Parcels.unwrap(getArguments().getParcelable(MODEL)); + if (restoredModel == null && arguments != null) { + restoredModel = Parcels.unwrap(arguments.getParcelable(MODEL)); } - - getPresenter().init(restoredModel, this); - lifeCycle = getPresenter().getLifeCycle(); + return restoredModel; } - public abstract RxMvpPresenter getPresenter(); - @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - lifeCycle.saveInstanceState(obj -> { - if (obj != null) { - outState.putParcelable(MODEL, Parcels.wrap(obj)); - } - }); + lifeCycle.saveInstanceState(obj -> outState.putParcelable(MODEL, Parcels.wrap(obj))); } @Override public void onResume() { @@ -45,4 +41,11 @@ public abstract class RxMvpFragment extends Fragment implements MvpView { super.onPause(); lifeCycle.emit(LifeCycle.EventType.PAUSE); } + + protected T createComponent(Func0 componentFactory) { + return ObjectsMapRetainedFragment.getOrCreate( + getChildFragmentManager(), + componentFactory + ); + } } diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index a8a37cb..9083121 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -1,21 +1,22 @@ package it.cosenonjaviste.lib.mvp; +import javax.inject.Inject; + import it.cosenonjaviste.lib.mvp.utils.RxHolder; -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import rx.Observable; import rx.functions.Action0; import rx.functions.Action1; public abstract class RxMvpPresenter { - private final RxHolder rxHolder; + @Inject RxHolder rxHolder; protected M model; protected MvpView view; - private LifeCycle lifeCycle = new LifeCycle(); + private LifeCycle lifeCycle; - public RxMvpPresenter(SchedulerManager schedulerManager) { - rxHolder = new RxHolder(schedulerManager, lifeCycle); + @Inject void initLifeCycle(LifeCycle lifeCycle) { + this.lifeCycle = lifeCycle; lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::subscribe); lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); lifeCycle.subscribeOnSaveInstanceState(() -> model); diff --git a/app/src/main/java/it/cosenonjaviste/ObjectsMapRetainedFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/ObjectsMapRetainedFragment.java similarity index 97% rename from app/src/main/java/it/cosenonjaviste/ObjectsMapRetainedFragment.java rename to androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/ObjectsMapRetainedFragment.java index 459d686..4b0047a 100644 --- a/app/src/main/java/it/cosenonjaviste/ObjectsMapRetainedFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/ObjectsMapRetainedFragment.java @@ -1,4 +1,4 @@ -package it.cosenonjaviste; +package it.cosenonjaviste.lib.mvp.utils; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java index 6407a4c..22729ae 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java @@ -3,8 +3,11 @@ import java.util.ArrayList; import java.util.List; +import javax.inject.Inject; + import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.ObservableWithFactory; +import it.cosenonjaviste.lib.mvp.PresenterScope; import rx.Observable; import rx.Subscriber; import rx.functions.Action0; @@ -14,6 +17,7 @@ import rx.observables.ConnectableObservable; import rx.subscriptions.CompositeSubscription; +@PresenterScope public class RxHolder { private SchedulerManager schedulerManager; @@ -23,7 +27,7 @@ public class RxHolder { protected final List observables = new ArrayList<>(); - public RxHolder(SchedulerManager schedulerManager, LifeCycle lifeCycle) { + @Inject public RxHolder(SchedulerManager schedulerManager, LifeCycle lifeCycle) { this.schedulerManager = schedulerManager; lifeCycle.subscribe(LifeCycle.EventType.PAUSE, this::pause); lifeCycle.subscribe(LifeCycle.EventType.DESTROY_ALL, this::destroy); diff --git a/app/build.gradle b/app/build.gradle index 0c9255a..2b94bcc 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -84,13 +84,11 @@ dependencies { compile project(':SuperListviewLibrary') compile 'com.squareup.okhttp:okhttp:2.0.0' compile 'com.squareup.retrofit:retrofit:1.9.0' - compile 'com.google.dagger:dagger:2.0' compile 'org.twitter4j:twitter4j-core:4.0.2' compile 'com.android.support:cardview-v7:21.0.3' compile 'io.reactivex:rxandroid-framework:0.24.0' compile 'com.jakewharton:butterknife:6.1.0' compile 'com.squareup.picasso:picasso:2.5.0' - compile 'org.glassfish:javax.annotation:10.0-b28' apt 'com.google.dagger:dagger-compiler:2.0' apt 'org.parceler:parceler:0.2.14' diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListComponent.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListComponent.java index 0746dcb..df87386 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListComponent.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListComponent.java @@ -2,10 +2,10 @@ import dagger.Component; import it.cosenonjaviste.ApplicationComponent; -import it.cosenonjaviste.utils.PresenterScope; +import it.cosenonjaviste.lib.mvp.PresenterScope; @PresenterScope @Component(dependencies = ApplicationComponent.class) public interface AuthorListComponent { - void inject(AuthorListFragment fragment); + void inject(AuthorListFragment authorListFragment); } diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index ae4282f..88fdf96 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -13,13 +13,15 @@ import butterknife.ButterKnife; import butterknife.InjectView; -import butterknife.OnClick; import it.cosenonjaviste.CoseNonJavisteApp; -import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpFragment; import it.cosenonjaviste.utils.SingleFragmentActivity; +import rx.Observable; +import rx.android.view.ViewObservable; +import rx.android.widget.OnItemClickEvent; +import rx.android.widget.WidgetObservable; import rx.functions.Actions; public class AuthorListFragment extends RxMvpFragment { @@ -31,15 +33,12 @@ public class AuthorListFragment extends RxMvpFragment { private AuthorAdapter adapter; @Override public void onCreate(Bundle state) { - ObjectsMapRetainedFragment.getOrCreate( - getChildFragmentManager(), - () -> DaggerAuthorListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() - ).inject(this); super.onCreate(state); - } - @Override public AuthorListPresenter getPresenter() { - return presenter; + createComponent(() -> DaggerAuthorListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build()) + .inject(this); + + presenter.init(getRestoredModel(state, getArguments()), this); } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { @@ -48,12 +47,15 @@ public class AuthorListFragment extends RxMvpFragment { adapter = new AuthorAdapter(getActivity()); grid.getList().setNumColumns(2); grid.setAdapter(adapter); - grid.setOnItemClickListener((parent, v, position, id) -> presenter.goToAuthorDetail(position)); return view; } - @OnClick(R.id.error_retry) void retry() { - presenter.loadAuthors(); + public Observable onItemClick() { + return WidgetObservable.itemClicks(grid.getList()).map(OnItemClickEvent::position); + } + + public Observable retry() { + return ViewObservable.clicks(getView().findViewById(R.id.error_retry)).map(e -> null); } @Override public void update(AuthorListModel model) { @@ -70,4 +72,5 @@ public void startLoading() { public void open(Class> viewClass, MM model) { SingleFragmentActivity.open(getActivity(), viewClass, model); } + } diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index 1d55f6d..fef759b 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -5,6 +5,7 @@ import javax.inject.Inject; +import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.Author; @@ -12,7 +13,6 @@ import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; -import it.cosenonjaviste.utils.PresenterScope; import rx.Observable; @PresenterScope @@ -23,7 +23,7 @@ public class AuthorListPresenter extends RxMvpPresenter { private boolean loadStarted; @Inject public AuthorListPresenter(SchedulerManager schedulerManager, WordPressService wordPressService) { - super(schedulerManager); + super(); this.wordPressService = wordPressService; } @@ -49,6 +49,9 @@ public void loadAuthors() { @Override public void subscribe() { super.subscribe(); + //TODO unsubscribe + getView().retry().subscribe(t -> loadAuthors()); + getView().onItemClick().subscribe(this::goToAuthorDetail); if (model.isEmpty() && !loadStarted) { loadAuthors(); } diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListComponent.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListComponent.java index 390dbdb..c20d2cd 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListComponent.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListComponent.java @@ -2,7 +2,7 @@ import dagger.Component; import it.cosenonjaviste.ApplicationComponent; -import it.cosenonjaviste.utils.PresenterScope; +import it.cosenonjaviste.lib.mvp.PresenterScope; @PresenterScope @Component(dependencies = ApplicationComponent.class) diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java index da3c9ef..b30f472 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java @@ -15,7 +15,6 @@ import butterknife.InjectView; import butterknife.OnClick; import it.cosenonjaviste.CoseNonJavisteApp; -import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpFragment; @@ -31,15 +30,12 @@ public class CategoryListFragment extends RxMvpFragment { @Inject CategoryListPresenter presenter; @Override public void onCreate(Bundle state) { - ObjectsMapRetainedFragment.getOrCreate( - getChildFragmentManager(), + super.onCreate(state); + createComponent( () -> DaggerCategoryListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - super.onCreate(state); - } - @Override public CategoryListPresenter getPresenter() { - return presenter; + presenter.init(getRestoredModel(state, getArguments()), this); } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index c2b86ac..b9349b7 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -4,6 +4,7 @@ import javax.inject.Inject; +import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.Category; @@ -11,7 +12,6 @@ import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; -import it.cosenonjaviste.utils.PresenterScope; import rx.Observable; @PresenterScope @@ -22,7 +22,7 @@ public class CategoryListPresenter extends RxMvpPresenter { private boolean loadStarted; @Inject public CategoryListPresenter(SchedulerManager schedulerManager, WordPressService wordPressService) { - super(schedulerManager); + super(); this.wordPressService = wordPressService; } diff --git a/app/src/main/java/it/cosenonjaviste/page/PageComponent.java b/app/src/main/java/it/cosenonjaviste/page/PageComponent.java index 0a4a0f5..f661647 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageComponent.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageComponent.java @@ -2,7 +2,7 @@ import dagger.Component; import it.cosenonjaviste.ApplicationComponent; -import it.cosenonjaviste.utils.PresenterScope; +import it.cosenonjaviste.lib.mvp.PresenterScope; @PresenterScope @Component(dependencies = ApplicationComponent.class) diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index 7e1eed6..7600778 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -19,7 +19,6 @@ import butterknife.ButterKnife; import butterknife.InjectView; import it.cosenonjaviste.CoseNonJavisteApp; -import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.RxMvpFragment; @@ -32,15 +31,12 @@ public class PageFragment extends RxMvpFragment { @Inject PagePresenter presenter; @Override public void onCreate(Bundle state) { - ObjectsMapRetainedFragment.getOrCreate( - getChildFragmentManager(), + super.onCreate(state); + createComponent( () -> DaggerPageComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - super.onCreate(state); - } - @Override public PagePresenter getPresenter() { - return presenter; + presenter.init(getRestoredModel(state, getArguments()), this); } @SuppressLint("SetJavaScriptEnabled") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java index dab75f2..729c5d3 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java +++ b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java @@ -2,9 +2,9 @@ import javax.inject.Inject; +import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; -import it.cosenonjaviste.utils.PresenterScope; @PresenterScope public class PagePresenter extends RxMvpPresenter { @@ -12,7 +12,6 @@ public class PagePresenter extends RxMvpPresenter { private PageUrlManager pageUrlManager; @Inject public PagePresenter(SchedulerManager schedulerManager, PageUrlManager pageUrlManager) { - super(schedulerManager); this.pageUrlManager = pageUrlManager; } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListComponent.java b/app/src/main/java/it/cosenonjaviste/post/PostListComponent.java index 5cce721..6386d38 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListComponent.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListComponent.java @@ -2,7 +2,7 @@ import dagger.Component; import it.cosenonjaviste.ApplicationComponent; -import it.cosenonjaviste.utils.PresenterScope; +import it.cosenonjaviste.lib.mvp.PresenterScope; @PresenterScope @Component(dependencies = ApplicationComponent.class) diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index 0a73903..978ce49 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -15,7 +15,6 @@ import butterknife.InjectView; import butterknife.OnClick; import it.cosenonjaviste.CoseNonJavisteApp; -import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpFragment; @@ -31,15 +30,12 @@ public class PostListFragment extends RxMvpFragment { private PostAdapter adapter; @Override public void onCreate(Bundle state) { - ObjectsMapRetainedFragment.getOrCreate( - getChildFragmentManager(), + super.onCreate(state); + createComponent( () -> DaggerPostListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - super.onCreate(state); - } - @Override public PostListPresenter getPresenter() { - return presenter; + presenter.init(getRestoredModel(state, getArguments()), this); } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index 944b930..137615a 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -5,6 +5,7 @@ import javax.inject.Inject; +import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.Author; @@ -14,7 +15,6 @@ import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; -import it.cosenonjaviste.utils.PresenterScope; import rx.Observable; @PresenterScope @@ -25,7 +25,7 @@ public class PostListPresenter extends RxMvpPresenter { private boolean loadStarted; @Inject public PostListPresenter(SchedulerManager schedulerManager, WordPressService wordPressService) { - super(schedulerManager); + super(); this.wordPressService = wordPressService; } diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListComponent.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListComponent.java index 38e6e53..f9f8077 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListComponent.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListComponent.java @@ -2,7 +2,7 @@ import dagger.Component; import it.cosenonjaviste.ApplicationComponent; -import it.cosenonjaviste.utils.PresenterScope; +import it.cosenonjaviste.lib.mvp.PresenterScope; @PresenterScope @Component(dependencies = ApplicationComponent.class) diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index 0d5edef..a76f5a0 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -15,7 +15,6 @@ import butterknife.InjectView; import butterknife.OnClick; import it.cosenonjaviste.CoseNonJavisteApp; -import it.cosenonjaviste.ObjectsMapRetainedFragment; import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.RxMvpFragment; import rx.functions.Actions; @@ -29,15 +28,11 @@ public class TweetListFragment extends RxMvpFragment { @Inject TweetListPresenter presenter; @Override public void onCreate(Bundle state) { - ObjectsMapRetainedFragment.getOrCreate( - getChildFragmentManager(), + super.onCreate(state); + createComponent( () -> DaggerTweetListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - super.onCreate(state); - } - - @Override public TweetListPresenter getPresenter() { - return presenter; + presenter.init(getRestoredModel(state, getArguments()), this); } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index 855c2db..d9673df 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -4,11 +4,11 @@ import javax.inject.Inject; +import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.Tweet; import it.cosenonjaviste.model.TwitterService; -import it.cosenonjaviste.utils.PresenterScope; import rx.Observable; @PresenterScope @@ -19,7 +19,7 @@ public class TweetListPresenter extends RxMvpPresenter { private boolean loadStarted; @Inject public TweetListPresenter(SchedulerManager schedulerManager, TwitterService twitterService) { - super(schedulerManager); + super(); this.twitterService = twitterService; } From ffb0acf43f43e43822be82e91090f85049b2ea8d Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Tue, 28 Apr 2015 09:16:56 +0200 Subject: [PATCH 044/332] Method rename --- .../it/cosenonjaviste/lib/mvp/RxMvpPresenter.java | 12 +++--------- .../cosenonjaviste/author/AuthorListPresenter.java | 4 ++-- .../category/CategoryListPresenter.java | 4 ++-- .../it/cosenonjaviste/post/PostListPresenter.java | 4 ++-- .../cosenonjaviste/twitter/TweetListPresenter.java | 4 ++-- 5 files changed, 11 insertions(+), 17 deletions(-) diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index 9083121..9a568f2 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -13,16 +13,14 @@ public abstract class RxMvpPresenter { @Inject RxHolder rxHolder; protected M model; protected MvpView view; - private LifeCycle lifeCycle; @Inject void initLifeCycle(LifeCycle lifeCycle) { - this.lifeCycle = lifeCycle; - lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::subscribe); + lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); lifeCycle.subscribeOnSaveInstanceState(() -> model); } - public void subscribe() { + public void resume() { view.update(model); rxHolder.resubscribePendingObservable(); } @@ -38,14 +36,10 @@ public void init(M model, MvpView view) { public void initAndSubscribe(M model, MvpView view) { init(model, view); - subscribe(); + resume(); } public MvpView getView() { return view; } - - public LifeCycle getLifeCycle() { - return lifeCycle; - } } \ No newline at end of file diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index fef759b..ada5336 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -47,8 +47,8 @@ public void loadAuthors() { }); } - @Override public void subscribe() { - super.subscribe(); + @Override public void resume() { + super.resume(); //TODO unsubscribe getView().retry().subscribe(t -> loadAuthors()); getView().onItemClick().subscribe(this::goToAuthorDetail); diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index b9349b7..5bf3041 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -26,8 +26,8 @@ public class CategoryListPresenter extends RxMvpPresenter { this.wordPressService = wordPressService; } - @Override public void subscribe() { - super.subscribe(); + @Override public void resume() { + super.resume(); if (model.isEmpty() && !loadStarted) { loadData(); } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index 137615a..88564e6 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -29,8 +29,8 @@ public class PostListPresenter extends RxMvpPresenter { this.wordPressService = wordPressService; } - @Override public void subscribe() { - super.subscribe(); + @Override public void resume() { + super.resume(); if (model.getItems().isEmpty() && !loadStarted) { reloadData(); } diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index d9673df..f3f4452 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -41,8 +41,8 @@ public void reloadData() { }); } - @Override public void subscribe() { - super.subscribe(); + @Override public void resume() { + super.resume(); if (model.isEmpty() && !loadStarted) { reloadData(); } From 3d5e4144ef8fb3a9fb542aa599ba4540f2f0f5d0 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Wed, 29 Apr 2015 08:31:29 +0200 Subject: [PATCH 045/332] Moved model to subclasses --- SuperListviewLibrary/build.gradle | 4 +-- androidMvp/build.gradle | 4 +-- .../cosenonjaviste/lib/mvp/RxMvpFragment.java | 13 +++++++++- .../lib/mvp/RxMvpPresenter.java | 19 ++------------ .../mvp/utils/ObjectsMapRetainedFragment.java | 2 +- app/build.gradle | 6 ++--- .../author/AuthorListFragment.java | 22 +++++++--------- .../author/AuthorListPresenter.java | 21 ++++++++------- .../category/CategoryListFragment.java | 7 ++--- .../category/CategoryListPresenter.java | 18 ++++++++----- .../it/cosenonjaviste/page/PageFragment.java | 7 ++--- .../it/cosenonjaviste/page/PagePresenter.java | 19 +++++++++++--- .../cosenonjaviste/post/PostListFragment.java | 6 +++-- .../post/PostListPresenter.java | 18 ++++++++----- .../twitter/TweetListFragment.java | 6 +++-- .../twitter/TweetListPresenter.java | 18 ++++++++----- .../mvp/author/AuthorListPresenterTest.java | 23 +++++++++------- .../category/CategoryListPresenterTest.java | 23 +++++++++------- .../mvp/page/PagePresenterTest.java | 16 +++++++++--- .../mvp/post/AuthorPostListPresenterTest.java | 17 ++++++------ .../post/CategoryPostListPresenterTest.java | 20 +++++++------- .../mvp/post/PostListPresenterTest.java | 26 +++++++++++-------- .../mvp/twitter/TweetListPresenterTest.java | 23 +++++++++------- 23 files changed, 197 insertions(+), 141 deletions(-) diff --git a/SuperListviewLibrary/build.gradle b/SuperListviewLibrary/build.gradle index b260fd5..1d32765 100644 --- a/SuperListviewLibrary/build.gradle +++ b/SuperListviewLibrary/build.gradle @@ -7,11 +7,11 @@ dependencies { android { compileSdkVersion 21 - buildToolsVersion "21.1.2" + buildToolsVersion "22.0.1" defaultConfig { minSdkVersion 4 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" } diff --git a/androidMvp/build.gradle b/androidMvp/build.gradle index a5fbe54..78f1eb9 100644 --- a/androidMvp/build.gradle +++ b/androidMvp/build.gradle @@ -4,11 +4,11 @@ apply plugin: 'me.tatarka.retrolambda' android { compileSdkVersion 21 - buildToolsVersion "21.1.2" + buildToolsVersion "22.0.1" defaultConfig { minSdkVersion 9 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 1 versionName "1.0" } diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java index 954398d..fc590d5 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java @@ -16,6 +16,15 @@ public abstract class RxMvpFragment extends Fragment implements MvpView { @Inject LifeCycle lifeCycle; + private Object model; + + @Override public final void onCreate(Bundle state) { + super.onCreate(state); + model = init(state); + } + + protected abstract Object init(Bundle state); + protected static M getRestoredModel(Bundle state, Bundle arguments) { M restoredModel = null; if (state != null) { @@ -29,7 +38,9 @@ protected static M getRestoredModel(Bundle state, Bundle arguments) { @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - lifeCycle.saveInstanceState(obj -> outState.putParcelable(MODEL, Parcels.wrap(obj))); + if (model != null) { + outState.putParcelable(MODEL, Parcels.wrap(model)); + } } @Override public void onResume() { diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index 9a568f2..d81967a 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -10,35 +10,20 @@ public abstract class RxMvpPresenter { - @Inject RxHolder rxHolder; - protected M model; + @Inject protected RxHolder rxHolder; protected MvpView view; @Inject void initLifeCycle(LifeCycle lifeCycle) { lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); - lifeCycle.subscribeOnSaveInstanceState(() -> model); } - public void resume() { - view.update(model); - rxHolder.resubscribePendingObservable(); - } + public abstract void resume(); protected void subscribe(Observable observable, Action0 onAttach, Action1 onNext, Action1 onError) { rxHolder.subscribe(observable, onAttach, onNext, onError); } - public void init(M model, MvpView view) { - this.model = model; - this.view = view; - } - - public void initAndSubscribe(M model, MvpView view) { - init(model, view); - resume(); - } - public MvpView getView() { return view; } diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/ObjectsMapRetainedFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/ObjectsMapRetainedFragment.java index 4b0047a..e70c34e 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/ObjectsMapRetainedFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/ObjectsMapRetainedFragment.java @@ -35,7 +35,7 @@ public static

P load(FragmentManager fragmentManager) { } public static C getOrCreate(FragmentManager fragmentManager, Func0 componentFactory) { - C component = ObjectsMapRetainedFragment.load(fragmentManager); + C component = load(fragmentManager); if (component == null) { component = componentFactory.call(); ObjectsMapRetainedFragment.save(fragmentManager, component); diff --git a/app/build.gradle b/app/build.gradle index 2b94bcc..b530e5b 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -44,13 +44,13 @@ android { version = '0.7.2.201409121644' } - compileSdkVersion 21 - buildToolsVersion "21.1.2" + compileSdkVersion 22 + buildToolsVersion "22.0.1" defaultConfig { applicationId "it.cosenonjaviste" minSdkVersion 14 - targetSdkVersion 21 + targetSdkVersion 22 versionCode 11 versionName "2.0" buildConfigField "String", "CONSUMER_KEY", project.oauth_consumerKey diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index 88fdf96..c41f515 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -13,15 +13,13 @@ import butterknife.ButterKnife; import butterknife.InjectView; +import butterknife.OnClick; +import butterknife.OnItemClick; import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpFragment; import it.cosenonjaviste.utils.SingleFragmentActivity; -import rx.Observable; -import rx.android.view.ViewObservable; -import rx.android.widget.OnItemClickEvent; -import rx.android.widget.WidgetObservable; import rx.functions.Actions; public class AuthorListFragment extends RxMvpFragment { @@ -32,13 +30,13 @@ public class AuthorListFragment extends RxMvpFragment { private AuthorAdapter adapter; - @Override public void onCreate(Bundle state) { - super.onCreate(state); - + @Override public Object init(Bundle state) { createComponent(() -> DaggerAuthorListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build()) .inject(this); - presenter.init(getRestoredModel(state, getArguments()), this); + AuthorListModel model = getRestoredModel(state, getArguments()); + presenter.init(model, this); + return model; } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { @@ -50,12 +48,12 @@ public class AuthorListFragment extends RxMvpFragment { return view; } - public Observable onItemClick() { - return WidgetObservable.itemClicks(grid.getList()).map(OnItemClickEvent::position); + @OnItemClick(R.id.grid) void goToDetails(int position) { + presenter.goToAuthorDetail(position); } - public Observable retry() { - return ViewObservable.clicks(getView().findViewById(R.id.error_retry)).map(e -> null); + @OnClick(R.id.error_retry) void retry() { + presenter.loadAuthors(); } @Override public void update(AuthorListModel model) { diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index ada5336..0b13e41 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -5,9 +5,9 @@ import javax.inject.Inject; +import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.Author; import it.cosenonjaviste.model.AuthorResponse; import it.cosenonjaviste.model.WordPressService; @@ -18,13 +18,13 @@ @PresenterScope public class AuthorListPresenter extends RxMvpPresenter { - private WordPressService wordPressService; + protected AuthorListModel model; + + @Inject WordPressService wordPressService; private boolean loadStarted; - @Inject public AuthorListPresenter(SchedulerManager schedulerManager, WordPressService wordPressService) { - super(); - this.wordPressService = wordPressService; + @Inject public AuthorListPresenter() { } public void loadAuthors() { @@ -48,10 +48,8 @@ public void loadAuthors() { } @Override public void resume() { - super.resume(); - //TODO unsubscribe - getView().retry().subscribe(t -> loadAuthors()); - getView().onItemClick().subscribe(this::goToAuthorDetail); + view.update(model); + rxHolder.resubscribePendingObservable(); if (model.isEmpty() && !loadStarted) { loadAuthors(); } @@ -65,4 +63,9 @@ public void goToAuthorDetail(int position) { @Override public AuthorListFragment getView() { return (AuthorListFragment) super.getView(); } + + public void init(it.cosenonjaviste.author.AuthorListModel model, MvpView view) { + this.model = model; + this.view = view; + } } diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java index b30f472..e5212e5 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java @@ -29,13 +29,14 @@ public class CategoryListFragment extends RxMvpFragment { @Inject CategoryListPresenter presenter; - @Override public void onCreate(Bundle state) { - super.onCreate(state); + @Override public Object init(Bundle state) { createComponent( () -> DaggerCategoryListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - presenter.init(getRestoredModel(state, getArguments()), this); + CategoryListModel model = getRestoredModel(state, getArguments()); + presenter.init(model, this); + return model; } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index 5bf3041..68ce817 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -4,9 +4,9 @@ import javax.inject.Inject; +import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.CategoryResponse; import it.cosenonjaviste.model.WordPressService; @@ -17,17 +17,18 @@ @PresenterScope public class CategoryListPresenter extends RxMvpPresenter { - private WordPressService wordPressService; + private CategoryListModel model; + + @Inject WordPressService wordPressService; private boolean loadStarted; - @Inject public CategoryListPresenter(SchedulerManager schedulerManager, WordPressService wordPressService) { - super(); - this.wordPressService = wordPressService; + @Inject public CategoryListPresenter() { } @Override public void resume() { - super.resume(); + view.update(model); + rxHolder.resubscribePendingObservable(); if (model.isEmpty() && !loadStarted) { loadData(); } @@ -60,4 +61,9 @@ public void goToPosts(int position) { @Override public CategoryListFragment getView() { return (CategoryListFragment) super.getView(); } + + public void init(it.cosenonjaviste.category.CategoryListModel model, MvpView view) { + this.model = model; + this.view = view; + } } diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index 7600778..60163f5 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -30,13 +30,14 @@ public class PageFragment extends RxMvpFragment { @Inject PagePresenter presenter; - @Override public void onCreate(Bundle state) { - super.onCreate(state); + @Override public Object init(Bundle state) { createComponent( () -> DaggerPageComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - presenter.init(getRestoredModel(state, getArguments()), this); + PageModel model = getRestoredModel(state, getArguments()); + presenter.init(model, this); + return model; } @SuppressLint("SetJavaScriptEnabled") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java index 729c5d3..04b4862 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java +++ b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java @@ -2,20 +2,31 @@ import javax.inject.Inject; +import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; @PresenterScope public class PagePresenter extends RxMvpPresenter { - private PageUrlManager pageUrlManager; + private PageModel model; - @Inject public PagePresenter(SchedulerManager schedulerManager, PageUrlManager pageUrlManager) { - this.pageUrlManager = pageUrlManager; + @Inject PageUrlManager pageUrlManager; + + @Inject public PagePresenter() { } public String getPostUrl() { return pageUrlManager.getUrl(model.getUrl()); } + + @Override public void resume() { + view.update(model); + rxHolder.resubscribePendingObservable(); + } + + public void init(it.cosenonjaviste.page.PageModel model, MvpView view) { + this.model = model; + this.view = view; + } } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index 978ce49..3baf9c4 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -29,13 +29,15 @@ public class PostListFragment extends RxMvpFragment { private PostAdapter adapter; - @Override public void onCreate(Bundle state) { + @Override public Object init(Bundle state) { super.onCreate(state); createComponent( () -> DaggerPostListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - presenter.init(getRestoredModel(state, getArguments()), this); + PostListModel model = getRestoredModel(state, getArguments()); + presenter.init(model, this); + return model; } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index 88564e6..5a15277 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -5,9 +5,9 @@ import javax.inject.Inject; +import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.Author; import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.Post; @@ -20,17 +20,18 @@ @PresenterScope public class PostListPresenter extends RxMvpPresenter { - private WordPressService wordPressService; + private PostListModel model; + + @Inject WordPressService wordPressService; private boolean loadStarted; - @Inject public PostListPresenter(SchedulerManager schedulerManager, WordPressService wordPressService) { - super(); - this.wordPressService = wordPressService; + @Inject public PostListPresenter() { } @Override public void resume() { - super.resume(); + view.update(model); + rxHolder.resubscribePendingObservable(); if (model.getItems().isEmpty() && !loadStarted) { reloadData(); } @@ -97,4 +98,9 @@ private static int calcNextPage(int size, int pageSize) { @Override public PostListFragment getView() { return (PostListFragment) super.getView(); } + + public void init(it.cosenonjaviste.post.PostListModel model, MvpView view) { + this.model = model; + this.view = view; + } } diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index a76f5a0..c7e1490 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -27,12 +27,14 @@ public class TweetListFragment extends RxMvpFragment { @Inject TweetListPresenter presenter; - @Override public void onCreate(Bundle state) { + @Override public Object init(Bundle state) { super.onCreate(state); createComponent( () -> DaggerTweetListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - presenter.init(getRestoredModel(state, getArguments()), this); + TweetListModel model = getRestoredModel(state, getArguments()); + presenter.init(model, this); + return model; } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index f3f4452..02d995d 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -4,9 +4,9 @@ import javax.inject.Inject; +import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.Tweet; import it.cosenonjaviste.model.TwitterService; import rx.Observable; @@ -14,13 +14,13 @@ @PresenterScope public class TweetListPresenter extends RxMvpPresenter { - private TwitterService twitterService; + private TweetListModel model; + + @Inject TwitterService twitterService; private boolean loadStarted; - @Inject public TweetListPresenter(SchedulerManager schedulerManager, TwitterService twitterService) { - super(); - this.twitterService = twitterService; + @Inject public TweetListPresenter() { } public void reloadData() { @@ -42,7 +42,8 @@ public void reloadData() { } @Override public void resume() { - super.resume(); + view.update(model); + rxHolder.resubscribePendingObservable(); if (model.isEmpty() && !loadStarted) { reloadData(); } @@ -72,4 +73,9 @@ private static int calcNextPage(int size, int pageSize) { @Override public TweetListFragment getView() { return (TweetListFragment) super.getView(); } + + public void init(it.cosenonjaviste.twitter.TweetListModel model, MvpView view) { + this.model = model; + this.view = view; + } } diff --git a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java index ebb4c07..aba6389 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java @@ -1,16 +1,19 @@ package it.cosenonjaviste.mvp.author; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; +import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; import it.cosenonjaviste.author.AuthorListFragment; import it.cosenonjaviste.author.AuthorListModel; import it.cosenonjaviste.author.AuthorListPresenter; +import it.cosenonjaviste.lib.mvp.LifeCycle; +import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.post.PostListModel; @@ -27,24 +30,22 @@ public class AuthorListPresenterTest { @Mock AuthorListFragment view; - private AuthorListPresenter presenter; + @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); + + @InjectMocks AuthorListPresenter presenter; @Mock WordPressService wordPressService; @Captor ArgumentCaptor modelCaptor; - @Before - public void setup() { - presenter = new AuthorListPresenter(new TestSchedulerManager(), wordPressService); - } - @Test public void testLoad() { when(wordPressService.listAuthors()) .thenReturn(authorResponse(2)); AuthorListModel model = new AuthorListModel(); - presenter.initAndSubscribe(model, view); + presenter.init(model, view); + presenter.resume(); assertThat(model.size()).isEqualTo(2); } @@ -54,7 +55,8 @@ public void testRetryAfterError() { .thenReturn(Observable.error(new RuntimeException())); AuthorListModel model = new AuthorListModel(); - presenter.initAndSubscribe(model, view); + presenter.init(model, view); + presenter.resume(); when(wordPressService.listAuthors()) .thenReturn(authorResponse(2)); @@ -70,7 +72,8 @@ public void testGoToDetail() { .thenReturn(authorResponse(2)); AuthorListModel authorListModel = new AuthorListModel(); - presenter.initAndSubscribe(authorListModel, view); + presenter.init(authorListModel, view); + presenter.resume(); presenter.goToAuthorDetail(1); verify(view).open(any(), modelCaptor.capture()); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java index 0835c08..70238b2 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java @@ -1,16 +1,19 @@ package it.cosenonjaviste.mvp.category; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; +import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; import it.cosenonjaviste.category.CategoryListFragment; import it.cosenonjaviste.category.CategoryListModel; import it.cosenonjaviste.category.CategoryListPresenter; +import it.cosenonjaviste.lib.mvp.LifeCycle; +import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.TestSchedulerManager; @@ -28,24 +31,22 @@ public class CategoryListPresenterTest { @Mock WordPressService wordPressService; - private CategoryListPresenter presenter; + @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); + + @InjectMocks CategoryListPresenter presenter; @Mock CategoryListFragment view; @Captor ArgumentCaptor modelCaptor; - @Before - public void setup() { - presenter = new CategoryListPresenter(new TestSchedulerManager(), wordPressService); - } - @Test public void testLoad() { when(wordPressService.listCategories()) .thenReturn(categoryResponse(3)); CategoryListModel model = new CategoryListModel(); - presenter.initAndSubscribe(model, view); + presenter.init(model, view); + presenter.resume(); assertThat(model.size()).isEqualTo(3); Category category = model.get(2); assertThat(category.getId()).isEqualTo(2); @@ -59,7 +60,8 @@ public void testRetryAfterError() { .thenReturn(Observable.error(new RuntimeException())); CategoryListModel model = new CategoryListModel(); - presenter.initAndSubscribe(model, view); + presenter.init(model, view); + presenter.resume(); when(wordPressService.listCategories()) .thenReturn(categoryResponse(3)); @@ -75,7 +77,8 @@ public void testGoToPosts() { .thenReturn(categoryResponse(3)); CategoryListModel categoryListModel = new CategoryListModel(); - presenter.initAndSubscribe(categoryListModel, view); + presenter.init(categoryListModel, view); + presenter.resume(); presenter.goToPosts(1); verify(view).open(any(), modelCaptor.capture()); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java index e8cec62..59dda81 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java @@ -5,9 +5,13 @@ import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; +import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; +import it.cosenonjaviste.lib.mvp.LifeCycle; +import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; @@ -20,16 +24,20 @@ @RunWith(MockitoJUnitRunner.class) public class PagePresenterTest { - private PagePresenter presenter; - @Mock PageFragment view; + @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); + + @Spy PageUrlManager pageUrlManager = new PageUrlManager(); + + @InjectMocks PagePresenter presenter; + @Captor ArgumentCaptor modelCaptor; @Before public void setup() { - presenter = new PagePresenter(new TestSchedulerManager(), new PageUrlManager()); - presenter.initAndSubscribe(new PageModel("url"), view); + presenter.init(new PageModel("url"), view); + presenter.resume(); } @Test diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java index 4a073ae..be1fdb2 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java @@ -1,12 +1,15 @@ package it.cosenonjaviste.mvp.post; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; import it.cosenonjaviste.TestData; +import it.cosenonjaviste.lib.mvp.LifeCycle; +import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.post.PostListFragment; @@ -25,14 +28,11 @@ public class AuthorPostListPresenterTest { @Mock PostListFragment view; - @Mock WordPressService wordPressService; + @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); - private PostListPresenter presenter; + @Mock WordPressService wordPressService; - @Before - public void setup() { - presenter = new PostListPresenter(new TestSchedulerManager(), wordPressService); - } + @InjectMocks PostListPresenter presenter; @Test public void testLoad() throws InterruptedException { @@ -41,7 +41,8 @@ public void testLoad() throws InterruptedException { PostListModel model = new PostListModel(TestData.createAuthor(145)); - presenter.initAndSubscribe(model, view); + presenter.init(model, view); + presenter.resume(); assertThat(model.getItems().size()).isEqualTo(1); verify(wordPressService).listAuthorPosts(eq(145L), eq(1)); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java index 61679f3..e868ca9 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java @@ -1,12 +1,15 @@ package it.cosenonjaviste.mvp.post; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; import it.cosenonjaviste.TestData; +import it.cosenonjaviste.lib.mvp.LifeCycle; +import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.TestSchedulerManager; @@ -23,21 +26,19 @@ public class CategoryPostListPresenterTest { @Mock PostListFragment view; - @Mock WordPressService wordPressService; + @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); - private PostListPresenter presenter; + @Mock WordPressService wordPressService; - @Before - public void setup() { - presenter = new PostListPresenter(new TestSchedulerManager(), wordPressService); - } + @InjectMocks PostListPresenter presenter; @Test public void testLoad() throws InterruptedException { when(wordPressService.listCategoryPosts(eq(1L), eq(1))) .thenReturn(TestData.postResponse(1)); PostListModel model = new PostListModel(new Category(1, "cat", 10)); - presenter.initAndSubscribe(model, view); + presenter.init(model, view); + presenter.resume(); assertThat(model.getItems().size()).isEqualTo(1); } @@ -49,7 +50,8 @@ public void testLoadMore() { .thenReturn(TestData.postResponse(5)); PostListModel model = new PostListModel(new Category(1, "cat", 10)); - presenter.initAndSubscribe(model, view); + presenter.init(model, view); + presenter.resume(); presenter.loadNextPage(); assertThat(model.getItems().size()).isEqualTo(15); } diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java index 6629bd3..e4d60ff 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java @@ -1,14 +1,17 @@ package it.cosenonjaviste.mvp.post; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; import org.mockito.Captor; +import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; +import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.utils.OptionalList; +import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.Post; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.TestSchedulerManager; @@ -30,14 +33,11 @@ public class PostListPresenterTest { @Mock PostListFragment view; - @Mock WordPressService wordPressService; + @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); - private PostListPresenter presenter; + @Mock WordPressService wordPressService; - @Before - public void setup() { - presenter = new PostListPresenter(new TestSchedulerManager(), wordPressService); - } + @InjectMocks PostListPresenter presenter; @Captor ArgumentCaptor modelCaptor; @@ -47,7 +47,8 @@ public void testLoad() throws InterruptedException { .thenReturn(postResponse(1)); PostListModel model = new PostListModel(); - presenter.initAndSubscribe(model, view); + presenter.init(model, view); + presenter.resume(); assertThat(model.getItems().size()).isEqualTo(1); } @@ -60,7 +61,8 @@ public void testLoadMore() { .thenReturn(postResponse(6)); PostListModel model = new PostListModel(); - presenter.initAndSubscribe(model, view); + presenter.init(model, view); + presenter.resume(); presenter.loadNextPage(); OptionalList items = model.getItems(); @@ -73,7 +75,8 @@ public void testRetryAfterError() { .thenReturn(Observable.error(new RuntimeException())); PostListModel model = new PostListModel(); - presenter.initAndSubscribe(model, view); + presenter.init(model, view); + presenter.resume(); assertThat(model.getItems().isError()).isTrue(); when(wordPressService.listPosts(eq(1))) @@ -91,7 +94,8 @@ public void testGoToDetails() { .thenReturn(postResponse(1)); PostListModel model = new PostListModel(); - presenter.initAndSubscribe(model, view); + presenter.init(model, view); + presenter.resume(); Post firstPost = model.getItems().get(0); presenter.goToDetail(firstPost); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java index d357afb..944d56c 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java @@ -1,12 +1,15 @@ package it.cosenonjaviste.mvp.twitter; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.InjectMocks; import org.mockito.Mock; +import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; import it.cosenonjaviste.TestData; +import it.cosenonjaviste.lib.mvp.LifeCycle; +import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.twitter.TweetListFragment; @@ -23,21 +26,19 @@ public class TweetListPresenterTest { @Mock TweetListFragment view; - @Mock TwitterService twitterService; + @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); - private TweetListPresenter presenter; + @Mock TwitterService twitterService; - @Before - public void setup() { - presenter = new TweetListPresenter(new TestSchedulerManager(), twitterService); - } + @InjectMocks TweetListPresenter presenter; @Test public void testLoadTweets() { when(twitterService.loadTweets(eq(1))) .thenReturn(TestData.tweets()); TweetListModel model = new TweetListModel(); - presenter.initAndSubscribe(model, view); + presenter.init(model, view); + presenter.resume(); assertThat(model.size()).isEqualTo(10); } @@ -46,7 +47,8 @@ public void setup() { .thenReturn(Observable.error(new RuntimeException())); TweetListModel model = new TweetListModel(); - presenter.initAndSubscribe(model, view); + presenter.init(model, view); + presenter.resume(); assertThat(model.isError()).isTrue(); @@ -64,7 +66,8 @@ public void setup() { .thenReturn(TestData.tweets()); TweetListModel tweetListModel = new TweetListModel(); - presenter.initAndSubscribe(tweetListModel, view); + presenter.init(tweetListModel, view); + presenter.resume(); presenter.loadNextPage(); From 83f793f8dfac23822b61ebf80ccd43c4227bddf2 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Wed, 29 Apr 2015 08:35:13 +0200 Subject: [PATCH 046/332] Removed subscribe method in presenter --- .../lib/mvp/RxMvpPresenter.java | 7 ------ .../author/AuthorListPresenter.java | 2 +- .../category/CategoryListPresenter.java | 2 +- .../post/PostListPresenter.java | 24 ++++++++++--------- .../twitter/TweetListPresenter.java | 24 ++++++++++--------- 5 files changed, 28 insertions(+), 31 deletions(-) diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index d81967a..8080e58 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -4,9 +4,6 @@ import javax.inject.Inject; import it.cosenonjaviste.lib.mvp.utils.RxHolder; -import rx.Observable; -import rx.functions.Action0; -import rx.functions.Action1; public abstract class RxMvpPresenter { @@ -20,10 +17,6 @@ public abstract class RxMvpPresenter { public abstract void resume(); - protected void subscribe(Observable observable, Action0 onAttach, Action1 onNext, Action1 onError) { - rxHolder.subscribe(observable, onAttach, onNext, onError); - } - public MvpView getView() { return view; } diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index 0b13e41..f7822ef 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -33,7 +33,7 @@ public void loadAuthors() { .map(AuthorResponse::getAuthors) .doOnNext(Collections::sort); - subscribe(observable, + rxHolder.subscribe(observable, () -> { loadStarted = true; getView().startLoading(); diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index 68ce817..ffdfc2a 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -39,7 +39,7 @@ public void loadData() { .listCategories() .map(CategoryResponse::getCategories); - subscribe(observable, + rxHolder.subscribe(observable, () -> { loadStarted = true; getView().startLoading(); diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index 5a15277..046824e 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -16,6 +16,8 @@ import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; import rx.Observable; +import rx.functions.Action0; +import rx.functions.Action1; @PresenterScope public class PostListPresenter extends RxMvpPresenter { @@ -40,7 +42,7 @@ public class PostListPresenter extends RxMvpPresenter { public void reloadData() { Observable> observable = getObservable(1); - subscribe(observable, + rxHolder.subscribe(observable, () -> { loadStarted = true; getView().startLoading(model.getItems().isEmpty()); @@ -63,16 +65,16 @@ public void loadNextPage() { int page = calcNextPage(model.getItems().size(), WordPressService.POST_PAGE_SIZE); Observable> observable = getObservable(page); - subscribe(observable, - () -> getView().startMoreItemsLoading(), - posts -> { - model.getItems().append(posts); - model.setMoreDataAvailable(posts.size() == WordPressService.POST_PAGE_SIZE); - view.update(model); - }, throwable -> { - model.getItems().error(throwable); - view.update(model); - }); + Action0 onAttach = () -> getView().startMoreItemsLoading();Action1> onNext = posts -> { + model.getItems().append(posts); + model.setMoreDataAvailable(posts.size() == WordPressService.POST_PAGE_SIZE); + view.update(model); + }; + Action1 onError = throwable -> { + model.getItems().error(throwable); + view.update(model); + }; + rxHolder.subscribe(observable, onAttach, onNext, onError); } private Observable> getObservable(int page) { diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index 02d995d..572507f 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -10,6 +10,8 @@ import it.cosenonjaviste.model.Tweet; import it.cosenonjaviste.model.TwitterService; import rx.Observable; +import rx.functions.Action0; +import rx.functions.Action1; @PresenterScope public class TweetListPresenter extends RxMvpPresenter { @@ -26,7 +28,7 @@ public class TweetListPresenter extends RxMvpPresenter { public void reloadData() { Observable> observable = twitterService.loadTweets(1); - subscribe(observable, + rxHolder.subscribe(observable, () -> { loadStarted = true; getView().startLoading(model.isEmpty()); @@ -53,16 +55,16 @@ public void loadNextPage() { int page = calcNextPage(model.size(), TwitterService.PAGE_SIZE); Observable> observable = twitterService.loadTweets(page); - subscribe(observable, - () -> getView().startMoreItemsLoading(), - posts -> { - model.append(posts); - model.setMoreDataAvailable(posts.size() == TwitterService.PAGE_SIZE); - view.update(model); - }, throwable -> { - model.error(throwable); - view.update(model); - }); + Action0 onAttach = () -> getView().startMoreItemsLoading();Action1> onNext = posts -> { + model.append(posts); + model.setMoreDataAvailable(posts.size() == TwitterService.PAGE_SIZE); + view.update(model); + }; + Action1 onError = throwable -> { + model.error(throwable); + view.update(model); + }; + rxHolder.subscribe(observable, onAttach, onNext, onError); } From 4099376d8259d206b320c37a03140edfbbd9cbbd Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Wed, 29 Apr 2015 21:53:38 +0200 Subject: [PATCH 047/332] Deleted MvpView interface --- .../it/cosenonjaviste/lib/mvp/MvpView.java | 5 ---- .../cosenonjaviste/lib/mvp/RxMvpFragment.java | 2 +- .../lib/mvp/RxMvpPresenter.java | 10 +------ .../androidtest/base/FragmentRule.java | 7 +++-- .../java/it/cosenonjaviste/MainActivity.java | 3 +-- .../author/AuthorListFragment.java | 11 +++----- .../author/AuthorListPresenter.java | 21 ++++++++++----- .../category/CategoryListFragment.java | 5 ++-- .../category/CategoryListPresenter.java | 20 +++++++++----- .../it/cosenonjaviste/page/PageFragment.java | 2 +- .../it/cosenonjaviste/page/PagePresenter.java | 16 ++++++++--- .../cosenonjaviste/post/PostListFragment.java | 6 ++--- .../post/PostListPresenter.java | 27 ++++++++++++------- .../twitter/TweetListFragment.java | 3 +-- .../twitter/TweetListPresenter.java | 27 ++++++++++++------- .../utils/SingleFragmentActivity.java | 9 +++---- 16 files changed, 93 insertions(+), 81 deletions(-) delete mode 100644 androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpView.java diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpView.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpView.java deleted file mode 100644 index c9d6589..0000000 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/MvpView.java +++ /dev/null @@ -1,5 +0,0 @@ -package it.cosenonjaviste.lib.mvp; - -public interface MvpView { - void update(M model); -} diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java index fc590d5..05dd893 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java @@ -10,7 +10,7 @@ import it.cosenonjaviste.lib.mvp.utils.ObjectsMapRetainedFragment; import rx.functions.Func0; -public abstract class RxMvpFragment extends Fragment implements MvpView { +public abstract class RxMvpFragment extends Fragment { public static final String MODEL = "model"; diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index 8080e58..ca6f03a 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -8,16 +8,8 @@ public abstract class RxMvpPresenter { @Inject protected RxHolder rxHolder; - protected MvpView view; - - @Inject void initLifeCycle(LifeCycle lifeCycle) { - lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); - lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); - } public abstract void resume(); - public MvpView getView() { - return view; - } + @Inject public abstract void initLifeCycle(LifeCycle lifeCycle); } \ No newline at end of file diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java index 9b3c5c9..fbf68e1 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java @@ -4,21 +4,20 @@ import org.parceler.Parcels; -import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpFragment; import it.cosenonjaviste.utils.SingleFragmentActivity; public class FragmentRule extends ActivityRule { - private final Class> viewClass; + private final Class viewClass; private Object model; - public static FragmentRule create(Class> viewClass, M model) { + public static FragmentRule create(Class viewClass, M model) { return new FragmentRule(viewClass, model); } - private FragmentRule(Class> viewClass, Object model) { + private FragmentRule(Class viewClass, Object model) { super(SingleFragmentActivity.class); this.viewClass = viewClass; this.model = model; diff --git a/app/src/main/java/it/cosenonjaviste/MainActivity.java b/app/src/main/java/it/cosenonjaviste/MainActivity.java index a104b00..263c9ec 100755 --- a/app/src/main/java/it/cosenonjaviste/MainActivity.java +++ b/app/src/main/java/it/cosenonjaviste/MainActivity.java @@ -22,7 +22,6 @@ import it.cosenonjaviste.author.AuthorListModel; import it.cosenonjaviste.category.CategoryListFragment; import it.cosenonjaviste.category.CategoryListModel; -import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpFragment; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; @@ -102,7 +101,7 @@ private Fragment createFragment(int position) { } } - public static T createView(@NonNull Context context, @NonNull Class> viewClass, @NonNull M model) { + public static T createView(@NonNull Context context, @NonNull Class viewClass, @NonNull M model) { Fragment fragment = Fragment.instantiate(context, viewClass.getName()); Bundle bundle = new Bundle(); bundle.putParcelable(RxMvpFragment.MODEL, Parcels.wrap(model)); diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index c41f515..f4e1eb3 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -14,10 +14,8 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.OnClick; -import butterknife.OnItemClick; import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.R; -import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpFragment; import it.cosenonjaviste.utils.SingleFragmentActivity; import rx.functions.Actions; @@ -43,20 +41,17 @@ public class AuthorListFragment extends RxMvpFragment { View view = inflater.inflate(R.layout.super_grid, container, false); ButterKnife.inject(this, view); adapter = new AuthorAdapter(getActivity()); + grid.getList().setOnItemClickListener((parent, view1, position, id) -> presenter.goToAuthorDetail(position)); grid.getList().setNumColumns(2); grid.setAdapter(adapter); return view; } - @OnItemClick(R.id.grid) void goToDetails(int position) { - presenter.goToAuthorDetail(position); - } - @OnClick(R.id.error_retry) void retry() { presenter.loadAuthors(); } - @Override public void update(AuthorListModel model) { + public void update(AuthorListModel model) { model.call(authors -> { grid.showList(); adapter.reloadData(authors); @@ -67,7 +62,7 @@ public void startLoading() { grid.showProgress(); } - public void open(Class> viewClass, MM model) { + public void open(Class viewClass, MM model) { SingleFragmentActivity.open(getActivity(), viewClass, model); } diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index f7822ef..01155bc 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -5,7 +5,7 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.model.Author; @@ -19,6 +19,7 @@ public class AuthorListPresenter extends RxMvpPresenter { protected AuthorListModel model; + protected AuthorListFragment view; @Inject WordPressService wordPressService; @@ -40,18 +41,19 @@ public void loadAuthors() { }, posts -> { model.done(posts); - view.update(model); + getView().update(model); }, throwable -> { model.error(throwable); - view.update(model); + getView().update(model); }); } @Override public void resume() { - view.update(model); rxHolder.resubscribePendingObservable(); if (model.isEmpty() && !loadStarted) { loadAuthors(); + } else { + getView().update(model); } } @@ -60,12 +62,17 @@ public void goToAuthorDetail(int position) { getView().open(PostListFragment.class, new PostListModel(author)); } - @Override public AuthorListFragment getView() { - return (AuthorListFragment) super.getView(); + public AuthorListFragment getView() { + return view; } - public void init(it.cosenonjaviste.author.AuthorListModel model, MvpView view) { + public void init(AuthorListModel model, AuthorListFragment view) { this.model = model; this.view = view; } + + @Inject public void initLifeCycle(LifeCycle lifeCycle) { + lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); + lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); + } } diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java index e5212e5..5b8b726 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java @@ -16,7 +16,6 @@ import butterknife.OnClick; import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.R; -import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpFragment; import it.cosenonjaviste.utils.SingleFragmentActivity; import rx.functions.Actions; @@ -55,7 +54,7 @@ public class CategoryListFragment extends RxMvpFragment { } - @Override public void update(CategoryListModel model) { + public void update(CategoryListModel model) { model.call( categories -> { grid.showList(); @@ -72,7 +71,7 @@ public void startLoading() { grid.showProgress(); } - public void open(Class> viewClass, MM model) { + public void open(Class viewClass, MM model) { SingleFragmentActivity.open(getActivity(), viewClass, model); } } diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index ffdfc2a..45cc540 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -4,7 +4,7 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.model.Category; @@ -17,6 +17,7 @@ @PresenterScope public class CategoryListPresenter extends RxMvpPresenter { + private CategoryListFragment view; private CategoryListModel model; @Inject WordPressService wordPressService; @@ -27,7 +28,7 @@ public class CategoryListPresenter extends RxMvpPresenter { } @Override public void resume() { - view.update(model); + getView().update(model); rxHolder.resubscribePendingObservable(); if (model.isEmpty() && !loadStarted) { loadData(); @@ -46,10 +47,10 @@ public void loadData() { }, posts -> { model.done(posts); - view.update(model); + getView().update(model); }, throwable -> { model.error(throwable); - view.update(model); + getView().update(model); }); } @@ -58,12 +59,17 @@ public void goToPosts(int position) { getView().open(PostListFragment.class, new PostListModel(category)); } - @Override public CategoryListFragment getView() { - return (CategoryListFragment) super.getView(); + public CategoryListFragment getView() { + return view; } - public void init(it.cosenonjaviste.category.CategoryListModel model, MvpView view) { + public void init(it.cosenonjaviste.category.CategoryListModel model, CategoryListFragment view) { this.model = model; this.view = view; } + + @Override @Inject public void initLifeCycle(LifeCycle lifeCycle) { + lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); + lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); + } } diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index 60163f5..ba8d6e8 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -97,7 +97,7 @@ public void onPageFinished(WebView view11, String url) { return view; } - @Override public void update(PageModel model) { + public void update(PageModel model) { webView.loadUrl(presenter.getPostUrl()); } } diff --git a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java index 04b4862..ae13710 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java +++ b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java @@ -2,13 +2,14 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; @PresenterScope public class PagePresenter extends RxMvpPresenter { + protected PageFragment view; private PageModel model; @Inject PageUrlManager pageUrlManager; @@ -21,12 +22,21 @@ public String getPostUrl() { } @Override public void resume() { - view.update(model); + getView().update(model); rxHolder.resubscribePendingObservable(); } - public void init(it.cosenonjaviste.page.PageModel model, MvpView view) { + public void init(PageModel model, PageFragment view) { this.model = model; this.view = view; } + + public PageFragment getView() { + return view; + } + + @Inject public void initLifeCycle(LifeCycle lifeCycle) { + lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); + lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); + } } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index 3baf9c4..78ec84f 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -16,7 +16,6 @@ import butterknife.OnClick; import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.R; -import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpFragment; import it.cosenonjaviste.utils.SingleFragmentActivity; import rx.functions.Actions; @@ -30,7 +29,6 @@ public class PostListFragment extends RxMvpFragment { private PostAdapter adapter; @Override public Object init(Bundle state) { - super.onCreate(state); createComponent( () -> DaggerPostListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); @@ -56,7 +54,7 @@ public class PostListFragment extends RxMvpFragment { presenter.reloadData(); } - @Override public void update(PostListModel model) { + public void update(PostListModel model) { model.getItems().call( posts -> { list.showList(); @@ -82,7 +80,7 @@ public void startMoreItemsLoading() { list.showMoreProgress(); } - public void open(Class> viewClass, MM model) { + public void open(Class viewClass, MM model) { SingleFragmentActivity.open(getActivity(), viewClass, model); } } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index 046824e..44126d1 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -5,7 +5,7 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.model.Author; @@ -22,6 +22,7 @@ @PresenterScope public class PostListPresenter extends RxMvpPresenter { + protected PostListFragment view; private PostListModel model; @Inject WordPressService wordPressService; @@ -32,7 +33,7 @@ public class PostListPresenter extends RxMvpPresenter { } @Override public void resume() { - view.update(model); + getView().update(model); rxHolder.resubscribePendingObservable(); if (model.getItems().isEmpty() && !loadStarted) { reloadData(); @@ -50,10 +51,10 @@ public void reloadData() { posts -> { model.getItems().done(new ArrayList<>(posts)); model.setMoreDataAvailable(posts.size() == WordPressService.POST_PAGE_SIZE); - view.update(model); + getView().update(model); }, throwable -> { model.getItems().error(throwable); - view.update(model); + getView().update(model); }); } @@ -65,14 +66,15 @@ public void loadNextPage() { int page = calcNextPage(model.getItems().size(), WordPressService.POST_PAGE_SIZE); Observable> observable = getObservable(page); - Action0 onAttach = () -> getView().startMoreItemsLoading();Action1> onNext = posts -> { + Action0 onAttach = () -> getView().startMoreItemsLoading(); + Action1> onNext = posts -> { model.getItems().append(posts); model.setMoreDataAvailable(posts.size() == WordPressService.POST_PAGE_SIZE); - view.update(model); + getView().update(model); }; Action1 onError = throwable -> { model.getItems().error(throwable); - view.update(model); + getView().update(model); }; rxHolder.subscribe(observable, onAttach, onNext, onError); } @@ -97,12 +99,17 @@ private static int calcNextPage(int size, int pageSize) { return size / pageSize + 1; } - @Override public PostListFragment getView() { - return (PostListFragment) super.getView(); + public PostListFragment getView() { + return view; } - public void init(it.cosenonjaviste.post.PostListModel model, MvpView view) { + public void init(it.cosenonjaviste.post.PostListModel model, PostListFragment view) { this.model = model; this.view = view; } + + @Inject public void initLifeCycle(LifeCycle lifeCycle) { + lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); + lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); + } } diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index c7e1490..a925118 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -28,7 +28,6 @@ public class TweetListFragment extends RxMvpFragment { @Inject TweetListPresenter presenter; @Override public Object init(Bundle state) { - super.onCreate(state); createComponent( () -> DaggerTweetListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); @@ -52,7 +51,7 @@ public class TweetListFragment extends RxMvpFragment { presenter.reloadData(); } - @Override public void update(TweetListModel model) { + public void update(TweetListModel model) { model.call( items -> { list.showList(); diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index 572507f..15d705b 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -4,7 +4,7 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.MvpView; +import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.model.Tweet; @@ -16,6 +16,7 @@ @PresenterScope public class TweetListPresenter extends RxMvpPresenter { + protected TweetListFragment view; private TweetListModel model; @Inject TwitterService twitterService; @@ -36,15 +37,15 @@ public void reloadData() { posts -> { model.done(posts); model.setMoreDataAvailable(posts.size() == TwitterService.PAGE_SIZE); - view.update(model); + getView().update(model); }, throwable -> { model.error(throwable); - view.update(model); + getView().update(model); }); } @Override public void resume() { - view.update(model); + getView().update(model); rxHolder.resubscribePendingObservable(); if (model.isEmpty() && !loadStarted) { reloadData(); @@ -55,14 +56,15 @@ public void loadNextPage() { int page = calcNextPage(model.size(), TwitterService.PAGE_SIZE); Observable> observable = twitterService.loadTweets(page); - Action0 onAttach = () -> getView().startMoreItemsLoading();Action1> onNext = posts -> { + Action0 onAttach = () -> getView().startMoreItemsLoading(); + Action1> onNext = posts -> { model.append(posts); model.setMoreDataAvailable(posts.size() == TwitterService.PAGE_SIZE); - view.update(model); + getView().update(model); }; Action1 onError = throwable -> { model.error(throwable); - view.update(model); + getView().update(model); }; rxHolder.subscribe(observable, onAttach, onNext, onError); @@ -72,12 +74,17 @@ private static int calcNextPage(int size, int pageSize) { return size / pageSize + 1; } - @Override public TweetListFragment getView() { - return (TweetListFragment) super.getView(); + public TweetListFragment getView() { + return view; } - public void init(it.cosenonjaviste.twitter.TweetListModel model, MvpView view) { + public void init(TweetListModel model, TweetListFragment view) { this.model = model; this.view = view; } + + @Inject public void initLifeCycle(LifeCycle lifeCycle) { + lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); + lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); + } } diff --git a/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java b/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java index 9d3b699..a05afab 100644 --- a/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java +++ b/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java @@ -12,31 +12,30 @@ import org.parceler.Parcels; import it.cosenonjaviste.R; -import it.cosenonjaviste.lib.mvp.MvpView; import it.cosenonjaviste.lib.mvp.RxMvpFragment; public class SingleFragmentActivity extends ActionBarActivity { private static final String VIEW_CLASS = "viewClass"; - public static Intent populateIntent(Intent intent, Class> viewClass) { + public static Intent populateIntent(Intent intent, Class viewClass) { intent.putExtra(VIEW_CLASS, viewClass.getName()); return intent; } - public static Intent createIntent(Context context, Class> viewClass) { + public static Intent createIntent(Context context, Class viewClass) { Intent intent = new Intent(context, SingleFragmentActivity.class); populateIntent(intent, viewClass); return intent; } - public static Intent createIntent(Class> viewClass) { + public static Intent createIntent(Class viewClass) { Intent intent = new Intent(); populateIntent(intent, viewClass); return intent; } - public static void open(FragmentActivity activity, Class> viewClass, MM model) { + public static void open(FragmentActivity activity, Class viewClass, MM model) { Intent intent = createIntent(activity, viewClass); intent.putExtra(RxMvpFragment.MODEL, Parcels.wrap(model)); activity.startActivity(intent); From d4d6d96850e183f4f771059e99a753d3c6bfadc3 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Wed, 29 Apr 2015 22:16:18 +0200 Subject: [PATCH 048/332] Removed generic parameter in RxMvpPresenter --- .../src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java | 2 +- .../main/java/it/cosenonjaviste/author/AuthorListPresenter.java | 2 +- .../java/it/cosenonjaviste/category/CategoryListPresenter.java | 2 +- app/src/main/java/it/cosenonjaviste/page/PagePresenter.java | 2 +- app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java | 2 +- .../main/java/it/cosenonjaviste/twitter/TweetListPresenter.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index ca6f03a..4b042ab 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -5,7 +5,7 @@ import it.cosenonjaviste.lib.mvp.utils.RxHolder; -public abstract class RxMvpPresenter { +public abstract class RxMvpPresenter { @Inject protected RxHolder rxHolder; diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index 01155bc..6d5117d 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -16,7 +16,7 @@ import rx.Observable; @PresenterScope -public class AuthorListPresenter extends RxMvpPresenter { +public class AuthorListPresenter extends RxMvpPresenter { protected AuthorListModel model; protected AuthorListFragment view; diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index 45cc540..eee2088 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -15,7 +15,7 @@ import rx.Observable; @PresenterScope -public class CategoryListPresenter extends RxMvpPresenter { +public class CategoryListPresenter extends RxMvpPresenter { private CategoryListFragment view; private CategoryListModel model; diff --git a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java index ae13710..a2c0f81 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java +++ b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java @@ -7,7 +7,7 @@ import it.cosenonjaviste.lib.mvp.RxMvpPresenter; @PresenterScope -public class PagePresenter extends RxMvpPresenter { +public class PagePresenter extends RxMvpPresenter { protected PageFragment view; private PageModel model; diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index 44126d1..86c0ba6 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -20,7 +20,7 @@ import rx.functions.Action1; @PresenterScope -public class PostListPresenter extends RxMvpPresenter { +public class PostListPresenter extends RxMvpPresenter { protected PostListFragment view; private PostListModel model; diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index 15d705b..d4fb98a 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -14,7 +14,7 @@ import rx.functions.Action1; @PresenterScope -public class TweetListPresenter extends RxMvpPresenter { +public class TweetListPresenter extends RxMvpPresenter { protected TweetListFragment view; private TweetListModel model; From b12c4e57bc03b8910f6ab3569d94f61359d535ab Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Thu, 30 Apr 2015 08:35:29 +0200 Subject: [PATCH 049/332] Build tools 1.2.2 --- build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle b/build.gradle index 9c749c6..5791eff 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.1.3' + classpath 'com.android.tools.build:gradle:1.2.2' classpath 'me.tatarka:gradle-retrolambda:3.0.1' // NOTE: Do not place your application dependencies here; they belong From fbae2be616acb2ad1318042bcf2cfa2f7727419d Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Thu, 30 Apr 2015 08:39:02 +0200 Subject: [PATCH 050/332] Generics parameters in RxMvpPresenter --- .../src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java | 2 +- .../main/java/it/cosenonjaviste/author/AuthorListPresenter.java | 2 +- .../java/it/cosenonjaviste/category/CategoryListPresenter.java | 2 +- app/src/main/java/it/cosenonjaviste/page/PagePresenter.java | 2 +- app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java | 2 +- .../main/java/it/cosenonjaviste/twitter/TweetListPresenter.java | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index 4b042ab..5a5bfbc 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -5,7 +5,7 @@ import it.cosenonjaviste.lib.mvp.utils.RxHolder; -public abstract class RxMvpPresenter { +public abstract class RxMvpPresenter { @Inject protected RxHolder rxHolder; diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index 6d5117d..fd4c26f 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -16,7 +16,7 @@ import rx.Observable; @PresenterScope -public class AuthorListPresenter extends RxMvpPresenter { +public class AuthorListPresenter extends RxMvpPresenter { protected AuthorListModel model; protected AuthorListFragment view; diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index eee2088..b4b0ba6 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -15,7 +15,7 @@ import rx.Observable; @PresenterScope -public class CategoryListPresenter extends RxMvpPresenter { +public class CategoryListPresenter extends RxMvpPresenter { private CategoryListFragment view; private CategoryListModel model; diff --git a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java index a2c0f81..9d80184 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java +++ b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java @@ -7,7 +7,7 @@ import it.cosenonjaviste.lib.mvp.RxMvpPresenter; @PresenterScope -public class PagePresenter extends RxMvpPresenter { +public class PagePresenter extends RxMvpPresenter { protected PageFragment view; private PageModel model; diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index 86c0ba6..1b54cda 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -20,7 +20,7 @@ import rx.functions.Action1; @PresenterScope -public class PostListPresenter extends RxMvpPresenter { +public class PostListPresenter extends RxMvpPresenter { protected PostListFragment view; private PostListModel model; diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index d4fb98a..64c7a58 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -14,7 +14,7 @@ import rx.functions.Action1; @PresenterScope -public class TweetListPresenter extends RxMvpPresenter { +public class TweetListPresenter extends RxMvpPresenter { protected TweetListFragment view; private TweetListModel model; From 729b1192392c9c6c801a5c475baf5d1527692fde Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Thu, 30 Apr 2015 08:43:13 +0200 Subject: [PATCH 051/332] Model and View fields in base class --- .../java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java | 8 ++++++++ .../it/cosenonjaviste/author/AuthorListPresenter.java | 7 ------- .../it/cosenonjaviste/category/CategoryListPresenter.java | 7 ------- .../main/java/it/cosenonjaviste/page/PagePresenter.java | 7 ------- .../java/it/cosenonjaviste/post/PostListPresenter.java | 7 ------- .../it/cosenonjaviste/twitter/TweetListPresenter.java | 7 ------- 6 files changed, 8 insertions(+), 35 deletions(-) diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index 5a5bfbc..75f9c70 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -9,7 +9,15 @@ public abstract class RxMvpPresenter { @Inject protected RxHolder rxHolder; + protected M model; + + protected V view; + public abstract void resume(); @Inject public abstract void initLifeCycle(LifeCycle lifeCycle); + + public final V getView() { + return view; + } } \ No newline at end of file diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index fd4c26f..f01b831 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -18,9 +18,6 @@ @PresenterScope public class AuthorListPresenter extends RxMvpPresenter { - protected AuthorListModel model; - protected AuthorListFragment view; - @Inject WordPressService wordPressService; private boolean loadStarted; @@ -62,10 +59,6 @@ public void goToAuthorDetail(int position) { getView().open(PostListFragment.class, new PostListModel(author)); } - public AuthorListFragment getView() { - return view; - } - public void init(AuthorListModel model, AuthorListFragment view) { this.model = model; this.view = view; diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index b4b0ba6..4ea8791 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -17,9 +17,6 @@ @PresenterScope public class CategoryListPresenter extends RxMvpPresenter { - private CategoryListFragment view; - private CategoryListModel model; - @Inject WordPressService wordPressService; private boolean loadStarted; @@ -59,10 +56,6 @@ public void goToPosts(int position) { getView().open(PostListFragment.class, new PostListModel(category)); } - public CategoryListFragment getView() { - return view; - } - public void init(it.cosenonjaviste.category.CategoryListModel model, CategoryListFragment view) { this.model = model; this.view = view; diff --git a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java index 9d80184..e49272b 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java +++ b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java @@ -9,9 +9,6 @@ @PresenterScope public class PagePresenter extends RxMvpPresenter { - protected PageFragment view; - private PageModel model; - @Inject PageUrlManager pageUrlManager; @Inject public PagePresenter() { @@ -31,10 +28,6 @@ public void init(PageModel model, PageFragment view) { this.view = view; } - public PageFragment getView() { - return view; - } - @Inject public void initLifeCycle(LifeCycle lifeCycle) { lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index 1b54cda..ce16a52 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -22,9 +22,6 @@ @PresenterScope public class PostListPresenter extends RxMvpPresenter { - protected PostListFragment view; - private PostListModel model; - @Inject WordPressService wordPressService; private boolean loadStarted; @@ -99,10 +96,6 @@ private static int calcNextPage(int size, int pageSize) { return size / pageSize + 1; } - public PostListFragment getView() { - return view; - } - public void init(it.cosenonjaviste.post.PostListModel model, PostListFragment view) { this.model = model; this.view = view; diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index 64c7a58..7712c2d 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -16,9 +16,6 @@ @PresenterScope public class TweetListPresenter extends RxMvpPresenter { - protected TweetListFragment view; - private TweetListModel model; - @Inject TwitterService twitterService; private boolean loadStarted; @@ -74,10 +71,6 @@ private static int calcNextPage(int size, int pageSize) { return size / pageSize + 1; } - public TweetListFragment getView() { - return view; - } - public void init(TweetListModel model, TweetListFragment view) { this.model = model; this.view = view; From b15cc608786b5bab36acdec30d5a116c254a5f54 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Thu, 30 Apr 2015 08:49:42 +0200 Subject: [PATCH 052/332] Common methods in base class --- .../it/cosenonjaviste/lib/mvp/RxMvpPresenter.java | 10 +++++++++- .../it/cosenonjaviste/author/AuthorListPresenter.java | 11 ----------- .../category/CategoryListPresenter.java | 11 ----------- .../java/it/cosenonjaviste/page/PagePresenter.java | 11 ----------- .../it/cosenonjaviste/post/PostListPresenter.java | 11 ----------- .../it/cosenonjaviste/twitter/TweetListPresenter.java | 11 ----------- 6 files changed, 9 insertions(+), 56 deletions(-) diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index 75f9c70..c4ecf21 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -15,7 +15,15 @@ public abstract class RxMvpPresenter { public abstract void resume(); - @Inject public abstract void initLifeCycle(LifeCycle lifeCycle); + public final void init(M model, V view) { + this.model = model; + this.view = view; + } + + @Inject public final void initLifeCycle(LifeCycle lifeCycle) { + lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); + lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); + } public final V getView() { return view; diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index f01b831..8897d9e 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -5,7 +5,6 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.model.Author; @@ -58,14 +57,4 @@ public void goToAuthorDetail(int position) { Author author = model.get(position); getView().open(PostListFragment.class, new PostListModel(author)); } - - public void init(AuthorListModel model, AuthorListFragment view) { - this.model = model; - this.view = view; - } - - @Inject public void initLifeCycle(LifeCycle lifeCycle) { - lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); - lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); - } } diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index 4ea8791..3081b5e 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -4,7 +4,6 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.model.Category; @@ -55,14 +54,4 @@ public void goToPosts(int position) { Category category = model.get(position); getView().open(PostListFragment.class, new PostListModel(category)); } - - public void init(it.cosenonjaviste.category.CategoryListModel model, CategoryListFragment view) { - this.model = model; - this.view = view; - } - - @Override @Inject public void initLifeCycle(LifeCycle lifeCycle) { - lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); - lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); - } } diff --git a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java index e49272b..35d195f 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java +++ b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java @@ -2,7 +2,6 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; @@ -22,14 +21,4 @@ public String getPostUrl() { getView().update(model); rxHolder.resubscribePendingObservable(); } - - public void init(PageModel model, PageFragment view) { - this.model = model; - this.view = view; - } - - @Inject public void initLifeCycle(LifeCycle lifeCycle) { - lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); - lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); - } } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index ce16a52..f37aaf0 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -5,7 +5,6 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.model.Author; @@ -95,14 +94,4 @@ private Observable> getObservable(int page) { private static int calcNextPage(int size, int pageSize) { return size / pageSize + 1; } - - public void init(it.cosenonjaviste.post.PostListModel model, PostListFragment view) { - this.model = model; - this.view = view; - } - - @Inject public void initLifeCycle(LifeCycle lifeCycle) { - lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); - lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); - } } diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index 7712c2d..38fd0c0 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -4,7 +4,6 @@ import javax.inject.Inject; -import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.PresenterScope; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.model.Tweet; @@ -70,14 +69,4 @@ public void loadNextPage() { private static int calcNextPage(int size, int pageSize) { return size / pageSize + 1; } - - public void init(TweetListModel model, TweetListFragment view) { - this.model = model; - this.view = view; - } - - @Inject public void initLifeCycle(LifeCycle lifeCycle) { - lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); - lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); - } } From 88760b699e6f88de97d1834b9cc6ea3b9d1474e9 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Thu, 30 Apr 2015 09:05:48 +0200 Subject: [PATCH 053/332] More methods in base class --- .../lib/mvp/RxMvpPresenter.java | 25 +++++++-- .../author/AuthorListPresenter.java | 21 ++++---- .../category/CategoryListPresenter.java | 22 ++++---- .../it/cosenonjaviste/page/PagePresenter.java | 6 +-- .../post/PostListPresenter.java | 44 +++++++--------- .../twitter/TweetListPresenter.java | 52 ++++++++----------- 6 files changed, 86 insertions(+), 84 deletions(-) diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index c4ecf21..089a5b2 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -4,16 +4,21 @@ import javax.inject.Inject; import it.cosenonjaviste.lib.mvp.utils.RxHolder; +import rx.Observable; +import rx.functions.Action0; +import rx.functions.Action1; public abstract class RxMvpPresenter { - @Inject protected RxHolder rxHolder; + @Inject RxHolder rxHolder; - protected M model; + private M model; - protected V view; + private V view; - public abstract void resume(); + public void resume() { + rxHolder.resubscribePendingObservable(); + } public final void init(M model, V view) { this.model = model; @@ -28,4 +33,16 @@ public final void init(M model, V view) { public final V getView() { return view; } + + public M getModel() { + return model; + } + + public void subscribe(Observable observable, Action0 onAttach, Action1 onNext, Action1 onError) { + rxHolder.subscribe(observable, onAttach, onNext, onError); + } + + public boolean isTaskRunning() { + return rxHolder.isTaskRunning(); + } } \ No newline at end of file diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index 8897d9e..7b4f48c 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -19,8 +19,6 @@ public class AuthorListPresenter extends RxMvpPresenter { - loadStarted = true; getView().startLoading(); }, posts -> { - model.done(posts); - getView().update(model); + getModel().done(posts); + getView().update(getModel()); }, throwable -> { - model.error(throwable); - getView().update(model); + getModel().error(throwable); + getView().update(getModel()); }); } @Override public void resume() { - rxHolder.resubscribePendingObservable(); - if (model.isEmpty() && !loadStarted) { + super.resume(); + if (getModel().isEmpty() && !isTaskRunning()) { loadAuthors(); } else { - getView().update(model); + getView().update(getModel()); } } public void goToAuthorDetail(int position) { - Author author = model.get(position); + Author author = getModel().get(position); getView().open(PostListFragment.class, new PostListModel(author)); } } diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index 3081b5e..74abeb7 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -18,16 +18,15 @@ public class CategoryListPresenter extends RxMvpPresenter { - loadStarted = true; getView().startLoading(); }, posts -> { - model.done(posts); - getView().update(model); + getModel().done(posts); + getView().update(getModel()); }, throwable -> { - model.error(throwable); - getView().update(model); + getModel().error(throwable); + getView().update(getModel()); }); } public void goToPosts(int position) { - Category category = model.get(position); + Category category = getModel().get(position); getView().open(PostListFragment.class, new PostListModel(category)); } } diff --git a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java index 35d195f..427daad 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java +++ b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java @@ -14,11 +14,11 @@ public class PagePresenter extends RxMvpPresenter { } public String getPostUrl() { - return pageUrlManager.getUrl(model.getUrl()); + return pageUrlManager.getUrl(getModel().getUrl()); } @Override public void resume() { - getView().update(model); - rxHolder.resubscribePendingObservable(); + getView().update(getModel()); + super.resume(); } } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index f37aaf0..67686ed 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -23,34 +23,30 @@ public class PostListPresenter extends RxMvpPresenter> observable = getObservable(1); - rxHolder.subscribe(observable, - () -> { - loadStarted = true; - getView().startLoading(model.getItems().isEmpty()); - }, + subscribe(observable, + () -> getView().startLoading(getModel().getItems().isEmpty()), posts -> { - model.getItems().done(new ArrayList<>(posts)); - model.setMoreDataAvailable(posts.size() == WordPressService.POST_PAGE_SIZE); - getView().update(model); + getModel().getItems().done(new ArrayList<>(posts)); + getModel().setMoreDataAvailable(posts.size() == WordPressService.POST_PAGE_SIZE); + getView().update(getModel()); }, throwable -> { - model.getItems().error(throwable); - getView().update(model); + getModel().getItems().error(throwable); + getView().update(getModel()); }); } @@ -59,29 +55,29 @@ public void goToDetail(Post item) { } public void loadNextPage() { - int page = calcNextPage(model.getItems().size(), WordPressService.POST_PAGE_SIZE); + int page = calcNextPage(getModel().getItems().size(), WordPressService.POST_PAGE_SIZE); Observable> observable = getObservable(page); Action0 onAttach = () -> getView().startMoreItemsLoading(); Action1> onNext = posts -> { - model.getItems().append(posts); - model.setMoreDataAvailable(posts.size() == WordPressService.POST_PAGE_SIZE); - getView().update(model); + getModel().getItems().append(posts); + getModel().setMoreDataAvailable(posts.size() == WordPressService.POST_PAGE_SIZE); + getView().update(getModel()); }; Action1 onError = throwable -> { - model.getItems().error(throwable); - getView().update(model); + getModel().getItems().error(throwable); + getView().update(getModel()); }; - rxHolder.subscribe(observable, onAttach, onNext, onError); + subscribe(observable, onAttach, onNext, onError); } private Observable> getObservable(int page) { Observable observable; - Category category = model.getCategory(); + Category category = getModel().getCategory(); if (category != null) { observable = wordPressService.listCategoryPosts(category.getId(), page); } else { - Author author = model.getAuthor(); + Author author = getModel().getAuthor(); if (author != null) { observable = wordPressService.listAuthorPosts(author.getId(), page); } else { diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index 38fd0c0..e43ca96 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -9,60 +9,54 @@ import it.cosenonjaviste.model.Tweet; import it.cosenonjaviste.model.TwitterService; import rx.Observable; -import rx.functions.Action0; -import rx.functions.Action1; @PresenterScope public class TweetListPresenter extends RxMvpPresenter { @Inject TwitterService twitterService; - private boolean loadStarted; - @Inject public TweetListPresenter() { } public void reloadData() { Observable> observable = twitterService.loadTweets(1); - rxHolder.subscribe(observable, - () -> { - loadStarted = true; - getView().startLoading(model.isEmpty()); - }, + subscribe(observable, + () -> getView().startLoading(getModel().isEmpty()), posts -> { - model.done(posts); - model.setMoreDataAvailable(posts.size() == TwitterService.PAGE_SIZE); - getView().update(model); + getModel().done(posts); + getModel().setMoreDataAvailable(posts.size() == TwitterService.PAGE_SIZE); + getView().update(getModel()); }, throwable -> { - model.error(throwable); - getView().update(model); + getModel().error(throwable); + getView().update(getModel()); }); } @Override public void resume() { - getView().update(model); - rxHolder.resubscribePendingObservable(); - if (model.isEmpty() && !loadStarted) { + super.resume(); + if (getModel().isEmpty() && !isTaskRunning()) { reloadData(); + } else { + getView().update(getModel()); } } public void loadNextPage() { - int page = calcNextPage(model.size(), TwitterService.PAGE_SIZE); + int page = calcNextPage(getModel().size(), TwitterService.PAGE_SIZE); Observable> observable = twitterService.loadTweets(page); - Action0 onAttach = () -> getView().startMoreItemsLoading(); - Action1> onNext = posts -> { - model.append(posts); - model.setMoreDataAvailable(posts.size() == TwitterService.PAGE_SIZE); - getView().update(model); - }; - Action1 onError = throwable -> { - model.error(throwable); - getView().update(model); - }; - rxHolder.subscribe(observable, onAttach, onNext, onError); + subscribe(observable, + () -> getView().startMoreItemsLoading(), + posts -> { + getModel().append(posts); + getModel().setMoreDataAvailable(posts.size() == TwitterService.PAGE_SIZE); + getView().update(getModel()); + }, + throwable -> { + getModel().error(throwable); + getView().update(getModel()); + }); } From c6a856c7184f59da8d45ef52434b4404b943cf47 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Fri, 1 May 2015 16:30:22 +0200 Subject: [PATCH 054/332] State management in LifeCycle class --- .../it/cosenonjaviste/lib/mvp/LifeCycle.java | 20 ++++++----- .../cosenonjaviste/lib/mvp/RxMvpFragment.java | 35 ++++++++----------- .../lib/mvp/RxMvpPresenter.java | 13 ++++--- .../androidtest/base/FragmentRule.java | 4 +-- .../java/it/cosenonjaviste/MainActivity.java | 4 +-- .../author/AuthorListFragment.java | 8 ++--- .../category/CategoryListFragment.java | 8 ++--- .../it/cosenonjaviste/page/PageFragment.java | 8 ++--- .../cosenonjaviste/post/PostListFragment.java | 8 ++--- .../twitter/TweetListFragment.java | 8 ++--- .../utils/SingleFragmentActivity.java | 4 +-- .../it/cosenonjaviste/mvp/TestLifeCycle.java | 16 +++++++++ .../mvp/author/AuthorListPresenterTest.java | 25 ++++++------- .../category/CategoryListPresenterTest.java | 14 ++++---- .../mvp/page/PagePresenterTest.java | 6 ++-- .../mvp/post/AuthorPostListPresenterTest.java | 6 ++-- .../post/CategoryPostListPresenterTest.java | 9 +++-- .../mvp/post/PostListPresenterTest.java | 15 ++++---- .../mvp/twitter/TweetListPresenterTest.java | 12 +++---- 19 files changed, 110 insertions(+), 113 deletions(-) create mode 100644 app/src/test/java/it/cosenonjaviste/mvp/TestLifeCycle.java diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java index f140388..f161231 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java @@ -6,13 +6,15 @@ import rx.Subscription; import rx.functions.Action0; import rx.functions.Action1; -import rx.functions.Func0; +import rx.functions.Action2; +import rx.functions.Func1; import rx.subjects.PublishSubject; @PresenterScope public class LifeCycle { - private Func0 saveObjectFunc; + private Action1> saveObjectFunc; + private Action1> loadAction; public enum EventType { RESUME, PAUSE, DESTROY_VIEW, DESTROY_ALL; @@ -35,16 +37,18 @@ public Subscription subscribe(EventType eventType, Action0 callback) { return subject.asObservable().filter(t -> t == eventType).subscribe(t -> callback.call()); } - public void subscribeOnSaveInstanceState(Func0 saveObjectFunc) { + public void subscribeState(Action1> saveObjectFunc, Action1> loadAction) { this.saveObjectFunc = saveObjectFunc; + this.loadAction = loadAction; } - public void saveInstanceState(Action1 saver) { + public void saveState(Action2 saver) { if (saveObjectFunc != null) { - Object obj = saveObjectFunc.call(); - if (obj != null) { - saver.call(obj); - } + saveObjectFunc.call(saver); } } + + public void loadState(Func1 loader) { + loadAction.call(loader); + } } diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java index 05dd893..b91c9dc 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java @@ -10,37 +10,30 @@ import it.cosenonjaviste.lib.mvp.utils.ObjectsMapRetainedFragment; import rx.functions.Func0; -public abstract class RxMvpFragment extends Fragment { - - public static final String MODEL = "model"; +public abstract class RxMvpFragment extends Fragment { @Inject LifeCycle lifeCycle; - private Object model; - @Override public final void onCreate(Bundle state) { super.onCreate(state); - model = init(state); + init(state); + lifeCycle.loadState(key -> { + Object restoredModel = null; + if (state != null) { + restoredModel = Parcels.unwrap(state.getParcelable(key)); + } + if (restoredModel == null && getArguments() != null) { + restoredModel = Parcels.unwrap(getArguments().getParcelable(key)); + } + return restoredModel; + }); } - protected abstract Object init(Bundle state); - - protected static M getRestoredModel(Bundle state, Bundle arguments) { - M restoredModel = null; - if (state != null) { - restoredModel = Parcels.unwrap(state.getParcelable(MODEL)); - } - if (restoredModel == null && arguments != null) { - restoredModel = Parcels.unwrap(arguments.getParcelable(MODEL)); - } - return restoredModel; - } + protected abstract void init(Bundle state); @Override public void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); - if (model != null) { - outState.putParcelable(MODEL, Parcels.wrap(model)); - } + lifeCycle.saveState((key, obj) -> outState.putParcelable(key, Parcels.wrap(obj))); } @Override public void onResume() { diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index 089a5b2..ae8d7ed 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -4,13 +4,16 @@ import javax.inject.Inject; import it.cosenonjaviste.lib.mvp.utils.RxHolder; +import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import rx.Observable; import rx.functions.Action0; import rx.functions.Action1; public abstract class RxMvpPresenter { - @Inject RxHolder rxHolder; + public static final String MODEL = "model"; + + private RxHolder rxHolder; private M model; @@ -20,14 +23,16 @@ public void resume() { rxHolder.resubscribePendingObservable(); } - public final void init(M model, V view) { - this.model = model; + public final void init(V view) { this.view = view; } - @Inject public final void initLifeCycle(LifeCycle lifeCycle) { + @Inject public final void initLifeCycle(LifeCycle lifeCycle, SchedulerManager schedulerManager) { lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); + lifeCycle.subscribeState(saver -> saver.call(MODEL, getModel()), loader -> model = (M) loader.call(MODEL)); + + rxHolder = new RxHolder(schedulerManager, lifeCycle); } public final V getView() { diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java index fbf68e1..b034cb8 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java @@ -4,7 +4,7 @@ import org.parceler.Parcels; -import it.cosenonjaviste.lib.mvp.RxMvpFragment; +import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.utils.SingleFragmentActivity; public class FragmentRule extends ActivityRule { @@ -25,7 +25,7 @@ private FragmentRule(Class viewClass, Object model) { @Override protected Intent getLaunchIntent(String targetPackage, Class activityClass) { Intent intent = SingleFragmentActivity.populateIntent(super.getLaunchIntent(targetPackage, activityClass), viewClass); - intent.putExtra(RxMvpFragment.MODEL, Parcels.wrap(model)); + intent.putExtra(RxMvpPresenter.MODEL, Parcels.wrap(model)); return intent; } } diff --git a/app/src/main/java/it/cosenonjaviste/MainActivity.java b/app/src/main/java/it/cosenonjaviste/MainActivity.java index 263c9ec..2bad1c7 100755 --- a/app/src/main/java/it/cosenonjaviste/MainActivity.java +++ b/app/src/main/java/it/cosenonjaviste/MainActivity.java @@ -22,7 +22,7 @@ import it.cosenonjaviste.author.AuthorListModel; import it.cosenonjaviste.category.CategoryListFragment; import it.cosenonjaviste.category.CategoryListModel; -import it.cosenonjaviste.lib.mvp.RxMvpFragment; +import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; import it.cosenonjaviste.post.PostListFragment; @@ -104,7 +104,7 @@ private Fragment createFragment(int position) { public static T createView(@NonNull Context context, @NonNull Class viewClass, @NonNull M model) { Fragment fragment = Fragment.instantiate(context, viewClass.getName()); Bundle bundle = new Bundle(); - bundle.putParcelable(RxMvpFragment.MODEL, Parcels.wrap(model)); + bundle.putParcelable(RxMvpPresenter.MODEL, Parcels.wrap(model)); fragment.setArguments(bundle); return (T) fragment; } diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index f4e1eb3..3da2dcb 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -20,7 +20,7 @@ import it.cosenonjaviste.utils.SingleFragmentActivity; import rx.functions.Actions; -public class AuthorListFragment extends RxMvpFragment { +public class AuthorListFragment extends RxMvpFragment { @InjectView(R.id.grid) SuperGridview grid; @@ -28,13 +28,11 @@ public class AuthorListFragment extends RxMvpFragment { private AuthorAdapter adapter; - @Override public Object init(Bundle state) { + @Override public void init(Bundle state) { createComponent(() -> DaggerAuthorListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build()) .inject(this); - AuthorListModel model = getRestoredModel(state, getArguments()); - presenter.init(model, this); - return model; + presenter.init(this); } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java index 5b8b726..d95ddbf 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java @@ -20,7 +20,7 @@ import it.cosenonjaviste.utils.SingleFragmentActivity; import rx.functions.Actions; -public class CategoryListFragment extends RxMvpFragment { +public class CategoryListFragment extends RxMvpFragment { @InjectView(R.id.grid) SuperGridview grid; @@ -28,14 +28,12 @@ public class CategoryListFragment extends RxMvpFragment { @Inject CategoryListPresenter presenter; - @Override public Object init(Bundle state) { + @Override public void init(Bundle state) { createComponent( () -> DaggerCategoryListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - CategoryListModel model = getRestoredModel(state, getArguments()); - presenter.init(model, this); - return model; + presenter.init(this); } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index ba8d6e8..96091ea 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -22,7 +22,7 @@ import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.RxMvpFragment; -public class PageFragment extends RxMvpFragment { +public class PageFragment extends RxMvpFragment { @InjectView(R.id.web_view) WebView webView; @@ -30,14 +30,12 @@ public class PageFragment extends RxMvpFragment { @Inject PagePresenter presenter; - @Override public Object init(Bundle state) { + @Override public void init(Bundle state) { createComponent( () -> DaggerPageComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - PageModel model = getRestoredModel(state, getArguments()); - presenter.init(model, this); - return model; + presenter.init(this); } @SuppressLint("SetJavaScriptEnabled") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index 78ec84f..b671203 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -20,7 +20,7 @@ import it.cosenonjaviste.utils.SingleFragmentActivity; import rx.functions.Actions; -public class PostListFragment extends RxMvpFragment { +public class PostListFragment extends RxMvpFragment { @InjectView(R.id.list) SuperListview list; @@ -28,14 +28,12 @@ public class PostListFragment extends RxMvpFragment { private PostAdapter adapter; - @Override public Object init(Bundle state) { + @Override public void init(Bundle state) { createComponent( () -> DaggerPostListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - PostListModel model = getRestoredModel(state, getArguments()); - presenter.init(model, this); - return model; + presenter.init(this); } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index a925118..35bbfe3 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -19,7 +19,7 @@ import it.cosenonjaviste.lib.mvp.RxMvpFragment; import rx.functions.Actions; -public class TweetListFragment extends RxMvpFragment { +public class TweetListFragment extends RxMvpFragment { @InjectView(R.id.list) SuperListview list; @@ -27,13 +27,11 @@ public class TweetListFragment extends RxMvpFragment { @Inject TweetListPresenter presenter; - @Override public Object init(Bundle state) { + @Override public void init(Bundle state) { createComponent( () -> DaggerTweetListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - TweetListModel model = getRestoredModel(state, getArguments()); - presenter.init(model, this); - return model; + presenter.init(this); } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java b/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java index a05afab..af094c2 100644 --- a/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java +++ b/app/src/main/java/it/cosenonjaviste/utils/SingleFragmentActivity.java @@ -12,7 +12,7 @@ import org.parceler.Parcels; import it.cosenonjaviste.R; -import it.cosenonjaviste.lib.mvp.RxMvpFragment; +import it.cosenonjaviste.lib.mvp.RxMvpPresenter; public class SingleFragmentActivity extends ActionBarActivity { @@ -37,7 +37,7 @@ public static Intent createIntent(Class viewClass) { public static void open(FragmentActivity activity, Class viewClass, MM model) { Intent intent = createIntent(activity, viewClass); - intent.putExtra(RxMvpFragment.MODEL, Parcels.wrap(model)); + intent.putExtra(RxMvpPresenter.MODEL, Parcels.wrap(model)); activity.startActivity(intent); } diff --git a/app/src/test/java/it/cosenonjaviste/mvp/TestLifeCycle.java b/app/src/test/java/it/cosenonjaviste/mvp/TestLifeCycle.java new file mode 100644 index 0000000..112f806 --- /dev/null +++ b/app/src/test/java/it/cosenonjaviste/mvp/TestLifeCycle.java @@ -0,0 +1,16 @@ +package it.cosenonjaviste.mvp; + +import it.cosenonjaviste.lib.mvp.LifeCycle; +import it.cosenonjaviste.lib.mvp.RxMvpPresenter; + +public class TestLifeCycle extends LifeCycle { + + private TestSchedulerManager schedulerManager = new TestSchedulerManager(); + + public void initAndResume(M model, RxMvpPresenter presenter, V view) { + presenter.initLifeCycle(this, schedulerManager); + loadState(key -> model); + presenter.init(view); + presenter.resume(); + } +} diff --git a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java index aba6389..2dd6494 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java @@ -6,16 +6,13 @@ import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; import it.cosenonjaviste.author.AuthorListFragment; import it.cosenonjaviste.author.AuthorListModel; import it.cosenonjaviste.author.AuthorListPresenter; -import it.cosenonjaviste.lib.mvp.LifeCycle; -import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.mvp.TestSchedulerManager; +import it.cosenonjaviste.mvp.TestLifeCycle; import it.cosenonjaviste.post.PostListModel; import rx.Observable; @@ -30,22 +27,22 @@ public class AuthorListPresenterTest { @Mock AuthorListFragment view; - @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); - @InjectMocks AuthorListPresenter presenter; @Mock WordPressService wordPressService; @Captor ArgumentCaptor modelCaptor; + private TestLifeCycle testLifeCycle = new TestLifeCycle(); + @Test public void testLoad() { when(wordPressService.listAuthors()) .thenReturn(authorResponse(2)); AuthorListModel model = new AuthorListModel(); - presenter.init(model, view); - presenter.resume(); + testLifeCycle.initAndResume(model, presenter, view); + assertThat(model.size()).isEqualTo(2); } @@ -53,14 +50,12 @@ public void testLoad() { public void testRetryAfterError() { when(wordPressService.listAuthors()) .thenReturn(Observable.error(new RuntimeException())); - - AuthorListModel model = new AuthorListModel(); - presenter.init(model, view); - presenter.resume(); - when(wordPressService.listAuthors()) .thenReturn(authorResponse(2)); + AuthorListModel model = new AuthorListModel(); + testLifeCycle.initAndResume(model, presenter, view); + presenter.loadAuthors(); assertThat(model.size()).isEqualTo(2); @@ -72,8 +67,8 @@ public void testGoToDetail() { .thenReturn(authorResponse(2)); AuthorListModel authorListModel = new AuthorListModel(); - presenter.init(authorListModel, view); - presenter.resume(); + testLifeCycle.initAndResume(authorListModel, presenter, view); + presenter.goToAuthorDetail(1); verify(view).open(any(), modelCaptor.capture()); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java index 70238b2..18450bb 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java @@ -16,6 +16,7 @@ import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.WordPressService; +import it.cosenonjaviste.mvp.TestLifeCycle; import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.post.PostListModel; import rx.Observable; @@ -31,7 +32,7 @@ public class CategoryListPresenterTest { @Mock WordPressService wordPressService; - @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); + private TestLifeCycle testLifeCycle = new TestLifeCycle(); @InjectMocks CategoryListPresenter presenter; @@ -45,8 +46,8 @@ public void testLoad() { .thenReturn(categoryResponse(3)); CategoryListModel model = new CategoryListModel(); - presenter.init(model, view); - presenter.resume(); + testLifeCycle.initAndResume(model, presenter, view); + assertThat(model.size()).isEqualTo(3); Category category = model.get(2); assertThat(category.getId()).isEqualTo(2); @@ -60,8 +61,7 @@ public void testRetryAfterError() { .thenReturn(Observable.error(new RuntimeException())); CategoryListModel model = new CategoryListModel(); - presenter.init(model, view); - presenter.resume(); + testLifeCycle.initAndResume(model, presenter, view); when(wordPressService.listCategories()) .thenReturn(categoryResponse(3)); @@ -77,8 +77,8 @@ public void testGoToPosts() { .thenReturn(categoryResponse(3)); CategoryListModel categoryListModel = new CategoryListModel(); - presenter.init(categoryListModel, view); - presenter.resume(); + testLifeCycle.initAndResume(categoryListModel, presenter, view); + presenter.goToPosts(1); verify(view).open(any(), modelCaptor.capture()); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java index 59dda81..8489a96 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java @@ -12,6 +12,7 @@ import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.utils.RxHolder; +import it.cosenonjaviste.mvp.TestLifeCycle; import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; @@ -26,7 +27,7 @@ public class PagePresenterTest { @Mock PageFragment view; - @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); + private TestLifeCycle testLifeCycle = new TestLifeCycle(); @Spy PageUrlManager pageUrlManager = new PageUrlManager(); @@ -36,8 +37,7 @@ public class PagePresenterTest { @Before public void setup() { - presenter.init(new PageModel("url"), view); - presenter.resume(); + testLifeCycle.initAndResume(new PageModel("url"), presenter, view); } @Test diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java index be1fdb2..716408f 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java @@ -11,6 +11,7 @@ import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.WordPressService; +import it.cosenonjaviste.mvp.TestLifeCycle; import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; @@ -28,7 +29,7 @@ public class AuthorPostListPresenterTest { @Mock PostListFragment view; - @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); + private TestLifeCycle testLifeCycle = new TestLifeCycle(); @Mock WordPressService wordPressService; @@ -41,8 +42,7 @@ public void testLoad() throws InterruptedException { PostListModel model = new PostListModel(TestData.createAuthor(145)); - presenter.init(model, view); - presenter.resume(); + testLifeCycle.initAndResume(model, presenter, view); assertThat(model.getItems().size()).isEqualTo(1); verify(wordPressService).listAuthorPosts(eq(145L), eq(1)); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java index e868ca9..90cc078 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java @@ -12,6 +12,7 @@ import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.WordPressService; +import it.cosenonjaviste.mvp.TestLifeCycle; import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; @@ -26,7 +27,7 @@ public class CategoryPostListPresenterTest { @Mock PostListFragment view; - @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); + private TestLifeCycle testLifeCycle = new TestLifeCycle(); @Mock WordPressService wordPressService; @@ -37,8 +38,7 @@ public void testLoad() throws InterruptedException { when(wordPressService.listCategoryPosts(eq(1L), eq(1))) .thenReturn(TestData.postResponse(1)); PostListModel model = new PostListModel(new Category(1, "cat", 10)); - presenter.init(model, view); - presenter.resume(); + testLifeCycle.initAndResume(model, presenter, view); assertThat(model.getItems().size()).isEqualTo(1); } @@ -50,8 +50,7 @@ public void testLoadMore() { .thenReturn(TestData.postResponse(5)); PostListModel model = new PostListModel(new Category(1, "cat", 10)); - presenter.init(model, view); - presenter.resume(); + testLifeCycle.initAndResume(model, presenter, view); presenter.loadNextPage(); assertThat(model.getItems().size()).isEqualTo(15); } diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java index e4d60ff..ccaf06a 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java @@ -14,6 +14,7 @@ import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.Post; import it.cosenonjaviste.model.WordPressService; +import it.cosenonjaviste.mvp.TestLifeCycle; import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.page.PageModel; import it.cosenonjaviste.post.PostListFragment; @@ -33,7 +34,7 @@ public class PostListPresenterTest { @Mock PostListFragment view; - @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); + private TestLifeCycle testLifeCycle = new TestLifeCycle(); @Mock WordPressService wordPressService; @@ -47,8 +48,7 @@ public void testLoad() throws InterruptedException { .thenReturn(postResponse(1)); PostListModel model = new PostListModel(); - presenter.init(model, view); - presenter.resume(); + testLifeCycle.initAndResume(model, presenter, view); assertThat(model.getItems().size()).isEqualTo(1); } @@ -61,8 +61,7 @@ public void testLoadMore() { .thenReturn(postResponse(6)); PostListModel model = new PostListModel(); - presenter.init(model, view); - presenter.resume(); + testLifeCycle.initAndResume(model, presenter, view); presenter.loadNextPage(); OptionalList items = model.getItems(); @@ -75,8 +74,7 @@ public void testRetryAfterError() { .thenReturn(Observable.error(new RuntimeException())); PostListModel model = new PostListModel(); - presenter.init(model, view); - presenter.resume(); + testLifeCycle.initAndResume(model, presenter, view); assertThat(model.getItems().isError()).isTrue(); when(wordPressService.listPosts(eq(1))) @@ -94,8 +92,7 @@ public void testGoToDetails() { .thenReturn(postResponse(1)); PostListModel model = new PostListModel(); - presenter.init(model, view); - presenter.resume(); + testLifeCycle.initAndResume(model, presenter, view); Post firstPost = model.getItems().get(0); presenter.goToDetail(firstPost); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java index 944d56c..601171f 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java @@ -11,6 +11,7 @@ import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.TwitterService; +import it.cosenonjaviste.mvp.TestLifeCycle; import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.twitter.TweetListFragment; import it.cosenonjaviste.twitter.TweetListModel; @@ -26,7 +27,7 @@ public class TweetListPresenterTest { @Mock TweetListFragment view; - @Spy RxHolder rxHolder = new RxHolder(new TestSchedulerManager(), new LifeCycle()); + private TestLifeCycle testLifeCycle = new TestLifeCycle(); @Mock TwitterService twitterService; @@ -37,8 +38,7 @@ public class TweetListPresenterTest { .thenReturn(TestData.tweets()); TweetListModel model = new TweetListModel(); - presenter.init(model, view); - presenter.resume(); + testLifeCycle.initAndResume(model, presenter, view); assertThat(model.size()).isEqualTo(10); } @@ -47,8 +47,7 @@ public class TweetListPresenterTest { .thenReturn(Observable.error(new RuntimeException())); TweetListModel model = new TweetListModel(); - presenter.init(model, view); - presenter.resume(); + testLifeCycle.initAndResume(model, presenter, view); assertThat(model.isError()).isTrue(); @@ -66,8 +65,7 @@ public class TweetListPresenterTest { .thenReturn(TestData.tweets()); TweetListModel tweetListModel = new TweetListModel(); - presenter.init(tweetListModel, view); - presenter.resume(); + testLifeCycle.initAndResume(tweetListModel, presenter, view); presenter.loadNextPage(); From 31f76eefc14130a0c1f0190bfb2df9821e4e3ae7 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Fri, 1 May 2015 16:40:51 +0200 Subject: [PATCH 055/332] Removed init method in presenter --- .../it/cosenonjaviste/lib/mvp/LifeCycle.java | 29 +++++++++++++++---- .../cosenonjaviste/lib/mvp/RxMvpFragment.java | 4 +-- .../lib/mvp/RxMvpPresenter.java | 11 +++---- .../author/AuthorListFragment.java | 2 -- .../category/CategoryListFragment.java | 2 -- .../it/cosenonjaviste/page/PageFragment.java | 2 -- .../cosenonjaviste/post/PostListFragment.java | 2 -- .../twitter/TweetListFragment.java | 1 - .../it/cosenonjaviste/mvp/TestLifeCycle.java | 3 +- 9 files changed, 33 insertions(+), 23 deletions(-) diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java index f161231..2013efb 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java @@ -16,25 +16,44 @@ public class LifeCycle { private Action1> saveObjectFunc; private Action1> loadAction; + public class Event { + private final Object source; + + private final EventType type; + + public Event(Object source, EventType type) { + this.source = source; + this.type = type; + } + + public Object getSource() { + return source; + } + + public EventType getType() { + return type; + } + } + public enum EventType { RESUME, PAUSE, DESTROY_VIEW, DESTROY_ALL; } - private PublishSubject subject = PublishSubject.create(); + private PublishSubject subject = PublishSubject.create(); @Inject public LifeCycle() { } - public void emit(EventType eventType) { - subject.onNext(eventType); + public void emit(Object source, EventType eventType) { + subject.onNext(new Event(source, eventType)); } - public Observable asObservable() { + public Observable asObservable() { return subject.asObservable(); } public Subscription subscribe(EventType eventType, Action0 callback) { - return subject.asObservable().filter(t -> t == eventType).subscribe(t -> callback.call()); + return asObservable().filter(e -> e.getType() == eventType).subscribe(t -> callback.call()); } public void subscribeState(Action1> saveObjectFunc, Action1> loadAction) { diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java index b91c9dc..ee7cdfc 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpFragment.java @@ -38,12 +38,12 @@ public abstract class RxMvpFragment extends Fragment { @Override public void onResume() { super.onResume(); - lifeCycle.emit(LifeCycle.EventType.RESUME); + lifeCycle.emit(this, LifeCycle.EventType.RESUME); } @Override public void onPause() { super.onPause(); - lifeCycle.emit(LifeCycle.EventType.PAUSE); + lifeCycle.emit(this, LifeCycle.EventType.PAUSE); } protected T createComponent(Func0 componentFactory) { diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java index ae8d7ed..a36e9fa 100644 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java +++ b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java @@ -23,12 +23,13 @@ public void resume() { rxHolder.resubscribePendingObservable(); } - public final void init(V view) { - this.view = view; - } - @Inject public final void initLifeCycle(LifeCycle lifeCycle, SchedulerManager schedulerManager) { - lifeCycle.subscribe(LifeCycle.EventType.RESUME, this::resume); + lifeCycle.asObservable() + .filter(e -> e.getType() == LifeCycle.EventType.RESUME) + .subscribe(e -> { + view = (V) e.getSource(); + resume(); + }); lifeCycle.subscribe(LifeCycle.EventType.DESTROY_VIEW, () -> this.view = null); lifeCycle.subscribeState(saver -> saver.call(MODEL, getModel()), loader -> model = (M) loader.call(MODEL)); diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index 3da2dcb..8586b39 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -31,8 +31,6 @@ public class AuthorListFragment extends RxMvpFragment { @Override public void init(Bundle state) { createComponent(() -> DaggerAuthorListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build()) .inject(this); - - presenter.init(this); } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java index d95ddbf..e9da20b 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java @@ -32,8 +32,6 @@ public class CategoryListFragment extends RxMvpFragment { createComponent( () -> DaggerCategoryListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - - presenter.init(this); } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index 96091ea..d21c4d0 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -34,8 +34,6 @@ public class PageFragment extends RxMvpFragment { createComponent( () -> DaggerPageComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - - presenter.init(this); } @SuppressLint("SetJavaScriptEnabled") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index b671203..5d580cd 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -32,8 +32,6 @@ public class PostListFragment extends RxMvpFragment { createComponent( () -> DaggerPostListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - - presenter.init(this); } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index 35bbfe3..d107c3d 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -31,7 +31,6 @@ public class TweetListFragment extends RxMvpFragment { createComponent( () -> DaggerTweetListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build() ).inject(this); - presenter.init(this); } @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { diff --git a/app/src/test/java/it/cosenonjaviste/mvp/TestLifeCycle.java b/app/src/test/java/it/cosenonjaviste/mvp/TestLifeCycle.java index 112f806..3901f3f 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/TestLifeCycle.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/TestLifeCycle.java @@ -10,7 +10,6 @@ public class TestLifeCycle extends LifeCycle { public void initAndResume(M model, RxMvpPresenter presenter, V view) { presenter.initLifeCycle(this, schedulerManager); loadState(key -> model); - presenter.init(view); - presenter.resume(); + emit(view, EventType.RESUME); } } From 2639d5dd9af9ed52e923a0bd0423f55691654ebf Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Fri, 1 May 2015 17:03:46 +0200 Subject: [PATCH 056/332] core and coremvp modules --- androidMvp/build.gradle | 4 +--- app/build.gradle | 2 +- core/.gitignore | 1 + core/build.gradle | 7 +++++++ coremvp/.gitignore | 1 + coremvp/build.gradle | 9 +++++++++ .../main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java | 0 .../it/cosenonjaviste/lib/mvp/ObservableWithFactory.java | 0 .../java/it/cosenonjaviste/lib/mvp/PresenterScope.java | 0 .../java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java | 0 .../java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java | 0 .../cosenonjaviste/lib/mvp/utils/SchedulerManager.java | 0 settings.gradle | 2 +- 13 files changed, 21 insertions(+), 5 deletions(-) create mode 100644 core/.gitignore create mode 100644 core/build.gradle create mode 100644 coremvp/.gitignore create mode 100644 coremvp/build.gradle rename {androidMvp => coremvp}/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java (100%) rename {androidMvp => coremvp}/src/main/java/it/cosenonjaviste/lib/mvp/ObservableWithFactory.java (100%) rename {androidMvp => coremvp}/src/main/java/it/cosenonjaviste/lib/mvp/PresenterScope.java (100%) rename {androidMvp => coremvp}/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java (100%) rename {androidMvp => coremvp}/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java (100%) rename {androidMvp => coremvp}/src/main/java/it/cosenonjaviste/lib/mvp/utils/SchedulerManager.java (100%) diff --git a/androidMvp/build.gradle b/androidMvp/build.gradle index 78f1eb9..52ad28a 100644 --- a/androidMvp/build.gradle +++ b/androidMvp/build.gradle @@ -29,10 +29,8 @@ android { } dependencies { - compile 'io.reactivex:rxandroid:0.24.0' + compile project(':coremvp') compile 'com.android.support:appcompat-v7:21.0.3' compile 'com.android.support:support-annotations:20.0.0' compile 'org.parceler:parceler-api:0.2.14' - compile 'com.google.dagger:dagger:2.0' - compile 'org.glassfish:javax.annotation:10.0-b28' } diff --git a/app/build.gradle b/app/build.gradle index b530e5b..0243af5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -80,13 +80,13 @@ android { } dependencies { + compile project(':core') compile project(':androidMvp') compile project(':SuperListviewLibrary') compile 'com.squareup.okhttp:okhttp:2.0.0' compile 'com.squareup.retrofit:retrofit:1.9.0' compile 'org.twitter4j:twitter4j-core:4.0.2' compile 'com.android.support:cardview-v7:21.0.3' - compile 'io.reactivex:rxandroid-framework:0.24.0' compile 'com.jakewharton:butterknife:6.1.0' compile 'com.squareup.picasso:picasso:2.5.0' apt 'com.google.dagger:dagger-compiler:2.0' diff --git a/core/.gitignore b/core/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/core/.gitignore @@ -0,0 +1 @@ +/build diff --git a/core/build.gradle b/core/build.gradle new file mode 100644 index 0000000..16720f1 --- /dev/null +++ b/core/build.gradle @@ -0,0 +1,7 @@ +apply plugin: 'java' + +apply plugin: 'me.tatarka.retrolambda' + +dependencies { + compile project(':coremvp') +} \ No newline at end of file diff --git a/coremvp/.gitignore b/coremvp/.gitignore new file mode 100644 index 0000000..796b96d --- /dev/null +++ b/coremvp/.gitignore @@ -0,0 +1 @@ +/build diff --git a/coremvp/build.gradle b/coremvp/build.gradle new file mode 100644 index 0000000..5f6dcc1 --- /dev/null +++ b/coremvp/build.gradle @@ -0,0 +1,9 @@ +apply plugin: 'java' + +apply plugin: 'me.tatarka.retrolambda' + +dependencies { + compile 'io.reactivex:rxandroid-framework:0.24.0' + compile 'com.google.dagger:dagger:2.0' + compile 'org.glassfish:javax.annotation:10.0-b28' +} \ No newline at end of file diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java b/coremvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java similarity index 100% rename from androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java rename to coremvp/src/main/java/it/cosenonjaviste/lib/mvp/LifeCycle.java diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/ObservableWithFactory.java b/coremvp/src/main/java/it/cosenonjaviste/lib/mvp/ObservableWithFactory.java similarity index 100% rename from androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/ObservableWithFactory.java rename to coremvp/src/main/java/it/cosenonjaviste/lib/mvp/ObservableWithFactory.java diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/PresenterScope.java b/coremvp/src/main/java/it/cosenonjaviste/lib/mvp/PresenterScope.java similarity index 100% rename from androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/PresenterScope.java rename to coremvp/src/main/java/it/cosenonjaviste/lib/mvp/PresenterScope.java diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java b/coremvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java similarity index 100% rename from androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java rename to coremvp/src/main/java/it/cosenonjaviste/lib/mvp/RxMvpPresenter.java diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java b/coremvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java similarity index 100% rename from androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java rename to coremvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/RxHolder.java diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/SchedulerManager.java b/coremvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/SchedulerManager.java similarity index 100% rename from androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/SchedulerManager.java rename to coremvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/SchedulerManager.java diff --git a/settings.gradle b/settings.gradle index 295baa7..5a84099 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1 +1 @@ -include ':androidMvp', ':SuperListviewLibrary', ':app' +include ':androidMvp', ':SuperListviewLibrary', ':app', ':core', ':coremvp' From 60b1fdcf4e9b2f05b44a7ef4f702cb18e2f64a2e Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Fri, 1 May 2015 17:30:11 +0200 Subject: [PATCH 057/332] Moved model classes in core model and introduces view interfaces --- app/build.gradle | 2 -- app/src/main/java/it/cosenonjaviste/AppModule.java | 2 +- .../java/it/cosenonjaviste/CoseNonJavisteApp.java | 14 ++++++++++++++ .../cosenonjaviste/author/AuthorListFragment.java | 12 +++++++----- .../cosenonjaviste/author/AuthorListPresenter.java | 5 ++--- .../it/cosenonjaviste/author/AuthorListView.java | 11 +++++++++++ .../category/CategoryListFragment.java | 12 +++++++----- .../category/CategoryListPresenter.java | 5 ++--- .../cosenonjaviste/category/CategoryListView.java | 11 +++++++++++ .../java/it/cosenonjaviste/page/PageFragment.java | 4 ++-- .../java/it/cosenonjaviste/page/PagePresenter.java | 4 ++-- .../main/java/it/cosenonjaviste/page/PageView.java | 5 +++++ .../it/cosenonjaviste/post/PostListFragment.java | 14 ++++++++------ .../it/cosenonjaviste/post/PostListPresenter.java | 5 ++--- .../java/it/cosenonjaviste/post/PostListView.java | 13 +++++++++++++ .../cosenonjaviste/twitter/TweetListFragment.java | 8 ++++---- .../cosenonjaviste/twitter/TweetListPresenter.java | 2 +- .../it/cosenonjaviste/twitter/TweetListView.java | 9 +++++++++ .../mvp/author/AuthorListPresenterTest.java | 7 +++---- .../mvp/category/CategoryListPresenterTest.java | 11 +++-------- .../cosenonjaviste/mvp/page/PagePresenterTest.java | 7 ++----- .../mvp/post/AuthorPostListPresenterTest.java | 8 ++------ .../mvp/post/CategoryPostListPresenterTest.java | 8 ++------ .../mvp/post/PostListPresenterTest.java | 11 +++-------- .../mvp/twitter/TweetListPresenterTest.java | 8 ++------ core/build.gradle | 2 ++ .../main/java/it/cosenonjaviste/model/Author.java | 3 --- .../it/cosenonjaviste/model/AuthorResponse.java | 0 .../java/it/cosenonjaviste/model/Category.java | 3 --- .../it/cosenonjaviste/model/CategoryResponse.java | 0 .../main/java/it/cosenonjaviste/model/Post.java | 3 --- .../java/it/cosenonjaviste/model/PostResponse.java | 0 .../main/java/it/cosenonjaviste/model/Tweet.java | 3 --- .../it/cosenonjaviste/model/TwitterService.java | 11 +++++------ .../it/cosenonjaviste/model/WordPressService.java | 0 .../java/it/cosenonjaviste/utils/Md5Utils.java | 0 36 files changed, 125 insertions(+), 98 deletions(-) create mode 100644 app/src/main/java/it/cosenonjaviste/author/AuthorListView.java create mode 100644 app/src/main/java/it/cosenonjaviste/category/CategoryListView.java create mode 100644 app/src/main/java/it/cosenonjaviste/page/PageView.java create mode 100644 app/src/main/java/it/cosenonjaviste/post/PostListView.java create mode 100644 app/src/main/java/it/cosenonjaviste/twitter/TweetListView.java rename {app => core}/src/main/java/it/cosenonjaviste/model/Author.java (97%) rename {app => core}/src/main/java/it/cosenonjaviste/model/AuthorResponse.java (100%) rename {app => core}/src/main/java/it/cosenonjaviste/model/Category.java (93%) rename {app => core}/src/main/java/it/cosenonjaviste/model/CategoryResponse.java (100%) rename {app => core}/src/main/java/it/cosenonjaviste/model/Post.java (95%) rename {app => core}/src/main/java/it/cosenonjaviste/model/PostResponse.java (100%) rename {app => core}/src/main/java/it/cosenonjaviste/model/Tweet.java (95%) rename {app => core}/src/main/java/it/cosenonjaviste/model/TwitterService.java (79%) rename {app => core}/src/main/java/it/cosenonjaviste/model/WordPressService.java (100%) rename {app => core}/src/main/java/it/cosenonjaviste/utils/Md5Utils.java (100%) diff --git a/app/build.gradle b/app/build.gradle index 0243af5..97f520e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -84,8 +84,6 @@ dependencies { compile project(':androidMvp') compile project(':SuperListviewLibrary') compile 'com.squareup.okhttp:okhttp:2.0.0' - compile 'com.squareup.retrofit:retrofit:1.9.0' - compile 'org.twitter4j:twitter4j-core:4.0.2' compile 'com.android.support:cardview-v7:21.0.3' compile 'com.jakewharton:butterknife:6.1.0' compile 'com.squareup.picasso:picasso:2.5.0' diff --git a/app/src/main/java/it/cosenonjaviste/AppModule.java b/app/src/main/java/it/cosenonjaviste/AppModule.java index 7c9bdac..695dd15 100644 --- a/app/src/main/java/it/cosenonjaviste/AppModule.java +++ b/app/src/main/java/it/cosenonjaviste/AppModule.java @@ -37,7 +37,7 @@ public AppModule(Application application) { } @Provides TwitterService provideTwitterService() { - return new TwitterService(); + return new TwitterService(BuildConfig.CONSUMER_KEY, BuildConfig.CONSUMER_SECRET, BuildConfig.ACCESS_TOKEN, BuildConfig.ACCESS_TOKEN_SECRET); } @Provides @Singleton SchedulerManager provideSchedulerManager() { diff --git a/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java b/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java index a6ff631..6879b1d 100644 --- a/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java +++ b/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java @@ -3,6 +3,20 @@ import android.app.Application; import android.content.Context; +import org.parceler.ParcelClass; +import org.parceler.ParcelClasses; + +import it.cosenonjaviste.model.Author; +import it.cosenonjaviste.model.Category; +import it.cosenonjaviste.model.Post; +import it.cosenonjaviste.model.Tweet; + +@ParcelClasses({ + @ParcelClass(Post.class), + @ParcelClass(Category.class), + @ParcelClass(Tweet.class), + @ParcelClass(Author.class) +}) public class CoseNonJavisteApp extends Application { public static ApplicationComponent component; diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index 8586b39..cf4aeac 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -17,10 +17,12 @@ import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.RxMvpFragment; +import it.cosenonjaviste.post.PostListFragment; +import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.utils.SingleFragmentActivity; import rx.functions.Actions; -public class AuthorListFragment extends RxMvpFragment { +public class AuthorListFragment extends RxMvpFragment implements AuthorListView { @InjectView(R.id.grid) SuperGridview grid; @@ -47,19 +49,19 @@ public class AuthorListFragment extends RxMvpFragment { presenter.loadAuthors(); } - public void update(AuthorListModel model) { + @Override public void update(AuthorListModel model) { model.call(authors -> { grid.showList(); adapter.reloadData(authors); }).whenError(t -> grid.showError()).whenEmpty(Actions.empty()); } - public void startLoading() { + @Override public void startLoading() { grid.showProgress(); } - public void open(Class viewClass, MM model) { - SingleFragmentActivity.open(getActivity(), viewClass, model); + @Override public void openPostList(PostListModel model) { + SingleFragmentActivity.open(getActivity(), PostListFragment.class, model); } } diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index 7b4f48c..41e671b 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -10,12 +10,11 @@ import it.cosenonjaviste.model.Author; import it.cosenonjaviste.model.AuthorResponse; import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; import rx.Observable; @PresenterScope -public class AuthorListPresenter extends RxMvpPresenter { +public class AuthorListPresenter extends RxMvpPresenter { @Inject WordPressService wordPressService; @@ -52,6 +51,6 @@ public void loadAuthors() { public void goToAuthorDetail(int position) { Author author = getModel().get(position); - getView().open(PostListFragment.class, new PostListModel(author)); + getView().openPostList(new PostListModel(author)); } } diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListView.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListView.java new file mode 100644 index 0000000..9e36ac9 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListView.java @@ -0,0 +1,11 @@ +package it.cosenonjaviste.author; + +import it.cosenonjaviste.post.PostListModel; + +public interface AuthorListView { + void update(AuthorListModel model); + + void startLoading(); + + void openPostList(PostListModel model); +} diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java index e9da20b..b0b6932 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java @@ -17,10 +17,12 @@ import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.RxMvpFragment; +import it.cosenonjaviste.post.PostListFragment; +import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.utils.SingleFragmentActivity; import rx.functions.Actions; -public class CategoryListFragment extends RxMvpFragment { +public class CategoryListFragment extends RxMvpFragment implements CategoryListView { @InjectView(R.id.grid) SuperGridview grid; @@ -50,7 +52,7 @@ public class CategoryListFragment extends RxMvpFragment { } - public void update(CategoryListModel model) { + @Override public void update(CategoryListModel model) { model.call( categories -> { grid.showList(); @@ -63,11 +65,11 @@ public void update(CategoryListModel model) { ); } - public void startLoading() { + @Override public void startLoading() { grid.showProgress(); } - public void open(Class viewClass, MM model) { - SingleFragmentActivity.open(getActivity(), viewClass, model); + @Override public void openPostList(PostListModel model) { + SingleFragmentActivity.open(getActivity(), PostListFragment.class, model); } } diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index 74abeb7..124af49 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -9,12 +9,11 @@ import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.CategoryResponse; import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; import rx.Observable; @PresenterScope -public class CategoryListPresenter extends RxMvpPresenter { +public class CategoryListPresenter extends RxMvpPresenter { @Inject WordPressService wordPressService; @@ -50,6 +49,6 @@ public void loadData() { public void goToPosts(int position) { Category category = getModel().get(position); - getView().open(PostListFragment.class, new PostListModel(category)); + getView().openPostList(new PostListModel(category)); } } diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListView.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListView.java new file mode 100644 index 0000000..e91177d --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListView.java @@ -0,0 +1,11 @@ +package it.cosenonjaviste.category; + +import it.cosenonjaviste.post.PostListModel; + +public interface CategoryListView { + void update(CategoryListModel model); + + void startLoading(); + + void openPostList(PostListModel model); +} diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index d21c4d0..500c967 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -22,7 +22,7 @@ import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.RxMvpFragment; -public class PageFragment extends RxMvpFragment { +public class PageFragment extends RxMvpFragment implements PageView { @InjectView(R.id.web_view) WebView webView; @@ -93,7 +93,7 @@ public void onPageFinished(WebView view11, String url) { return view; } - public void update(PageModel model) { + @Override public void update(PageModel model) { webView.loadUrl(presenter.getPostUrl()); } } diff --git a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java index 427daad..45a76ff 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java +++ b/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java @@ -6,7 +6,7 @@ import it.cosenonjaviste.lib.mvp.RxMvpPresenter; @PresenterScope -public class PagePresenter extends RxMvpPresenter { +public class PagePresenter extends RxMvpPresenter { @Inject PageUrlManager pageUrlManager; @@ -18,7 +18,7 @@ public String getPostUrl() { } @Override public void resume() { - getView().update(getModel()); super.resume(); + getView().update(getModel()); } } diff --git a/app/src/main/java/it/cosenonjaviste/page/PageView.java b/app/src/main/java/it/cosenonjaviste/page/PageView.java new file mode 100644 index 0000000..7c2aa29 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/page/PageView.java @@ -0,0 +1,5 @@ +package it.cosenonjaviste.page; + +public interface PageView { + void update(PageModel model); +} diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index 5d580cd..f7bfc5d 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -17,10 +17,12 @@ import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.RxMvpFragment; +import it.cosenonjaviste.page.PageFragment; +import it.cosenonjaviste.page.PageModel; import it.cosenonjaviste.utils.SingleFragmentActivity; import rx.functions.Actions; -public class PostListFragment extends RxMvpFragment { +public class PostListFragment extends RxMvpFragment implements PostListView { @InjectView(R.id.list) SuperListview list; @@ -50,7 +52,7 @@ public class PostListFragment extends RxMvpFragment { presenter.reloadData(); } - public void update(PostListModel model) { + @Override public void update(PostListModel model) { model.getItems().call( posts -> { list.showList(); @@ -64,7 +66,7 @@ public void update(PostListModel model) { ); } - public void startLoading(boolean showMainLoading) { + @Override public void startLoading(boolean showMainLoading) { if (showMainLoading) { list.showProgress(); } else { @@ -72,11 +74,11 @@ public void startLoading(boolean showMainLoading) { } } - public void startMoreItemsLoading() { + @Override public void startMoreItemsLoading() { list.showMoreProgress(); } - public void open(Class viewClass, MM model) { - SingleFragmentActivity.open(getActivity(), viewClass, model); + @Override public void openDetail(PageModel model) { + SingleFragmentActivity.open(getActivity(), PageFragment.class, model); } } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index 67686ed..db72374 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -12,14 +12,13 @@ import it.cosenonjaviste.model.Post; import it.cosenonjaviste.model.PostResponse; import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; import rx.Observable; import rx.functions.Action0; import rx.functions.Action1; @PresenterScope -public class PostListPresenter extends RxMvpPresenter { +public class PostListPresenter extends RxMvpPresenter { @Inject WordPressService wordPressService; @@ -51,7 +50,7 @@ public void reloadData() { } public void goToDetail(Post item) { - getView().open(PageFragment.class, new PageModel(item.getUrl())); + getView().openDetail(new PageModel(item.getUrl())); } public void loadNextPage() { diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListView.java b/app/src/main/java/it/cosenonjaviste/post/PostListView.java new file mode 100644 index 0000000..bfd8635 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/post/PostListView.java @@ -0,0 +1,13 @@ +package it.cosenonjaviste.post; + +import it.cosenonjaviste.page.PageModel; + +public interface PostListView { + void update(PostListModel model); + + void startLoading(boolean showMainLoading); + + void startMoreItemsLoading(); + + void openDetail(PageModel model); +} diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index d107c3d..041e553 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -19,7 +19,7 @@ import it.cosenonjaviste.lib.mvp.RxMvpFragment; import rx.functions.Actions; -public class TweetListFragment extends RxMvpFragment { +public class TweetListFragment extends RxMvpFragment implements TweetListView { @InjectView(R.id.list) SuperListview list; @@ -48,7 +48,7 @@ public class TweetListFragment extends RxMvpFragment { presenter.reloadData(); } - public void update(TweetListModel model) { + @Override public void update(TweetListModel model) { model.call( items -> { list.showList(); @@ -62,7 +62,7 @@ public void update(TweetListModel model) { ); } - public void startLoading(boolean showMainLoading) { + @Override public void startLoading(boolean showMainLoading) { if (showMainLoading) { list.showProgress(); } else { @@ -70,7 +70,7 @@ public void startLoading(boolean showMainLoading) { } } - public void startMoreItemsLoading() { + @Override public void startMoreItemsLoading() { list.showMoreProgress(); } } \ No newline at end of file diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index e43ca96..3e7e53a 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -11,7 +11,7 @@ import rx.Observable; @PresenterScope -public class TweetListPresenter extends RxMvpPresenter { +public class TweetListPresenter extends RxMvpPresenter { @Inject TwitterService twitterService; diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListView.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListView.java new file mode 100644 index 0000000..99c85db --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListView.java @@ -0,0 +1,9 @@ +package it.cosenonjaviste.twitter; + +public interface TweetListView { + void update(TweetListModel model); + + void startLoading(boolean showMainLoading); + + void startMoreItemsLoading(); +} diff --git a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java index 2dd6494..b01520c 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java @@ -8,9 +8,9 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import it.cosenonjaviste.author.AuthorListFragment; import it.cosenonjaviste.author.AuthorListModel; import it.cosenonjaviste.author.AuthorListPresenter; +import it.cosenonjaviste.author.AuthorListView; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.TestLifeCycle; import it.cosenonjaviste.post.PostListModel; @@ -18,14 +18,13 @@ import static it.cosenonjaviste.TestData.authorResponse; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Matchers.any; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class AuthorListPresenterTest { - @Mock AuthorListFragment view; + @Mock AuthorListView view; @InjectMocks AuthorListPresenter presenter; @@ -71,7 +70,7 @@ public void testGoToDetail() { presenter.goToAuthorDetail(1); - verify(view).open(any(), modelCaptor.capture()); + verify(view).openPostList(modelCaptor.capture()); PostListModel model = modelCaptor.getValue(); assertThat(model.getAuthor()).isEqualTo(authorListModel.get(1)); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java index 18450bb..b22c195 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java @@ -6,24 +6,19 @@ import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; -import it.cosenonjaviste.category.CategoryListFragment; import it.cosenonjaviste.category.CategoryListModel; import it.cosenonjaviste.category.CategoryListPresenter; -import it.cosenonjaviste.lib.mvp.LifeCycle; -import it.cosenonjaviste.lib.mvp.utils.RxHolder; +import it.cosenonjaviste.category.CategoryListView; import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.TestLifeCycle; -import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.post.PostListModel; import rx.Observable; import static it.cosenonjaviste.TestData.categoryResponse; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Matchers.any; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -36,7 +31,7 @@ public class CategoryListPresenterTest { @InjectMocks CategoryListPresenter presenter; - @Mock CategoryListFragment view; + @Mock CategoryListView view; @Captor ArgumentCaptor modelCaptor; @@ -81,7 +76,7 @@ public void testGoToPosts() { presenter.goToPosts(1); - verify(view).open(any(), modelCaptor.capture()); + verify(view).openPostList(modelCaptor.capture()); assertThat(modelCaptor.getValue().getCategory()).isEqualTo(categoryListModel.get(1)); } diff --git a/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java index 8489a96..17392a2 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java @@ -10,14 +10,11 @@ import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; -import it.cosenonjaviste.lib.mvp.LifeCycle; -import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.mvp.TestLifeCycle; -import it.cosenonjaviste.mvp.TestSchedulerManager; -import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; import it.cosenonjaviste.page.PagePresenter; import it.cosenonjaviste.page.PageUrlManager; +import it.cosenonjaviste.page.PageView; import it.cosenonjaviste.post.PostListModel; import static org.assertj.core.api.Assertions.assertThat; @@ -25,7 +22,7 @@ @RunWith(MockitoJUnitRunner.class) public class PagePresenterTest { - @Mock PageFragment view; + @Mock PageView view; private TestLifeCycle testLifeCycle = new TestLifeCycle(); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java index 716408f..d0b35df 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java @@ -4,18 +4,14 @@ import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.lib.mvp.LifeCycle; -import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.TestLifeCycle; -import it.cosenonjaviste.mvp.TestSchedulerManager; -import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.post.PostListPresenter; +import it.cosenonjaviste.post.PostListView; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Matchers.anyInt; @@ -27,7 +23,7 @@ @RunWith(MockitoJUnitRunner.class) public class AuthorPostListPresenterTest { - @Mock PostListFragment view; + @Mock PostListView view; private TestLifeCycle testLifeCycle = new TestLifeCycle(); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java index 90cc078..316a2d2 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java @@ -4,19 +4,15 @@ import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.lib.mvp.LifeCycle; -import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.TestLifeCycle; -import it.cosenonjaviste.mvp.TestSchedulerManager; -import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.post.PostListPresenter; +import it.cosenonjaviste.post.PostListView; import static org.assertj.core.api.Assertions.assertThat; import static org.mockito.Matchers.eq; @@ -25,7 +21,7 @@ @RunWith(MockitoJUnitRunner.class) public class CategoryPostListPresenterTest { - @Mock PostListFragment view; + @Mock PostListView view; private TestLifeCycle testLifeCycle = new TestLifeCycle(); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java index ccaf06a..cc874ea 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java @@ -6,25 +6,20 @@ import org.mockito.Captor; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; -import it.cosenonjaviste.lib.mvp.LifeCycle; import it.cosenonjaviste.lib.mvp.utils.OptionalList; -import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.Post; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.TestLifeCycle; -import it.cosenonjaviste.mvp.TestSchedulerManager; import it.cosenonjaviste.page.PageModel; -import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.post.PostListPresenter; +import it.cosenonjaviste.post.PostListView; import rx.Observable; import static it.cosenonjaviste.TestData.postResponse; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Matchers.any; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -32,7 +27,7 @@ @RunWith(MockitoJUnitRunner.class) public class PostListPresenterTest { - @Mock PostListFragment view; + @Mock PostListView view; private TestLifeCycle testLifeCycle = new TestLifeCycle(); @@ -97,7 +92,7 @@ public void testGoToDetails() { presenter.goToDetail(firstPost); - verify(view).open(any(), modelCaptor.capture()); + verify(view).openDetail(modelCaptor.capture()); PageModel detailModel = modelCaptor.getValue(); String url = detailModel.getUrl(); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java index 601171f..7367552 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java @@ -4,18 +4,14 @@ import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.lib.mvp.LifeCycle; -import it.cosenonjaviste.lib.mvp.utils.RxHolder; import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.mvp.TestLifeCycle; -import it.cosenonjaviste.mvp.TestSchedulerManager; -import it.cosenonjaviste.twitter.TweetListFragment; import it.cosenonjaviste.twitter.TweetListModel; import it.cosenonjaviste.twitter.TweetListPresenter; +import it.cosenonjaviste.twitter.TweetListView; import rx.Observable; import static org.assertj.core.api.Assertions.assertThat; @@ -25,7 +21,7 @@ @RunWith(MockitoJUnitRunner.class) public class TweetListPresenterTest { - @Mock TweetListFragment view; + @Mock TweetListView view; private TestLifeCycle testLifeCycle = new TestLifeCycle(); diff --git a/core/build.gradle b/core/build.gradle index 16720f1..d60883c 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -4,4 +4,6 @@ apply plugin: 'me.tatarka.retrolambda' dependencies { compile project(':coremvp') + compile 'com.squareup.retrofit:retrofit:1.9.0' + compile 'org.twitter4j:twitter4j-core:4.0.2' } \ No newline at end of file diff --git a/app/src/main/java/it/cosenonjaviste/model/Author.java b/core/src/main/java/it/cosenonjaviste/model/Author.java similarity index 97% rename from app/src/main/java/it/cosenonjaviste/model/Author.java rename to core/src/main/java/it/cosenonjaviste/model/Author.java index e0e0778..14e1900 100644 --- a/app/src/main/java/it/cosenonjaviste/model/Author.java +++ b/core/src/main/java/it/cosenonjaviste/model/Author.java @@ -2,11 +2,8 @@ import com.google.gson.annotations.SerializedName; -import org.parceler.Parcel; - import it.cosenonjaviste.utils.Md5Utils; -@Parcel public class Author implements Comparable { long id; diff --git a/app/src/main/java/it/cosenonjaviste/model/AuthorResponse.java b/core/src/main/java/it/cosenonjaviste/model/AuthorResponse.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/model/AuthorResponse.java rename to core/src/main/java/it/cosenonjaviste/model/AuthorResponse.java diff --git a/app/src/main/java/it/cosenonjaviste/model/Category.java b/core/src/main/java/it/cosenonjaviste/model/Category.java similarity index 93% rename from app/src/main/java/it/cosenonjaviste/model/Category.java rename to core/src/main/java/it/cosenonjaviste/model/Category.java index 4c59ea4..a06ef8b 100644 --- a/app/src/main/java/it/cosenonjaviste/model/Category.java +++ b/core/src/main/java/it/cosenonjaviste/model/Category.java @@ -2,9 +2,6 @@ import com.google.gson.annotations.SerializedName; -import org.parceler.Parcel; - -@Parcel public class Category { long id; diff --git a/app/src/main/java/it/cosenonjaviste/model/CategoryResponse.java b/core/src/main/java/it/cosenonjaviste/model/CategoryResponse.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/model/CategoryResponse.java rename to core/src/main/java/it/cosenonjaviste/model/CategoryResponse.java diff --git a/app/src/main/java/it/cosenonjaviste/model/Post.java b/core/src/main/java/it/cosenonjaviste/model/Post.java similarity index 95% rename from app/src/main/java/it/cosenonjaviste/model/Post.java rename to core/src/main/java/it/cosenonjaviste/model/Post.java index 1f94e1b..8573ab1 100644 --- a/app/src/main/java/it/cosenonjaviste/model/Post.java +++ b/core/src/main/java/it/cosenonjaviste/model/Post.java @@ -1,10 +1,7 @@ package it.cosenonjaviste.model; -import org.parceler.Parcel; - import java.util.Date; -@Parcel public class Post { long id; Author author; diff --git a/app/src/main/java/it/cosenonjaviste/model/PostResponse.java b/core/src/main/java/it/cosenonjaviste/model/PostResponse.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/model/PostResponse.java rename to core/src/main/java/it/cosenonjaviste/model/PostResponse.java diff --git a/app/src/main/java/it/cosenonjaviste/model/Tweet.java b/core/src/main/java/it/cosenonjaviste/model/Tweet.java similarity index 95% rename from app/src/main/java/it/cosenonjaviste/model/Tweet.java rename to core/src/main/java/it/cosenonjaviste/model/Tweet.java index 11d8191..9c71141 100644 --- a/app/src/main/java/it/cosenonjaviste/model/Tweet.java +++ b/core/src/main/java/it/cosenonjaviste/model/Tweet.java @@ -1,10 +1,7 @@ package it.cosenonjaviste.model; -import org.parceler.Parcel; - import java.util.Date; -@Parcel public class Tweet { long id; String text; diff --git a/app/src/main/java/it/cosenonjaviste/model/TwitterService.java b/core/src/main/java/it/cosenonjaviste/model/TwitterService.java similarity index 79% rename from app/src/main/java/it/cosenonjaviste/model/TwitterService.java rename to core/src/main/java/it/cosenonjaviste/model/TwitterService.java index 3b0564f..d50e2d1 100644 --- a/app/src/main/java/it/cosenonjaviste/model/TwitterService.java +++ b/core/src/main/java/it/cosenonjaviste/model/TwitterService.java @@ -2,7 +2,6 @@ import java.util.List; -import it.cosenonjaviste.BuildConfig; import rx.Observable; import rx.Subscriber; import twitter4j.Paging; @@ -19,13 +18,13 @@ public class TwitterService { private final Twitter twitter; - public TwitterService() { + public TwitterService(String consumerKey, String consumerSecret, String accessToken, String accessTokenSecret) { ConfigurationBuilder cb = new ConfigurationBuilder(); cb.setDebugEnabled(true) - .setOAuthConsumerKey(BuildConfig.CONSUMER_KEY) - .setOAuthConsumerSecret(BuildConfig.CONSUMER_SECRET) - .setOAuthAccessToken(BuildConfig.ACCESS_TOKEN) - .setOAuthAccessTokenSecret(BuildConfig.ACCESS_TOKEN_SECRET); + .setOAuthConsumerKey(consumerKey) + .setOAuthConsumerSecret(consumerSecret) + .setOAuthAccessToken(accessToken) + .setOAuthAccessTokenSecret(accessTokenSecret); TwitterFactory tf = new TwitterFactory(cb.build()); twitter = tf.getInstance(); } diff --git a/app/src/main/java/it/cosenonjaviste/model/WordPressService.java b/core/src/main/java/it/cosenonjaviste/model/WordPressService.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/model/WordPressService.java rename to core/src/main/java/it/cosenonjaviste/model/WordPressService.java diff --git a/app/src/main/java/it/cosenonjaviste/utils/Md5Utils.java b/core/src/main/java/it/cosenonjaviste/utils/Md5Utils.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/utils/Md5Utils.java rename to core/src/main/java/it/cosenonjaviste/utils/Md5Utils.java From 27d9832fdf08aa5fa32254e02e5872cddc0bac0d Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 12:25:33 +0200 Subject: [PATCH 058/332] Removed OptionalList in TweetListModel --- .../twitter/TweetListFragment.java | 22 ++++++------ .../twitter/TweetListModel.java | 34 +++++++++---------- .../twitter/TweetListPresenter.java | 10 +++--- .../cosenonjaviste/twitter/TweetListView.java | 2 ++ 4 files changed, 34 insertions(+), 34 deletions(-) diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java index 041e553..f6fde0a 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListFragment.java @@ -9,6 +9,8 @@ import com.quentindommerc.superlistview.SuperListview; +import org.parceler.ParcelClass; + import javax.inject.Inject; import butterknife.ButterKnife; @@ -17,8 +19,8 @@ import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.RxMvpFragment; -import rx.functions.Actions; +@ParcelClass(TweetListModel.class) public class TweetListFragment extends RxMvpFragment implements TweetListView { @InjectView(R.id.list) SuperListview list; @@ -49,17 +51,13 @@ public class TweetListFragment extends RxMvpFragment implements TweetListView { } @Override public void update(TweetListModel model) { - model.call( - items -> { - list.showList(); - list.hideMoreProgress(model.isMoreDataAvailable()); - adapter.reloadData(items); - } - ).whenError( - t -> list.showError() - ).whenEmpty( - Actions.empty() - ); + list.showList(); + list.hideMoreProgress(model.isMoreDataAvailable()); + adapter.reloadData(model.getItems()); + } + + public void showError() { + list.showError(); } @Override public void startLoading(boolean showMainLoading) { diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListModel.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListModel.java index 7ddcf70..a58e601 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListModel.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListModel.java @@ -1,17 +1,13 @@ package it.cosenonjaviste.twitter; -import org.parceler.Parcel; - import java.util.List; -import it.cosenonjaviste.lib.mvp.utils.OptionalItem; -import it.cosenonjaviste.lib.mvp.utils.OptionalList; import it.cosenonjaviste.model.Tweet; -import rx.functions.Action1; -@Parcel public class TweetListModel { - OptionalList list = new OptionalList<>(); + List list; + + boolean errorLoading; boolean moreDataAvailable; @@ -23,20 +19,18 @@ public boolean isMoreDataAvailable() { return moreDataAvailable; } - public OptionalItem> call(Action1> action) { - return list.call(action); - } - public boolean isEmpty() { - return list.isEmpty(); + return list == null || list.isEmpty(); } - public void done(List object) { - list.done(object); + public void done(List list) { + this.list = list; + errorLoading = false; } - public void error(Throwable throwable) { - list.error(throwable); + public void error() { + list = null; + errorLoading = true; } public int size() { @@ -44,10 +38,14 @@ public int size() { } public boolean isError() { - return list.isError(); + return errorLoading; } public void append(List object) { - list.append(object); + list.addAll(object); + } + + public List getItems() { + return list; } } diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java index 3e7e53a..f50bc56 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java @@ -28,8 +28,8 @@ public void reloadData() { getModel().setMoreDataAvailable(posts.size() == TwitterService.PAGE_SIZE); getView().update(getModel()); }, throwable -> { - getModel().error(throwable); - getView().update(getModel()); + getModel().error(); + getView().showError(); }); } @@ -37,6 +37,8 @@ public void reloadData() { super.resume(); if (getModel().isEmpty() && !isTaskRunning()) { reloadData(); + } else if (getModel().isError()) { + getView().showError(); } else { getView().update(getModel()); } @@ -54,8 +56,8 @@ public void loadNextPage() { getView().update(getModel()); }, throwable -> { - getModel().error(throwable); - getView().update(getModel()); + getModel().error(); + getView().showError(); }); } diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListView.java b/app/src/main/java/it/cosenonjaviste/twitter/TweetListView.java index 99c85db..c19ce4f 100644 --- a/app/src/main/java/it/cosenonjaviste/twitter/TweetListView.java +++ b/app/src/main/java/it/cosenonjaviste/twitter/TweetListView.java @@ -6,4 +6,6 @@ public interface TweetListView { void startLoading(boolean showMainLoading); void startMoreItemsLoading(); + + void showError(); } From 5a2fa138f1a2ec18e17a7c57342b662774096bda Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 12:31:16 +0200 Subject: [PATCH 059/332] Moved TweetListPresenter in core module --- core/build.gradle | 4 +++ .../java/it/cosenonjaviste/TestData.java | 0 .../twitter/TweetListModel.java | 0 .../twitter/TweetListPresenter.java | 0 .../cosenonjaviste/twitter/TweetListView.java | 0 .../mvp/twitter/TweetListPresenterTest.java | 25 +++++++++---------- .../it/cosenonjaviste/mvp/TestLifeCycle.java | 0 .../mvp/TestSchedulerManager.java | 0 8 files changed, 16 insertions(+), 13 deletions(-) rename {app/src/debug => core/src/main}/java/it/cosenonjaviste/TestData.java (100%) rename {app => core}/src/main/java/it/cosenonjaviste/twitter/TweetListModel.java (100%) rename {app => core}/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java (100%) rename {app => core}/src/main/java/it/cosenonjaviste/twitter/TweetListView.java (100%) rename {app => core}/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java (70%) rename {app/src/test => coremvp/src/main}/java/it/cosenonjaviste/mvp/TestLifeCycle.java (100%) rename {app/src/test => coremvp/src/main}/java/it/cosenonjaviste/mvp/TestSchedulerManager.java (100%) diff --git a/core/build.gradle b/core/build.gradle index d60883c..abed3c8 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -6,4 +6,8 @@ dependencies { compile project(':coremvp') compile 'com.squareup.retrofit:retrofit:1.9.0' compile 'org.twitter4j:twitter4j-core:4.0.2' + + testCompile 'junit:junit:4.12' + testCompile 'org.mockito:mockito-core:1.9.5' + testCompile 'org.assertj:assertj-core:1.7.0' } \ No newline at end of file diff --git a/app/src/debug/java/it/cosenonjaviste/TestData.java b/core/src/main/java/it/cosenonjaviste/TestData.java similarity index 100% rename from app/src/debug/java/it/cosenonjaviste/TestData.java rename to core/src/main/java/it/cosenonjaviste/TestData.java diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListModel.java b/core/src/main/java/it/cosenonjaviste/twitter/TweetListModel.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/twitter/TweetListModel.java rename to core/src/main/java/it/cosenonjaviste/twitter/TweetListModel.java diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java b/core/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java rename to core/src/main/java/it/cosenonjaviste/twitter/TweetListPresenter.java diff --git a/app/src/main/java/it/cosenonjaviste/twitter/TweetListView.java b/core/src/main/java/it/cosenonjaviste/twitter/TweetListView.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/twitter/TweetListView.java rename to core/src/main/java/it/cosenonjaviste/twitter/TweetListView.java diff --git a/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java b/core/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java similarity index 70% rename from app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java rename to core/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java index 7367552..ed61e26 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java +++ b/core/src/test/java/it/cosenonjaviste/mvp/twitter/TweetListPresenterTest.java @@ -1,9 +1,12 @@ package it.cosenonjaviste.mvp.twitter; +import org.assertj.core.api.Assertions; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; +import org.mockito.Matchers; import org.mockito.Mock; +import org.mockito.Mockito; import org.mockito.runners.MockitoJUnitRunner; import it.cosenonjaviste.TestData; @@ -14,10 +17,6 @@ import it.cosenonjaviste.twitter.TweetListView; import rx.Observable; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Matchers.eq; -import static org.mockito.Mockito.when; - @RunWith(MockitoJUnitRunner.class) public class TweetListPresenterTest { @@ -30,34 +29,34 @@ public class TweetListPresenterTest { @InjectMocks TweetListPresenter presenter; @Test public void testLoadTweets() { - when(twitterService.loadTweets(eq(1))) + Mockito.when(twitterService.loadTweets(Matchers.eq(1))) .thenReturn(TestData.tweets()); TweetListModel model = new TweetListModel(); testLifeCycle.initAndResume(model, presenter, view); - assertThat(model.size()).isEqualTo(10); + Assertions.assertThat(model.size()).isEqualTo(10); } @Test public void testRetryAfterError() { - when(twitterService.loadTweets(eq(1))) + Mockito.when(twitterService.loadTweets(Matchers.eq(1))) .thenReturn(Observable.error(new RuntimeException())); TweetListModel model = new TweetListModel(); testLifeCycle.initAndResume(model, presenter, view); - assertThat(model.isError()).isTrue(); + Assertions.assertThat(model.isError()).isTrue(); - when(twitterService.loadTweets(eq(1))) + Mockito.when(twitterService.loadTweets(Matchers.eq(1))) .thenReturn(TestData.tweets()); presenter.reloadData(); - assertThat(model.isError()).isFalse(); - assertThat(model.size()).isEqualTo(10); + Assertions.assertThat(model.isError()).isFalse(); + Assertions.assertThat(model.size()).isEqualTo(10); } @Test public void testLoadMoreTweets() { - when(twitterService.loadTweets(eq(1))) + Mockito.when(twitterService.loadTweets(Matchers.eq(1))) .thenReturn(TestData.tweets()); TweetListModel tweetListModel = new TweetListModel(); @@ -65,6 +64,6 @@ public class TweetListPresenterTest { presenter.loadNextPage(); - assertThat(tweetListModel.size()).isEqualTo(20); + Assertions.assertThat(tweetListModel.size()).isEqualTo(20); } } diff --git a/app/src/test/java/it/cosenonjaviste/mvp/TestLifeCycle.java b/coremvp/src/main/java/it/cosenonjaviste/mvp/TestLifeCycle.java similarity index 100% rename from app/src/test/java/it/cosenonjaviste/mvp/TestLifeCycle.java rename to coremvp/src/main/java/it/cosenonjaviste/mvp/TestLifeCycle.java diff --git a/app/src/test/java/it/cosenonjaviste/mvp/TestSchedulerManager.java b/coremvp/src/main/java/it/cosenonjaviste/mvp/TestSchedulerManager.java similarity index 100% rename from app/src/test/java/it/cosenonjaviste/mvp/TestSchedulerManager.java rename to coremvp/src/main/java/it/cosenonjaviste/mvp/TestSchedulerManager.java From 7aa689170b4823eda97cd9479b06a91d8bc6eec4 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 12:43:27 +0200 Subject: [PATCH 060/332] Removed OptionalList in PostListModel --- .../cosenonjaviste/post/PostListFragment.java | 22 ++++++------ .../it/cosenonjaviste/post/PostListModel.java | 36 ++++++++++++++++--- .../post/PostListPresenter.java | 29 +++++++-------- .../it/cosenonjaviste/post/PostListView.java | 2 ++ .../mvp/post/PostListPresenterTest.java | 9 ++--- 5 files changed, 61 insertions(+), 37 deletions(-) diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java index f7bfc5d..33c8fb2 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListFragment.java @@ -9,6 +9,8 @@ import com.quentindommerc.superlistview.SuperListview; +import org.parceler.ParcelClass; + import javax.inject.Inject; import butterknife.ButterKnife; @@ -20,8 +22,8 @@ import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; import it.cosenonjaviste.utils.SingleFragmentActivity; -import rx.functions.Actions; +@ParcelClass(PostListModel.class) public class PostListFragment extends RxMvpFragment implements PostListView { @InjectView(R.id.list) SuperListview list; @@ -53,17 +55,13 @@ public class PostListFragment extends RxMvpFragment implements PostListView { } @Override public void update(PostListModel model) { - model.getItems().call( - posts -> { - list.showList(); - list.hideMoreProgress(model.isMoreDataAvailable()); - adapter.reloadData(posts); - } - ).whenError( - t -> list.showError() - ).whenEmpty( - Actions.empty() - ); + list.showList(); + list.hideMoreProgress(model.isMoreDataAvailable()); + adapter.reloadData(model.getItems()); + } + + @Override public void showError() { + list.showError(); } @Override public void startLoading(boolean showMainLoading) { diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListModel.java b/app/src/main/java/it/cosenonjaviste/post/PostListModel.java index c07a82a..36e9697 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListModel.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListModel.java @@ -1,21 +1,21 @@ package it.cosenonjaviste.post; -import org.parceler.Parcel; +import java.util.List; -import it.cosenonjaviste.lib.mvp.utils.OptionalList; import it.cosenonjaviste.model.Author; import it.cosenonjaviste.model.Category; import it.cosenonjaviste.model.Post; -@Parcel public class PostListModel { - OptionalList items = new OptionalList<>(); + List items; Category category; boolean moreDataAvailable; + boolean errorLoading; + Author author; public PostListModel() { @@ -45,7 +45,33 @@ public Author getAuthor() { return author; } - public OptionalList getItems() { + public List getItems() { return items; } + + public void done(List items) { + this.items = items; + errorLoading = false; + } + + public void error() { + items = null; + errorLoading = true; + } + + public boolean isError() { + return errorLoading; + } + + public void append(List object) { + items.addAll(object); + } + + public int size() { + return items.size(); + } + + public boolean isEmpty() { + return items == null || items.isEmpty(); + } } diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java index db72374..76cd9ca 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java @@ -14,8 +14,6 @@ import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.page.PageModel; import rx.Observable; -import rx.functions.Action0; -import rx.functions.Action1; @PresenterScope public class PostListPresenter extends RxMvpPresenter { @@ -27,8 +25,10 @@ public class PostListPresenter extends RxMvpPresenter> observable = getObservable(1); subscribe(observable, - () -> getView().startLoading(getModel().getItems().isEmpty()), + () -> getView().startLoading(getModel().isEmpty()), posts -> { - getModel().getItems().done(new ArrayList<>(posts)); + getModel().done(new ArrayList<>(posts)); getModel().setMoreDataAvailable(posts.size() == WordPressService.POST_PAGE_SIZE); getView().update(getModel()); }, throwable -> { - getModel().getItems().error(throwable); - getView().update(getModel()); + getModel().error(); + getView().showError(); }); } @@ -57,17 +57,14 @@ public void loadNextPage() { int page = calcNextPage(getModel().getItems().size(), WordPressService.POST_PAGE_SIZE); Observable> observable = getObservable(page); - Action0 onAttach = () -> getView().startMoreItemsLoading(); - Action1> onNext = posts -> { - getModel().getItems().append(posts); + subscribe(observable, () -> getView().startMoreItemsLoading(), posts -> { + getModel().append(posts); getModel().setMoreDataAvailable(posts.size() == WordPressService.POST_PAGE_SIZE); getView().update(getModel()); - }; - Action1 onError = throwable -> { - getModel().getItems().error(throwable); - getView().update(getModel()); - }; - subscribe(observable, onAttach, onNext, onError); + }, throwable -> { + getModel().error(); + getView().showError(); + }); } private Observable> getObservable(int page) { diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListView.java b/app/src/main/java/it/cosenonjaviste/post/PostListView.java index bfd8635..685b537 100644 --- a/app/src/main/java/it/cosenonjaviste/post/PostListView.java +++ b/app/src/main/java/it/cosenonjaviste/post/PostListView.java @@ -5,6 +5,8 @@ public interface PostListView { void update(PostListModel model); + void showError(); + void startLoading(boolean showMainLoading); void startMoreItemsLoading(); diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java index cc874ea..f2b33be 100644 --- a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java +++ b/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java @@ -8,7 +8,8 @@ import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; -import it.cosenonjaviste.lib.mvp.utils.OptionalList; +import java.util.List; + import it.cosenonjaviste.model.Post; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.mvp.TestLifeCycle; @@ -59,7 +60,7 @@ public void testLoadMore() { testLifeCycle.initAndResume(model, presenter, view); presenter.loadNextPage(); - OptionalList items = model.getItems(); + List items = model.getItems(); assertThat(items.size()).isEqualTo(16); } @@ -70,14 +71,14 @@ public void testRetryAfterError() { PostListModel model = new PostListModel(); testLifeCycle.initAndResume(model, presenter, view); - assertThat(model.getItems().isError()).isTrue(); + assertThat(model.isError()).isTrue(); when(wordPressService.listPosts(eq(1))) .thenReturn(postResponse(6)); presenter.reloadData(); - assertThat(model.getItems().isError()).isFalse(); + assertThat(model.isError()).isFalse(); assertThat(model.getItems().size()).isEqualTo(6); } From 7a168abbc23f8e391261aff3745bde67f6d53a6d Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 12:49:55 +0200 Subject: [PATCH 061/332] Moved PagePresenter and PostListPresenter in core module --- app/src/main/java/it/cosenonjaviste/page/PageFragment.java | 3 +++ .../src/main/java/it/cosenonjaviste/page/PageModel.java | 3 --- .../src/main/java/it/cosenonjaviste/page/PagePresenter.java | 0 .../src/main/java/it/cosenonjaviste/page/PageUrlManager.java | 0 .../src/main/java/it/cosenonjaviste/page/PageView.java | 0 .../src/main/java/it/cosenonjaviste/post/PostListModel.java | 0 .../main/java/it/cosenonjaviste/post/PostListPresenter.java | 0 .../src/main/java/it/cosenonjaviste/post/PostListView.java | 0 .../java/it/cosenonjaviste/mvp/page/PagePresenterTest.java | 0 .../cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java | 0 .../cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java | 0 .../java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java | 0 12 files changed, 3 insertions(+), 3 deletions(-) rename {app => core}/src/main/java/it/cosenonjaviste/page/PageModel.java (85%) rename {app => core}/src/main/java/it/cosenonjaviste/page/PagePresenter.java (100%) rename {app => core}/src/main/java/it/cosenonjaviste/page/PageUrlManager.java (100%) rename {app => core}/src/main/java/it/cosenonjaviste/page/PageView.java (100%) rename {app => core}/src/main/java/it/cosenonjaviste/post/PostListModel.java (100%) rename {app => core}/src/main/java/it/cosenonjaviste/post/PostListPresenter.java (100%) rename {app => core}/src/main/java/it/cosenonjaviste/post/PostListView.java (100%) rename {app => core}/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java (100%) rename {app => core}/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java (100%) rename {app => core}/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java (100%) rename {app => core}/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java (100%) diff --git a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java index 500c967..c39ddf4 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageFragment.java +++ b/app/src/main/java/it/cosenonjaviste/page/PageFragment.java @@ -11,6 +11,8 @@ import android.webkit.WebView; import android.webkit.WebViewClient; +import org.parceler.ParcelClass; + import java.io.File; import java.io.IOException; @@ -22,6 +24,7 @@ import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.RxMvpFragment; +@ParcelClass(PageModel.class) public class PageFragment extends RxMvpFragment implements PageView { @InjectView(R.id.web_view) WebView webView; diff --git a/app/src/main/java/it/cosenonjaviste/page/PageModel.java b/core/src/main/java/it/cosenonjaviste/page/PageModel.java similarity index 85% rename from app/src/main/java/it/cosenonjaviste/page/PageModel.java rename to core/src/main/java/it/cosenonjaviste/page/PageModel.java index 3609121..0bbf964 100644 --- a/app/src/main/java/it/cosenonjaviste/page/PageModel.java +++ b/core/src/main/java/it/cosenonjaviste/page/PageModel.java @@ -1,8 +1,5 @@ package it.cosenonjaviste.page; -import org.parceler.Parcel; - -@Parcel public class PageModel { String url; diff --git a/app/src/main/java/it/cosenonjaviste/page/PagePresenter.java b/core/src/main/java/it/cosenonjaviste/page/PagePresenter.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/page/PagePresenter.java rename to core/src/main/java/it/cosenonjaviste/page/PagePresenter.java diff --git a/app/src/main/java/it/cosenonjaviste/page/PageUrlManager.java b/core/src/main/java/it/cosenonjaviste/page/PageUrlManager.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/page/PageUrlManager.java rename to core/src/main/java/it/cosenonjaviste/page/PageUrlManager.java diff --git a/app/src/main/java/it/cosenonjaviste/page/PageView.java b/core/src/main/java/it/cosenonjaviste/page/PageView.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/page/PageView.java rename to core/src/main/java/it/cosenonjaviste/page/PageView.java diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListModel.java b/core/src/main/java/it/cosenonjaviste/post/PostListModel.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/post/PostListModel.java rename to core/src/main/java/it/cosenonjaviste/post/PostListModel.java diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java b/core/src/main/java/it/cosenonjaviste/post/PostListPresenter.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/post/PostListPresenter.java rename to core/src/main/java/it/cosenonjaviste/post/PostListPresenter.java diff --git a/app/src/main/java/it/cosenonjaviste/post/PostListView.java b/core/src/main/java/it/cosenonjaviste/post/PostListView.java similarity index 100% rename from app/src/main/java/it/cosenonjaviste/post/PostListView.java rename to core/src/main/java/it/cosenonjaviste/post/PostListView.java diff --git a/app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java b/core/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java similarity index 100% rename from app/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java rename to core/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java b/core/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java similarity index 100% rename from app/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java rename to core/src/test/java/it/cosenonjaviste/mvp/post/AuthorPostListPresenterTest.java diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java b/core/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java similarity index 100% rename from app/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java rename to core/src/test/java/it/cosenonjaviste/mvp/post/CategoryPostListPresenterTest.java diff --git a/app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java b/core/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java similarity index 100% rename from app/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java rename to core/src/test/java/it/cosenonjaviste/mvp/post/PostListPresenterTest.java From 1b9c0e44c57b9f132dc1639c1adcf4da3995963e Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 13:02:03 +0200 Subject: [PATCH 062/332] Moved all presenters in core module --- .../lib/mvp/utils/OptionalItem.java | 106 ------------------ .../lib/mvp/utils/OptionalList.java | 58 ---------- .../author/AuthorListFragment.java | 12 +- .../author/AuthorListModel.java | 39 ------- .../category/CategoryListFragment.java | 20 ++-- .../category/CategoryListModel.java | 39 ------- .../mvp/author/AuthorListPresenterTest.java | 78 ------------- .../author/AuthorListModel.java | 41 +++++++ .../author/AuthorListPresenter.java | 10 +- .../cosenonjaviste/author/AuthorListView.java | 2 + .../category/CategoryListModel.java | 41 +++++++ .../category/CategoryListPresenter.java | 10 +- .../category/CategoryListView.java | 2 + .../it/cosenonjaviste/model/JsonStubs.java | 0 .../model/WordPressServiceTest.java | 0 .../category/CategoryListPresenterTest.java | 0 16 files changed, 113 insertions(+), 345 deletions(-) delete mode 100644 androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/OptionalItem.java delete mode 100644 androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/OptionalList.java delete mode 100644 app/src/main/java/it/cosenonjaviste/author/AuthorListModel.java delete mode 100644 app/src/main/java/it/cosenonjaviste/category/CategoryListModel.java delete mode 100644 app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java create mode 100644 core/src/main/java/it/cosenonjaviste/author/AuthorListModel.java rename {app => core}/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java (87%) rename {app => core}/src/main/java/it/cosenonjaviste/author/AuthorListView.java (90%) create mode 100644 core/src/main/java/it/cosenonjaviste/category/CategoryListModel.java rename {app => core}/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java (86%) rename {app => core}/src/main/java/it/cosenonjaviste/category/CategoryListView.java (91%) rename {app => core}/src/test/java/it/cosenonjaviste/model/JsonStubs.java (100%) rename {app => core}/src/test/java/it/cosenonjaviste/model/WordPressServiceTest.java (100%) rename {app => core}/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java (100%) diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/OptionalItem.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/OptionalItem.java deleted file mode 100644 index c0c5791..0000000 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/OptionalItem.java +++ /dev/null @@ -1,106 +0,0 @@ -package it.cosenonjaviste.lib.mvp.utils; - -import android.os.Parcel; -import android.os.Parcelable; - -import org.parceler.Parcels; -import org.parceler.Transient; - -import rx.functions.Action0; -import rx.functions.Action1; - -public class OptionalItem implements Parcelable { - - @Transient - T object; - - Throwable throwable; - - public OptionalItem() { - } - - public OptionalItem(T object) { - this.object = object; - } - - public OptionalItem(T object, Throwable throwable) { - this.object = object; - this.throwable = throwable; - } - - public T getObject() { - return object; - } - - public void done(T object) { - throwable = null; - this.object = object; - } - - public Throwable getThrowable() { - return throwable; - } - - public void error(Throwable throwable) { - this.throwable = throwable; - } - - public boolean isEmpty() { - return throwable == null && object == null; - } - - public boolean isError() { - return throwable != null; - } - - public boolean isValueAvalaible() { - return !isError() && !isEmpty(); - } - - public OptionalItem call(Action1 action) { - if (!isEmpty() && !isError()) { - action.call(object); - } - return this; - } - - public OptionalItem whenEmpty(Action0 action) { - if (isEmpty()) { - action.call(); - } - return this; - } - - public OptionalItem whenError(Action1 action) { - if (isError()) { - action.call(throwable); - } - return this; - } - - @Override public int describeContents() { - return 0; - } - - @Override public void writeToParcel(Parcel parcel, int flags) { - parcel.writeParcelable(Parcels.wrap(object), 0); - parcel.writeSerializable(throwable); - } - - protected void readFromParcel(Parcel in) { - object = Parcels.unwrap(in.readParcelable(getClass().getClassLoader())); - throwable = (Throwable) in.readSerializable(); - } - - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - public OptionalItem createFromParcel(Parcel in) { - OptionalItem person = new OptionalItem<>(); - person.readFromParcel(in); - return person; - } - - public OptionalItem[] newArray(int size) { - return new OptionalItem[size]; - } - }; -} diff --git a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/OptionalList.java b/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/OptionalList.java deleted file mode 100644 index 80b8503..0000000 --- a/androidMvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/OptionalList.java +++ /dev/null @@ -1,58 +0,0 @@ -package it.cosenonjaviste.lib.mvp.utils; - -import android.os.Parcel; -import android.os.Parcelable; - -import java.util.ArrayList; -import java.util.List; - -public class OptionalList extends OptionalItem> implements Parcelable { - public OptionalList() { - this(new ArrayList<>()); - } - - public OptionalList(List object) { - super(object); - } - - public OptionalList(List object, Throwable throwable) { - super(object, throwable); - } - - @Override public boolean isEmpty() { - return super.isEmpty() || getObject().isEmpty(); - } - - public int size() { - if (isValueAvalaible()) { - return getObject().size(); - } else { - return 0; - } - } - - public T get(int index) { - if (isValueAvalaible()) { - return getObject().get(index); - } else { - return null; - } - } - - public void append(List object) { - throwable = null; - this.object.addAll(object); - } - - public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { - public OptionalList createFromParcel(Parcel in) { - OptionalList person = new OptionalList<>(); - person.readFromParcel(in); - return person; - } - - public OptionalList[] newArray(int size) { - return new OptionalList[size]; - } - }; -} diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index cf4aeac..d6d94b8 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -9,6 +9,8 @@ import com.quentindommerc.superlistview.SuperGridview; +import org.parceler.ParcelClass; + import javax.inject.Inject; import butterknife.ButterKnife; @@ -20,8 +22,8 @@ import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.utils.SingleFragmentActivity; -import rx.functions.Actions; +@ParcelClass(AuthorListModel.class) public class AuthorListFragment extends RxMvpFragment implements AuthorListView { @InjectView(R.id.grid) SuperGridview grid; @@ -50,10 +52,12 @@ public class AuthorListFragment extends RxMvpFragment implements AuthorListView } @Override public void update(AuthorListModel model) { - model.call(authors -> { grid.showList(); - adapter.reloadData(authors); - }).whenError(t -> grid.showError()).whenEmpty(Actions.empty()); + adapter.reloadData(model.getItems()); + } + + @Override public void showError() { + grid.showError(); } @Override public void startLoading() { diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListModel.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListModel.java deleted file mode 100644 index 660542a..0000000 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListModel.java +++ /dev/null @@ -1,39 +0,0 @@ -package it.cosenonjaviste.author; - -import org.parceler.Parcel; - -import java.util.List; - -import it.cosenonjaviste.lib.mvp.utils.OptionalItem; -import it.cosenonjaviste.lib.mvp.utils.OptionalList; -import it.cosenonjaviste.model.Author; -import rx.functions.Action1; - -@Parcel -public class AuthorListModel { - OptionalList items = new OptionalList<>(); - - public boolean isEmpty() { - return items.isEmpty(); - } - - public int size() { - return items.size(); - } - - public Author get(int index) { - return items.get(index); - } - - public void done(List object) { - items.done(object); - } - - public void error(Throwable throwable) { - items.error(throwable); - } - - public OptionalItem> call(Action1> action) { - return items.call(action); - } -} diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java index b0b6932..553e1a2 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/category/CategoryListFragment.java @@ -9,6 +9,8 @@ import com.quentindommerc.superlistview.SuperGridview; +import org.parceler.ParcelClass; + import javax.inject.Inject; import butterknife.ButterKnife; @@ -20,8 +22,8 @@ import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; import it.cosenonjaviste.utils.SingleFragmentActivity; -import rx.functions.Actions; +@ParcelClass(CategoryListModel.class) public class CategoryListFragment extends RxMvpFragment implements CategoryListView { @InjectView(R.id.grid) SuperGridview grid; @@ -53,16 +55,12 @@ public class CategoryListFragment extends RxMvpFragment implements CategoryListV @Override public void update(CategoryListModel model) { - model.call( - categories -> { - grid.showList(); - adapter.reloadData(categories); - } - ).whenError( - t -> grid.showError() - ).whenEmpty( - Actions.empty() - ); + grid.showList(); + adapter.reloadData(model.getItems()); + } + + @Override public void showError() { + grid.showError(); } @Override public void startLoading() { diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListModel.java b/app/src/main/java/it/cosenonjaviste/category/CategoryListModel.java deleted file mode 100644 index 5d2c5ce..0000000 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListModel.java +++ /dev/null @@ -1,39 +0,0 @@ -package it.cosenonjaviste.category; - -import org.parceler.Parcel; - -import java.util.List; - -import it.cosenonjaviste.lib.mvp.utils.OptionalItem; -import it.cosenonjaviste.lib.mvp.utils.OptionalList; -import it.cosenonjaviste.model.Category; -import rx.functions.Action1; - -@Parcel -public class CategoryListModel { - OptionalList items = new OptionalList<>(); - - public boolean isEmpty() { - return items.isEmpty(); - } - - public int size() { - return items.size(); - } - - public Category get(int index) { - return items.get(index); - } - - public void done(List object) { - items.done(object); - } - - public void error(Throwable throwable) { - items.error(throwable); - } - - public OptionalItem> call(Action1> action) { - return items.call(action); - } -} diff --git a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java b/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java deleted file mode 100644 index b01520c..0000000 --- a/app/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java +++ /dev/null @@ -1,78 +0,0 @@ -package it.cosenonjaviste.mvp.author; - -import org.junit.Test; -import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.runners.MockitoJUnitRunner; - -import it.cosenonjaviste.author.AuthorListModel; -import it.cosenonjaviste.author.AuthorListPresenter; -import it.cosenonjaviste.author.AuthorListView; -import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.mvp.TestLifeCycle; -import it.cosenonjaviste.post.PostListModel; -import rx.Observable; - -import static it.cosenonjaviste.TestData.authorResponse; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - -@RunWith(MockitoJUnitRunner.class) -public class AuthorListPresenterTest { - - @Mock AuthorListView view; - - @InjectMocks AuthorListPresenter presenter; - - @Mock WordPressService wordPressService; - - @Captor ArgumentCaptor modelCaptor; - - private TestLifeCycle testLifeCycle = new TestLifeCycle(); - - @Test - public void testLoad() { - when(wordPressService.listAuthors()) - .thenReturn(authorResponse(2)); - - AuthorListModel model = new AuthorListModel(); - testLifeCycle.initAndResume(model, presenter, view); - - assertThat(model.size()).isEqualTo(2); - } - - @Test - public void testRetryAfterError() { - when(wordPressService.listAuthors()) - .thenReturn(Observable.error(new RuntimeException())); - when(wordPressService.listAuthors()) - .thenReturn(authorResponse(2)); - - AuthorListModel model = new AuthorListModel(); - testLifeCycle.initAndResume(model, presenter, view); - - presenter.loadAuthors(); - - assertThat(model.size()).isEqualTo(2); - } - - @Test - public void testGoToDetail() { - when(wordPressService.listAuthors()) - .thenReturn(authorResponse(2)); - - AuthorListModel authorListModel = new AuthorListModel(); - testLifeCycle.initAndResume(authorListModel, presenter, view); - - presenter.goToAuthorDetail(1); - - verify(view).openPostList(modelCaptor.capture()); - - PostListModel model = modelCaptor.getValue(); - assertThat(model.getAuthor()).isEqualTo(authorListModel.get(1)); - } -} \ No newline at end of file diff --git a/core/src/main/java/it/cosenonjaviste/author/AuthorListModel.java b/core/src/main/java/it/cosenonjaviste/author/AuthorListModel.java new file mode 100644 index 0000000..829ea11 --- /dev/null +++ b/core/src/main/java/it/cosenonjaviste/author/AuthorListModel.java @@ -0,0 +1,41 @@ +package it.cosenonjaviste.author; + +import java.util.List; + +import it.cosenonjaviste.model.Author; + +public class AuthorListModel { + List items; + + boolean errorLoading; + + public boolean isEmpty() { + return items.isEmpty(); + } + + public int size() { + return items.size(); + } + + public Author get(int index) { + return items.get(index); + } + + public void done(List items) { + this.items = items; + errorLoading = false; + } + + public void error() { + items = null; + errorLoading = true; + } + + public List getItems() { + return items; + } + + public boolean isError() { + return errorLoading; + } +} diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java b/core/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java similarity index 87% rename from app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java rename to core/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java index 41e671b..947c435 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java +++ b/core/src/main/java/it/cosenonjaviste/author/AuthorListPresenter.java @@ -28,15 +28,13 @@ public void loadAuthors() { .doOnNext(Collections::sort); subscribe(observable, - () -> { - getView().startLoading(); - }, + () -> getView().startLoading(), posts -> { getModel().done(posts); getView().update(getModel()); }, throwable -> { - getModel().error(throwable); - getView().update(getModel()); + getModel().error(); + getView().showError(); }); } @@ -44,6 +42,8 @@ public void loadAuthors() { super.resume(); if (getModel().isEmpty() && !isTaskRunning()) { loadAuthors(); + } else if (getModel().isError()) { + getView().showError(); } else { getView().update(getModel()); } diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListView.java b/core/src/main/java/it/cosenonjaviste/author/AuthorListView.java similarity index 90% rename from app/src/main/java/it/cosenonjaviste/author/AuthorListView.java rename to core/src/main/java/it/cosenonjaviste/author/AuthorListView.java index 9e36ac9..e81c7cc 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListView.java +++ b/core/src/main/java/it/cosenonjaviste/author/AuthorListView.java @@ -5,6 +5,8 @@ public interface AuthorListView { void update(AuthorListModel model); + void showError(); + void startLoading(); void openPostList(PostListModel model); diff --git a/core/src/main/java/it/cosenonjaviste/category/CategoryListModel.java b/core/src/main/java/it/cosenonjaviste/category/CategoryListModel.java new file mode 100644 index 0000000..6a3f432 --- /dev/null +++ b/core/src/main/java/it/cosenonjaviste/category/CategoryListModel.java @@ -0,0 +1,41 @@ +package it.cosenonjaviste.category; + +import java.util.List; + +import it.cosenonjaviste.model.Category; + +public class CategoryListModel { + List items; + + boolean errorLoading; + + public boolean isEmpty() { + return items == null || items.isEmpty(); + } + + public int size() { + return items.size(); + } + + public Category get(int index) { + return items.get(index); + } + + public void done(List items) { + this.items = items; + errorLoading = false; + } + + public void error() { + items = null; + errorLoading = true; + } + + public List getItems() { + return items; + } + + public boolean isError() { + return errorLoading; + } +} diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java b/core/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java similarity index 86% rename from app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java rename to core/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java index 124af49..22c23c5 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java +++ b/core/src/main/java/it/cosenonjaviste/category/CategoryListPresenter.java @@ -24,6 +24,8 @@ public class CategoryListPresenter extends RxMvpPresenter { - getView().startLoading(); - }, + () -> getView().startLoading(), posts -> { getModel().done(posts); getView().update(getModel()); }, throwable -> { - getModel().error(throwable); - getView().update(getModel()); + getModel().error(); + getView().showError(); }); } diff --git a/app/src/main/java/it/cosenonjaviste/category/CategoryListView.java b/core/src/main/java/it/cosenonjaviste/category/CategoryListView.java similarity index 91% rename from app/src/main/java/it/cosenonjaviste/category/CategoryListView.java rename to core/src/main/java/it/cosenonjaviste/category/CategoryListView.java index e91177d..8a15bb8 100644 --- a/app/src/main/java/it/cosenonjaviste/category/CategoryListView.java +++ b/core/src/main/java/it/cosenonjaviste/category/CategoryListView.java @@ -5,6 +5,8 @@ public interface CategoryListView { void update(CategoryListModel model); + void showError(); + void startLoading(); void openPostList(PostListModel model); diff --git a/app/src/test/java/it/cosenonjaviste/model/JsonStubs.java b/core/src/test/java/it/cosenonjaviste/model/JsonStubs.java similarity index 100% rename from app/src/test/java/it/cosenonjaviste/model/JsonStubs.java rename to core/src/test/java/it/cosenonjaviste/model/JsonStubs.java diff --git a/app/src/test/java/it/cosenonjaviste/model/WordPressServiceTest.java b/core/src/test/java/it/cosenonjaviste/model/WordPressServiceTest.java similarity index 100% rename from app/src/test/java/it/cosenonjaviste/model/WordPressServiceTest.java rename to core/src/test/java/it/cosenonjaviste/model/WordPressServiceTest.java diff --git a/app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java b/core/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java similarity index 100% rename from app/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java rename to core/src/test/java/it/cosenonjaviste/mvp/category/CategoryListPresenterTest.java From 6bc98c3f42ef5e838e66de175b3561e3cd3b3e18 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 14:07:50 +0200 Subject: [PATCH 063/332] Restored test --- .../mvp/author/AuthorListPresenterTest.java | 78 +++++++++++++++++++ 1 file changed, 78 insertions(+) create mode 100644 core/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java diff --git a/core/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java b/core/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java new file mode 100644 index 0000000..b01520c --- /dev/null +++ b/core/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java @@ -0,0 +1,78 @@ +package it.cosenonjaviste.mvp.author; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +import it.cosenonjaviste.author.AuthorListModel; +import it.cosenonjaviste.author.AuthorListPresenter; +import it.cosenonjaviste.author.AuthorListView; +import it.cosenonjaviste.model.WordPressService; +import it.cosenonjaviste.mvp.TestLifeCycle; +import it.cosenonjaviste.post.PostListModel; +import rx.Observable; + +import static it.cosenonjaviste.TestData.authorResponse; +import static org.assertj.core.api.Assertions.assertThat; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@RunWith(MockitoJUnitRunner.class) +public class AuthorListPresenterTest { + + @Mock AuthorListView view; + + @InjectMocks AuthorListPresenter presenter; + + @Mock WordPressService wordPressService; + + @Captor ArgumentCaptor modelCaptor; + + private TestLifeCycle testLifeCycle = new TestLifeCycle(); + + @Test + public void testLoad() { + when(wordPressService.listAuthors()) + .thenReturn(authorResponse(2)); + + AuthorListModel model = new AuthorListModel(); + testLifeCycle.initAndResume(model, presenter, view); + + assertThat(model.size()).isEqualTo(2); + } + + @Test + public void testRetryAfterError() { + when(wordPressService.listAuthors()) + .thenReturn(Observable.error(new RuntimeException())); + when(wordPressService.listAuthors()) + .thenReturn(authorResponse(2)); + + AuthorListModel model = new AuthorListModel(); + testLifeCycle.initAndResume(model, presenter, view); + + presenter.loadAuthors(); + + assertThat(model.size()).isEqualTo(2); + } + + @Test + public void testGoToDetail() { + when(wordPressService.listAuthors()) + .thenReturn(authorResponse(2)); + + AuthorListModel authorListModel = new AuthorListModel(); + testLifeCycle.initAndResume(authorListModel, presenter, view); + + presenter.goToAuthorDetail(1); + + verify(view).openPostList(modelCaptor.capture()); + + PostListModel model = modelCaptor.getValue(); + assertThat(model.getAuthor()).isEqualTo(authorListModel.get(1)); + } +} \ No newline at end of file From 0c8e90d893d2f40492849f0bba6899447270f49b Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 14:08:33 +0200 Subject: [PATCH 064/332] Fix null pointer --- .../src/main/java/it/cosenonjaviste/author/AuthorListModel.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/src/main/java/it/cosenonjaviste/author/AuthorListModel.java b/core/src/main/java/it/cosenonjaviste/author/AuthorListModel.java index 829ea11..c68b6ff 100644 --- a/core/src/main/java/it/cosenonjaviste/author/AuthorListModel.java +++ b/core/src/main/java/it/cosenonjaviste/author/AuthorListModel.java @@ -10,7 +10,7 @@ public class AuthorListModel { boolean errorLoading; public boolean isEmpty() { - return items.isEmpty(); + return items == null || items.isEmpty(); } public int size() { From ab749ddf023523cf3ef3e9ba310603d2655c9eb7 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 14:41:23 +0200 Subject: [PATCH 065/332] Espresso 2.1 config --- app/build.gradle | 6 ++++-- build.gradle | 3 +++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 97f520e..3fcd541 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -96,11 +96,13 @@ dependencies { exclude group: 'org.hamcrest', module: 'hamcrest-core' } androidTestCompile 'com.squareup.spoon:spoon-client:1.0.5' - androidTestCompile('com.android.support.test.espresso:espresso-core:2.0') { + androidTestCompile 'com.android.support.test:runner:0.2' + androidTestCompile 'com.android.support.test:rules:0.2' + androidTestCompile('com.android.support.test.espresso:espresso-core:2.1') { exclude group: 'javax.inject', module: 'javax.inject' exclude group: 'com.squareup', module: 'javawriter' } - androidTestCompile 'com.android.support.test:testing-support-lib:0.1' + androidTestCompile 'com.android.support.test.espresso:espresso-intents:2.1' androidTestCompile 'com.squareup.okhttp:mockwebserver:2.0.0' testCompile 'junit:junit:4.12' diff --git a/build.gradle b/build.gradle index 5791eff..46c2ce5 100644 --- a/build.gradle +++ b/build.gradle @@ -17,4 +17,7 @@ allprojects { repositories { jcenter() } + configurations.all { + resolutionStrategy.force 'com.android.support:support-annotations:22.1.1' + } } From 0e5b890883cbd91567b850c0a79cf7246b3e6783 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 16:16:29 +0200 Subject: [PATCH 066/332] New class EspressoSchedulerManager --- .../androidtest/base/DaggerRule.java | 30 ------------------- .../androidtest/base/EspressoExecutor.java | 5 +++- .../base/EspressoSchedulerManager.java | 17 +++++++++++ .../base/MvpEspressoTestModule.java | 2 +- .../lib/mvp/utils/SchedulerManager.java | 10 +------ 5 files changed, 23 insertions(+), 41 deletions(-) create mode 100644 app/src/androidTest/java/it/cosenonjaviste/androidtest/base/EspressoSchedulerManager.java diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java index 34bda16..3481c85 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java @@ -3,14 +3,9 @@ import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; -import org.mockito.MockitoAnnotations; import it.cosenonjaviste.CoseNonJavisteApp; -import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import rx.functions.Action1; -import rx.schedulers.Schedulers; - -import static android.support.test.espresso.Espresso.registerIdlingResources; public class DaggerRule implements TestRule { @@ -23,40 +18,15 @@ public DaggerRule(Action1 afterInjectAction) { @Override public Statement apply(Statement base, Description description) { return new Statement() { @Override public void evaluate() throws Throwable { - - setupDexmaker(); - - //TODO - MockitoAnnotations.initMocks(this); - - final EspressoExecutor espressoExecutor = EspressoExecutor.newCachedThreadPool(); - TestComponent component = DaggerUtils.getComponent(); if (afterInjectAction != null) { afterInjectAction.call(component); } CoseNonJavisteApp.component = component; - registerIdlingResources(espressoExecutor); - - SchedulerManager.setIo(Schedulers.from(espressoExecutor)); - base.evaluate(); } }; } - - /** - * Workaround for Mockito and JB-MR2 incompatibility to avoid - * java.lang.IllegalArgumentException: dexcache == null - * - * @see - * https://code.google.com/p/dexmaker/issues/detail?id=2 - */ - private void setupDexmaker() { -// // Explicitly set the Dexmaker cache, so tests that use mockito work -// final String dexCache = getInstrumentation().getTargetContext().getCacheDir().getPath(); -// System.setProperty("dexmaker.dexcache", dexCache); - } } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/EspressoExecutor.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/EspressoExecutor.java index 010b11b..f2cf9fb 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/EspressoExecutor.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/EspressoExecutor.java @@ -7,6 +7,8 @@ import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import static android.support.test.espresso.Espresso.registerIdlingResources; + public class EspressoExecutor extends ThreadPoolExecutor implements IdlingResource { private int runningTasks; @@ -22,7 +24,8 @@ public static EspressoExecutor newCachedThreadPool() { if (singleton == null) { singleton = new EspressoExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, - new SynchronousQueue()); + new SynchronousQueue<>()); + registerIdlingResources(singleton); } return singleton; } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/EspressoSchedulerManager.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/EspressoSchedulerManager.java new file mode 100644 index 0000000..8fdaf7e --- /dev/null +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/EspressoSchedulerManager.java @@ -0,0 +1,17 @@ +package it.cosenonjaviste.androidtest.base; + +import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; +import rx.Observable; +import rx.Scheduler; +import rx.schedulers.Schedulers; + +import static rx.android.schedulers.AndroidSchedulers.mainThread; + +public class EspressoSchedulerManager extends SchedulerManager { + + private Scheduler scheduler = Schedulers.from(EspressoExecutor.newCachedThreadPool()); + + @Override public Observable bindObservable(Observable observable) { + return observable.subscribeOn(scheduler).observeOn(mainThread()); + } +} diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java index 74cb1da..fb8bf12 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java @@ -19,7 +19,7 @@ public class MvpEspressoTestModule { } @Provides @Singleton SchedulerManager provideSchedulerManager() { - return new SchedulerManager(); + return new EspressoSchedulerManager(); } @Provides @Singleton PageUrlManager providePostDetailUrlManager(MockWebServerWrapper server) { diff --git a/coremvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/SchedulerManager.java b/coremvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/SchedulerManager.java index 66814b0..6c5b7ce 100644 --- a/coremvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/SchedulerManager.java +++ b/coremvp/src/main/java/it/cosenonjaviste/lib/mvp/utils/SchedulerManager.java @@ -9,15 +9,7 @@ public class SchedulerManager { public static Scheduler io = Schedulers.io(); - public static Observable background(Observable observable) { - return observable.subscribeOn(io).observeOn(mainThread()); - } - - public static void setIo(Scheduler io) { - SchedulerManager.io = io; - } - public Observable bindObservable(Observable observable) { - return background(observable); + return observable.subscribeOn(io).observeOn(mainThread()); } } From 98739c81881100484bef2a1361f923003b59a622 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 16:28:25 +0200 Subject: [PATCH 067/332] Component not static in Application --- .../androidtest/MainActivityTest.java | 29 +++++++++++++------ .../androidtest/base/DaggerRule.java | 10 +++++-- .../androidtest/base/DaggerUtils.java | 7 ----- .../it/cosenonjaviste/CoseNonJavisteApp.java | 6 +++- 4 files changed, 32 insertions(+), 20 deletions(-) delete mode 100644 app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerUtils.java diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java index faba389..286adc2 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java @@ -1,21 +1,24 @@ package it.cosenonjaviste.androidtest; +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.junit.rules.RuleChain; -import org.junit.rules.TestRule; import org.junit.runner.RunWith; import javax.inject.Inject; +import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.MainActivity; import it.cosenonjaviste.R; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.androidtest.base.ActivityRule; -import it.cosenonjaviste.androidtest.base.DaggerRule; +import it.cosenonjaviste.androidtest.base.DaggerTestComponent; import it.cosenonjaviste.androidtest.base.MockWebServerWrapper; +import it.cosenonjaviste.androidtest.base.TestComponent; import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.model.WordPressService; @@ -43,9 +46,14 @@ public class MainActivityTest { @Inject TwitterService twitterService; - private final ActivityRule fragmentRule = new ActivityRule<>(MainActivity.class); + @Rule public ActivityTestRule activityRule = new ActivityTestRule<>(MainActivity.class, false, false); + + @Before + public void setUp() throws Exception { + Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); + TestComponent component = DaggerTestComponent.builder().build(); + ((CoseNonJavisteApp) app).setComponent(component); - private final DaggerRule daggerRule = new DaggerRule(component -> { component.inject(this); when(wordPressService.listPosts(eq(1))) @@ -61,29 +69,32 @@ public class MainActivityTest { .thenReturn(TestData.tweets()); server.initDispatcher("CoseNonJaviste"); - }); - - @Rule public TestRule chain = RuleChain.outerRule(daggerRule).around(fragmentRule); + } @Test public void showMainActivity() { + activityRule.launchActivity(null); } @Test public void showCategories() { + activityRule.launchActivity(null); clickOnDrawer(1); onView(withText("cat 0")).check(matches(isDisplayed())); } @Test public void showAuthors() { + activityRule.launchActivity(null); clickOnDrawer(2); onView(withText("name 0")).check(matches(isDisplayed())); } @Test public void showTweets() { + activityRule.launchActivity(null); clickOnDrawer(3); onView(withText("tweet text 1")).check(matches(isDisplayed())); } @Test public void showContactForm() { + activityRule.launchActivity(null); clickOnDrawer(4); } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java index 3481c85..1191aa3 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java @@ -1,5 +1,8 @@ package it.cosenonjaviste.androidtest.base; +import android.content.Context; +import android.support.test.InstrumentationRegistry; + import org.junit.rules.TestRule; import org.junit.runner.Description; import org.junit.runners.model.Statement; @@ -18,14 +21,15 @@ public DaggerRule(Action1 afterInjectAction) { @Override public Statement apply(Statement base, Description description) { return new Statement() { @Override public void evaluate() throws Throwable { - TestComponent component = DaggerUtils.getComponent(); + + Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); + TestComponent component = DaggerTestComponent.builder().build(); + ((CoseNonJavisteApp) app).setComponent(component); if (afterInjectAction != null) { afterInjectAction.call(component); } - CoseNonJavisteApp.component = component; base.evaluate(); - } }; } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerUtils.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerUtils.java deleted file mode 100644 index 9163503..0000000 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerUtils.java +++ /dev/null @@ -1,7 +0,0 @@ -package it.cosenonjaviste.androidtest.base; - -public class DaggerUtils { - public static TestComponent getComponent() { - return DaggerTestComponent.builder().build(); - } -} diff --git a/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java b/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java index 6879b1d..1441f14 100644 --- a/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java +++ b/app/src/main/java/it/cosenonjaviste/CoseNonJavisteApp.java @@ -19,7 +19,7 @@ }) public class CoseNonJavisteApp extends Application { - public static ApplicationComponent component; + private ApplicationComponent component; @Override public void onCreate() { super.onCreate(); @@ -35,4 +35,8 @@ public ApplicationComponent getComponent() { public static ApplicationComponent getComponent(Context context) { return ((CoseNonJavisteApp) context.getApplicationContext()).getComponent(); } + + public void setComponent(ApplicationComponent component) { + this.component = component; + } } From 6b11ae187aa8b302e2554a8985fe220a11e40f0a Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 17:01:44 +0200 Subject: [PATCH 068/332] Support library ActivityTestRule --- app/build.gradle | 8 +- .../androidtest/AuthorListTest.java | 29 +++-- .../androidtest/CategoryListTest.java | 36 +++-- .../cosenonjaviste/androidtest/PageTest.java | 26 ++-- .../androidtest/PostListTest.java | 30 +++-- .../androidtest/TweetListTest.java | 27 ++-- .../androidtest/base/ActivityRule.java | 123 ------------------ .../androidtest/base/DaggerRule.java | 36 ----- .../androidtest/base/FragmentRule.java | 39 ++++-- 9 files changed, 128 insertions(+), 226 deletions(-) delete mode 100644 app/src/androidTest/java/it/cosenonjaviste/androidtest/base/ActivityRule.java delete mode 100644 app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java diff --git a/app/build.gradle b/app/build.gradle index 3fcd541..aee4f66 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -91,8 +91,8 @@ dependencies { apt 'org.parceler:parceler:0.2.14' androidTestApt 'com.google.dagger:dagger-compiler:2.0' - androidTestCompile 'com.google.dexmaker:dexmaker:1.0' - androidTestCompile('com.google.dexmaker:dexmaker-mockito:1.0') { + androidTestCompile 'com.google.dexmaker:dexmaker:1.2' + androidTestCompile('com.google.dexmaker:dexmaker-mockito:1.2') { exclude group: 'org.hamcrest', module: 'hamcrest-core' } androidTestCompile 'com.squareup.spoon:spoon-client:1.0.5' @@ -104,10 +104,6 @@ dependencies { } androidTestCompile 'com.android.support.test.espresso:espresso-intents:2.1' androidTestCompile 'com.squareup.okhttp:mockwebserver:2.0.0' - - testCompile 'junit:junit:4.12' - testCompile 'org.mockito:mockito-core:1.9.5' - testCompile 'org.assertj:assertj-core:1.7.0' } // Define coverage source. diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java index cbfbaa6..acab695 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java @@ -1,41 +1,46 @@ package it.cosenonjaviste.androidtest; -import android.support.test.runner.AndroidJUnit4; +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.junit.rules.RuleChain; -import org.junit.rules.TestRule; -import org.junit.runner.RunWith; import javax.inject.Inject; +import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.androidtest.base.DaggerRule; +import it.cosenonjaviste.androidtest.base.DaggerTestComponent; import it.cosenonjaviste.androidtest.base.FragmentRule; +import it.cosenonjaviste.androidtest.base.TestComponent; import it.cosenonjaviste.author.AuthorListFragment; import it.cosenonjaviste.author.AuthorListModel; import it.cosenonjaviste.model.WordPressService; import static org.mockito.Mockito.when; -@RunWith(AndroidJUnit4.class) public class AuthorListTest { @Inject WordPressService wordPressService; - private final FragmentRule fragmentRule = FragmentRule.create(AuthorListFragment.class, new AuthorListModel()); + @Rule public FragmentRule fragmentRule = new FragmentRule(AuthorListFragment.class); + + @Before + public void setUp() { + Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); + TestComponent component = DaggerTestComponent.builder().build(); + ((CoseNonJavisteApp) app).setComponent(component); - private final DaggerRule daggerRule = new DaggerRule(component -> { component.inject(this); + when(wordPressService.listAuthors()) .thenReturn(TestData.authorResponse(2)); - }); - - @Rule public TestRule chain = RuleChain.outerRule(daggerRule).around(fragmentRule); + } @Test public void testAuthorList() { -// showUi(); + + fragmentRule.launchFragment(new AuthorListModel()); } } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java index 1eddee7..090012a 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java @@ -1,34 +1,50 @@ package it.cosenonjaviste.androidtest; +import android.content.Context; +import android.support.test.InstrumentationRegistry; + +import org.junit.Before; import org.junit.Rule; -import org.junit.rules.RuleChain; -import org.junit.rules.TestRule; +import org.junit.Test; import javax.inject.Inject; +import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.androidtest.base.DaggerRule; +import it.cosenonjaviste.androidtest.base.DaggerTestComponent; import it.cosenonjaviste.androidtest.base.FragmentRule; -import it.cosenonjaviste.author.AuthorListFragment; -import it.cosenonjaviste.author.AuthorListModel; +import it.cosenonjaviste.androidtest.base.TestComponent; +import it.cosenonjaviste.category.CategoryListFragment; +import it.cosenonjaviste.category.CategoryListModel; import it.cosenonjaviste.model.WordPressService; +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.assertion.ViewAssertions.matches; +import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; +import static android.support.test.espresso.matcher.ViewMatchers.withText; import static org.mockito.Mockito.when; public class CategoryListTest { @Inject WordPressService wordPressService; - private final FragmentRule fragmentRule = FragmentRule.create(AuthorListFragment.class, new AuthorListModel()); + @Rule public FragmentRule fragmentRule = new FragmentRule(CategoryListFragment.class); + + @Before + public void setUp() { + Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); + TestComponent component = DaggerTestComponent.builder().build(); + ((CoseNonJavisteApp) app).setComponent(component); - private final DaggerRule daggerRule = new DaggerRule(component -> { component.inject(this); + } + + @Test public void testCategoryList() { when(wordPressService.listCategories()) .thenReturn(TestData.categoryResponse(3)); - }); - @Rule public TestRule chain = RuleChain.outerRule(daggerRule).around(fragmentRule); + fragmentRule.launchFragment(new CategoryListModel()); - public void testCategoryList() throws InterruptedException { + onView(withText("cat 1")).check(matches(isDisplayed())); } } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java index 4b29889..b460354 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java @@ -1,15 +1,19 @@ package it.cosenonjaviste.androidtest; +import android.content.Context; +import android.support.test.InstrumentationRegistry; + +import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.junit.rules.RuleChain; -import org.junit.rules.TestRule; import javax.inject.Inject; -import it.cosenonjaviste.androidtest.base.DaggerRule; +import it.cosenonjaviste.CoseNonJavisteApp; +import it.cosenonjaviste.androidtest.base.DaggerTestComponent; import it.cosenonjaviste.androidtest.base.FragmentRule; import it.cosenonjaviste.androidtest.base.MockWebServerWrapper; +import it.cosenonjaviste.androidtest.base.TestComponent; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; @@ -17,16 +21,20 @@ public class PageTest { @Inject MockWebServerWrapper server; - private final FragmentRule fragmentRule = FragmentRule.create(PageFragment.class, new PageModel("url")); + @Rule public FragmentRule fragmentRule = new FragmentRule(PageFragment.class); + + @Before + public void setUp() { + Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); + TestComponent component = DaggerTestComponent.builder().build(); + ((CoseNonJavisteApp) app).setComponent(component); - private final DaggerRule daggerRule = new DaggerRule(component -> { component.inject(this); - server.initDispatcher("CoseNonJaviste"); - }); - @Rule public TestRule chain = RuleChain.outerRule(daggerRule).around(fragmentRule); + server.initDispatcher("CoseNonJaviste"); + } @Test public void testDetailFragment() { -// showUi(); + fragmentRule.launchFragment(new PageModel("url")); } } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java index c7458d3..2fbcbb0 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java @@ -1,15 +1,19 @@ package it.cosenonjaviste.androidtest; +import android.content.Context; +import android.support.test.InstrumentationRegistry; + +import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.junit.rules.RuleChain; -import org.junit.rules.TestRule; import javax.inject.Inject; +import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.androidtest.base.DaggerRule; +import it.cosenonjaviste.androidtest.base.DaggerTestComponent; import it.cosenonjaviste.androidtest.base.FragmentRule; +import it.cosenonjaviste.androidtest.base.TestComponent; import it.cosenonjaviste.model.Post; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.post.PostListFragment; @@ -31,28 +35,38 @@ public class PostListTest { @Inject WordPressService wordPressService; - private final FragmentRule fragmentRule = FragmentRule.create(PostListFragment.class, new PostListModel()); + @Rule public FragmentRule fragmentRule = new FragmentRule(PostListFragment.class); + + @Before + public void setUp() { + Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); + TestComponent component = DaggerTestComponent.builder().build(); + ((CoseNonJavisteApp) app).setComponent(component); - private final DaggerRule daggerRule = new DaggerRule(component -> { component.inject(this); + when(wordPressService.listPosts(eq(1))) .thenReturn(TestData.postResponse(0, 10)); when(wordPressService.listPosts(eq(2))) .thenReturn(TestData.postResponse(10, 10)); - }); - - @Rule public TestRule chain = RuleChain.outerRule(daggerRule).around(fragmentRule); + } @Test public void testPostList() throws InterruptedException { + fragmentRule.launchFragment(new PostListModel()); + onView(withText("post title 1")).check(matches(isDisplayed())); } @Test public void testGoToPostDetail() { + fragmentRule.launchFragment(new PostListModel()); + onData(is(instanceOf(Post.class))).inAdapterView(withId(android.R.id.list)) .atPosition(3).perform(click()); } @Test public void testLoadMore() { + fragmentRule.launchFragment(new PostListModel()); + onData(is(instanceOf(Post.class))).inAdapterView(withId(android.R.id.list)) .atPosition(9).check(matches(isDisplayed())); onView(withText("post title 10")).check(matches(isDisplayed())); diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java index 740aebf..00140ad 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java @@ -1,18 +1,21 @@ package it.cosenonjaviste.androidtest; +import android.content.Context; +import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; +import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.junit.rules.RuleChain; -import org.junit.rules.TestRule; import org.junit.runner.RunWith; import javax.inject.Inject; +import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.androidtest.base.DaggerRule; +import it.cosenonjaviste.androidtest.base.DaggerTestComponent; import it.cosenonjaviste.androidtest.base.FragmentRule; +import it.cosenonjaviste.androidtest.base.TestComponent; import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.twitter.TweetListFragment; import it.cosenonjaviste.twitter.TweetListModel; @@ -29,17 +32,23 @@ public class TweetListTest { @Inject TwitterService twitterService; - private final FragmentRule fragmentRule = FragmentRule.create(TweetListFragment.class, new TweetListModel()); + @Rule public FragmentRule fragmentRule = new FragmentRule(TweetListFragment.class); + + @Before + public void setUp() { + Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); + TestComponent component = DaggerTestComponent.builder().build(); + ((CoseNonJavisteApp) app).setComponent(component); + + component.inject(this); - private final DaggerRule daggerRule = new DaggerRule(objectGraph -> { - objectGraph.inject(this); when(twitterService.loadTweets(eq(1))) .thenReturn(TestData.tweets()); - }); - - @Rule public TestRule chain = RuleChain.outerRule(daggerRule).around(fragmentRule); + } @Test public void testPostList() { + fragmentRule.launchFragment(new TweetListModel()); + onView(withText("tweet text 1")).check(matches(isDisplayed())); } } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/ActivityRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/ActivityRule.java deleted file mode 100644 index a39fd0a..0000000 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/ActivityRule.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Copyright (C) 2015 Jake Wharton - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package it.cosenonjaviste.androidtest.base; - -import android.app.Activity; -import android.app.Instrumentation; -import android.content.Intent; -import android.support.test.InstrumentationRegistry; - -import org.junit.Before; -import org.junit.Rule; -import org.junit.rules.TestRule; -import org.junit.runner.Description; -import org.junit.runners.model.Statement; - -/** - * A JUnit {@link Rule @Rule} which launches an activity when your test starts. Stop extending - * gross {@code ActivityInstrumentationBarfCase2}! - *

- * Usage: - *

{@code
- * @Rule
- * public final ActivityRule example =
- *     new ActivityRule<>(ExampleActivity.class);
- * }
- * - * This will automatically launch the activity for each test method. The instance will also be - * created sooner should you need to use it in a {@link Before @Before} method. - *

- * You can also customize the way in which the activity is launched by overriding - * {@link #getLaunchIntent(String, Class)} and customizing or replacing the {@link Intent}. - *

{@code
- * @Rule
- * public final ActivityRule example =
- *     new ActivityRule(ExampleActivity.class) {
- *       @Override
- *       protected Intent getLaunchIntent(String packageName, Class activityClass) {
- *         Intent intent = super.getLaunchIntent(packageName, activityClass);
- *         intent.putExtra("Hello", "World!");
- *         return intent;
- *       }
- *     };
- * }
- */ -public class ActivityRule implements TestRule { - private final Class activityClass; - - private T activity; - private Instrumentation instrumentation; - - public ActivityRule(Class activityClass) { - this.activityClass = activityClass; - } - - protected Intent getLaunchIntent(String targetPackage, Class activityClass) { - Intent intent = new Intent(Intent.ACTION_MAIN); - intent.setClassName(targetPackage, activityClass.getName()); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - return intent; - } - - /** - * Get the running instance of the specified activity. This will launch it if it is not already - * running. - */ - public final T get() { - launchActivity(); - return activity; - } - - /** Get the {@link Instrumentation} instance for this test. */ - public final Instrumentation instrumentation() { - launchActivity(); - return instrumentation; - } - - @Override public final Statement apply(final Statement base, Description description) { - return new Statement() { - @Override public void evaluate() throws Throwable { - launchActivity(); - - base.evaluate(); - - if (!activity.isFinishing()) { - activity.finish(); - } - activity = null; // Eager reference kill in case someone leaked our reference. - } - }; - } - - private Instrumentation fetchInstrumentation() { - Instrumentation result = instrumentation; - return result != null ? result - : (instrumentation = InstrumentationRegistry.getInstrumentation()); - } - - @SuppressWarnings("unchecked") // Guarded by generics at the constructor. - private void launchActivity() { - if (activity != null) return; - - Instrumentation instrumentation = fetchInstrumentation(); - - String targetPackage = instrumentation.getTargetContext().getPackageName(); - Intent intent = getLaunchIntent(targetPackage, activityClass); - - activity = (T) instrumentation.startActivitySync(intent); - instrumentation.waitForIdleSync(); - } -} \ No newline at end of file diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java deleted file mode 100644 index 1191aa3..0000000 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/DaggerRule.java +++ /dev/null @@ -1,36 +0,0 @@ -package it.cosenonjaviste.androidtest.base; - -import android.content.Context; -import android.support.test.InstrumentationRegistry; - -import org.junit.rules.TestRule; -import org.junit.runner.Description; -import org.junit.runners.model.Statement; - -import it.cosenonjaviste.CoseNonJavisteApp; -import rx.functions.Action1; - -public class DaggerRule implements TestRule { - - private Action1 afterInjectAction; - - public DaggerRule(Action1 afterInjectAction) { - this.afterInjectAction = afterInjectAction; - } - - @Override public Statement apply(Statement base, Description description) { - return new Statement() { - @Override public void evaluate() throws Throwable { - - Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); - TestComponent component = DaggerTestComponent.builder().build(); - ((CoseNonJavisteApp) app).setComponent(component); - if (afterInjectAction != null) { - afterInjectAction.call(component); - } - - base.evaluate(); - } - }; - } -} diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java index b034cb8..0b86d0a 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/FragmentRule.java @@ -1,31 +1,44 @@ package it.cosenonjaviste.androidtest.base; +import android.content.Context; import android.content.Intent; +import android.os.Bundle; +import android.support.test.InstrumentationRegistry; +import android.support.test.rule.ActivityTestRule; +import android.support.v4.app.Fragment; import org.parceler.Parcels; import it.cosenonjaviste.lib.mvp.RxMvpPresenter; import it.cosenonjaviste.utils.SingleFragmentActivity; -public class FragmentRule extends ActivityRule { +public class FragmentRule extends ActivityTestRule { + private Class fragmentClass; - private final Class viewClass; + public FragmentRule(Class fragmentClass) { + super(SingleFragmentActivity.class, false, false); + this.fragmentClass = fragmentClass; + } - private Object model; + public SingleFragmentActivity launchFragment() { + return launchFragment(null); + } - public static FragmentRule create(Class viewClass, M model) { - return new FragmentRule(viewClass, model); + public void launchFragment(Object model) { + Bundle bundle = new Bundle(); + bundle.putParcelable(RxMvpPresenter.MODEL, Parcels.wrap(model)); + launchFragment(bundle); } - private FragmentRule(Class viewClass, Object model) { - super(SingleFragmentActivity.class); - this.viewClass = viewClass; - this.model = model; + public SingleFragmentActivity launchFragment(Bundle b) { + Intent intent = SingleFragmentActivity.populateIntent(new Intent(), fragmentClass); + if (b != null) { + intent.putExtras(b); + } + return launchActivity(intent); } - @Override protected Intent getLaunchIntent(String targetPackage, Class activityClass) { - Intent intent = SingleFragmentActivity.populateIntent(super.getLaunchIntent(targetPackage, activityClass), viewClass); - intent.putExtra(RxMvpPresenter.MODEL, Parcels.wrap(model)); - return intent; + public T getApplication() { + return (T) InstrumentationRegistry.getTargetContext().getApplicationContext(); } } From 659f01682acfa7d92a4d68778719c1dac3827fcf Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 17:09:42 +0200 Subject: [PATCH 069/332] Dagger test config refactoring --- .../androidtest/AuthorListTest.java | 27 ++++++++----------- .../androidtest/CategoryListTest.java | 16 +++-------- .../androidtest/MainActivityTest.java | 15 +++-------- .../cosenonjaviste/androidtest/PageTest.java | 16 +++-------- .../androidtest/PostListTest.java | 16 +++-------- .../androidtest/TweetListTest.java | 19 ++++--------- .../androidtest/dagger/DaggerUtils.java | 15 +++++++++++ .../MvpEspressoTestModule.java | 4 ++- .../{base => dagger}/TestComponent.java | 2 +- 9 files changed, 47 insertions(+), 83 deletions(-) create mode 100644 app/src/androidTest/java/it/cosenonjaviste/androidtest/dagger/DaggerUtils.java rename app/src/androidTest/java/it/cosenonjaviste/androidtest/{base => dagger}/MvpEspressoTestModule.java (85%) rename app/src/androidTest/java/it/cosenonjaviste/androidtest/{base => dagger}/TestComponent.java (95%) diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java index acab695..ddd196b 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/AuthorListTest.java @@ -1,23 +1,22 @@ package it.cosenonjaviste.androidtest; -import android.content.Context; -import android.support.test.InstrumentationRegistry; - import org.junit.Before; import org.junit.Rule; import org.junit.Test; import javax.inject.Inject; -import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.androidtest.base.DaggerTestComponent; import it.cosenonjaviste.androidtest.base.FragmentRule; -import it.cosenonjaviste.androidtest.base.TestComponent; +import it.cosenonjaviste.androidtest.dagger.DaggerUtils; import it.cosenonjaviste.author.AuthorListFragment; import it.cosenonjaviste.author.AuthorListModel; import it.cosenonjaviste.model.WordPressService; +import static android.support.test.espresso.Espresso.onView; +import static android.support.test.espresso.assertion.ViewAssertions.matches; +import static android.support.test.espresso.matcher.ViewMatchers.isDisplayed; +import static android.support.test.espresso.matcher.ViewMatchers.withText; import static org.mockito.Mockito.when; public class AuthorListTest { @@ -26,21 +25,17 @@ public class AuthorListTest { @Rule public FragmentRule fragmentRule = new FragmentRule(AuthorListFragment.class); - @Before - public void setUp() { - Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); - TestComponent component = DaggerTestComponent.builder().build(); - ((CoseNonJavisteApp) app).setComponent(component); - - component.inject(this); - - when(wordPressService.listAuthors()) - .thenReturn(TestData.authorResponse(2)); + @Before public void setUp() { + DaggerUtils.createTestComponent().inject(this); } @Test public void testAuthorList() { + when(wordPressService.listAuthors()) + .thenReturn(TestData.authorResponse(2)); fragmentRule.launchFragment(new AuthorListModel()); + + onView(withText("name 1")).check(matches(isDisplayed())); } } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java index 090012a..45c1db0 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/CategoryListTest.java @@ -1,19 +1,14 @@ package it.cosenonjaviste.androidtest; -import android.content.Context; -import android.support.test.InstrumentationRegistry; - import org.junit.Before; import org.junit.Rule; import org.junit.Test; import javax.inject.Inject; -import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.androidtest.base.DaggerTestComponent; import it.cosenonjaviste.androidtest.base.FragmentRule; -import it.cosenonjaviste.androidtest.base.TestComponent; +import it.cosenonjaviste.androidtest.dagger.DaggerUtils; import it.cosenonjaviste.category.CategoryListFragment; import it.cosenonjaviste.category.CategoryListModel; import it.cosenonjaviste.model.WordPressService; @@ -30,13 +25,8 @@ public class CategoryListTest { @Rule public FragmentRule fragmentRule = new FragmentRule(CategoryListFragment.class); - @Before - public void setUp() { - Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); - TestComponent component = DaggerTestComponent.builder().build(); - ((CoseNonJavisteApp) app).setComponent(component); - - component.inject(this); + @Before public void setUp() { + DaggerUtils.createTestComponent().inject(this); } @Test public void testCategoryList() { diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java index 286adc2..b85e710 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/MainActivityTest.java @@ -1,7 +1,5 @@ package it.cosenonjaviste.androidtest; -import android.content.Context; -import android.support.test.InstrumentationRegistry; import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; @@ -12,13 +10,11 @@ import javax.inject.Inject; -import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.MainActivity; import it.cosenonjaviste.R; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.androidtest.base.DaggerTestComponent; import it.cosenonjaviste.androidtest.base.MockWebServerWrapper; -import it.cosenonjaviste.androidtest.base.TestComponent; +import it.cosenonjaviste.androidtest.dagger.DaggerUtils; import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.model.WordPressService; @@ -48,13 +44,8 @@ public class MainActivityTest { @Rule public ActivityTestRule activityRule = new ActivityTestRule<>(MainActivity.class, false, false); - @Before - public void setUp() throws Exception { - Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); - TestComponent component = DaggerTestComponent.builder().build(); - ((CoseNonJavisteApp) app).setComponent(component); - - component.inject(this); + @Before public void setUp() { + DaggerUtils.createTestComponent().inject(this); when(wordPressService.listPosts(eq(1))) .thenReturn(TestData.postResponse(10)); diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java index b460354..fa77920 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PageTest.java @@ -1,19 +1,14 @@ package it.cosenonjaviste.androidtest; -import android.content.Context; -import android.support.test.InstrumentationRegistry; - import org.junit.Before; import org.junit.Rule; import org.junit.Test; import javax.inject.Inject; -import it.cosenonjaviste.CoseNonJavisteApp; -import it.cosenonjaviste.androidtest.base.DaggerTestComponent; import it.cosenonjaviste.androidtest.base.FragmentRule; import it.cosenonjaviste.androidtest.base.MockWebServerWrapper; -import it.cosenonjaviste.androidtest.base.TestComponent; +import it.cosenonjaviste.androidtest.dagger.DaggerUtils; import it.cosenonjaviste.page.PageFragment; import it.cosenonjaviste.page.PageModel; @@ -23,13 +18,8 @@ public class PageTest { @Rule public FragmentRule fragmentRule = new FragmentRule(PageFragment.class); - @Before - public void setUp() { - Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); - TestComponent component = DaggerTestComponent.builder().build(); - ((CoseNonJavisteApp) app).setComponent(component); - - component.inject(this); + @Before public void setUp() { + DaggerUtils.createTestComponent().inject(this); server.initDispatcher("CoseNonJaviste"); } diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java index 2fbcbb0..603165b 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/PostListTest.java @@ -1,19 +1,14 @@ package it.cosenonjaviste.androidtest; -import android.content.Context; -import android.support.test.InstrumentationRegistry; - import org.junit.Before; import org.junit.Rule; import org.junit.Test; import javax.inject.Inject; -import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.androidtest.base.DaggerTestComponent; import it.cosenonjaviste.androidtest.base.FragmentRule; -import it.cosenonjaviste.androidtest.base.TestComponent; +import it.cosenonjaviste.androidtest.dagger.DaggerUtils; import it.cosenonjaviste.model.Post; import it.cosenonjaviste.model.WordPressService; import it.cosenonjaviste.post.PostListFragment; @@ -37,13 +32,8 @@ public class PostListTest { @Rule public FragmentRule fragmentRule = new FragmentRule(PostListFragment.class); - @Before - public void setUp() { - Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); - TestComponent component = DaggerTestComponent.builder().build(); - ((CoseNonJavisteApp) app).setComponent(component); - - component.inject(this); + @Before public void setUp() { + DaggerUtils.createTestComponent().inject(this); when(wordPressService.listPosts(eq(1))) .thenReturn(TestData.postResponse(0, 10)); diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java index 00140ad..9311b15 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/TweetListTest.java @@ -1,7 +1,5 @@ package it.cosenonjaviste.androidtest; -import android.content.Context; -import android.support.test.InstrumentationRegistry; import android.support.test.runner.AndroidJUnit4; import org.junit.Before; @@ -11,11 +9,9 @@ import javax.inject.Inject; -import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.TestData; -import it.cosenonjaviste.androidtest.base.DaggerTestComponent; import it.cosenonjaviste.androidtest.base.FragmentRule; -import it.cosenonjaviste.androidtest.base.TestComponent; +import it.cosenonjaviste.androidtest.dagger.DaggerUtils; import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.twitter.TweetListFragment; import it.cosenonjaviste.twitter.TweetListModel; @@ -34,19 +30,14 @@ public class TweetListTest { @Rule public FragmentRule fragmentRule = new FragmentRule(TweetListFragment.class); - @Before - public void setUp() { - Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); - TestComponent component = DaggerTestComponent.builder().build(); - ((CoseNonJavisteApp) app).setComponent(component); - - component.inject(this); + @Before public void setUp() { + DaggerUtils.createTestComponent().inject(this); + } + @Test public void testPostList() { when(twitterService.loadTweets(eq(1))) .thenReturn(TestData.tweets()); - } - @Test public void testPostList() { fragmentRule.launchFragment(new TweetListModel()); onView(withText("tweet text 1")).check(matches(isDisplayed())); diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/dagger/DaggerUtils.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/dagger/DaggerUtils.java new file mode 100644 index 0000000..5e1c902 --- /dev/null +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/dagger/DaggerUtils.java @@ -0,0 +1,15 @@ +package it.cosenonjaviste.androidtest.dagger; + +import android.content.Context; +import android.support.test.InstrumentationRegistry; + +import it.cosenonjaviste.CoseNonJavisteApp; + +public class DaggerUtils { + public static TestComponent createTestComponent() { + Context app = InstrumentationRegistry.getInstrumentation().getTargetContext().getApplicationContext(); + TestComponent component = DaggerTestComponent.builder().build(); + ((CoseNonJavisteApp) app).setComponent(component); + return component; + } +} diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/dagger/MvpEspressoTestModule.java similarity index 85% rename from app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java rename to app/src/androidTest/java/it/cosenonjaviste/androidtest/dagger/MvpEspressoTestModule.java index fb8bf12..b71cfe8 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/MvpEspressoTestModule.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/dagger/MvpEspressoTestModule.java @@ -1,4 +1,4 @@ -package it.cosenonjaviste.androidtest.base; +package it.cosenonjaviste.androidtest.dagger; import org.mockito.Mockito; @@ -6,6 +6,8 @@ import dagger.Module; import dagger.Provides; +import it.cosenonjaviste.androidtest.base.EspressoSchedulerManager; +import it.cosenonjaviste.androidtest.base.MockWebServerWrapper; import it.cosenonjaviste.lib.mvp.utils.SchedulerManager; import it.cosenonjaviste.model.TwitterService; import it.cosenonjaviste.model.WordPressService; diff --git a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/TestComponent.java b/app/src/androidTest/java/it/cosenonjaviste/androidtest/dagger/TestComponent.java similarity index 95% rename from app/src/androidTest/java/it/cosenonjaviste/androidtest/base/TestComponent.java rename to app/src/androidTest/java/it/cosenonjaviste/androidtest/dagger/TestComponent.java index 7e12514..6b4b953 100644 --- a/app/src/androidTest/java/it/cosenonjaviste/androidtest/base/TestComponent.java +++ b/app/src/androidTest/java/it/cosenonjaviste/androidtest/dagger/TestComponent.java @@ -1,4 +1,4 @@ -package it.cosenonjaviste.androidtest.base; +package it.cosenonjaviste.androidtest.dagger; import javax.inject.Singleton; From 472b8f7aab123b7299a296c2a42c91c6d153b08b Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 17:38:59 +0200 Subject: [PATCH 070/332] Fix travis config --- .travis.yml | 4 ++-- circle.yml | 28 ---------------------------- 2 files changed, 2 insertions(+), 30 deletions(-) delete mode 100644 circle.yml diff --git a/.travis.yml b/.travis.yml index b3681d5..3c8a063 100644 --- a/.travis.yml +++ b/.travis.yml @@ -15,8 +15,8 @@ env: android: components: - platform-tools - - build-tools-21.1.2 - - android-21 + - build-tools-22.0.1 + - android-22 - extra-google-m2repository - extra-android-m2repository - sys-img-armeabi-v7a-android-19 diff --git a/circle.yml b/circle.yml deleted file mode 100644 index b002c44..0000000 --- a/circle.yml +++ /dev/null @@ -1,28 +0,0 @@ -general: - artifacts: - - mvp-test/build/outputs - - mvp/build/outputs - -machine: - environment: - ANDROID_HOME: /home/ubuntu/android - java: - version: oraclejdk8 - -dependencies: - cache_directories: - - ~/.android - - ~/android - - override: - - sh ./install-dependencies.sh - - ./gradlew dependencies - -test: - override: - - $ANDROID_HOME/tools/emulator -avd testing -no-window -no-boot-anim -no-audio: - background: true - parallel: true - - bash ./wait.sh: - parallel: true - - ./gradlew mvp-test:build mvp-test:jacocoTestReport From 7692c996319df2faa8fbd2c7ca5694384588157a Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 22:00:59 +0200 Subject: [PATCH 071/332] Fix travis config --- .travis.yml | 2 +- core/build.gradle | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 3c8a063..fe11d22 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,4 +31,4 @@ before_script: - android-wait-for-emulator - adb shell input keyevent 82 & -script: ./gradlew connectedAndroidTest testDebug mergeTestCodeCoverageResults jacocoTestReport coveralls --stacktrace \ No newline at end of file +script: ./gradlew :app:connectedAndroidTest :core:testDebug :app:mergeTestCodeCoverageResults :app:jacocoTestReport :app:coveralls --stacktrace \ No newline at end of file diff --git a/core/build.gradle b/core/build.gradle index abed3c8..984db80 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -1,7 +1,13 @@ apply plugin: 'java' +apply plugin: "jacoco" + apply plugin: 'me.tatarka.retrolambda' +jacoco { + toolVersion = "0.7.2.201409121644" +} + dependencies { compile project(':coremvp') compile 'com.squareup.retrofit:retrofit:1.9.0' From 78d838591d8812da7aef9c1e31efc93a26ec540a Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 2 May 2015 22:07:04 +0200 Subject: [PATCH 072/332] Fix travis config --- app/build.gradle | 2 +- core/build.gradle | 5 +++++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index aee4f66..df6d837 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -152,7 +152,7 @@ task mergeTestCodeCoverageResults(type: JacocoMerge) { description = 'Merge test code coverage results from junit and instrumentation test' destinationFile = file("build/outputs/code-coverage/merged-coverage.exec") doFirst {delete destinationFile} - executionData = files('build/outputs/code-coverage/connected/coverage.ec', 'build/jacoco/testDebug.exec') + executionData = files('build/outputs/code-coverage/connected/coverage.ec', '../core/build/jacoco/testDebug.exec') } task jacocoTestReport(type: JacocoReport) { diff --git a/core/build.gradle b/core/build.gradle index 984db80..aca62e1 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -8,6 +8,11 @@ jacoco { toolVersion = "0.7.2.201409121644" } +retrolambda { + oldJdk '/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home' +// oldJdk '/usr/lib/jvm/jdk1.7.0' +} + dependencies { compile project(':coremvp') compile 'com.squareup.retrofit:retrofit:1.9.0' From 3f4ad190109296302fcceebd6750019a8d608a74 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 3 May 2015 11:11:49 +0200 Subject: [PATCH 073/332] Fix travis config --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index fe11d22..f18c705 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,4 +31,4 @@ before_script: - android-wait-for-emulator - adb shell input keyevent 82 & -script: ./gradlew :app:connectedAndroidTest :core:testDebug :app:mergeTestCodeCoverageResults :app:jacocoTestReport :app:coveralls --stacktrace \ No newline at end of file +script: ./gradlew :app:connectedAndroidTest :core:test :app:mergeTestCodeCoverageResults :app:jacocoTestReport :app:coveralls --stacktrace \ No newline at end of file From fead67069b7f5d960932037dd2bee97d54984d6d Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 3 May 2015 11:25:48 +0200 Subject: [PATCH 074/332] Fix travis config --- .travis.yml | 2 +- core/build.gradle | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index f18c705..2679991 100644 --- a/.travis.yml +++ b/.travis.yml @@ -31,4 +31,4 @@ before_script: - android-wait-for-emulator - adb shell input keyevent 82 & -script: ./gradlew :app:connectedAndroidTest :core:test :app:mergeTestCodeCoverageResults :app:jacocoTestReport :app:coveralls --stacktrace \ No newline at end of file +script: ./gradlew :core:test :app:connectedAndroidTest :app:mergeTestCodeCoverageResults :app:jacocoTestReport :app:coveralls --stacktrace \ No newline at end of file diff --git a/core/build.gradle b/core/build.gradle index aca62e1..5c7c8b0 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -9,8 +9,8 @@ jacoco { } retrolambda { - oldJdk '/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home' -// oldJdk '/usr/lib/jvm/jdk1.7.0' +// oldJdk '/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home' + oldJdk '/usr/lib/jvm/jdk1.7.0' } dependencies { From 0d72b958870d19dc8ca54b000a77f244cb766bcf Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 3 May 2015 11:33:11 +0200 Subject: [PATCH 075/332] Fix travis config --- core/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/core/build.gradle b/core/build.gradle index 5c7c8b0..a123d22 100644 --- a/core/build.gradle +++ b/core/build.gradle @@ -10,7 +10,7 @@ jacoco { retrolambda { // oldJdk '/Library/Java/JavaVirtualMachines/jdk1.7.0_51.jdk/Contents/Home' - oldJdk '/usr/lib/jvm/jdk1.7.0' + oldJdk '/usr/lib/jvm/java-7-oracle' } dependencies { From 604bb819efb4342ea94721c6b7b5e19e14ed4595 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 3 May 2015 11:47:53 +0200 Subject: [PATCH 076/332] Fix travis config --- app/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/build.gradle b/app/build.gradle index df6d837..4d6367e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -152,7 +152,7 @@ task mergeTestCodeCoverageResults(type: JacocoMerge) { description = 'Merge test code coverage results from junit and instrumentation test' destinationFile = file("build/outputs/code-coverage/merged-coverage.exec") doFirst {delete destinationFile} - executionData = files('build/outputs/code-coverage/connected/coverage.ec', '../core/build/jacoco/testDebug.exec') + executionData = files('build/outputs/code-coverage/connected/coverage.ec', '../core/build/jacoco/test.exec') } task jacocoTestReport(type: JacocoReport) { From dfff25811aaa68874e44415d086319eb5df7ea5b Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Tue, 5 May 2015 22:58:23 +0200 Subject: [PATCH 077/332] New class ViewMock to simplify JUnit tests --- .../java/it/cosenonjaviste/mvp/ViewMock.java | 69 +++++++++++++++++++ .../mvp/author/AuthorListPresenterTest.java | 15 ++-- .../mvp/page/PagePresenterTest.java | 20 ++---- 3 files changed, 79 insertions(+), 25 deletions(-) create mode 100644 core/src/test/java/it/cosenonjaviste/mvp/ViewMock.java diff --git a/core/src/test/java/it/cosenonjaviste/mvp/ViewMock.java b/core/src/test/java/it/cosenonjaviste/mvp/ViewMock.java new file mode 100644 index 0000000..10b4a10 --- /dev/null +++ b/core/src/test/java/it/cosenonjaviste/mvp/ViewMock.java @@ -0,0 +1,69 @@ +package it.cosenonjaviste.mvp; + +import org.mockito.Mockito; +import org.mockito.stubbing.Answer; +import org.mockito.verification.VerificationMode; + +import java.lang.reflect.Method; +import java.util.HashMap; +import java.util.Map; + +import it.cosenonjaviste.lib.mvp.RxMvpPresenter; +import rx.Observable; +import rx.subjects.PublishSubject; + +public class ViewMock { + + private V mock; + + private Map> callbacks = new HashMap<>(); + + private Class viewClass; + + private TestLifeCycle testLifeCycle = new TestLifeCycle(); + + public ViewMock(Class viewClass) { + this.viewClass = viewClass; + mock = Mockito.mock(viewClass, (Answer) invocation -> { + if (invocation.getMethod().getReturnType().isAssignableFrom(Observable.class)) { + Method method = invocation.getMethod(); + PublishSubject subject = PublishSubject.create(); + callbacks.put(method, subject); + return subject; + } + return null; + }); + } + + public V get() { + return mock; + } + + public V emit(Object value) { + return Mockito.mock(viewClass, (Answer) invocation -> { + PublishSubject subject = callbacks.get(invocation.getMethod()); + subject.onNext(value); + return null; + }); + } + + public V text(String value) { + return emit(value); + } + + public V click() { + return emit(null); + } + + public V verify() { + return Mockito.verify(get()); + } + + public V verify(VerificationMode mode) { + return Mockito.verify(get(), mode); + } + + public void initAndResume(M model, RxMvpPresenter presenter) { + testLifeCycle.initAndResume(model, presenter, mock); + } +} diff --git a/core/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java b/core/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java index b01520c..28f1d1f 100644 --- a/core/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java +++ b/core/src/test/java/it/cosenonjaviste/mvp/author/AuthorListPresenterTest.java @@ -12,27 +12,24 @@ import it.cosenonjaviste.author.AuthorListPresenter; import it.cosenonjaviste.author.AuthorListView; import it.cosenonjaviste.model.WordPressService; -import it.cosenonjaviste.mvp.TestLifeCycle; +import it.cosenonjaviste.mvp.ViewMock; import it.cosenonjaviste.post.PostListModel; import rx.Observable; import static it.cosenonjaviste.TestData.authorResponse; import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public class AuthorListPresenterTest { - @Mock AuthorListView view; - @InjectMocks AuthorListPresenter presenter; @Mock WordPressService wordPressService; @Captor ArgumentCaptor modelCaptor; - private TestLifeCycle testLifeCycle = new TestLifeCycle(); + private ViewMock view = new ViewMock<>(AuthorListView.class); @Test public void testLoad() { @@ -40,7 +37,7 @@ public void testLoad() { .thenReturn(authorResponse(2)); AuthorListModel model = new AuthorListModel(); - testLifeCycle.initAndResume(model, presenter, view); + view.initAndResume(model, presenter); assertThat(model.size()).isEqualTo(2); } @@ -53,7 +50,7 @@ public void testRetryAfterError() { .thenReturn(authorResponse(2)); AuthorListModel model = new AuthorListModel(); - testLifeCycle.initAndResume(model, presenter, view); + view.initAndResume(model, presenter); presenter.loadAuthors(); @@ -66,11 +63,11 @@ public void testGoToDetail() { .thenReturn(authorResponse(2)); AuthorListModel authorListModel = new AuthorListModel(); - testLifeCycle.initAndResume(authorListModel, presenter, view); + view.initAndResume(authorListModel, presenter); presenter.goToAuthorDetail(1); - verify(view).openPostList(modelCaptor.capture()); + view.verify().openPostList(modelCaptor.capture()); PostListModel model = modelCaptor.getValue(); assertThat(model.getAuthor()).isEqualTo(authorListModel.get(1)); diff --git a/core/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java b/core/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java index 17392a2..6fa0459 100644 --- a/core/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java +++ b/core/src/test/java/it/cosenonjaviste/mvp/page/PagePresenterTest.java @@ -1,44 +1,32 @@ package it.cosenonjaviste.mvp.page; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import org.mockito.ArgumentCaptor; -import org.mockito.Captor; import org.mockito.InjectMocks; -import org.mockito.Mock; import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; -import it.cosenonjaviste.mvp.TestLifeCycle; +import it.cosenonjaviste.mvp.ViewMock; import it.cosenonjaviste.page.PageModel; import it.cosenonjaviste.page.PagePresenter; import it.cosenonjaviste.page.PageUrlManager; import it.cosenonjaviste.page.PageView; -import it.cosenonjaviste.post.PostListModel; import static org.assertj.core.api.Assertions.assertThat; @RunWith(MockitoJUnitRunner.class) public class PagePresenterTest { - @Mock PageView view; - - private TestLifeCycle testLifeCycle = new TestLifeCycle(); + private ViewMock view = new ViewMock<>(PageView.class); @Spy PageUrlManager pageUrlManager = new PageUrlManager(); @InjectMocks PagePresenter presenter; - @Captor ArgumentCaptor modelCaptor; - - @Before - public void setup() { - testLifeCycle.initAndResume(new PageModel("url"), presenter, view); - } - @Test public void testLoad() { + view.initAndResume(new PageModel("url"), presenter); + assertThat(presenter.getPostUrl()).isEqualTo("url"); } } \ No newline at end of file From 7950112299f8b67fc5c76b1ee8fdb971f072b53d Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sat, 30 May 2015 17:21:04 +0200 Subject: [PATCH 078/332] AppCompat 22.2.0 --- androidMvp/build.gradle | 4 ++-- app/build.gradle | 4 +++- app/src/main/java/it/cosenonjaviste/MainActivity.java | 4 ++-- app/src/main/res/values-v21/styles.xml | 10 ---------- app/src/main/res/values/styles.xml | 6 ++---- build.gradle | 5 +++-- 6 files changed, 12 insertions(+), 21 deletions(-) delete mode 100644 app/src/main/res/values-v21/styles.xml diff --git a/androidMvp/build.gradle b/androidMvp/build.gradle index 52ad28a..a30b2f1 100644 --- a/androidMvp/build.gradle +++ b/androidMvp/build.gradle @@ -30,7 +30,7 @@ android { dependencies { compile project(':coremvp') - compile 'com.android.support:appcompat-v7:21.0.3' - compile 'com.android.support:support-annotations:20.0.0' + compile 'com.android.support:appcompat-v7:22.2.0' + compile 'com.android.support:support-annotations:22.2.0' compile 'org.parceler:parceler-api:0.2.14' } diff --git a/app/build.gradle b/app/build.gradle index 4d6367e..05ddea1 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,6 +14,8 @@ buildscript { apply plugin: 'com.android.application' +apply plugin: 'com.android.databinding' + apply plugin: 'me.tatarka.retrolambda' apply plugin: 'com.neenbedankt.android-apt' @@ -84,7 +86,7 @@ dependencies { compile project(':androidMvp') compile project(':SuperListviewLibrary') compile 'com.squareup.okhttp:okhttp:2.0.0' - compile 'com.android.support:cardview-v7:21.0.3' + compile 'com.android.support:cardview-v7:22.2.0' compile 'com.jakewharton:butterknife:6.1.0' compile 'com.squareup.picasso:picasso:2.5.0' apt 'com.google.dagger:dagger-compiler:2.0' diff --git a/app/src/main/java/it/cosenonjaviste/MainActivity.java b/app/src/main/java/it/cosenonjaviste/MainActivity.java index 2bad1c7..1e05daa 100755 --- a/app/src/main/java/it/cosenonjaviste/MainActivity.java +++ b/app/src/main/java/it/cosenonjaviste/MainActivity.java @@ -7,8 +7,8 @@ import android.support.v4.app.Fragment; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; -import android.support.v7.app.ActionBarActivity; import android.support.v7.app.ActionBarDrawerToggle; +import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; import android.widget.ArrayAdapter; @@ -30,7 +30,7 @@ import it.cosenonjaviste.twitter.TweetListFragment; import it.cosenonjaviste.twitter.TweetListModel; -public class MainActivity extends ActionBarActivity { +public class MainActivity extends AppCompatActivity { @InjectView(R.id.drawer_layout) DrawerLayout mDrawerLayout; @InjectView(R.id.left_drawer_menu) View mDrawerMenu; @InjectView(R.id.left_drawer) ListView mDrawerList; diff --git a/app/src/main/res/values-v21/styles.xml b/app/src/main/res/values-v21/styles.xml deleted file mode 100644 index 27b65f4..0000000 --- a/app/src/main/res/values-v21/styles.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 1ad41ed..47d5b50 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -1,14 +1,12 @@ - diff --git a/build.gradle b/build.gradle index 46c2ce5..3f5b92d 100644 --- a/build.gradle +++ b/build.gradle @@ -5,8 +5,9 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:1.2.2' - classpath 'me.tatarka:gradle-retrolambda:3.0.1' + classpath 'com.android.tools.build:gradle:1.3.0-beta1' + classpath "com.android.databinding:dataBinder:1.0-rc0" + classpath 'me.tatarka:gradle-retrolambda:3.1.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files From b9cc2ec7f0174f27ee3932a312a80e3fd7226340 Mon Sep 17 00:00:00 2001 From: Fabio Collini Date: Sun, 31 May 2015 11:32:59 +0200 Subject: [PATCH 079/332] Author fragment using SuperRecyclerView --- app/build.gradle | 4 +- .../cosenonjaviste/author/AuthorAdapter.java | 79 ------------------- .../author/AuthorListFragment.java | 39 +++++---- .../author/AuthorViewHolder.java | 53 +++++++++++++ .../cosenonjaviste/utils/BindableAdapter.java | 37 +++++++++ .../utils/BindableViewHolder.java | 12 +++ app/src/main/res/layout/author_cell.xml | 25 +++--- app/src/main/res/layout/category_row.xml | 4 +- app/src/main/res/layout/error_view.xml | 15 ++-- app/src/main/res/layout/post_row.xml | 4 +- app/src/main/res/layout/super_recycler.xml | 20 +++++ app/src/main/res/layout/tweet_row.xml | 4 +- build.gradle | 3 +- 13 files changed, 179 insertions(+), 120 deletions(-) delete mode 100644 app/src/main/java/it/cosenonjaviste/author/AuthorAdapter.java create mode 100644 app/src/main/java/it/cosenonjaviste/author/AuthorViewHolder.java create mode 100644 app/src/main/java/it/cosenonjaviste/utils/BindableAdapter.java create mode 100644 app/src/main/java/it/cosenonjaviste/utils/BindableViewHolder.java create mode 100644 app/src/main/res/layout/super_recycler.xml diff --git a/app/build.gradle b/app/build.gradle index 05ddea1..7097aa4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -14,8 +14,6 @@ buildscript { apply plugin: 'com.android.application' -apply plugin: 'com.android.databinding' - apply plugin: 'me.tatarka.retrolambda' apply plugin: 'com.neenbedankt.android-apt' @@ -89,6 +87,8 @@ dependencies { compile 'com.android.support:cardview-v7:22.2.0' compile 'com.jakewharton:butterknife:6.1.0' compile 'com.squareup.picasso:picasso:2.5.0' + compile 'com.android.support:recyclerview-v7:22.2.0' + compile 'com.malinskiy:superrecyclerview:1.1.0' apt 'com.google.dagger:dagger-compiler:2.0' apt 'org.parceler:parceler:0.2.14' diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorAdapter.java b/app/src/main/java/it/cosenonjaviste/author/AuthorAdapter.java deleted file mode 100644 index 335a505..0000000 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorAdapter.java +++ /dev/null @@ -1,79 +0,0 @@ -package it.cosenonjaviste.author; - -import android.content.Context; -import android.text.Html; -import android.text.TextUtils; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.ImageView; -import android.widget.TextView; - -import com.squareup.picasso.Picasso; - -import java.util.ArrayList; -import java.util.List; - -import butterknife.ButterKnife; -import butterknife.InjectView; -import it.cosenonjaviste.R; -import it.cosenonjaviste.model.Author; -import it.cosenonjaviste.utils.CircleTransform; - -public class AuthorAdapter extends BaseAdapter { - - private List authors = new ArrayList<>(); - - private Context context; - private CircleTransform transformation; - - public AuthorAdapter(Context context) { - this.context = context; - transformation = CircleTransform.createWithBorder(context, R.dimen.author_image_size_big, R.color.colorPrimary, R.dimen.author_image_border); - } - - @Override public int getCount() { - return authors.size(); - } - - @Override public Author getItem(int position) { - return authors.get(position); - } - - @Override public long getItemId(int position) { - return getItem(position).getId(); - } - - @Override public View getView(int position, View convertView, ViewGroup parent) { - if (convertView == null) { - convertView = LayoutInflater.from(context).inflate(R.layout.author_cell, parent, false); - RowWrapper rowWrapper = new RowWrapper(); - ButterKnife.inject(rowWrapper, convertView); - convertView.setTag(rowWrapper); - } - RowWrapper rowWrapper = (RowWrapper) convertView.getTag(); - Author author = getItem(position); - String description = author.getDescription(); - rowWrapper.title.setText(Html.fromHtml(description.replaceAll("^

", "").replaceAll("$

", ""))); - rowWrapper.firstName.setText(author.getFirstName()); - rowWrapper.lastName.setText(author.getLastName()); - String imageUrl = author.getImageUrl(); - if (!TextUtils.isEmpty(imageUrl)) { - Picasso.with(context).load(imageUrl).transform(transformation).into(rowWrapper.image); - } - return convertView; - } - - public void reloadData(List posts) { - this.authors = posts; - notifyDataSetChanged(); - } - - static class RowWrapper { - @InjectView(R.id.first_name) TextView firstName; - @InjectView(R.id.last_name) TextView lastName; - @InjectView(R.id.title) TextView title; - @InjectView(R.id.author_image) ImageView image; - } -} diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java index d6d94b8..6279112 100644 --- a/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorListFragment.java @@ -1,13 +1,13 @@ package it.cosenonjaviste.author; -import android.annotation.SuppressLint; import android.os.Bundle; import android.support.annotation.Nullable; +import android.support.v7.widget.GridLayoutManager; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; -import com.quentindommerc.superlistview.SuperGridview; +import com.malinskiy.superrecyclerview.SuperRecyclerView; import org.parceler.ParcelClass; @@ -19,31 +19,38 @@ import it.cosenonjaviste.CoseNonJavisteApp; import it.cosenonjaviste.R; import it.cosenonjaviste.lib.mvp.RxMvpFragment; +import it.cosenonjaviste.model.Author; import it.cosenonjaviste.post.PostListFragment; import it.cosenonjaviste.post.PostListModel; +import it.cosenonjaviste.utils.BindableAdapter; +import it.cosenonjaviste.utils.CircleTransform; import it.cosenonjaviste.utils.SingleFragmentActivity; @ParcelClass(AuthorListModel.class) public class AuthorListFragment extends RxMvpFragment implements AuthorListView { - @InjectView(R.id.grid) SuperGridview grid; + @InjectView(R.id.recycler) SuperRecyclerView superRecycler; + + @InjectView(R.id.error_root) View errorLayout; @Inject AuthorListPresenter presenter; - private AuthorAdapter adapter; + private BindableAdapter adapter; @Override public void init(Bundle state) { createComponent(() -> DaggerAuthorListComponent.builder().applicationComponent(CoseNonJavisteApp.getComponent(getActivity())).build()) .inject(this); } - @SuppressLint("ResourceAsColor") @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.super_grid, container, false); + @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { + View view = inflater.inflate(R.layout.super_recycler, container, false); ButterKnife.inject(this, view); - adapter = new AuthorAdapter(getActivity()); - grid.getList().setOnItemClickListener((parent, view1, position, id) -> presenter.goToAuthorDetail(position)); - grid.getList().setNumColumns(2); - grid.setAdapter(adapter); + + CircleTransform transformation = CircleTransform.createWithBorder(getActivity(), R.dimen.author_image_size_big, R.color.colorPrimary, R.dimen.author_image_border); + adapter = new BindableAdapter<>(v -> new AuthorViewHolder(inflater.inflate(R.layout.author_cell, v, false), transformation, presenter)); + superRecycler.setAdapter(adapter); + GridLayoutManager layoutManager = new GridLayoutManager(getActivity(), 2); + superRecycler.setLayoutManager(layoutManager); return view; } @@ -52,20 +59,22 @@ public class AuthorListFragment extends RxMvpFragment implements AuthorListView } @Override public void update(AuthorListModel model) { - grid.showList(); - adapter.reloadData(model.getItems()); + superRecycler.showRecycler(); + adapter.reloadData(model.getItems()); } @Override public void showError() { - grid.showError(); + errorLayout.setVisibility(View.VISIBLE); + superRecycler.hideRecycler(); + superRecycler.hideProgress(); } @Override public void startLoading() { - grid.showProgress(); + superRecycler.showProgress(); + errorLayout.setVisibility(View.GONE); } @Override public void openPostList(PostListModel model) { SingleFragmentActivity.open(getActivity(), PostListFragment.class, model); } - } diff --git a/app/src/main/java/it/cosenonjaviste/author/AuthorViewHolder.java b/app/src/main/java/it/cosenonjaviste/author/AuthorViewHolder.java new file mode 100644 index 0000000..9f7af52 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/author/AuthorViewHolder.java @@ -0,0 +1,53 @@ +package it.cosenonjaviste.author; + +import android.text.Html; +import android.text.TextUtils; +import android.view.View; +import android.widget.ImageView; +import android.widget.TextView; + +import com.squareup.picasso.Picasso; + +import butterknife.ButterKnife; +import butterknife.InjectView; +import butterknife.OnClick; +import it.cosenonjaviste.R; +import it.cosenonjaviste.model.Author; +import it.cosenonjaviste.utils.BindableViewHolder; +import it.cosenonjaviste.utils.CircleTransform; + +public class AuthorViewHolder extends BindableViewHolder { + + private final CircleTransform transformation; + private final AuthorListPresenter presenter; + + @InjectView(R.id.first_name) TextView firstName; + @InjectView(R.id.last_name) TextView lastName; + @InjectView(R.id.title) TextView title; + @InjectView(R.id.author_image) ImageView image; + + private int position; + + public AuthorViewHolder(View itemView, CircleTransform transformation, AuthorListPresenter presenter) { + super(itemView); + this.transformation = transformation; + this.presenter = presenter; + ButterKnife.inject(this, itemView); + } + + @OnClick(R.id.author_cell) void goToDetail() { + presenter.goToAuthorDetail(position); + } + + @Override public void bind(Author author, int position) { + this.position = position; + String description = author.getDescription(); + title.setText(Html.fromHtml(description.replaceAll("^

", "").replaceAll("$

", ""))); + firstName.setText(author.getFirstName()); + lastName.setText(author.getLastName()); + String imageUrl = author.getImageUrl(); + if (!TextUtils.isEmpty(imageUrl)) { + Picasso.with(itemView.getContext()).load(imageUrl).transform(transformation).into(image); + } + } +} diff --git a/app/src/main/java/it/cosenonjaviste/utils/BindableAdapter.java b/app/src/main/java/it/cosenonjaviste/utils/BindableAdapter.java new file mode 100644 index 0000000..9ec1cbb --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/utils/BindableAdapter.java @@ -0,0 +1,37 @@ +package it.cosenonjaviste.utils; + +import android.support.v7.widget.RecyclerView; +import android.view.ViewGroup; + +import java.util.ArrayList; +import java.util.List; + +import rx.functions.Func1; + +public class BindableAdapter extends RecyclerView.Adapter> { + + private List authors = new ArrayList<>(); + + private Func1> viewHolderFactory; + + public BindableAdapter(Func1> viewHolderFactory) { + this.viewHolderFactory = viewHolderFactory; + } + + @Override public BindableViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) { + return viewHolderFactory.call(viewGroup); + } + + @Override public void onBindViewHolder(BindableViewHolder authorViewHolder, int i) { + authorViewHolder.bind(authors.get(i), i); + } + + @Override public int getItemCount() { + return authors.size(); + } + + public void reloadData(List posts) { + this.authors = posts; + notifyDataSetChanged(); + } +} diff --git a/app/src/main/java/it/cosenonjaviste/utils/BindableViewHolder.java b/app/src/main/java/it/cosenonjaviste/utils/BindableViewHolder.java new file mode 100644 index 0000000..2f05634 --- /dev/null +++ b/app/src/main/java/it/cosenonjaviste/utils/BindableViewHolder.java @@ -0,0 +1,12 @@ +package it.cosenonjaviste.utils; + +import android.support.v7.widget.RecyclerView; +import android.view.View; + +public abstract class BindableViewHolder extends RecyclerView.ViewHolder { + public BindableViewHolder(View itemView) { + super(itemView); + } + + public abstract void bind(T item, int pos); +} diff --git a/app/src/main/res/layout/author_cell.xml b/app/src/main/res/layout/author_cell.xml index 35036b1..80b2362 100644 --- a/app/src/main/res/layout/author_cell.xml +++ b/app/src/main/res/layout/author_cell.xml @@ -1,16 +1,19 @@ + android:layout_height="wrap_content" + card_view:cardUseCompatPadding="true"> + android:padding="16dp"> + android:textStyle="bold" + tools:text="Name"/> + android:textStyle="bold" + tools:text="Last name"/> + android:textSize="10sp" + android:visibility="gone" + tools:text="Title"/> \ No newline at end of file diff --git a/app/src/main/res/layout/category_row.xml b/app/src/main/res/layout/category_row.xml index 46f8885..ab45336 100644 --- a/app/src/main/res/layout/category_row.xml +++ b/app/src/main/res/layout/category_row.xml @@ -3,7 +3,9 @@ xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" - android:layout_height="wrap_content"> + android:layout_height="wrap_content" + xmlns:card_view="http://schemas.android.com/apk/res-auto" + card_view:cardUseCompatPadding="true"> - + android:gravity="center" + android:orientation="vertical"> + android:textAppearance="?android:attr/textAppearanceMedium"/>