├── app
├── .gitignore
├── src
│ ├── main
│ │ ├── res
│ │ │ ├── mipmap-hdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-mdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── mipmap-xxhdpi
│ │ │ │ └── ic_launcher.png
│ │ │ ├── values
│ │ │ │ ├── styles.xml
│ │ │ │ ├── dimens.xml
│ │ │ │ └── strings.xml
│ │ │ ├── values-w820dp
│ │ │ │ └── dimens.xml
│ │ │ └── layout
│ │ │ │ ├── activity_detail.xml
│ │ │ │ └── activity_main.xml
│ │ └── java
│ │ │ └── it
│ │ │ └── cosenonjaviste
│ │ │ └── testableandroidapps
│ │ │ ├── mvplib
│ │ │ ├── Presenter.java
│ │ │ ├── MvpContext.java
│ │ │ └── BaseActivity.java
│ │ │ ├── MvpScope.java
│ │ │ ├── model
│ │ │ ├── WordPressService.java
│ │ │ ├── PostResponse.java
│ │ │ ├── Author.java
│ │ │ └── Post.java
│ │ │ ├── v2
│ │ │ ├── TestableShareActivity.java
│ │ │ ├── TestablePostListActivity.java
│ │ │ └── ShareActivity.java
│ │ │ ├── v7
│ │ │ ├── ShareComponent.java
│ │ │ ├── PostListComponent.java
│ │ │ ├── PostListModel.java
│ │ │ ├── ShareModel.java
│ │ │ ├── SharePresenter.java
│ │ │ └── PostListPresenter.java
│ │ │ ├── v4
│ │ │ ├── ShareModel.java
│ │ │ ├── PostListModel.java
│ │ │ └── ShareActivity.java
│ │ │ ├── SchedulerManager.java
│ │ │ ├── CnjApplication.java
│ │ │ ├── v5
│ │ │ ├── PostListModel.java
│ │ │ ├── ShareModel.java
│ │ │ ├── SharePresenter.java
│ │ │ └── PostListPresenter.java
│ │ │ ├── v6
│ │ │ ├── PostListModel.java
│ │ │ ├── ShareModel.java
│ │ │ ├── SharePresenter.java
│ │ │ ├── PostListPresenter.java
│ │ │ └── ShareActivity.java
│ │ │ ├── v8
│ │ │ ├── PostListModel.java
│ │ │ ├── ShareModel.java
│ │ │ ├── SharePresenter.java
│ │ │ ├── ShareActivity.java
│ │ │ └── PostListActivity.java
│ │ │ ├── v10
│ │ │ ├── ShareActivity.java
│ │ │ ├── PostListModel.java
│ │ │ ├── ShareModel.java
│ │ │ ├── PostListActivity.java
│ │ │ └── SharePresenter.java
│ │ │ ├── ShareExecutor.java
│ │ │ ├── v9
│ │ │ ├── PostListModel.java
│ │ │ ├── ShareModel.java
│ │ │ ├── ShareActivity.java
│ │ │ ├── PostListActivity.java
│ │ │ └── SharePresenter.java
│ │ │ ├── PostViewHolder.java
│ │ │ ├── ObservableHolder.java
│ │ │ ├── ApplicationModule.java
│ │ │ ├── PostAdapter.java
│ │ │ ├── RetainedFragment.java
│ │ │ ├── ApplicationComponent.java
│ │ │ ├── v3
│ │ │ └── ShareActivity.java
│ │ │ └── v1
│ │ │ └── ShareActivity.java
│ ├── androidTest
│ │ └── java
│ │ │ └── it
│ │ │ └── cosenonjaviste
│ │ │ └── testableandroidapps
│ │ │ ├── PostCreator.java
│ │ │ ├── v3
│ │ │ ├── TestComponent.java
│ │ │ ├── PostListActivityTest.java
│ │ │ └── ShareActivityTest.java
│ │ │ ├── v4
│ │ │ ├── TestComponent.java
│ │ │ ├── PostListActivityTest.java
│ │ │ └── ShareActivityTest.java
│ │ │ ├── v5
│ │ │ ├── TestComponent.java
│ │ │ ├── PostListActivityTest.java
│ │ │ └── ShareActivityTest.java
│ │ │ ├── v6
│ │ │ ├── TestComponent.java
│ │ │ ├── PostListActivityTest.java
│ │ │ └── ShareActivityTest.java
│ │ │ ├── v7
│ │ │ ├── TestComponent.java
│ │ │ ├── PostListActivityTest.java
│ │ │ └── ShareActivityTest.java
│ │ │ ├── TestModule.java
│ │ │ ├── v1
│ │ │ ├── PostListActivityTest.java
│ │ │ └── ShareActivityTest.java
│ │ │ ├── utils
│ │ │ ├── ErrorTextMatcher.java
│ │ │ └── EspressoExecutor.java
│ │ │ └── v2
│ │ │ ├── PostListActivityTest.java
│ │ │ └── ShareActivityTest.java
│ └── test
│ │ └── java
│ │ └── it
│ │ └── cosenonjaviste
│ │ └── testableandroidapps
│ │ ├── mvplib
│ │ ├── MvpTestContext.java
│ │ └── FakeEditable.java
│ │ ├── utils
│ │ └── FileUtils.java
│ │ ├── JsonParsingTest.java
│ │ ├── v5
│ │ ├── SharePresenterTest.java
│ │ └── PostListPresenterTest.java
│ │ ├── v6
│ │ ├── SharePresenterTest.java
│ │ └── PostListPresenterTest.java
│ │ ├── v7
│ │ ├── SharePresenterTest.java
│ │ └── PostListPresenterTest.java
│ │ ├── v8
│ │ ├── SharePresenterTest.java
│ │ └── PostListPresenterTest.java
│ │ ├── v10
│ │ ├── SharePresenterTest.java
│ │ └── PostListPresenterTest.java
│ │ └── v9
│ │ ├── SharePresenterTest.java
│ │ └── PostListPresenterTest.java
└── proguard-rules.pro
├── dependencyinjection
├── .gitignore
├── src
│ ├── main
│ │ └── java
│ │ │ └── it
│ │ │ └── cosenonjaviste
│ │ │ └── testableandroidapps
│ │ │ ├── v1
│ │ │ ├── Main.java
│ │ │ ├── EmailSender.java
│ │ │ └── PostBatch.java
│ │ │ ├── v3
│ │ │ ├── Main.java
│ │ │ ├── MainComponent.java
│ │ │ ├── EmailSender.java
│ │ │ ├── PostBatch.java
│ │ │ └── MainModule.java
│ │ │ ├── v4
│ │ │ ├── Main.java
│ │ │ ├── MainComponent.java
│ │ │ ├── EmailSender.java
│ │ │ ├── PostBatch.java
│ │ │ └── MainModule.java
│ │ │ ├── v5
│ │ │ ├── Main.java
│ │ │ ├── MainComponent.java
│ │ │ ├── EmailSender.java
│ │ │ ├── MainModule.java
│ │ │ └── PostBatch.java
│ │ │ ├── v2
│ │ │ ├── EmailSender.java
│ │ │ ├── Main.java
│ │ │ └── PostBatch.java
│ │ │ └── model
│ │ │ ├── WordPressService.java
│ │ │ ├── PostResponse.java
│ │ │ ├── Author.java
│ │ │ └── Post.java
│ └── test
│ │ └── java
│ │ └── it
│ │ └── cosenonjaviste
│ │ └── testableandroidapps
│ │ ├── v4
│ │ ├── TestComponent.java
│ │ ├── TestModule.java
│ │ └── PostBatchTest.java
│ │ ├── v5
│ │ ├── TestComponent.java
│ │ ├── TestModule.java
│ │ ├── PostBatchTest.java
│ │ └── PostBatchNoDaggerTest.java
│ │ ├── v1
│ │ └── PostBatchTest.java
│ │ ├── v2
│ │ ├── EmailSenderSpy.java
│ │ ├── WordPressServiceStub.java
│ │ ├── PostBatchTest.java
│ │ ├── MockitoPostsBatchTest3.java
│ │ ├── MockitoPostsBatchTest2.java
│ │ └── MockitoPostBatchTest.java
│ │ └── v3
│ │ └── PostBatchTest.java
└── build.gradle
├── settings.gradle
├── .gitignore
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── README.md
├── gradle.properties
└── gradlew.bat
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/dependencyinjection/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':app', ':dependencyinjection'
2 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .gradle
2 | /local.properties
3 | /.idea/*
4 | .DS_Store
5 | /build
6 | *.iml
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fabioCollini/TestableAndroidAppsDroidCon15/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fabioCollini/TestableAndroidAppsDroidCon15/HEAD/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fabioCollini/TestableAndroidAppsDroidCon15/HEAD/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fabioCollini/TestableAndroidAppsDroidCon15/HEAD/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/fabioCollini/TestableAndroidAppsDroidCon15/HEAD/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/app/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 16dp
5 |
6 |
--------------------------------------------------------------------------------
/dependencyinjection/src/main/java/it/cosenonjaviste/testableandroidapps/v1/Main.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v1;
2 |
3 | public class Main {
4 | public static void main(String[] args) {
5 | new PostBatch().execute();
6 | }
7 | }
8 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Wed Apr 10 15:27:10 PDT 2013
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | zipStoreBase=GRADLE_USER_HOME
5 | zipStorePath=wrapper/dists
6 | distributionUrl=https\://services.gradle.org/distributions/gradle-2.2.1-all.zip
7 |
--------------------------------------------------------------------------------
/dependencyinjection/src/main/java/it/cosenonjaviste/testableandroidapps/v3/Main.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v3;
2 |
3 | public class Main {
4 | public static void main(String[] args) {
5 | PostBatch batch = DaggerMainComponent.create().getBatch();
6 | batch.execute();
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/dependencyinjection/src/main/java/it/cosenonjaviste/testableandroidapps/v4/Main.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v4;
2 |
3 | public class Main {
4 | public static void main(String[] args) {
5 | PostBatch batch = DaggerMainComponent.create().getBatch();
6 | batch.execute();
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/dependencyinjection/src/main/java/it/cosenonjaviste/testableandroidapps/v5/Main.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v5;
2 |
3 | public class Main {
4 | public static void main(String[] args) {
5 | PostBatch batch = DaggerMainComponent.create().getBatch();
6 | batch.execute();
7 | }
8 | }
9 |
--------------------------------------------------------------------------------
/app/src/main/java/it/cosenonjaviste/testableandroidapps/mvplib/Presenter.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.mvplib;
2 |
3 | public interface Presenter {
4 | void resume(MvpContext mvpContext);
5 |
6 | void pause();
7 |
8 | void destroy();
9 |
10 | M createDefaultModel();
11 | }
12 |
--------------------------------------------------------------------------------
/app/src/main/java/it/cosenonjaviste/testableandroidapps/MvpScope.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps;
2 |
3 | import java.lang.annotation.Retention;
4 |
5 | import javax.inject.Scope;
6 |
7 | import static java.lang.annotation.RetentionPolicy.RUNTIME;
8 |
9 | @Scope
10 | @Retention(RUNTIME)
11 | public @interface MvpScope {
12 | }
--------------------------------------------------------------------------------
/dependencyinjection/src/main/java/it/cosenonjaviste/testableandroidapps/v3/MainComponent.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v3;
2 |
3 | import javax.inject.Singleton;
4 |
5 | import dagger.Component;
6 |
7 | @Singleton
8 | @Component(modules = MainModule.class)
9 | public interface MainComponent {
10 | PostBatch getBatch();
11 | }
12 |
--------------------------------------------------------------------------------
/dependencyinjection/src/main/java/it/cosenonjaviste/testableandroidapps/v4/MainComponent.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v4;
2 |
3 | import javax.inject.Singleton;
4 |
5 | import dagger.Component;
6 |
7 | @Singleton
8 | @Component(modules = MainModule.class)
9 | public interface MainComponent {
10 | PostBatch getBatch();
11 | }
12 |
--------------------------------------------------------------------------------
/dependencyinjection/src/main/java/it/cosenonjaviste/testableandroidapps/v5/MainComponent.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v5;
2 |
3 | import javax.inject.Singleton;
4 |
5 | import dagger.Component;
6 |
7 | @Singleton
8 | @Component(modules = MainModule.class)
9 | public interface MainComponent {
10 | PostBatch getBatch();
11 | }
12 |
--------------------------------------------------------------------------------
/dependencyinjection/src/main/java/it/cosenonjaviste/testableandroidapps/v1/EmailSender.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v1;
2 |
3 | import it.cosenonjaviste.testableandroidapps.model.Post;
4 |
5 | public class EmailSender {
6 | public void sendEmail(Post p) {
7 | System.out.println("email " + p.getTitle() + " sent!");
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/dependencyinjection/src/main/java/it/cosenonjaviste/testableandroidapps/v2/EmailSender.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v2;
2 |
3 | import it.cosenonjaviste.testableandroidapps.model.Post;
4 |
5 | public class EmailSender {
6 | public void sendEmail(Post p) {
7 | System.out.println("email " + p.getTitle() + " sent!");
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/dependencyinjection/src/test/java/it/cosenonjaviste/testableandroidapps/v4/TestComponent.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v4;
2 |
3 | import javax.inject.Singleton;
4 |
5 | import dagger.Component;
6 |
7 | @Singleton
8 | @Component(modules = TestModule.class)
9 | public interface TestComponent {
10 | void inject(PostBatchTest test);
11 | }
12 |
--------------------------------------------------------------------------------
/dependencyinjection/src/test/java/it/cosenonjaviste/testableandroidapps/v5/TestComponent.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v5;
2 |
3 | import javax.inject.Singleton;
4 |
5 | import dagger.Component;
6 |
7 | @Singleton
8 | @Component(modules = TestModule.class)
9 | public interface TestComponent {
10 | void inject(PostBatchTest test);
11 | }
12 |
--------------------------------------------------------------------------------
/dependencyinjection/src/main/java/it/cosenonjaviste/testableandroidapps/model/WordPressService.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.model;
2 |
3 | import retrofit.http.GET;
4 |
5 | public interface WordPressService {
6 | @GET("/?json=get_recent_posts&count=10&exclude=attachments,thumbnail_images,content,title_plain,tags,custom_fields") PostResponse listPosts();
7 | }
--------------------------------------------------------------------------------
/dependencyinjection/src/main/java/it/cosenonjaviste/testableandroidapps/v3/EmailSender.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v3;
2 |
3 | import it.cosenonjaviste.testableandroidapps.model.Post;
4 |
5 | public class EmailSender {
6 |
7 | public void sendEmail(Post p) {
8 | System.out.println("email " + p.getTitle() + " sent!");
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/app/src/main/java/it/cosenonjaviste/testableandroidapps/model/WordPressService.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.model;
2 |
3 | import retrofit.http.GET;
4 | import rx.Observable;
5 |
6 | public interface WordPressService {
7 | @GET("/?json=get_recent_posts&count=10&exclude=attachments,thumbnail_images,content,title_plain,tags,custom_fields") Observable listPosts();
8 | }
--------------------------------------------------------------------------------
/dependencyinjection/src/test/java/it/cosenonjaviste/testableandroidapps/v1/PostBatchTest.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v1;
2 |
3 | import org.junit.Test;
4 |
5 | public class PostBatchTest {
6 |
7 | private PostBatch postBatch = new PostBatch();
8 |
9 | @Test
10 | public void testExecute() {
11 | postBatch.execute();
12 | //???
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/app/src/main/res/values-w820dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 64dp
6 |
7 |
--------------------------------------------------------------------------------
/app/src/main/java/it/cosenonjaviste/testableandroidapps/v2/TestableShareActivity.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v2;
2 |
3 | public class TestableShareActivity extends ShareActivity {
4 |
5 | public String shareTitle;
6 |
7 | public String shareBody;
8 |
9 | @Override protected void startSendActivity(String title, String body) {
10 | shareTitle = title;
11 | shareBody = body;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/app/src/main/java/it/cosenonjaviste/testableandroidapps/v7/ShareComponent.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v7;
2 |
3 | import dagger.Component;
4 | import it.cosenonjaviste.testableandroidapps.ApplicationComponent;
5 | import it.cosenonjaviste.testableandroidapps.MvpScope;
6 |
7 | @MvpScope
8 | @Component(dependencies = ApplicationComponent.class)
9 | public interface ShareComponent {
10 | void inject(ShareActivity activity);
11 | }
12 |
--------------------------------------------------------------------------------
/app/src/main/java/it/cosenonjaviste/testableandroidapps/v7/PostListComponent.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v7;
2 |
3 | import dagger.Component;
4 | import it.cosenonjaviste.testableandroidapps.ApplicationComponent;
5 | import it.cosenonjaviste.testableandroidapps.MvpScope;
6 |
7 | @MvpScope
8 | @Component(dependencies = ApplicationComponent.class)
9 | public interface PostListComponent {
10 | void inject(PostListActivity activity);
11 | }
12 |
--------------------------------------------------------------------------------
/dependencyinjection/src/test/java/it/cosenonjaviste/testableandroidapps/v2/EmailSenderSpy.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v2;
2 |
3 | import it.cosenonjaviste.testableandroidapps.model.Post;
4 |
5 | public class EmailSenderSpy extends EmailSender {
6 |
7 | private int emailCount;
8 |
9 | @Override public void sendEmail(Post p) {
10 | emailCount++;
11 | }
12 |
13 | public int getEmailCount() {
14 | return emailCount;
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/dependencyinjection/build.gradle:
--------------------------------------------------------------------------------
1 | apply plugin: 'java'
2 |
3 | dependencies {
4 | compile 'com.squareup.okhttp:okhttp:2.0.0'
5 | compile 'com.squareup.retrofit:retrofit:1.9.0'
6 | compile 'com.google.dagger:dagger:2.0'
7 | compile 'com.google.dagger:dagger-compiler:2.0'
8 |
9 | testCompile 'junit:junit:4.12'
10 | testCompile 'org.mockito:mockito-core:1.9.5'
11 | testCompile 'org.assertj:assertj-core:1.7.0'
12 | testCompile 'com.google.dagger:dagger-compiler:2.0'
13 | }
--------------------------------------------------------------------------------
/app/src/main/java/it/cosenonjaviste/testableandroidapps/model/PostResponse.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.model;
2 |
3 | import java.util.Arrays;
4 | import java.util.List;
5 |
6 | public class PostResponse {
7 | private List posts;
8 |
9 | public PostResponse() {
10 | }
11 |
12 | public PostResponse(Post... posts) {
13 | this.posts = Arrays.asList(posts);
14 | }
15 |
16 | public List getPosts() {
17 | return posts;
18 | }
19 | }
20 |
--------------------------------------------------------------------------------
/app/src/main/java/it/cosenonjaviste/testableandroidapps/v2/TestablePostListActivity.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v2;
2 |
3 | import java.util.List;
4 |
5 | import it.cosenonjaviste.testableandroidapps.model.Post;
6 | import rx.Observable;
7 |
8 | public class TestablePostListActivity extends PostListActivity {
9 |
10 | public static Observable> result;
11 |
12 | @Override protected Observable> createListObservable() {
13 | return result;
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/dependencyinjection/src/main/java/it/cosenonjaviste/testableandroidapps/v4/EmailSender.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v4;
2 |
3 | import javax.inject.Inject;
4 | import javax.inject.Singleton;
5 |
6 | import it.cosenonjaviste.testableandroidapps.model.Post;
7 |
8 | @Singleton
9 | public class EmailSender {
10 |
11 | @Inject public EmailSender() {
12 | }
13 |
14 | public void sendEmail(Post p) {
15 | System.out.println("email " + p.getTitle() + " sent!");
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/it/cosenonjaviste/testableandroidapps/PostCreator.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps;
2 |
3 | import java.util.Date;
4 |
5 | import it.cosenonjaviste.testableandroidapps.model.Author;
6 | import it.cosenonjaviste.testableandroidapps.model.Post;
7 |
8 | public class PostCreator {
9 | public static Post createPost(int id) {
10 | return new Post(id, new Author(id, "name " + id, "last name " + id), "title " + id, new Date(), "url" + id, "excerpt " + id);
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/it/cosenonjaviste/testableandroidapps/v3/TestComponent.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v3;
2 |
3 | import javax.inject.Singleton;
4 |
5 | import dagger.Component;
6 | import it.cosenonjaviste.testableandroidapps.ApplicationComponent;
7 | import it.cosenonjaviste.testableandroidapps.TestModule;
8 |
9 | @Singleton
10 | @Component(modules = TestModule.class)
11 | public interface TestComponent extends ApplicationComponent {
12 | void inject(PostListActivityTest test);
13 |
14 | void inject(ShareActivityTest test);
15 | }
16 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/it/cosenonjaviste/testableandroidapps/v4/TestComponent.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v4;
2 |
3 | import javax.inject.Singleton;
4 |
5 | import dagger.Component;
6 | import it.cosenonjaviste.testableandroidapps.ApplicationComponent;
7 | import it.cosenonjaviste.testableandroidapps.TestModule;
8 |
9 | @Singleton
10 | @Component(modules = TestModule.class)
11 | public interface TestComponent extends ApplicationComponent {
12 | void inject(PostListActivityTest test);
13 |
14 | void inject(ShareActivityTest test);
15 | }
16 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/it/cosenonjaviste/testableandroidapps/v5/TestComponent.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v5;
2 |
3 | import javax.inject.Singleton;
4 |
5 | import dagger.Component;
6 | import it.cosenonjaviste.testableandroidapps.ApplicationComponent;
7 | import it.cosenonjaviste.testableandroidapps.TestModule;
8 |
9 | @Singleton
10 | @Component(modules = TestModule.class)
11 | public interface TestComponent extends ApplicationComponent {
12 | void inject(PostListActivityTest test);
13 |
14 | void inject(ShareActivityTest test);
15 | }
16 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/it/cosenonjaviste/testableandroidapps/v6/TestComponent.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v6;
2 |
3 | import javax.inject.Singleton;
4 |
5 | import dagger.Component;
6 | import it.cosenonjaviste.testableandroidapps.ApplicationComponent;
7 | import it.cosenonjaviste.testableandroidapps.TestModule;
8 |
9 | @Singleton
10 | @Component(modules = TestModule.class)
11 | public interface TestComponent extends ApplicationComponent {
12 | void inject(PostListActivityTest test);
13 |
14 | void inject(ShareActivityTest test);
15 | }
16 |
--------------------------------------------------------------------------------
/app/src/androidTest/java/it/cosenonjaviste/testableandroidapps/v7/TestComponent.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v7;
2 |
3 | import javax.inject.Singleton;
4 |
5 | import dagger.Component;
6 | import it.cosenonjaviste.testableandroidapps.ApplicationComponent;
7 | import it.cosenonjaviste.testableandroidapps.TestModule;
8 |
9 | @Singleton
10 | @Component(modules = TestModule.class)
11 | public interface TestComponent extends ApplicationComponent {
12 | void inject(PostListActivityTest test);
13 |
14 | void inject(ShareActivityTest test);
15 | }
16 |
--------------------------------------------------------------------------------
/app/src/main/java/it/cosenonjaviste/testableandroidapps/v4/ShareModel.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v4;
2 |
3 | import org.parceler.Parcel;
4 |
5 | @Parcel
6 | public class ShareModel {
7 | String title;
8 |
9 | String body;
10 |
11 | public String getTitle() {
12 | return title;
13 | }
14 |
15 | public void setTitle(String title) {
16 | this.title = title;
17 | }
18 |
19 | public String getBody() {
20 | return body;
21 | }
22 |
23 | public void setBody(String body) {
24 | this.body = body;
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/app/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | TestableAndroidAppsDroidCon15
3 |
4 | Hello world!
5 | Settings
6 | Share
7 | Error loading data
8 | Reload
9 | Loading...
10 | Title
11 | Text
12 | Mandatory field
13 |
14 |
--------------------------------------------------------------------------------
/dependencyinjection/src/main/java/it/cosenonjaviste/testableandroidapps/model/PostResponse.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.model;
2 |
3 | import java.util.Arrays;
4 | import java.util.List;
5 |
6 | public class PostResponse {
7 | private List posts;
8 |
9 | public PostResponse() {
10 | }
11 |
12 | public PostResponse(List posts) {
13 | this.posts = posts;
14 | }
15 |
16 | public PostResponse(Post... posts) {
17 | this.posts = Arrays.asList(posts);
18 | }
19 |
20 | public List getPosts() {
21 | return posts;
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/dependencyinjection/src/test/java/it/cosenonjaviste/testableandroidapps/v2/WordPressServiceStub.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v2;
2 |
3 | import it.cosenonjaviste.testableandroidapps.model.PostResponse;
4 | import it.cosenonjaviste.testableandroidapps.model.WordPressService;
5 |
6 | public class WordPressServiceStub implements WordPressService {
7 |
8 | private PostResponse postResponse;
9 |
10 | public WordPressServiceStub(PostResponse postResponse) {
11 | this.postResponse = postResponse;
12 | }
13 |
14 | @Override public PostResponse listPosts() {
15 | return postResponse;
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/dependencyinjection/src/test/java/it/cosenonjaviste/testableandroidapps/v4/TestModule.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v4;
2 |
3 | import org.mockito.Mockito;
4 |
5 | import javax.inject.Singleton;
6 |
7 | import dagger.Module;
8 | import dagger.Provides;
9 | import it.cosenonjaviste.testableandroidapps.model.WordPressService;
10 |
11 | @Module
12 | public class TestModule {
13 | @Provides @Singleton EmailSender provideEmailSender() {
14 | return Mockito.mock(EmailSender.class);
15 | }
16 |
17 | @Provides @Singleton WordPressService provideWordPressService() {
18 | return Mockito.mock(WordPressService.class);
19 | }
20 | }
21 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # TestableAndroidAppsDroidCon15
2 |
3 | Droidcon Italy 2015 example
4 |
5 |
6 |
--------------------------------------------------------------------------------
/dependencyinjection/src/main/java/it/cosenonjaviste/testableandroidapps/v5/EmailSender.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps.v5;
2 |
3 | import java.util.Random;
4 |
5 | import javax.inject.Inject;
6 | import javax.inject.Singleton;
7 |
8 | import it.cosenonjaviste.testableandroidapps.model.Post;
9 |
10 | @Singleton
11 | public class EmailSender {
12 |
13 | @Inject public EmailSender() {
14 | }
15 |
16 | public void sendEmail(Post p) {
17 | try {
18 | Thread.sleep(new Random().nextInt(500));
19 | } catch (InterruptedException ignored) {
20 | }
21 | System.out.println("email " + p.getTitle() + " sent!");
22 | }
23 | }
24 |
--------------------------------------------------------------------------------
/app/src/main/java/it/cosenonjaviste/testableandroidapps/SchedulerManager.java:
--------------------------------------------------------------------------------
1 | package it.cosenonjaviste.testableandroidapps;
2 |
3 | import rx.Observable;
4 | import rx.Scheduler;
5 |
6 | public class SchedulerManager {
7 |
8 | private Observable.Transformer transformer;
9 |
10 | public SchedulerManager(Scheduler io, Scheduler mainThread) {
11 | transformer = new Observable.Transformer