├── domain
├── .gitignore
├── src
│ └── main
│ │ ├── res
│ │ ├── values
│ │ │ └── strings.xml
│ │ ├── drawable-hdpi
│ │ │ └── ic_launcher.png
│ │ ├── drawable-mdpi
│ │ │ └── ic_launcher.png
│ │ ├── drawable-xhdpi
│ │ │ └── ic_launcher.png
│ │ └── drawable-xxhdpi
│ │ │ └── ic_launcher.png
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── amulyakhare
│ │ └── domain
│ │ ├── interactor
│ │ ├── GetBookListUseCase.java
│ │ ├── DownloadBookUseCase.java
│ │ ├── GetBookDetailUseCase.java
│ │ └── impl
│ │ │ ├── GetBookDetailUseCaseImpl.java
│ │ │ ├── GetBookListUseCaseImpl.java
│ │ │ └── DownloadBookUseCaseImpl.java
│ │ ├── repository
│ │ └── BookRepository.java
│ │ └── model
│ │ └── Book.java
├── proguard-rules.pro
├── build.gradle
└── domain.iml
├── ui
├── .gitignore
├── src
│ ├── androidTest
│ │ ├── resources
│ │ │ └── org.robolectric.Config.properties
│ │ └── java
│ │ │ └── com
│ │ │ └── amulyakhare
│ │ │ └── bookstore
│ │ │ └── test
│ │ │ └── book
│ │ │ └── BookListActivityTest.java
│ └── main
│ │ ├── res
│ │ ├── drawable-hdpi
│ │ │ ├── book1.jpg
│ │ │ └── ic_launcher.png
│ │ ├── drawable-mdpi
│ │ │ └── ic_launcher.png
│ │ ├── drawable-xhdpi
│ │ │ └── ic_launcher.png
│ │ ├── drawable-xxhdpi
│ │ │ └── ic_launcher.png
│ │ ├── values
│ │ │ ├── styles.xml
│ │ │ ├── dimens.xml
│ │ │ └── strings.xml
│ │ ├── values-w820dp
│ │ │ └── dimens.xml
│ │ ├── layout
│ │ │ ├── activity_home.xml
│ │ │ ├── book_list_item_layout.xml
│ │ │ └── activity_book_detail.xml
│ │ └── menu
│ │ │ ├── menu_home.xml
│ │ │ └── menu_book_detail.xml
│ │ ├── java
│ │ └── com
│ │ │ └── amulyakhare
│ │ │ └── bookstore
│ │ │ └── ui
│ │ │ ├── book
│ │ │ ├── detail
│ │ │ │ ├── IBookDetailView.java
│ │ │ │ ├── BookDetailActivity.java
│ │ │ │ └── BookDetailPresenter.java
│ │ │ └── list
│ │ │ │ ├── IBookListView.java
│ │ │ │ ├── BookListItemView.java
│ │ │ │ ├── BookListPresenter.java
│ │ │ │ └── BookListActivity.java
│ │ │ ├── application
│ │ │ ├── IPresenter.java
│ │ │ ├── BookStoreApplication.java
│ │ │ ├── BookStoreBaseActivity.java
│ │ │ └── BookStoreModule.java
│ │ │ ├── navigation
│ │ │ └── Navigator.java
│ │ │ └── model
│ │ │ ├── mapper
│ │ │ └── BookModelMapper.java
│ │ │ └── BookModel.java
│ │ └── AndroidManifest.xml
├── proguard-rules.pro
├── build.gradle
└── ui.iml
├── framework
├── .gitignore
├── src
│ └── main
│ │ ├── res
│ │ ├── values
│ │ │ └── strings.xml
│ │ ├── drawable-hdpi
│ │ │ └── ic_launcher.png
│ │ ├── drawable-mdpi
│ │ │ └── ic_launcher.png
│ │ ├── drawable-xhdpi
│ │ │ └── ic_launcher.png
│ │ └── drawable-xxhdpi
│ │ │ └── ic_launcher.png
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── amulyakhare
│ │ └── framework
│ │ └── data
│ │ └── BookDataRepository.java
├── proguard-rules.pro
├── build.gradle
└── framework.iml
├── settings.gradle
├── gradle
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── README.md
├── .gitignore
├── BookStore.iml
├── gradle.properties
├── gradlew.bat
└── gradlew
/domain/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/ui/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/framework/.gitignore:
--------------------------------------------------------------------------------
1 | /build
2 |
--------------------------------------------------------------------------------
/settings.gradle:
--------------------------------------------------------------------------------
1 | include ':ui', ':domain', ':framework'
2 |
--------------------------------------------------------------------------------
/domain/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | domain
3 |
4 |
--------------------------------------------------------------------------------
/framework/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 | framework
3 |
4 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amulyakhare/Android-Clean-Architecture-BookStore/HEAD/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/ui/src/androidTest/resources/org.robolectric.Config.properties:
--------------------------------------------------------------------------------
1 | # Robolectric doesn't know how to support SDK 19 yet.
2 | emulateSdk=18
3 | reportSdk=18
--------------------------------------------------------------------------------
/ui/src/main/res/drawable-hdpi/book1.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amulyakhare/Android-Clean-Architecture-BookStore/HEAD/ui/src/main/res/drawable-hdpi/book1.jpg
--------------------------------------------------------------------------------
/ui/src/main/res/drawable-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amulyakhare/Android-Clean-Architecture-BookStore/HEAD/ui/src/main/res/drawable-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/ui/src/main/res/drawable-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amulyakhare/Android-Clean-Architecture-BookStore/HEAD/ui/src/main/res/drawable-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/ui/src/main/res/drawable-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amulyakhare/Android-Clean-Architecture-BookStore/HEAD/ui/src/main/res/drawable-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/ui/src/main/res/drawable-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amulyakhare/Android-Clean-Architecture-BookStore/HEAD/ui/src/main/res/drawable-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/domain/src/main/res/drawable-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amulyakhare/Android-Clean-Architecture-BookStore/HEAD/domain/src/main/res/drawable-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/domain/src/main/res/drawable-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amulyakhare/Android-Clean-Architecture-BookStore/HEAD/domain/src/main/res/drawable-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/domain/src/main/res/drawable-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amulyakhare/Android-Clean-Architecture-BookStore/HEAD/domain/src/main/res/drawable-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/domain/src/main/res/drawable-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amulyakhare/Android-Clean-Architecture-BookStore/HEAD/domain/src/main/res/drawable-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/framework/src/main/res/drawable-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amulyakhare/Android-Clean-Architecture-BookStore/HEAD/framework/src/main/res/drawable-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/framework/src/main/res/drawable-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amulyakhare/Android-Clean-Architecture-BookStore/HEAD/framework/src/main/res/drawable-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/framework/src/main/res/drawable-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amulyakhare/Android-Clean-Architecture-BookStore/HEAD/framework/src/main/res/drawable-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/framework/src/main/res/drawable-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/amulyakhare/Android-Clean-Architecture-BookStore/HEAD/framework/src/main/res/drawable-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/domain/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/ui/src/main/res/values/styles.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/ui/src/main/res/values/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | 16dp
4 | 16dp
5 |
6 |
--------------------------------------------------------------------------------
/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.1-all.zip
7 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/amulyakhare/domain/interactor/GetBookListUseCase.java:
--------------------------------------------------------------------------------
1 | package com.amulyakhare.domain.interactor;
2 |
3 | /**
4 | * @author amulya
5 | * @datetime 16 Nov 2014, 3:34 PM
6 | */
7 | public interface GetBookListUseCase {
8 |
9 | public void execute();
10 |
11 | }
12 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/amulyakhare/domain/interactor/DownloadBookUseCase.java:
--------------------------------------------------------------------------------
1 | package com.amulyakhare.domain.interactor;
2 |
3 | /**
4 | * @author amulya
5 | * @datetime 16 Nov 2014, 5:00 PM
6 | */
7 | public interface DownloadBookUseCase {
8 |
9 | public void execute(String url);
10 | }
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/amulyakhare/domain/interactor/GetBookDetailUseCase.java:
--------------------------------------------------------------------------------
1 | package com.amulyakhare.domain.interactor;
2 |
3 | /**
4 | * @author amulya
5 | * @datetime 16 Nov 2014, 4:51 PM
6 | */
7 | public interface GetBookDetailUseCase {
8 |
9 | public void execute(int id);
10 | }
11 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | A sample android application built based on principles of Uncle Bob's Clean Architecture as described [here](http://vimeo.com/43612849). Some of the code inspiration comes from this [awesome article](http://fernandocejas.com/2014/09/03/architecting-android-the-clean-way/) and [github repo](https://github.com/android10/Android-CleanArchitecture).
2 |
3 | WORK IN PROGRESS!
4 |
--------------------------------------------------------------------------------
/framework/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
3 |
4 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/ui/src/main/java/com/amulyakhare/bookstore/ui/book/detail/IBookDetailView.java:
--------------------------------------------------------------------------------
1 | package com.amulyakhare.bookstore.ui.book.detail;
2 |
3 | import com.amulyakhare.bookstore.ui.model.BookModel;
4 |
5 | /**
6 | * @author amulya
7 | * @datetime 16 Nov 2014, 4:45 PM
8 | */
9 | public interface IBookDetailView {
10 |
11 | public void renderBookDetail(BookModel bookDetailModel);
12 | }
13 |
--------------------------------------------------------------------------------
/ui/src/main/java/com/amulyakhare/bookstore/ui/application/IPresenter.java:
--------------------------------------------------------------------------------
1 | package com.amulyakhare.bookstore.ui.application;
2 |
3 | /**
4 | * @author amulya
5 | * @datetime 16 Nov 2014, 3:17 PM
6 | */
7 | public interface IPresenter {
8 |
9 | public void onInit();
10 |
11 | public void onResume();
12 |
13 | public void onPause();
14 |
15 | public void onDestroy();
16 | }
17 |
--------------------------------------------------------------------------------
/ui/src/main/res/values/strings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | AppStore
5 | Books
6 | Hello world!
7 | Settings
8 | Details
9 |
10 |
11 |
--------------------------------------------------------------------------------
/ui/src/main/res/values-w820dp/dimens.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 | 64dp
6 |
7 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/amulyakhare/domain/repository/BookRepository.java:
--------------------------------------------------------------------------------
1 | package com.amulyakhare.domain.repository;
2 |
3 | import com.amulyakhare.domain.model.Book;
4 |
5 | import java.util.List;
6 |
7 | /**
8 | * @author amulya
9 | * @datetime 16 Nov 2014, 3:46 PM
10 | */
11 | public interface BookRepository {
12 |
13 | public List getBookList();
14 |
15 | public Book getBook(int id);
16 | }
17 |
--------------------------------------------------------------------------------
/ui/src/main/java/com/amulyakhare/bookstore/ui/book/list/IBookListView.java:
--------------------------------------------------------------------------------
1 | package com.amulyakhare.bookstore.ui.book.list;
2 |
3 | import com.amulyakhare.bookstore.ui.model.BookModel;
4 |
5 | import java.util.List;
6 |
7 | /**
8 | * @author amulya
9 | * @datetime 16 Nov 2014, 3:22 PM
10 | */
11 | public interface IBookListView {
12 |
13 | public void renderBookList(List bookItemModelList);
14 | }
15 |
--------------------------------------------------------------------------------
/ui/src/main/res/layout/activity_home.xml:
--------------------------------------------------------------------------------
1 |
5 |
6 |
10 |
11 |
--------------------------------------------------------------------------------
/ui/src/main/res/menu/menu_home.xml:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/ui/src/main/res/menu/menu_book_detail.xml:
--------------------------------------------------------------------------------
1 |
10 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | #built application files
2 | *.apk
3 | *.ap_
4 |
5 | # files for the dex VM
6 | *.dex
7 |
8 | # Java class files
9 | *.class
10 |
11 | # generated files
12 | bin/
13 | gen/
14 |
15 | # Local configuration file (sdk path, etc)
16 | local.properties
17 |
18 | # Windows thumbnail db
19 | Thumbs.db
20 |
21 | # OSX files
22 | .DS_Store
23 |
24 | # Eclipse project files
25 | .classpath
26 | .project
27 |
28 | # Android Studio
29 | .idea
30 | #.idea/workspace.xml - remove # and delete .idea if it better suit your needs.
31 | .gradle
32 | build/
--------------------------------------------------------------------------------
/ui/src/main/java/com/amulyakhare/bookstore/ui/navigation/Navigator.java:
--------------------------------------------------------------------------------
1 | package com.amulyakhare.bookstore.ui.navigation;
2 |
3 | import android.content.Context;
4 | import android.content.Intent;
5 |
6 | import com.amulyakhare.bookstore.ui.book.detail.BookDetailActivity_;
7 |
8 | /**
9 | * @author amulya
10 | * @datetime 16 Nov 2014, 5:22 PM
11 | */
12 | public class Navigator {
13 |
14 | public static final String BOOK_ID = "BOOK_ID";
15 |
16 | public void navigateToDetail(Context context, int bookId) {
17 | Intent intent = new Intent(context, BookDetailActivity_.class);
18 | intent.putExtra(BOOK_ID, bookId);
19 | context.startActivity(intent);
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/domain/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /home/gardev/android/adt-bundle-linux/sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/ui/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /home/gardev/android/adt-bundle-linux/sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/framework/proguard-rules.pro:
--------------------------------------------------------------------------------
1 | # Add project specific ProGuard rules here.
2 | # By default, the flags in this file are appended to flags specified
3 | # in /home/gardev/android/adt-bundle-linux/sdk/tools/proguard/proguard-android.txt
4 | # You can edit the include path and order by changing the proguardFiles
5 | # directive in build.gradle.
6 | #
7 | # For more details, see
8 | # http://developer.android.com/guide/developing/tools/proguard.html
9 |
10 | # Add any project specific keep options here:
11 |
12 | # If your project uses WebView with JS, uncomment the following
13 | # and specify the fully qualified class name to the JavaScript interface
14 | # class:
15 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview {
16 | # public *;
17 | #}
18 |
--------------------------------------------------------------------------------
/framework/src/main/java/com/amulyakhare/framework/data/BookDataRepository.java:
--------------------------------------------------------------------------------
1 | package com.amulyakhare.framework.data;
2 |
3 | import com.amulyakhare.domain.model.Book;
4 | import com.amulyakhare.domain.repository.BookRepository;
5 |
6 | import java.util.ArrayList;
7 | import java.util.List;
8 |
9 | /**
10 | * @author amulya
11 | * @datetime 16 Nov 2014, 3:53 PM
12 | */
13 | public class BookDataRepository implements BookRepository {
14 |
15 | @Override
16 | public List getBookList() {
17 | List bookList = new ArrayList();
18 | for (int i = 0; i < 3; i++) {
19 | bookList.add(new Book());
20 | }
21 | return bookList;
22 | }
23 |
24 | @Override
25 | public Book getBook(int id) {
26 | return new Book();
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/BookStore.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/gradle.properties:
--------------------------------------------------------------------------------
1 | # Project-wide Gradle settings.
2 |
3 | # IDE (e.g. Android Studio) users:
4 | # Gradle settings configured through the IDE *will override*
5 | # any settings specified in this file.
6 |
7 | # For more details on how to configure your build environment visit
8 | # http://www.gradle.org/docs/current/userguide/build_environment.html
9 |
10 | # Specifies the JVM arguments used for the daemon process.
11 | # The setting is particularly useful for tweaking memory settings.
12 | # Default value: -Xmx10248m -XX:MaxPermSize=256m
13 | # org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8
14 |
15 | # When configured, Gradle will run in incubating parallel mode.
16 | # This option should only be used with decoupled projects. More details, visit
17 | # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects
18 | # org.gradle.parallel=true
--------------------------------------------------------------------------------
/ui/src/main/java/com/amulyakhare/bookstore/ui/application/BookStoreApplication.java:
--------------------------------------------------------------------------------
1 | package com.amulyakhare.bookstore.ui.application;
2 |
3 | import android.app.Application;
4 |
5 | import java.util.Arrays;
6 | import java.util.List;
7 |
8 | import dagger.ObjectGraph;
9 |
10 | /**
11 | * @author amulya
12 | * @datetime 16 Nov 2014, 3:58 PM
13 | */
14 | public class BookStoreApplication extends Application {
15 |
16 | private ObjectGraph graph;
17 |
18 | @Override
19 | public void onCreate() {
20 | super.onCreate();
21 | graph = ObjectGraph.create(getModules().toArray());
22 | }
23 |
24 | protected List