Explorar el Código

Simplified binding logic for headers

Vadik Sirekanyan hace 7 años
padre
commit
5a2968f74d

+ 11 - 1
app/src/main/java/com/sirekanyan/knigopis/common/ResourceProvider.kt

@@ -3,9 +3,19 @@ package com.sirekanyan.knigopis.common
 import android.app.Application
 
 interface ResourceProvider {
+
     fun getString(id: Int, vararg args: Any): String
+
+    fun getQuantityString(id: Int, quantity: Int, vararg args: Any): String
+
 }
 
 class ResourceProviderImpl(private val app: Application) : ResourceProvider {
-    override fun getString(id: Int, vararg args: Any): String = app.getString(id, *args)
+
+    override fun getString(id: Int, vararg args: Any): String =
+        app.getString(id, *args)
+
+    override fun getQuantityString(id: Int, quantity: Int, vararg args: Any): String =
+        app.resources.getQuantityString(id, quantity, *args)
+
 }

+ 3 - 16
app/src/main/java/com/sirekanyan/knigopis/common/view/header/StickyHeaderImpl.kt

@@ -1,17 +1,12 @@
 package com.sirekanyan.knigopis.common.view.header
 
-import android.app.Application
 import android.view.View
 import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.extensions.showNow
-import com.sirekanyan.knigopis.common.orDefault
 import com.sirekanyan.knigopis.model.BookModel
 import kotlinx.android.synthetic.main.header.view.*
 
-class StickyHeaderImpl(
-    private val app: Application,
-    private val books: List<BookModel>
-) : StickyHeader {
+class StickyHeaderImpl(private val books: List<BookModel>) : StickyHeader {
 
     override fun getHeaderPositionForItem(itemPosition: Int) = itemPosition
 
@@ -21,16 +16,8 @@ class StickyHeaderImpl(
 
     override fun bindHeaderData(header: View, headerPosition: Int) {
         val group = books[headerPosition].group
-        header.headerTitle.text =
-                group.title.orDefault(app.getString(R.string.books_header_done_other))
-        header.headerCount.also { headerCount ->
-            headerCount.text = app.resources.getQuantityString(
-                R.plurals.common_header_books,
-                group.count,
-                group.count
-            )
-            headerCount.showNow()
-        }
+        header.headerTitle.text = group.title
+        header.headerCount.text = group.count
         header.headerBottomDivider.showNow()
     }
 

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

@@ -68,7 +68,7 @@ val appModule = applicationContext {
 }
 
 private fun Context.userModule() {
-    bean { UserInteractorImpl(get(), get()) as UserInteractor }
+    bean { UserInteractorImpl(get(), get(), get()) as UserInteractor }
 }
 
 private fun createMainEndpoint(gson: Gson) =

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

@@ -79,9 +79,7 @@ class MainActivity : AppCompatActivity(), Router {
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_main)
         initRecyclerView(booksRecyclerView)
-        booksRecyclerView.addItemDecoration(
-            HeaderItemDecoration(StickyHeaderImpl(application, allBooks))
-        )
+        booksRecyclerView.addItemDecoration(HeaderItemDecoration(StickyHeaderImpl(allBooks)))
         initRecyclerView(usersRecyclerView)
         initRecyclerView(notesRecyclerView)
         val currentTabId = savedInstanceState?.getInt(CURRENT_TAB_KEY)

+ 1 - 10
app/src/main/java/com/sirekanyan/knigopis/feature/books/BookHeaderViewHolder.kt

@@ -1,9 +1,7 @@
 package com.sirekanyan.knigopis.feature.books
 
 import android.view.View
-import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.adapter.CommonViewHolder
-import com.sirekanyan.knigopis.common.extensions.showNow
 import com.sirekanyan.knigopis.model.BookHeaderModel
 import com.sirekanyan.knigopis.model.BookModel
 import kotlinx.android.extensions.LayoutContainer
@@ -14,18 +12,11 @@ class BookHeaderViewHolder(
 ) : CommonViewHolder<BookModel>(containerView),
     LayoutContainer {
 
-    private val resources = containerView.context.resources
-
     override fun onBind(position: Int, model: BookModel) {
         val header = model as BookHeaderModel
         headerTitle.text = header.title
+        headerCount.text = header.count
         headerDivider.visibility = if (position == 0) View.INVISIBLE else View.VISIBLE
-        headerCount.text = resources.getQuantityString(
-            R.plurals.common_header_books,
-            header.count,
-            header.count
-        )
-        headerCount.showNow(header.count > 0)
     }
 
 }

+ 1 - 3
app/src/main/java/com/sirekanyan/knigopis/feature/user/UserActivity.kt

@@ -70,9 +70,7 @@ class UserActivity : AppCompatActivity() {
         supportActionBar?.setDisplayHomeAsUpEnabled(true)
         val layoutManager = LinearLayoutManager(this)
         userBooksRecyclerView.layoutManager = layoutManager
-        userBooksRecyclerView.addItemDecoration(
-            HeaderItemDecoration(StickyHeaderImpl(application, books))
-        )
+        userBooksRecyclerView.addItemDecoration(HeaderItemDecoration(StickyHeaderImpl(books)))
         userBooksRecyclerView.adapter = booksAdapter
     }
 

+ 2 - 11
app/src/main/java/com/sirekanyan/knigopis/feature/user/UserBookHeaderViewHolder.kt

@@ -1,7 +1,6 @@
 package com.sirekanyan.knigopis.feature.user
 
 import android.view.View
-import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.adapter.CommonViewHolder
 import com.sirekanyan.knigopis.common.extensions.showNow
 import com.sirekanyan.knigopis.model.BookHeaderModel
@@ -14,18 +13,10 @@ class UserBookHeaderViewHolder(
 ) : CommonViewHolder<BookModel>(containerView),
     LayoutContainer {
 
-    private val context = containerView.context
-    private val defaultTitle = context.getString(R.string.books_header_done_other)
-
     override fun onBind(position: Int, model: BookModel) {
         val header = model as BookHeaderModel
-        headerTitle.text = header.title.takeUnless(String::isEmpty) ?: defaultTitle
-        headerCount.text = context.resources.getQuantityString(
-            R.plurals.common_header_books,
-            header.count,
-            header.count
-        )
-        headerCount.showNow()
+        headerTitle.text = header.title
+        headerCount.text = header.count
         headerDivider.showNow(position > 0)
     }
 

+ 5 - 3
app/src/main/java/com/sirekanyan/knigopis/feature/user/UserInteractor.kt

@@ -1,8 +1,9 @@
 package com.sirekanyan.knigopis.feature.user
 
+import com.sirekanyan.knigopis.common.ResourceProvider
 import com.sirekanyan.knigopis.common.io2main
-import com.sirekanyan.knigopis.model.BookHeaderModel
 import com.sirekanyan.knigopis.model.BookModel
+import com.sirekanyan.knigopis.model.createBookHeaderModel
 import com.sirekanyan.knigopis.model.toBookModel
 import com.sirekanyan.knigopis.repository.KAuth
 import com.sirekanyan.knigopis.repository.api.Endpoint
@@ -23,7 +24,8 @@ interface UserInteractor {
 
 class UserInteractorImpl(
     private val auth: KAuth,
-    private val api: Endpoint
+    private val api: Endpoint,
+    private val resources: ResourceProvider
 ) : UserInteractor {
 
     override fun subscribe(userId: String) =
@@ -49,7 +51,7 @@ class UserInteractorImpl(
                         year2.compareTo(year1)
                     })
                     .flatMap { (year, books) ->
-                        val header = BookHeaderModel(year, books.size)
+                        val header = createBookHeaderModel(resources, year, books.size)
                         val items = books.map { it.toBookModel(header.group) }
                         listOf(header, *items.toTypedArray())
                     }

+ 1 - 1
app/src/main/java/com/sirekanyan/knigopis/model/BookGroupModel.kt

@@ -1,3 +1,3 @@
 package com.sirekanyan.knigopis.model
 
-class BookGroupModel(val title: String, val count: Int)
+class BookGroupModel(val title: String, val count: String)

+ 10 - 1
app/src/main/java/com/sirekanyan/knigopis/model/BookModel.kt

@@ -1,8 +1,17 @@
 package com.sirekanyan.knigopis.model
 
+import com.sirekanyan.knigopis.R
+import com.sirekanyan.knigopis.common.ResourceProvider
 import com.sirekanyan.knigopis.common.adapter.CommonModel
+import com.sirekanyan.knigopis.common.orDefault
 import com.sirekanyan.knigopis.repository.api.createBookImageUrl
 
+fun createBookHeaderModel(resources: ResourceProvider, title: String, count: Int): BookHeaderModel {
+    val titleOrDefault = title.orDefault(resources.getString(R.string.books_header_done_other))
+    val countText = resources.getQuantityString(R.plurals.common_header_books, count, count)
+    return BookHeaderModel(titleOrDefault, countText)
+}
+
 sealed class BookModel(
     override val id: String,
     override val isHeader: Boolean,
@@ -11,7 +20,7 @@ sealed class BookModel(
 
 class BookHeaderModel(
     val title: String,
-    val count: Int
+    val count: String
 ) : BookModel("header-id-$title-$count", true, BookGroupModel(title, count))
 
 class BookDataModel(

+ 5 - 5
app/src/main/java/com/sirekanyan/knigopis/repository/BookOrganizer.kt

@@ -2,11 +2,11 @@ package com.sirekanyan.knigopis.repository
 
 import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.ResourceProvider
-import com.sirekanyan.knigopis.model.BookHeaderModel
 import com.sirekanyan.knigopis.model.BookModel
-import com.sirekanyan.knigopis.model.toBookModel
+import com.sirekanyan.knigopis.model.createBookHeaderModel
 import com.sirekanyan.knigopis.model.dto.FinishedBook
 import com.sirekanyan.knigopis.model.dto.PlannedBook
+import com.sirekanyan.knigopis.model.toBookModel
 
 interface BookOrganizer<T> {
 
@@ -36,14 +36,14 @@ class PlannedBookOrganizerImpl(
         val doingBooks = books.filterNot { it.priority == 0 }
         if (doingBooks.isNotEmpty()) {
             val todoHeaderTitle = resources.getString(R.string.books_header_doing)
-            val header = BookHeaderModel(todoHeaderTitle, doingBooks.size)
+            val header = createBookHeaderModel(resources, todoHeaderTitle, doingBooks.size)
             result.add(header)
             result.addAll(doingBooks.map { it.toBookModel(header.group) })
         }
         val todoBooks = books.filter { it.priority == 0 }
         if (todoBooks.isNotEmpty()) {
             val todoHeaderTitle = resources.getString(R.string.books_header_todo)
-            val header = BookHeaderModel(todoHeaderTitle, todoBooks.size)
+            val header = createBookHeaderModel(resources, todoHeaderTitle, todoBooks.size)
             result.add(header)
             result.addAll(todoBooks.map { it.toBookModel(header.group) })
         }
@@ -74,7 +74,7 @@ class FinishedBookPrepareImpl(
                     }
                     else -> resources.getString(R.string.books_header_done, year)
                 }
-                val header = BookHeaderModel(headerTitle, books.size)
+                val header = createBookHeaderModel(resources, headerTitle, books.size)
                 val items = books.map { it.toBookModel(header.group) }
                 listOf(header, *items.toTypedArray())
             }

+ 1 - 3
app/src/main/res/layout/header.xml

@@ -34,9 +34,7 @@
         android:fontFamily="sans-serif"
         android:textColor="?android:attr/textColorTertiary"
         android:textSize="14sp"
-        android:visibility="invisible"
-        tools:text="12 книг"
-        tools:visibility="visible" />
+        tools:text="12 книг" />
 
     <View
         android:id="@+id/headerBottomDivider"