Parcourir la source

Added separate presenter and view for users page

Vadik Sirekanyan il y a 7 ans
Parent
commit
335dddd02b

+ 7 - 3
app/src/main/java/com/sirekanyan/knigopis/dependency.kt

@@ -19,6 +19,8 @@ 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.feature.users.UsersPresenterImpl
+import com.sirekanyan.knigopis.feature.users.UsersViewImpl
 import com.sirekanyan.knigopis.model.BookDataModel
 import com.sirekanyan.knigopis.model.BookHeaderModel
 import com.sirekanyan.knigopis.model.BookModel
@@ -87,21 +89,23 @@ private fun KoinContext.mainModule() {
         val params = it.getContext().createParameters()
         val progressView = ProgressViewImpl(it.getRootView(R.id.swipeRefresh))
         val loginPresenter = LoginPresenterImpl(it.getRouter(), get(params))
+        val usersPresenter = UsersPresenterImpl(get(), get())
         val notesPresenter = NotesPresenterImpl(get())
         MainPresenterImpl(
             loginPresenter,
+            usersPresenter,
             notesPresenter,
             it.getRouter(),
             get(),
             get(),
             get(),
-            get(),
-            get(),
             progressView // TODO: remove
         ).also { p ->
+            val dialogs: DialogFactory = get(params)
             loginPresenter.view = LoginViewImpl(it.getRootView(), loginPresenter)
+            usersPresenter.view = UsersViewImpl(it.getRootView(R.id.usersPage), p, progressView, dialogs)
             notesPresenter.view = NotesViewImpl(it.getRootView(R.id.notesPage), p, progressView)
-            p.view = MainViewImpl(it.getRootView(), p, get(params))
+            p.view = MainViewImpl(it.getRootView(), p, dialogs)
         } as MainPresenter
     }
 }

+ 6 - 23
app/src/main/java/com/sirekanyan/knigopis/feature/MainPresenter.kt

@@ -3,21 +3,20 @@ package com.sirekanyan.knigopis.feature
 import android.net.Uri
 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.feature.users.UsersPresenter
+import com.sirekanyan.knigopis.feature.users.UsersView
 import com.sirekanyan.knigopis.model.*
 import com.sirekanyan.knigopis.model.CurrentTab.*
 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 {
 
@@ -41,17 +40,17 @@ interface MainPresenter : Presenter {
 
 class MainPresenterImpl(
     private val loginPresenter: LoginPresenter,
+    private val usersPresenter: UsersPresenter,
     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 resources: ResourceProvider,
     private val progressView: ProgressView
 ) : BasePresenter<MainView>(loginPresenter, notesPresenter),
     MainPresenter,
     MainView.Callbacks,
+    UsersView.Callbacks,
     NotesView.Callbacks {
 
     private val loadedTabs = mutableSetOf<CurrentTab>()
@@ -123,7 +122,7 @@ class MainPresenterImpl(
         if (isFirst || isForce) {
             when (tab) {
                 HOME_TAB -> refreshHomeTab()
-                USERS_TAB -> refreshUsersTab()
+                USERS_TAB -> usersPresenter.refresh()
                 NOTES_TAB -> notesPresenter.refresh()
             }
         }
@@ -209,11 +208,7 @@ class MainPresenterImpl(
     }
 
     override fun onUserLongClicked(user: UserModel) {
-        val uriItems = user.profiles
-            .mapNotNull(String::toUriOrNull)
-            .map { ProfileItem(it, resources) }
-            .distinctBy(ProfileItem::title)
-        view.showUserProfiles(user.name, uriItems)
+        usersPresenter.showUserProfiles(user)
     }
 
     override fun onUserProfileClicked(uri: ProfileItem) {
@@ -248,16 +243,4 @@ class MainPresenterImpl(
             })
     }
 
-    private fun refreshUsersTab() {
-        userRepository.observeUsers()
-            .io2main()
-            .showProgressBar(progressView)
-            .bind({ users ->
-                view.updateUsers(users)
-            }, {
-                logError("cannot load users", it)
-                view.showUsersError(it)
-            })
-    }
-
 }

+ 5 - 31
app/src/main/java/com/sirekanyan/knigopis/feature/MainView.kt

@@ -8,7 +8,6 @@ import android.view.View
 import com.sirekanyan.knigopis.BuildConfig
 import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.android.dialog.DialogFactory
-import com.sirekanyan.knigopis.common.android.dialog.DialogItem
 import com.sirekanyan.knigopis.common.android.dialog.createDialogItem
 import com.sirekanyan.knigopis.common.android.header.HeaderItemDecoration
 import com.sirekanyan.knigopis.common.android.header.StickyHeaderImpl
@@ -19,9 +18,9 @@ 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.users.UsersAdapter
-import com.sirekanyan.knigopis.feature.users.UsersView
-import com.sirekanyan.knigopis.model.*
+import com.sirekanyan.knigopis.model.BookDataModel
+import com.sirekanyan.knigopis.model.BookModel
+import com.sirekanyan.knigopis.model.CurrentTab
 import com.sirekanyan.knigopis.model.CurrentTab.*
 import com.sirekanyan.knigopis.repository.cache.COMMON_PREFS_NAME
 import kotlinx.android.extensions.LayoutContainer
@@ -31,7 +30,7 @@ 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 {
+interface MainView : BooksView {
 
     fun showAboutDialog()
     fun showPage(tab: CurrentTab)
@@ -41,10 +40,7 @@ interface MainView : BooksView, UsersView {
     fun showProfileOption(isVisible: Boolean)
     fun setDarkThemeOptionChecked(isChecked: Boolean)
 
-    interface Callbacks :
-        BooksView.Callbacks,
-        UsersView.Callbacks {
-
+    interface Callbacks : BooksView.Callbacks {
         fun onNavigationClicked(itemId: Int)
         fun onToolbarClicked()
         fun onLoginOptionClicked()
@@ -66,7 +62,6 @@ class MainViewImpl(
     private val context = containerView.context
     private val resources = context.resources
     private val booksAdapter = BooksAdapter(callbacks::onBookClicked, callbacks::onBookLongClicked)
-    private val usersAdapter = UsersAdapter(callbacks::onUserClicked, callbacks::onUserLongClicked)
     private val loginOption: MenuItem
     private val profileOption: MenuItem
     private val darkThemeOption: MenuItem
@@ -109,7 +104,6 @@ class MainViewImpl(
         darkThemeOption = toolbar.menu.findItem(R.id.option_dark_theme)
         toolbar.menu.findItem(R.id.option_clear_cache).isVisible = BuildConfig.DEBUG
         booksRecyclerView.adapter = booksAdapter
-        usersRecyclerView.adapter = usersAdapter
         booksRecyclerView.addItemDecoration(HeaderItemDecoration(StickyHeaderImpl(booksAdapter)))
         addBookButton.setOnClickListener {
             callbacks.onAddBookClicked()
@@ -144,21 +138,10 @@ class MainViewImpl(
         callbacks.onBooksUpdated()
     }
 
-    override fun updateUsers(users: List<UserModel>) {
-        usersPlaceholder.show(users.isEmpty())
-        usersErrorPlaceholder.hide()
-        usersAdapter.submitList(users)
-        callbacks.onUsersUpdated()
-    }
-
     override fun showBooksError(throwable: Throwable) {
         handleError(throwable, booksPlaceholder, booksErrorPlaceholder, booksAdapter)
     }
 
-    override fun showUsersError(throwable: Throwable) {
-        handleError(throwable, usersPlaceholder, usersErrorPlaceholder, usersAdapter)
-    }
-
     override fun showNavigation(isVisible: Boolean) {
         if (isVisible) {
             bottomNavigation.show()
@@ -218,13 +201,4 @@ class MainViewImpl(
         context.toast(R.string.books_error_delete)
     }
 
-    override fun showUserProfiles(title: String, items: List<ProfileItem>) {
-        val dialogItems: List<DialogItem> = items.map { uriItem ->
-            createDialogItem(uriItem.title, uriItem.iconRes) {
-                callbacks.onUserProfileClicked(uriItem)
-            }
-        }
-        dialogs.showDialog(title, *dialogItems.toTypedArray())
-    }
-
 }

+ 44 - 0
app/src/main/java/com/sirekanyan/knigopis/feature/users/UsersPresenter.kt

@@ -0,0 +1,44 @@
+package com.sirekanyan.knigopis.feature.users
+
+import com.sirekanyan.knigopis.common.BasePresenter
+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.model.ProfileItem
+import com.sirekanyan.knigopis.model.UserModel
+import com.sirekanyan.knigopis.repository.UserRepository
+
+interface UsersPresenter {
+    fun refresh()
+    fun showUserProfiles(user: UserModel)
+}
+
+class UsersPresenterImpl(
+    private val userRepository: UserRepository,
+    private val resources: ResourceProvider
+) : BasePresenter<UsersView>(),
+    UsersPresenter {
+
+    override fun refresh() {
+        userRepository.observeUsers()
+            .io2main()
+            .showProgressBar(view)
+            .bind({ users ->
+                view.updateUsers(users)
+            }, {
+                logError("cannot load users", it)
+                view.showUsersError(it)
+            })
+    }
+
+    override fun showUserProfiles(user: UserModel) {
+        val uriItems = user.profiles
+            .mapNotNull(String::toUriOrNull)
+            .map { ProfileItem(it, resources) }
+            .distinctBy(ProfileItem::title)
+        view.showUserProfiles(user.name, uriItems)
+    }
+
+}

+ 48 - 1
app/src/main/java/com/sirekanyan/knigopis/feature/users/UsersView.kt

@@ -1,9 +1,19 @@
 package com.sirekanyan.knigopis.feature.users
 
+import android.view.View
+import com.sirekanyan.knigopis.common.android.dialog.DialogFactory
+import com.sirekanyan.knigopis.common.android.dialog.DialogItem
+import com.sirekanyan.knigopis.common.android.dialog.createDialogItem
+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.ProfileItem
 import com.sirekanyan.knigopis.model.UserModel
+import kotlinx.android.extensions.LayoutContainer
+import kotlinx.android.synthetic.main.users_page.*
 
-interface UsersView {
+interface UsersView : ProgressView {
 
     fun updateUsers(users: List<UserModel>)
     fun showUsersError(throwable: Throwable)
@@ -16,4 +26,41 @@ interface UsersView {
         fun onUsersUpdated()
     }
 
+}
+
+class UsersViewImpl(
+    override val containerView: View,
+    private val callbacks: UsersView.Callbacks,
+    private val progressView: ProgressView,
+    private val dialogs: DialogFactory
+) : UsersView,
+    LayoutContainer,
+    ProgressView by progressView {
+
+    private val usersAdapter = UsersAdapter(callbacks::onUserClicked, callbacks::onUserLongClicked)
+
+    init {
+        usersRecyclerView.adapter = usersAdapter
+    }
+
+    override fun updateUsers(users: List<UserModel>) {
+        usersPlaceholder.show(users.isEmpty())
+        usersErrorPlaceholder.hide()
+        usersAdapter.submitList(users)
+        callbacks.onUsersUpdated()
+    }
+
+    override fun showUsersError(throwable: Throwable) {
+        handleError(throwable, usersPlaceholder, usersErrorPlaceholder, usersAdapter)
+    }
+
+    override fun showUserProfiles(title: String, items: List<ProfileItem>) {
+        val dialogItems: List<DialogItem> = items.map { uriItem ->
+            createDialogItem(uriItem.title, uriItem.iconRes) {
+                callbacks.onUserProfileClicked(uriItem)
+            }
+        }
+        dialogs.showDialog(title, *dialogItems.toTypedArray())
+    }
+
 }