This project represent a proof of concept inspired by the VIPER architecture (See https://www.objc.io/issues/13-architecture/viper/).
- The main objective is to evaluate the architecture (using it into "Real world" use cases) finding a balance between flexibility, modularity, loose coupling and overhead.
- Secondly it is intended as a blue print for future projects defining a set of useful libraries, frameworks and best practices.
- Thirdly it is a good way to use some APIs to improve my experience on it (MediaRecorder, Camera API)
Here is a list of libraries/frameworks I integrated:
- Butterknife: to inject views in UI code and avoid findViewById and click listeners boilerplate
- Leak Canary: a very nice memory leak detection library to be sure to not leak activities etc
- Dagger 2: for Dependency Injection. It is a quite complex framework and still is not used at its full potential (Still work in progress)
- RxJava and RxAndroid: used on the interactor layer at the moment to schedule in a nice compact way the data store or network calls on the background thread and having the observer publishing results on the UI thread.
- Stetho: to live inspect the UI and the network usage
For testing:
- Mockito
- JUnit
- Hamcrest
- Roboeletric
Integrated some AppCompat elements:
- Navigation view
- Snackbar
- Toolbar
- FloatingActionButton
Still TODOs:
- General code polishing
- Improve Dagger usage (implementing the activity context for example)
- Integrating Espresso for UI Testing
- General clean up and adding Null/NotNull annotations
- Adding more presenters and interactors tests
- Need to put the MediaRecorder on background thread?
- Move Camera API to interactor and adding reactive behaviour