Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Practical Android Architecture

Practical Android Architecture

Covers several Android App Architecture such as MVP, MVVM, MVC. Demonstrates how specific architecture can help solving problems with different set of incoming parameters, such as absence of API or UI/UX designs.
https://youtu.be/BklGDBXpDbo

Avatar for Sergii Kozyrev

Sergii Kozyrev

June 18, 2019
Tweet

More Decks by Sergii Kozyrev

Other Decks in Programming

Transcript

  1. Maintainability Easy to fix and maintain. Benefits of having Architecture

    Testability Easy to cover with tests. Extensibility Easy to add new features.
  2. Note: this could be a controversial topic because some developers

    clarify that MVC, MVP, MVVM (or any other) are not architecture patterns but design patterns for the presentation layer (because the true architecture as such is ‘the layers architecture’) What are the currently widely used Android Application Architectures?
  3. Interactor Interactor Clean Architecture Interactor Use Case Entities Domain DataSource

    Data VP/VM Presentation API, db, sensors Framework Platform Agnostic
  4. Interactor Interactor Clean Architecture Interactor Use Case Entities Domain DataSource

    Data VP/VM Presentation API, db, sensors Framework Platform Agnostic ???
  5. Data-Framework Dependency Inversion Usual Setup Dependency Inversion class RoomDatabase {

    fun requestItems(): List<String> = listOf() } class DataRepository { private val roomDatabase = RoomDatabase() fun requestItems(): List<String> = roomDatabase.requestItems() } // Inversion of control applied class DataRepository2(private val roomDatabase: RoomDatabase) { fun requestItems(): List<String> { val result = roomDatabase.requestItems() return result } }
  6. Data-Framework Dependency Inversion Usual Setup Dependency Inversion interface DataPersistence {

    fun requestItems(): List<String> } class DataRepository3(private val dataPersistence: DataPersistence) { fun requestItems(): List<String> { val result = dataPersistence.requestItems() return result } } class RoomDatabase2 : DataPersistence { override fun requestItems(): List<String> = listOf() }
  7. Clean Architecture / VIPER Interface *View *Router Presenter Aka UseCase

    Interactor DataSource Entity Interface View Interface Router
  8. Simple VIPER Setup Abstraction Implementation interface ViewCallbacks interface Router abstract

    class Interactor<RequestModel, ResponseModel>(val subscribeOn: Scheduler, val observeOn: Scheduler) { fun execute(requestModel: RequestModel, consumer: Consumer<in ResponseModel>) {...} protected abstract fun createObservable(requestModel: RequestModel): Observable<ResponseModel> } abstract class Presenter<V : ViewCallbacks> { fun takeView(view: V) { ... } } abstract class ViperPresenter<V : ViewCallbacks, R : Router> : Presenter<V>() { fun takeRouter(router: R) { ... } } Client Code
  9. Simple VIPER Setup Abstraction interface MyViewCallbacks : ViewCallbacks {fun showUserProfile()}

    interface MyRouter : Router { fun navigateToLogin() } class MyInteractor : Interactor<String, ByteArray>(Schedulers.trampoline(), Schedulers.io()) { override fun createObservable(requestModel: String): Observable<ByteArray> { ... } } class MyPresenter(val interactor: MyInteractor) : ViperPresenter<MyViewCallbacks, MyRouter>() { override fun onTakeView(view: MyViewCallbacks) { interactor.execute("param", Consumer { }) } } Implementation Client Code
  10. Simple VIPER Setup Abstraction class MyActivity : MyViewCallbacks, MyRouter {

    // Comes from [MyViewCallbacks] override fun showUserProfile() {} // Comes from [MyRouter] override fun navigateToLogin() {} fun onCreate() { val presenter = MyPresenter(MyInteractor()) presenter.takeRouter(this) presenter.takeView(this) } } Implementation Client Code
  11. REAL PROJECT STORY #1 Project Brief: • User story-boards provided

    • Grayscale designs provided, but subject to change • API partially ready • No Business rules available yet
  12. REAL PROJECT STORY #1 • User story-boards provided • Grayscale

    designs provided, but subject to change • API partially ready • No Business rules available yet View<Interface> SampleActivity SampleFragment View Presenter<Interface> Presenter Repository Model Notify User Interaction Ask View to setup itself Update Data State Initial Solution MVP
  13. REAL PROJECT STORY #1 • User story-boards provided • Grayscale

    designs provided, but subject to change • API partially ready • No Business rules available yet View<Interface> SampleActivity SampleFragment View Presenter<Interface> Presenter Repository Model Notify User Interaction Ask View to setup itself Update Data State Initial Solution MVP
  14. REAL PROJECT STORY #1 • User story-boards provided • Grayscale

    designs provided, but subject to change • API partially ready • No Business rules available yet View<Interface> SampleActivity SampleFragment View Presenter<Interface> Presenter Repository Model Notify User Interaction Ask View to setup itself Update Data State Initial Solution MVP
  15. REAL PROJECT STORY #1 • User story-boards provided • Grayscale

    designs provided, but subject to change • API partially ready • No Business rules available yet View<Interface> SampleActivity SampleFragment View Presenter<Interface> Presenter Repository Model Notify User Interaction Ask View to setup itself Update Data State Initial Solution MVP
  16. REAL PROJECT STORY #1 • User story-boards provided • Grayscale

    designs provided, but subject to change • API partially ready • No Business rules available yet View<Interface> SampleActivity SampleFragment View Presenter<Interface> Presenter Repository Model Notify User Interaction Ask View to setup itself Update Data State Initial Solution MVP
  17. REAL PROJECT STORY #1 • User story-boards provided • Grayscale

    designs provided, but subject to change • API partially ready • No Business rules available yet View<Interface> SampleActivity SampleFragment View Presenter<Interface> Presenter Repository Model Notify User Interaction Ask View to setup itself Update Data State View<Interface> SampleActivity SampleFragment View Repository Model Initial Solution MVP
  18. REAL PROJECT STORY #1 Project Brief: • User story-boards provided

    • Grayscale designs provided, but subject to change • API partially ready • No Business rules available yet
  19. REAL PROJECT STORY #1 • User story-boards provided • Grayscale

    designs provided, but subject to change • API partially ready • No Business rules available yet Final Solution VIPER
  20. REAL PROJECT STORY #1 • User story-boards provided • Grayscale

    designs provided, but subject to change • API partially ready • No Business rules available yet Interface *View *Router Presenter Aka UseCase Interactor DataSource Entity Interface View Interface Router Final Solution VIPER
  21. REAL PROJECT STORY #1 • User story-boards provided • Grayscale

    designs provided, but subject to change • API partially ready • No Business rules available yet Interface *View *Router Presenter Aka UseCase Interactor DataSource Entity Interface View Interface Router Final Solution VIPER
  22. REAL PROJECT STORY #1 • User story-boards provided • Grayscale

    designs provided, but subject to change • API partially ready • No Business rules available yet Interface *View *Router Presenter Aka UseCase Interactor DataSource Entity Interface View Interface Router Final Solution VIPER
  23. REAL PROJECT STORY #1 • User story-boards provided • Grayscale

    designs provided, but subject to change • API partially ready • No Business rules available yet Interface *View *Router Presenter Aka UseCase Interactor DataSource Entity Interface View Interface Router Final Solution VIPER
  24. REAL PROJECT STORY #1 • User story-boards provided • Grayscale

    designs provided, but subject to change • API partially ready • No Business rules available yet Interface *View *Router Presenter Aka UseCase Interactor DataSource Entity Interface View Interface Router Final Solution VIPER
  25. REAL PROJECT STORY #1 • User story-boards provided • Grayscale

    designs provided, but subject to change • API partially ready • No Business rules available yet Interface *View *Router Presenter Aka UseCase Interactor DataSource Entity Interface View Interface Router Aka UseCase Interactor DataSource Entity Interface Router Final Solution VIPER
  26. REAL PROJECT STORY #2 Project Brief: • UI/UX Design ready

    • Private WebAPI • No Business rules available yet
  27. REAL PROJECT STORY #2 • UI/UX Design ready • Private

    WebAPI • No Business rules available yet View<Interface> SampleActivity SampleFragment View Presenter<Interface> Presenter Repository Model Notify User Interaction Ask View to setup itself Update Data State Initial Solution MVP
  28. REAL PROJECT STORY #2 • UI/UX Design ready • Private

    WebAPI • No Business rules available yet View<Interface> SampleActivity SampleFragment View Presenter<Interface> Presenter Repository Model Notify User Interaction Ask View to setup itself Update Data State Initial Solution MVP
  29. REAL PROJECT STORY #2 • UI/UX Design ready • Private

    WebAPI • No Business rules available yet View<Interface> SampleActivity SampleFragment View Presenter<Interface> Presenter Repository Model Notify User Interaction Ask View to setup itself Update Data State Initial Solution MVP
  30. REAL PROJECT STORY #2 • UI/UX Design ready • Private

    WebAPI • No Business rules available yet View<Interface> SampleActivity SampleFragment View Presenter<Interface> Presenter Repository Model Notify User Interaction Ask View to setup itself Update Data State Initial Solution MVP
  31. REAL PROJECT STORY #2 • UI/UX Design ready • Private

    WebAPI • No Business rules available yet View<Interface> SampleActivity SampleFragment View Presenter<Interface> Presenter Repository Model Notify User Interaction Ask View to setup itself Update Data State View<Interface> SampleActivity SampleFragment View Repository Model Initial Solution MVP Presenter<Interface> Presenter
  32. REAL PROJECT STORY #2 Project Brief: • UI/UX Design ready

    • Private WebAPI • No Business rules available yet
  33. REAL PROJECT STORY #2 • UI/UX Design ready • Private

    WebAPI • No Business rules available yet SampleActivity SampleFragment sample_activity.xml View Presenter<Interface> SampleActivity ViewModel Repository Model Notify User Interaction Observe ViewState Update Data State Final Solution MVVM
  34. REAL PROJECT STORY #2 • UI/UX Design ready • Private

    WebAPI • No Business rules available yet SampleActivity SampleFragment sample_activity.xml View Presenter<Interface> SampleActivity ViewModel Repository Model Notify User Interaction Observe ViewState Update Data State Final Solution MVVM
  35. REAL PROJECT STORY #2 • UI/UX Design ready • Private

    WebAPI • No Business rules available yet SampleActivity SampleFragment sample_activity.xml View Presenter<Interface> SampleActivity ViewModel Repository Model Notify User Interaction Observe ViewState Update Data State Final Solution MVVM
  36. REAL PROJECT STORY #2 • UI/UX Design ready • Private

    WebAPI • No Business rules available yet SampleActivity SampleFragment sample_activity.xml View Presenter<Interface> SampleActivity ViewModel Repository Model Notify User Interaction Observe ViewState Update Data State Final Solution MVVM
  37. REAL PROJECT STORY #2 • UI/UX Design ready • Private

    WebAPI • No Business rules available yet SampleActivity SampleFragment sample_activity.xml View Presenter<Interface> SampleActivity ViewModel Repository Model Notify User Interaction Observe ViewState Update Data State SampleActivity SampleFragment sample_activity.xml View Repository Model Final Solution MVVM ViewModel<Interface> SampleViewModel ViewModel
  38. Useful Links Modular App Architecture https://www.youtube.com/watch?v=PZBg5DIzNww App Architecture with Kotlin:

    https://www.youtube.com/watch?v=Sy6ZdgqrQp0 Architecture sample: https://github.com/googlesamples/android-architecture @kozyrevsergey89 [email protected] Q&A