Selaa lähdekoodia

Moved book click handlers to presenter

Vadik Sirekanyan 7 vuotta sitten
vanhempi
commit
18b05d147f

+ 5 - 54
app/src/main/java/com/sirekanyan/knigopis/feature/MainActivity.kt

@@ -18,13 +18,9 @@ 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.createDialogItem
-import com.sirekanyan.knigopis.common.view.header.HeaderItemDecoration
-import com.sirekanyan.knigopis.common.view.header.StickyHeaderImpl
 import com.sirekanyan.knigopis.createParameters
 import com.sirekanyan.knigopis.feature.book.createEditBookIntent
 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.model.BookDataModel
@@ -51,7 +47,6 @@ class MainActivity : BaseActivity(), Router, MainPresenter.Router {
     private val userRepository by inject<UserRepository>()
     private val noteRepository by inject<NoteRepository>()
     private val resourceProvider by inject<ResourceProvider>()
-    private val booksAdapter by lazy { BooksAdapter(::onBookClicked, ::onBookLongClicked) }
     private var userLoggedIn = false
     private var booksChanged = false
     private lateinit var loginOption: MenuItem
@@ -71,9 +66,8 @@ class MainActivity : BaseActivity(), Router, MainPresenter.Router {
             noteRepository,
             resourceProvider
         ).apply {
-            view = MainViewImpl(getRootView(), this, booksAdapter, dialogs)
+            view = MainViewImpl(getRootView(), this, dialogs)
         }
-        booksRecyclerView.addItemDecoration(HeaderItemDecoration(StickyHeaderImpl(booksAdapter)))
         val currentTabId = savedInstanceState?.getInt(CURRENT_TAB_KEY)
         val currentTab = currentTabId?.let { CurrentTab.getByItemId(it) }
         val defaultTab = if (auth.isAuthorized()) HOME_TAB else NOTES_TAB
@@ -253,6 +247,10 @@ class MainActivity : BaseActivity(), Router, MainPresenter.Router {
         })
     }
 
+    override fun forceRefresh() {
+        refresh(isForce = true)
+    }
+
     private fun refreshOptionsMenu() {
         initNavigationView()
         auth.isAuthorized().let { authorized ->
@@ -272,51 +270,4 @@ class MainActivity : BaseActivity(), Router, MainPresenter.Router {
         presenter.showPage(tab, isForce)
     }
 
-    private fun onBookClicked(book: BookDataModel) {
-        openBookScreen(book)
-    }
-
-    private fun onBookLongClicked(book: BookDataModel) {
-        val bookFullTitle = resources.getFullTitleString(book.title, book.author)
-        val onDeleteConfirmed = {
-            if (book.isFinished) {
-                api.deleteFinishedBook(book.id, auth.getAccessToken())
-            } else {
-                api.deletePlannedBook(book.id, auth.getAccessToken())
-            }
-                .io2main()
-                .bind({
-                    refresh(isForce = true)
-                }, {
-                    toast(R.string.books_error_delete)
-                    logError("cannot delete finished book", it)
-                })
-        }
-        val onDeleteClicked = {
-            AlertDialog.Builder(this)
-                .setTitle(R.string.books_title_confirm_delete)
-                .setMessage(
-                    getString(
-                        R.string.books_message_confirm_delete,
-                        bookFullTitle
-                    )
-                )
-                .setNegativeButton(R.string.common_button_cancel) { d, _ -> d.dismiss() }
-                .setPositiveButton(R.string.books_button_confirm_delete) { d, _ ->
-                    onDeleteConfirmed()
-                    d.dismiss()
-                }
-                .show()
-        }
-        dialogs.showDialog(
-            bookFullTitle,
-            createDialogItem(R.string.books_button_edit, R.drawable.ic_edit) {
-                openBookScreen(book)
-            },
-            createDialogItem(R.string.books_button_delete, R.drawable.ic_delete) {
-                onDeleteClicked()
-            }
-        )
-    }
-
 }

+ 30 - 0
app/src/main/java/com/sirekanyan/knigopis/feature/MainPresenter.kt

@@ -8,6 +8,7 @@ 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.BookDataModel
 import com.sirekanyan.knigopis.model.CurrentTab
 import com.sirekanyan.knigopis.model.CurrentTab.*
 import com.sirekanyan.knigopis.model.NoteModel
@@ -24,9 +25,11 @@ interface MainPresenter : Presenter {
 
     interface Router {
         fun login()
+        fun forceRefresh()
         fun openProfileScreen()
         fun reopenScreen()
         fun openNewBookScreen()
+        fun openBookScreen(book: BookDataModel)
         fun openUserScreen(id: String, name: String, image: String?)
         fun openWebPage(uri: Uri)
     }
@@ -76,6 +79,33 @@ class MainPresenterImpl(
         router.openNewBookScreen()
     }
 
+    override fun onBookClicked(book: BookDataModel) {
+        router.openBookScreen(book)
+    }
+
+    override fun onBookLongClicked(book: BookDataModel) {
+        view.showBookActions(book)
+    }
+
+    override fun onEditBookClicked(book: BookDataModel) {
+        router.openBookScreen(book)
+    }
+
+    override fun onDeleteBookClicked(book: BookDataModel) {
+        view.showBookDeleteDialog(book)
+    }
+
+    override fun onDeleteBookConfirmed(book: BookDataModel) {
+        bookRepository.deleteBook(book)
+            .io2main()
+            .bind({
+                router.forceRefresh()
+            }, {
+                view.showBookDeleteError()
+                logError("cannot delete finished book", it)
+            })
+    }
+
     override fun onUserClicked(user: UserModel) {
         router.openUserScreen(user.id, user.name, user.image)
     }

+ 45 - 9
app/src/main/java/com/sirekanyan/knigopis/feature/MainView.kt

@@ -7,22 +7,18 @@ import android.view.View
 import android.widget.TextView
 import com.sirekanyan.knigopis.BuildConfig
 import com.sirekanyan.knigopis.R
-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.extensions.*
 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
 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
+import com.sirekanyan.knigopis.model.*
 import com.sirekanyan.knigopis.model.CurrentTab.*
-import com.sirekanyan.knigopis.model.NoteModel
-import com.sirekanyan.knigopis.model.UserModel
 import com.sirekanyan.knigopis.repository.cache.COMMON_PREFS_NAME
 import kotlinx.android.extensions.LayoutContainer
 import kotlinx.android.synthetic.main.about.view.*
@@ -45,6 +41,9 @@ interface MainView {
     fun showProgress()
     fun hideProgress()
     fun hideSwipeRefresh()
+    fun showBookActions(book: BookDataModel)
+    fun showBookDeleteDialog(book: BookDataModel)
+    fun showBookDeleteError()
     fun showUserProfiles(title: String, items: List<UriItem>)
 
     interface Callbacks {
@@ -53,6 +52,11 @@ interface MainView {
         fun onAboutOptionClicked()
         fun onDarkThemeOptionClicked(isChecked: Boolean)
         fun onAddBookClicked()
+        fun onEditBookClicked(book: BookDataModel)
+        fun onDeleteBookClicked(book: BookDataModel)
+        fun onDeleteBookConfirmed(book: BookDataModel)
+        fun onBookClicked(book: BookDataModel)
+        fun onBookLongClicked(book: BookDataModel)
         fun onUserClicked(user: UserModel)
         fun onUserLongClicked(user: UserModel)
         fun onUserProfileClicked(uri: UriItem)
@@ -64,11 +68,12 @@ interface MainView {
 class MainViewImpl(
     override val containerView: View,
     private val callbacks: MainView.Callbacks,
-    private val booksAdapter: BooksAdapter,
     private val dialogs: DialogFactory
 ) : MainView, LayoutContainer {
 
     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 notesAdapter = NotesAdapter(callbacks::onNoteClicked)
 
@@ -105,6 +110,7 @@ class MainViewImpl(
         booksRecyclerView.adapter = booksAdapter
         usersRecyclerView.adapter = usersAdapter
         notesRecyclerView.adapter = notesAdapter
+        booksRecyclerView.addItemDecoration(HeaderItemDecoration(StickyHeaderImpl(booksAdapter)))
         addBookButton.setOnClickListener {
             callbacks.onAddBookClicked()
         }
@@ -166,6 +172,36 @@ class MainViewImpl(
         swipeRefresh.isRefreshing = false
     }
 
+    override fun showBookActions(book: BookDataModel) {
+        val bookFullTitle = resources.getFullTitleString(book.title, book.author)
+        dialogs.showDialog(
+            bookFullTitle,
+            createDialogItem(R.string.books_button_edit, R.drawable.ic_edit) {
+                callbacks.onEditBookClicked(book)
+            },
+            createDialogItem(R.string.books_button_delete, R.drawable.ic_delete) {
+                callbacks.onDeleteBookClicked(book)
+            }
+        )
+    }
+
+    override fun showBookDeleteDialog(book: BookDataModel) {
+        val bookFullTitle = resources.getFullTitleString(book.title, book.author)
+        AlertDialog.Builder(context)
+            .setTitle(R.string.books_title_confirm_delete)
+            .setMessage(context.getString(R.string.books_message_confirm_delete, bookFullTitle))
+            .setNegativeButton(R.string.common_button_cancel) { d, _ -> d.dismiss() }
+            .setPositiveButton(R.string.books_button_confirm_delete) { d, _ ->
+                callbacks.onDeleteBookConfirmed(book)
+                d.dismiss()
+            }
+            .show()
+    }
+
+    override fun showBookDeleteError() {
+        context.toast(R.string.books_error_delete)
+    }
+
     override fun showUserProfiles(title: String, items: List<UriItem>) {
         val dialogItems: List<DialogItem> = items.map { uriItem ->
             createDialogItem(uriItem.title, uriItem.iconRes) {

+ 10 - 0
app/src/main/java/com/sirekanyan/knigopis/repository/BookRepository.kt

@@ -1,6 +1,7 @@
 package com.sirekanyan.knigopis.repository
 
 import com.sirekanyan.knigopis.common.NetworkChecker
+import com.sirekanyan.knigopis.model.BookDataModel
 import com.sirekanyan.knigopis.model.BookModel
 import com.sirekanyan.knigopis.model.dto.FinishedBook
 import com.sirekanyan.knigopis.model.dto.FinishedBookToSend
@@ -23,6 +24,8 @@ interface BookRepository {
 
     fun saveBook(bookId: String?, book: PlannedBookToSend, done: Boolean?): Completable
 
+    fun deleteBook(book: BookDataModel): Completable
+
 }
 
 class BookRepositoryImpl(
@@ -59,6 +62,13 @@ class BookRepositoryImpl(
             }
         }
 
+    override fun deleteBook(book: BookDataModel): Completable =
+        if (book.isFinished) {
+            api.deleteFinishedBook(book.id, auth.getAccessToken())
+        } else {
+            api.deletePlannedBook(book.id, auth.getAccessToken())
+        }
+
     override fun loadFromNetwork(): Single<List<BookModel>> =
         Singles.zip(
             api.getPlannedBooks(auth.getAccessToken()),