diff --git a/app/build.gradle b/app/build.gradle index 0d296d8b70a1e230065a5f22a5a44dc4c75007f0..cce474a80c18f3568fee16326eba7b245cedf417 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -31,8 +31,19 @@ android { dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.android.support:appcompat-v7:26.1.0' + implementation 'com.android.support:support-v4:26.1.0' + implementation 'com.android.support:design:26.1.0' implementation 'com.android.support.constraint:constraint-layout:1.0.2' testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' + + // Dagger + implementation 'com.google.dagger:dagger:2.11' + implementation 'com.google.dagger:dagger-android-support:2.11' // if you use the support libraries + annotationProcessor 'com.google.dagger:dagger-compiler:2.11' + annotationProcessor 'com.google.dagger:dagger-android-processor:2.11' + implementation 'com.google.dagger:dagger-android:2.11' + compileOnly 'javax.annotation:jsr250-api:1.0' } + diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/MainActivity.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/MainActivity.java deleted file mode 100644 index 090ccda6e2f4128f721ad21dfdd216fd8ceae5bb..0000000000000000000000000000000000000000 --- a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/MainActivity.java +++ /dev/null @@ -1,13 +0,0 @@ -package me.szaki.xkcd.xkcdbrowser; - -import android.support.v7.app.AppCompatActivity; -import android.os.Bundle; - -public class MainActivity extends AppCompatActivity { - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - setContentView(R.layout.activity_main); - } -} diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/XKCDBrowserApplication.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/XKCDBrowserApplication.java new file mode 100644 index 0000000000000000000000000000000000000000..dc11a728393dfb9e6272e6f4362fe9e510c65552 --- /dev/null +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/XKCDBrowserApplication.java @@ -0,0 +1,15 @@ +package me.szaki.xkcd.xkcdbrowser; + +import android.app.Application; + +import me.szaki.xkcd.xkcdbrowser.ui.UIModule; + +public class XKCDBrowserApplication extends Application { + public static XKCDBrowserApplicationComponent injector; + + @Override + public void onCreate() { + super.onCreate(); + injector = DaggerXKCDBrowserApplicationComponent.builder().uIModule(new UIModule(this)).build(); + } +} diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/XKCDBrowserApplicationComponent.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/XKCDBrowserApplicationComponent.java new file mode 100644 index 0000000000000000000000000000000000000000..baf10132a8f6c4734546f382637543a31353f623 --- /dev/null +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/XKCDBrowserApplicationComponent.java @@ -0,0 +1,25 @@ +package me.szaki.xkcd.xkcdbrowser; + + +import javax.inject.Singleton; + +import dagger.Component; +import me.szaki.xkcd.xkcdbrowser.interactor.InteractorModule; +import me.szaki.xkcd.xkcdbrowser.interactor.comics.ComicsInteractor; +import me.szaki.xkcd.xkcdbrowser.ui.UIModule; +import me.szaki.xkcd.xkcdbrowser.ui.detail.DetailActivity; +import me.szaki.xkcd.xkcdbrowser.ui.favorites.FavoritesActivity; +import me.szaki.xkcd.xkcdbrowser.ui.main.MainActivity; + +@Singleton +@Component(modules = {UIModule.class, InteractorModule.class}) +public interface XKCDBrowserApplicationComponent { + + void inject(MainActivity mainActivity); + + void inject(DetailActivity detailActivity); + + void inject(FavoritesActivity favoritesActivity); + + void inject(ComicsInteractor comicsInteractor); +} diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/interactor/InteractorModule.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/interactor/InteractorModule.java new file mode 100644 index 0000000000000000000000000000000000000000..de0c2172c2d5dde915f04c4f4a62d2d9c42b7962 --- /dev/null +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/interactor/InteractorModule.java @@ -0,0 +1,13 @@ +package me.szaki.xkcd.xkcdbrowser.interactor; + +import dagger.Module; +import dagger.Provides; +import me.szaki.xkcd.xkcdbrowser.interactor.comics.ComicsInteractor; + +@Module +public class InteractorModule { + @Provides + public ComicsInteractor provideComicsInteractor() { + return new ComicsInteractor(); + } +} diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/interactor/comics/ComicsInteractor.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/interactor/comics/ComicsInteractor.java new file mode 100644 index 0000000000000000000000000000000000000000..30603ccaa0156bc1197e5d322647ae854fa7d9d3 --- /dev/null +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/interactor/comics/ComicsInteractor.java @@ -0,0 +1,10 @@ +package me.szaki.xkcd.xkcdbrowser.interactor.comics; + + +import me.szaki.xkcd.xkcdbrowser.XKCDBrowserApplication; + +public class ComicsInteractor { + public ComicsInteractor() { + XKCDBrowserApplication.injector.inject(this); + } +} diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/Presenter.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/Presenter.java new file mode 100644 index 0000000000000000000000000000000000000000..9a124a48fba537e7a372e6bf3689f8b62eb0eeab --- /dev/null +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/Presenter.java @@ -0,0 +1,13 @@ +package me.szaki.xkcd.xkcdbrowser.ui; + +public abstract class Presenter<S> { + protected S screen; + + public void attachScreen(S screen) { + this.screen = screen; + } + + public void detachScreen() { + this.screen = null; + } +} diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/UIModule.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/UIModule.java new file mode 100644 index 0000000000000000000000000000000000000000..b4b6b791da5a88154b4198f5f0ff64d22be66191 --- /dev/null +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/UIModule.java @@ -0,0 +1,44 @@ +package me.szaki.xkcd.xkcdbrowser.ui; + +import android.content.Context; + +import javax.inject.Singleton; + +import dagger.Module; +import dagger.Provides; +import me.szaki.xkcd.xkcdbrowser.ui.detail.DetailPresenter; +import me.szaki.xkcd.xkcdbrowser.ui.favorites.FavoritesPresenter; +import me.szaki.xkcd.xkcdbrowser.ui.main.MainPresenter; + +@Module +public class UIModule { + private Context context; + + public UIModule(Context context) { + this.context = context; + } + + @Provides + public Context provideContext() { + return context; + } + + @Provides + @Singleton + public MainPresenter provideMainPresenter() { + return new MainPresenter(); + } + + @Provides + @Singleton + public DetailPresenter provideDetailPresenter() { + return new DetailPresenter(); + } + + @Provides + @Singleton + public FavoritesPresenter provideFavoritesPresenter() { + return new FavoritesPresenter(); + } + +} diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailActivity.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..88053321a0cb1f6a330dc9b9be9bf42b135b5bc6 --- /dev/null +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailActivity.java @@ -0,0 +1,35 @@ +package me.szaki.xkcd.xkcdbrowser.ui.detail; + + +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; + +import javax.inject.Inject; + +import me.szaki.xkcd.xkcdbrowser.R; +import me.szaki.xkcd.xkcdbrowser.XKCDBrowserApplication; + +public class DetailActivity extends AppCompatActivity implements DetailScreen { + @Inject + DetailPresenter detailPresenter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_detail); + + XKCDBrowserApplication.injector.inject(this); + } + + @Override + protected void onStart() { + super.onStart(); + detailPresenter.attachScreen(this); + } + + @Override + protected void onStop() { + super.onStop(); + detailPresenter.detachScreen(); + } +} diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailPresenter.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailPresenter.java new file mode 100644 index 0000000000000000000000000000000000000000..130f5a50d4e8ca7af4561320c5b6f7d70be59a63 --- /dev/null +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailPresenter.java @@ -0,0 +1,22 @@ +package me.szaki.xkcd.xkcdbrowser.ui.detail; + + +import javax.inject.Inject; + +import me.szaki.xkcd.xkcdbrowser.interactor.comics.ComicsInteractor; +import me.szaki.xkcd.xkcdbrowser.ui.Presenter; + +public class DetailPresenter extends Presenter<DetailScreen> { + @Inject + ComicsInteractor comicsInteractor; + + @Override + public void attachScreen(DetailScreen screen) { + super.attachScreen(screen); + } + + @Override + public void detachScreen() { + super.detachScreen(); + } +} diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailScreen.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailScreen.java new file mode 100644 index 0000000000000000000000000000000000000000..9c33c64924b67d5037eed407a5c7488643467d07 --- /dev/null +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/detail/DetailScreen.java @@ -0,0 +1,4 @@ +package me.szaki.xkcd.xkcdbrowser.ui.detail; + +public interface DetailScreen { +} diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesActivity.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..e1c52712267f44ceb24233fade9984c0a5110c69 --- /dev/null +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesActivity.java @@ -0,0 +1,35 @@ +package me.szaki.xkcd.xkcdbrowser.ui.favorites; + + +import android.os.Bundle; +import android.support.v7.app.AppCompatActivity; + +import javax.inject.Inject; + +import me.szaki.xkcd.xkcdbrowser.R; +import me.szaki.xkcd.xkcdbrowser.XKCDBrowserApplication; + +public class FavoritesActivity extends AppCompatActivity implements FavoritesScreen { + @Inject + FavoritesPresenter favoritesPresenter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_favorites); + + XKCDBrowserApplication.injector.inject(this); + } + + @Override + protected void onStart() { + super.onStart(); + favoritesPresenter.attachScreen(this); + } + + @Override + protected void onStop() { + super.onStop(); + favoritesPresenter.detachScreen(); + } +} diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesPresenter.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesPresenter.java new file mode 100644 index 0000000000000000000000000000000000000000..87d4db82d3a4d0a2d2c866d9cf1a83f6636b3779 --- /dev/null +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesPresenter.java @@ -0,0 +1,22 @@ +package me.szaki.xkcd.xkcdbrowser.ui.favorites; + + +import javax.inject.Inject; + +import me.szaki.xkcd.xkcdbrowser.interactor.comics.ComicsInteractor; +import me.szaki.xkcd.xkcdbrowser.ui.Presenter; + +public class FavoritesPresenter extends Presenter<FavoritesScreen> { + @Inject + ComicsInteractor comicsInteractor; + + @Override + public void attachScreen(FavoritesScreen screen) { + super.attachScreen(screen); + } + + @Override + public void detachScreen() { + super.detachScreen(); + } +} diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesScreen.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesScreen.java new file mode 100644 index 0000000000000000000000000000000000000000..691e7d763c80a741a754df0c94a572bfc915a4cb --- /dev/null +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/favorites/FavoritesScreen.java @@ -0,0 +1,5 @@ +package me.szaki.xkcd.xkcdbrowser.ui.favorites; + + +public interface FavoritesScreen { +} diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainActivity.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainActivity.java new file mode 100644 index 0000000000000000000000000000000000000000..44ee581f349aff30816f1510d29221521b3821b5 --- /dev/null +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainActivity.java @@ -0,0 +1,34 @@ +package me.szaki.xkcd.xkcdbrowser.ui.main; + +import android.support.v7.app.AppCompatActivity; +import android.os.Bundle; + +import javax.inject.Inject; + +import me.szaki.xkcd.xkcdbrowser.R; +import me.szaki.xkcd.xkcdbrowser.XKCDBrowserApplication; + +public class MainActivity extends AppCompatActivity implements MainScreen { + @Inject + MainPresenter mainPresenter; + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.activity_main); + + XKCDBrowserApplication.injector.inject(this); + } + + @Override + protected void onStart() { + super.onStart(); + mainPresenter.attachScreen(this); + } + + @Override + protected void onStop() { + super.onStop(); + mainPresenter.detachScreen(); + } +} diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainPresenter.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainPresenter.java new file mode 100644 index 0000000000000000000000000000000000000000..1dcf930fc6d42073aa1250efd01a66f314f5c6eb --- /dev/null +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainPresenter.java @@ -0,0 +1,22 @@ +package me.szaki.xkcd.xkcdbrowser.ui.main; + + +import javax.inject.Inject; + +import me.szaki.xkcd.xkcdbrowser.interactor.comics.ComicsInteractor; +import me.szaki.xkcd.xkcdbrowser.ui.Presenter; + +public class MainPresenter extends Presenter<MainScreen> { + @Inject + ComicsInteractor comicsInteractor; + + @Override + public void attachScreen(MainScreen screen) { + super.attachScreen(screen); + } + + @Override + public void detachScreen() { + super.detachScreen(); + } +} diff --git a/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainScreen.java b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainScreen.java new file mode 100644 index 0000000000000000000000000000000000000000..4990c7658b6fd903d6092c3cddb60f120bf652ee --- /dev/null +++ b/app/src/main/java/me/szaki/xkcd/xkcdbrowser/ui/main/MainScreen.java @@ -0,0 +1,4 @@ +package me.szaki.xkcd.xkcdbrowser.ui.main; + +public interface MainScreen { +} diff --git a/app/src/main/res/layout/activity_detail.xml b/app/src/main/res/layout/activity_detail.xml new file mode 100644 index 0000000000000000000000000000000000000000..43febafe7eab8c820972e8f95ec0bf959b643d4f --- /dev/null +++ b/app/src/main/res/layout/activity_detail.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context="me.szaki.xkcd.xkcdbrowser.ui.detail.DetailActivity"> + +</android.support.constraint.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_favorites.xml b/app/src/main/res/layout/activity_favorites.xml new file mode 100644 index 0000000000000000000000000000000000000000..5596ce04683d3f097b1bd9adca0fe6062b827905 --- /dev/null +++ b/app/src/main/res/layout/activity_favorites.xml @@ -0,0 +1,9 @@ +<?xml version="1.0" encoding="utf-8"?> +<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto" + xmlns:tools="http://schemas.android.com/tools" + android:layout_width="match_parent" + android:layout_height="match_parent" + tools:context="me.szaki.xkcd.xkcdbrowser.ui.favorites.FavoritesActivity"> + +</android.support.constraint.ConstraintLayout> \ No newline at end of file diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 5d615661825dec99ccaa92a2d6102674f8eaeb9e..e25f1fe4f3260a7b5c8fd4cbe6ded0deb8274d70 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -4,7 +4,7 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context="me.szaki.xkcd.xkcdbrowser.MainActivity"> + tools:context="me.szaki.xkcd.xkcdbrowser.ui.main.MainActivity"> <TextView android:layout_width="wrap_content"