Explorar o código

Added separate presenter and view for notes page

Vadik Sirekanyan %!s(int64=7) %!d(string=hai) anos
pai
achega
b51376f580

+ 12 - 1
app/src/main/java/com/sirekanyan/knigopis/common/extensions/Reactivex.kt

@@ -1,5 +1,6 @@
 package com.sirekanyan.knigopis.common.extensions
 
+import com.sirekanyan.knigopis.feature.ProgressView
 import io.reactivex.Completable
 import io.reactivex.Flowable
 import io.reactivex.Single
@@ -13,4 +14,14 @@ fun <T> Flowable<T>.io2main(): Flowable<T> =
     subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
 
 fun Completable.io2main(): Completable =
-    subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
+    subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread())
+
+fun <T> Flowable<T>.showProgressBar(progress: ProgressView): Flowable<T> =
+    doOnSubscribe {
+        progress.showProgress()
+    }.doOnNext {
+        progress.hideProgress()
+    }.doFinally {
+        progress.hideProgress()
+        progress.hideSwipeRefresh()
+    }

+ 13 - 4
app/src/main/java/com/sirekanyan/knigopis/dependency.kt

@@ -12,8 +12,11 @@ import com.sirekanyan.knigopis.common.extensions.getRootView
 import com.sirekanyan.knigopis.feature.MainPresenter
 import com.sirekanyan.knigopis.feature.MainPresenterImpl
 import com.sirekanyan.knigopis.feature.MainViewImpl
+import com.sirekanyan.knigopis.feature.ProgressViewImpl
 import com.sirekanyan.knigopis.feature.login.LoginPresenterImpl
 import com.sirekanyan.knigopis.feature.login.LoginViewImpl
+import com.sirekanyan.knigopis.feature.notes.NotesPresenterImpl
+import com.sirekanyan.knigopis.feature.notes.NotesViewImpl
 import com.sirekanyan.knigopis.feature.user.UserInteractor
 import com.sirekanyan.knigopis.feature.user.UserInteractorImpl
 import com.sirekanyan.knigopis.model.BookDataModel
@@ -82,19 +85,22 @@ val appModule = applicationContext {
 private fun KoinContext.mainModule() {
     factory {
         val params = it.getContext().createParameters()
-        val loginPresenter = LoginPresenterImpl(it.getRouter(), get(params)).also { p ->
-            p.view = LoginViewImpl(it.getRootView(), p)
-        }
+        val progressView = ProgressViewImpl(it.getRootView(R.id.swipeRefresh))
+        val loginPresenter = LoginPresenterImpl(it.getRouter(), get(params))
+        val notesPresenter = NotesPresenterImpl(get())
         MainPresenterImpl(
             loginPresenter,
+            notesPresenter,
             it.getRouter(),
             get(),
             get(),
             get(),
             get(),
             get(),
-            get()
+            progressView // TODO: remove
         ).also { p ->
+            loginPresenter.view = LoginViewImpl(it.getRootView(), loginPresenter)
+            notesPresenter.view = NotesViewImpl(it.getRootView(R.id.notesPage), p, progressView)
             p.view = MainViewImpl(it.getRootView(), p, get(params))
         } as MainPresenter
     }
@@ -122,6 +128,9 @@ private fun ParameterProvider.getContext(): Context =
 private fun ParameterProvider.getRootView(): View =
     this[ROOT_VIEW_KEY]
 
+private fun ParameterProvider.getRootView(id: Int): View =
+    getRootView().findViewById(id)
+
 private fun <T> ParameterProvider.getRouter(): T =
     this[ROUTER_KEY]
 

+ 16 - 31
app/src/main/java/com/sirekanyan/knigopis/feature/MainPresenter.kt

@@ -5,14 +5,19 @@ import com.sirekanyan.knigopis.common.BasePresenter
 import com.sirekanyan.knigopis.common.Presenter
 import com.sirekanyan.knigopis.common.android.ResourceProvider
 import com.sirekanyan.knigopis.common.extensions.io2main
+import com.sirekanyan.knigopis.common.extensions.showProgressBar
 import com.sirekanyan.knigopis.common.extensions.toUriOrNull
 import com.sirekanyan.knigopis.common.functions.logError
 import com.sirekanyan.knigopis.feature.login.LoginPresenter
+import com.sirekanyan.knigopis.feature.notes.NotesPresenter
+import com.sirekanyan.knigopis.feature.notes.NotesView
 import com.sirekanyan.knigopis.feature.users.MainPresenterState
 import com.sirekanyan.knigopis.model.*
 import com.sirekanyan.knigopis.model.CurrentTab.*
-import com.sirekanyan.knigopis.repository.*
-import io.reactivex.Flowable
+import com.sirekanyan.knigopis.repository.AuthRepository
+import com.sirekanyan.knigopis.repository.BookRepository
+import com.sirekanyan.knigopis.repository.Configuration
+import com.sirekanyan.knigopis.repository.UserRepository
 
 interface MainPresenter : Presenter {
 
@@ -36,16 +41,18 @@ interface MainPresenter : Presenter {
 
 class MainPresenterImpl(
     private val loginPresenter: LoginPresenter,
+    private val notesPresenter: NotesPresenter,
     private val router: MainPresenter.Router,
     private val config: Configuration,
     private val auth: AuthRepository,
     private val bookRepository: BookRepository,
     private val userRepository: UserRepository,
-    private val noteRepository: NoteRepository,
-    private val resources: ResourceProvider
-) : BasePresenter<MainView>(loginPresenter),
+    private val resources: ResourceProvider,
+    private val progressView: ProgressView
+) : BasePresenter<MainView>(loginPresenter, notesPresenter),
     MainPresenter,
-    MainView.Callbacks {
+    MainView.Callbacks,
+    NotesView.Callbacks {
 
     private val loadedTabs = mutableSetOf<CurrentTab>()
     private var currentTab: CurrentTab? = null
@@ -117,7 +124,7 @@ class MainPresenterImpl(
             when (tab) {
                 HOME_TAB -> refreshHomeTab()
                 USERS_TAB -> refreshUsersTab()
-                NOTES_TAB -> refreshNotesTab()
+                NOTES_TAB -> notesPresenter.refresh()
             }
         }
     }
@@ -232,7 +239,7 @@ class MainPresenterImpl(
     private fun refreshHomeTab() {
         bookRepository.observeBooks()
             .io2main()
-            .showProgressBar()
+            .showProgressBar(progressView)
             .bind({ books ->
                 view.updateBooks(books)
             }, {
@@ -244,7 +251,7 @@ class MainPresenterImpl(
     private fun refreshUsersTab() {
         userRepository.observeUsers()
             .io2main()
-            .showProgressBar()
+            .showProgressBar(progressView)
             .bind({ users ->
                 view.updateUsers(users)
             }, {
@@ -253,26 +260,4 @@ class MainPresenterImpl(
             })
     }
 
-    private fun refreshNotesTab() {
-        noteRepository.observeNotes()
-            .io2main()
-            .showProgressBar()
-            .bind({ notes ->
-                view.updateNotes(notes)
-            }, {
-                logError("cannot load notes", it)
-                view.showNotesError(it)
-            })
-    }
-
-    private fun <T> Flowable<T>.showProgressBar(): Flowable<T> =
-        doOnSubscribe {
-            view.showProgress()
-        }.doOnNext {
-            view.hideProgress()
-        }.doFinally {
-            view.hideProgress()
-            view.hideSwipeRefresh()
-        }
-
 }

+ 2 - 35
app/src/main/java/com/sirekanyan/knigopis/feature/MainView.kt

@@ -19,8 +19,6 @@ import com.sirekanyan.knigopis.common.extensions.toast
 import com.sirekanyan.knigopis.common.functions.handleError
 import com.sirekanyan.knigopis.feature.books.BooksAdapter
 import com.sirekanyan.knigopis.feature.books.BooksView
-import com.sirekanyan.knigopis.feature.notes.NotesAdapter
-import com.sirekanyan.knigopis.feature.notes.NotesView
 import com.sirekanyan.knigopis.feature.users.UsersAdapter
 import com.sirekanyan.knigopis.feature.users.UsersView
 import com.sirekanyan.knigopis.model.*
@@ -33,13 +31,10 @@ import kotlinx.android.synthetic.main.books_page.*
 import kotlinx.android.synthetic.main.notes_page.*
 import kotlinx.android.synthetic.main.users_page.*
 
-interface MainView : BooksView, UsersView, NotesView {
+interface MainView : BooksView, UsersView {
 
     fun showAboutDialog()
     fun showPage(tab: CurrentTab)
-    fun showProgress()
-    fun hideProgress()
-    fun hideSwipeRefresh()
     fun showNavigation(isVisible: Boolean)
     fun setNavigation(itemId: Int)
     fun showLoginOption(isVisible: Boolean)
@@ -48,8 +43,7 @@ interface MainView : BooksView, UsersView, NotesView {
 
     interface Callbacks :
         BooksView.Callbacks,
-        UsersView.Callbacks,
-        NotesView.Callbacks {
+        UsersView.Callbacks {
 
         fun onNavigationClicked(itemId: Int)
         fun onToolbarClicked()
@@ -73,7 +67,6 @@ class MainViewImpl(
     private val resources = context.resources
     private val booksAdapter = BooksAdapter(callbacks::onBookClicked, callbacks::onBookLongClicked)
     private val usersAdapter = UsersAdapter(callbacks::onUserClicked, callbacks::onUserLongClicked)
-    private val notesAdapter = NotesAdapter(callbacks::onNoteClicked)
     private val loginOption: MenuItem
     private val profileOption: MenuItem
     private val darkThemeOption: MenuItem
@@ -117,7 +110,6 @@ class MainViewImpl(
         toolbar.menu.findItem(R.id.option_clear_cache).isVisible = BuildConfig.DEBUG
         booksRecyclerView.adapter = booksAdapter
         usersRecyclerView.adapter = usersAdapter
-        notesRecyclerView.adapter = notesAdapter
         booksRecyclerView.addItemDecoration(HeaderItemDecoration(StickyHeaderImpl(booksAdapter)))
         addBookButton.setOnClickListener {
             callbacks.onAddBookClicked()
@@ -159,13 +151,6 @@ class MainViewImpl(
         callbacks.onUsersUpdated()
     }
 
-    override fun updateNotes(notes: List<NoteModel>) {
-        notesPlaceholder.show(notes.isEmpty())
-        notesErrorPlaceholder.hide()
-        notesAdapter.submitList(notes)
-        callbacks.onNotesUpdated()
-    }
-
     override fun showBooksError(throwable: Throwable) {
         handleError(throwable, booksPlaceholder, booksErrorPlaceholder, booksAdapter)
     }
@@ -174,24 +159,6 @@ class MainViewImpl(
         handleError(throwable, usersPlaceholder, usersErrorPlaceholder, usersAdapter)
     }
 
-    override fun showNotesError(throwable: Throwable) {
-        handleError(throwable, notesPlaceholder, notesErrorPlaceholder, notesAdapter)
-    }
-
-    override fun showProgress() {
-        if (!swipeRefresh.isRefreshing) {
-            booksProgressBar.show()
-        }
-    }
-
-    override fun hideProgress() {
-        booksProgressBar.hide()
-    }
-
-    override fun hideSwipeRefresh() {
-        swipeRefresh.isRefreshing = false
-    }
-
     override fun showNavigation(isVisible: Boolean) {
         if (isVisible) {
             bottomNavigation.show()

+ 34 - 0
app/src/main/java/com/sirekanyan/knigopis/feature/ProgressView.kt

@@ -0,0 +1,34 @@
+package com.sirekanyan.knigopis.feature
+
+import android.view.View
+import com.sirekanyan.knigopis.common.extensions.hide
+import com.sirekanyan.knigopis.common.extensions.show
+import kotlinx.android.extensions.LayoutContainer
+import kotlinx.android.synthetic.main.activity_main.*
+
+interface ProgressView {
+    fun showProgress()
+    fun hideProgress()
+    fun hideSwipeRefresh()
+}
+
+class ProgressViewImpl(
+    override val containerView: View
+) : ProgressView,
+    LayoutContainer {
+
+    override fun showProgress() {
+        if (!swipeRefresh.isRefreshing) {
+            booksProgressBar.show()
+        }
+    }
+
+    override fun hideProgress() {
+        booksProgressBar.hide()
+    }
+
+    override fun hideSwipeRefresh() {
+        swipeRefresh.isRefreshing = false
+    }
+
+}

+ 31 - 0
app/src/main/java/com/sirekanyan/knigopis/feature/notes/NotesPresenter.kt

@@ -0,0 +1,31 @@
+package com.sirekanyan.knigopis.feature.notes
+
+import com.sirekanyan.knigopis.common.BasePresenter
+import com.sirekanyan.knigopis.common.Presenter
+import com.sirekanyan.knigopis.common.extensions.io2main
+import com.sirekanyan.knigopis.common.extensions.showProgressBar
+import com.sirekanyan.knigopis.common.functions.logError
+import com.sirekanyan.knigopis.repository.NoteRepository
+
+interface NotesPresenter : Presenter {
+    fun refresh()
+}
+
+class NotesPresenterImpl(
+    private val noteRepository: NoteRepository
+) : BasePresenter<NotesView>(),
+    NotesPresenter {
+
+    override fun refresh() {
+        noteRepository.observeNotes()
+            .io2main()
+            .showProgressBar(view)
+            .bind({ notes ->
+                view.updateNotes(notes)
+            }, {
+                logError("cannot load notes", it)
+                view.showNotesError(it)
+            })
+    }
+
+}

+ 35 - 1
app/src/main/java/com/sirekanyan/knigopis/feature/notes/NotesView.kt

@@ -1,8 +1,15 @@
 package com.sirekanyan.knigopis.feature.notes
 
+import android.view.View
+import com.sirekanyan.knigopis.common.extensions.hide
+import com.sirekanyan.knigopis.common.extensions.show
+import com.sirekanyan.knigopis.common.functions.handleError
+import com.sirekanyan.knigopis.feature.ProgressView
 import com.sirekanyan.knigopis.model.NoteModel
+import kotlinx.android.extensions.LayoutContainer
+import kotlinx.android.synthetic.main.notes_page.*
 
-interface NotesView {
+interface NotesView : ProgressView {
 
     fun updateNotes(notes: List<NoteModel>)
     fun showNotesError(throwable: Throwable)
@@ -12,4 +19,31 @@ interface NotesView {
         fun onNotesUpdated()
     }
 
+}
+
+class NotesViewImpl(
+    override val containerView: View,
+    private val callbacks: NotesView.Callbacks,
+    private val progressView: ProgressView
+) : NotesView,
+    LayoutContainer,
+    ProgressView by progressView {
+
+    private val notesAdapter = NotesAdapter(callbacks::onNoteClicked)
+
+    init {
+        notesRecyclerView.adapter = notesAdapter
+    }
+
+    override fun updateNotes(notes: List<NoteModel>) {
+        notesPlaceholder.show(notes.isEmpty())
+        notesErrorPlaceholder.hide()
+        notesAdapter.submitList(notes)
+        callbacks.onNotesUpdated()
+    }
+
+    override fun showNotesError(throwable: Throwable) {
+        handleError(throwable, notesPlaceholder, notesErrorPlaceholder, notesAdapter)
+    }
+
 }