Pārlūkot izejas kodu

Moved user click handlers to presenter

Vadik Sirekanyan 7 gadi atpakaļ
vecāks
revīzija
55cedd5256

+ 2 - 1
app/src/main/java/com/sirekanyan/knigopis/common/BasePresenter.kt

@@ -6,8 +6,9 @@ import io.reactivex.Observable
 import io.reactivex.Single
 import io.reactivex.disposables.CompositeDisposable
 
-abstract class BasePresenter {
+abstract class BasePresenter<V : Any> {
 
+    lateinit var view: V
     private val disposables = CompositeDisposable()
 
     fun <T> Flowable<T>.bind(onSuccess: (T) -> Unit, onError: (Throwable) -> Unit) {

+ 3 - 26
app/src/main/java/com/sirekanyan/knigopis/feature/MainActivity.kt

@@ -18,7 +18,6 @@ import com.sirekanyan.knigopis.common.ResourceProvider
 import com.sirekanyan.knigopis.common.extensions.*
 import com.sirekanyan.knigopis.common.functions.logError
 import com.sirekanyan.knigopis.common.view.dialog.DialogFactory
-import com.sirekanyan.knigopis.common.view.dialog.DialogItem
 import com.sirekanyan.knigopis.common.view.dialog.createDialogItem
 import com.sirekanyan.knigopis.common.view.header.HeaderItemDecoration
 import com.sirekanyan.knigopis.common.view.header.StickyHeaderImpl
@@ -28,13 +27,10 @@ import com.sirekanyan.knigopis.feature.book.createNewBookIntent
 import com.sirekanyan.knigopis.feature.books.BooksAdapter
 import com.sirekanyan.knigopis.feature.profile.createProfileIntent
 import com.sirekanyan.knigopis.feature.user.createUserIntent
-import com.sirekanyan.knigopis.feature.users.UriItem
-import com.sirekanyan.knigopis.feature.users.UsersAdapter
 import com.sirekanyan.knigopis.model.BookDataModel
 import com.sirekanyan.knigopis.model.CurrentTab
 import com.sirekanyan.knigopis.model.CurrentTab.HOME_TAB
 import com.sirekanyan.knigopis.model.CurrentTab.NOTES_TAB
-import com.sirekanyan.knigopis.model.UserModel
 import com.sirekanyan.knigopis.repository.*
 import com.tbruyelle.rxpermissions2.RxPermissions
 import kotlinx.android.synthetic.main.activity_main.*
@@ -56,7 +52,6 @@ class MainActivity : BaseActivity(), Router, MainPresenter.Router {
     private val noteRepository by inject<NoteRepository>()
     private val resourceProvider by inject<ResourceProvider>()
     private val booksAdapter by lazy { BooksAdapter(::onBookClicked, ::onBookLongClicked) }
-    private val usersAdapter by lazy { UsersAdapter(::onUserClicked, ::onUserLongClicked) }
     private var userLoggedIn = false
     private var booksChanged = false
     private lateinit var loginOption: MenuItem
@@ -68,16 +63,15 @@ class MainActivity : BaseActivity(), Router, MainPresenter.Router {
         setTheme(if (config.isDarkTheme) R.style.DarkAppTheme else R.style.AppTheme)
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_main)
-        val view = MainViewImpl(getRootView(), booksAdapter, usersAdapter)
         presenter = MainPresenterImpl(
-            view,
             this,
             config,
             bookRepository,
             userRepository,
-            noteRepository
+            noteRepository,
+            resourceProvider
         ).apply {
-            view.callbacks = this
+            view = MainViewImpl(getRootView(), this, booksAdapter, dialogs)
         }
         booksRecyclerView.addItemDecoration(HeaderItemDecoration(StickyHeaderImpl(booksAdapter)))
         val currentTabId = savedInstanceState?.getInt(CURRENT_TAB_KEY)
@@ -325,21 +319,4 @@ class MainActivity : BaseActivity(), Router, MainPresenter.Router {
         )
     }
 
-    private fun onUserClicked(user: UserModel) {
-        openUserScreen(user.id, user.name, user.image)
-    }
-
-    private fun onUserLongClicked(user: UserModel) {
-        val dialogItems: List<DialogItem> = user.profiles
-            .mapNotNull(String::toUriOrNull)
-            .map { UriItem(it, resourceProvider) }
-            .distinctBy(UriItem::title)
-            .map { uriItem ->
-                createDialogItem(uriItem.title, uriItem.iconRes) {
-                    openWebPage(uriItem.uri)
-                }
-            }
-        dialogs.showDialog(user.name, *dialogItems.toTypedArray())
-    }
-
 }

+ 25 - 4
app/src/main/java/com/sirekanyan/knigopis/feature/MainPresenter.kt

@@ -1,12 +1,17 @@
 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.ResourceProvider
 import com.sirekanyan.knigopis.common.extensions.io2main
+import com.sirekanyan.knigopis.common.extensions.toUriOrNull
 import com.sirekanyan.knigopis.common.functions.logError
+import com.sirekanyan.knigopis.feature.users.UriItem
 import com.sirekanyan.knigopis.model.CurrentTab
 import com.sirekanyan.knigopis.model.CurrentTab.*
 import com.sirekanyan.knigopis.model.NoteModel
+import com.sirekanyan.knigopis.model.UserModel
 import com.sirekanyan.knigopis.repository.BookRepository
 import com.sirekanyan.knigopis.repository.Configuration
 import com.sirekanyan.knigopis.repository.NoteRepository
@@ -23,18 +28,18 @@ interface MainPresenter : Presenter {
         fun reopenScreen()
         fun openNewBookScreen()
         fun openUserScreen(id: String, name: String, image: String?)
+        fun openWebPage(uri: Uri)
     }
-
 }
 
 class MainPresenterImpl(
-    private val view: MainView,
     private val router: MainPresenter.Router,
     private val config: Configuration,
     private val bookRepository: BookRepository,
     private val userRepository: UserRepository,
-    private val noteRepository: NoteRepository
-) : BasePresenter(), MainPresenter, MainView.Callbacks {
+    private val noteRepository: NoteRepository,
+    private val resources: ResourceProvider
+) : BasePresenter<MainView>(), MainPresenter, MainView.Callbacks {
 
     private val loadedTabs = mutableSetOf<CurrentTab>()
 
@@ -71,6 +76,22 @@ class MainPresenterImpl(
         router.openNewBookScreen()
     }
 
+    override fun onUserClicked(user: UserModel) {
+        router.openUserScreen(user.id, user.name, user.image)
+    }
+
+    override fun onUserLongClicked(user: UserModel) {
+        val uriItems = user.profiles
+            .mapNotNull(String::toUriOrNull)
+            .map { UriItem(it, resources) }
+            .distinctBy(UriItem::title)
+        view.showUserProfiles(user.name, uriItems)
+    }
+
+    override fun onUserProfileClicked(uri: UriItem) {
+        router.openWebPage(uri.uri)
+    }
+
     override fun onNoteClicked(note: NoteModel) {
         router.openUserScreen(note.userId, note.userName, note.userImage)
     }

+ 21 - 3
app/src/main/java/com/sirekanyan/knigopis/feature/MainView.kt

@@ -11,8 +11,12 @@ import com.sirekanyan.knigopis.common.extensions.hide
 import com.sirekanyan.knigopis.common.extensions.isVisible
 import com.sirekanyan.knigopis.common.extensions.show
 import com.sirekanyan.knigopis.common.extensions.toast
+import com.sirekanyan.knigopis.common.view.dialog.DialogFactory
+import com.sirekanyan.knigopis.common.view.dialog.DialogItem
+import com.sirekanyan.knigopis.common.view.dialog.createDialogItem
 import com.sirekanyan.knigopis.feature.books.BooksAdapter
 import com.sirekanyan.knigopis.feature.notes.NotesAdapter
+import com.sirekanyan.knigopis.feature.users.UriItem
 import com.sirekanyan.knigopis.feature.users.UsersAdapter
 import com.sirekanyan.knigopis.model.BookModel
 import com.sirekanyan.knigopis.model.CurrentTab
@@ -41,6 +45,7 @@ interface MainView {
     fun showProgress()
     fun hideProgress()
     fun hideSwipeRefresh()
+    fun showUserProfiles(title: String, items: List<UriItem>)
 
     interface Callbacks {
         fun onLoginOptionClicked()
@@ -48,6 +53,9 @@ interface MainView {
         fun onAboutOptionClicked()
         fun onDarkThemeOptionClicked(isChecked: Boolean)
         fun onAddBookClicked()
+        fun onUserClicked(user: UserModel)
+        fun onUserLongClicked(user: UserModel)
+        fun onUserProfileClicked(uri: UriItem)
         fun onNoteClicked(note: NoteModel)
     }
 
@@ -55,13 +63,14 @@ interface MainView {
 
 class MainViewImpl(
     override val containerView: View,
+    private val callbacks: MainView.Callbacks,
     private val booksAdapter: BooksAdapter,
-    private val usersAdapter: UsersAdapter
+    private val dialogs: DialogFactory
 ) : MainView, LayoutContainer {
 
-    lateinit var callbacks: MainView.Callbacks
     private val context = containerView.context
-    private val notesAdapter = NotesAdapter { callbacks.onNoteClicked(it) }
+    private val usersAdapter = UsersAdapter(callbacks::onUserClicked, callbacks::onUserLongClicked)
+    private val notesAdapter = NotesAdapter(callbacks::onNoteClicked)
 
     init {
         toolbar.inflateMenu(R.menu.options)
@@ -157,6 +166,15 @@ class MainViewImpl(
         swipeRefresh.isRefreshing = false
     }
 
+    override fun showUserProfiles(title: String, items: List<UriItem>) {
+        val dialogItems: List<DialogItem> = items.map { uriItem ->
+            createDialogItem(uriItem.title, uriItem.iconRes) {
+                callbacks.onUserProfileClicked(uriItem)
+            }
+        }
+        dialogs.showDialog(title, *dialogItems.toTypedArray())
+    }
+
     private fun handleError(
         throwable: Throwable,
         placeholder: View,