فهرست منبع

Added books count to header

Vadik Sirekanyan 7 سال پیش
والد
کامیت
1d671f3366

+ 3 - 2
app/src/main/java/me/vadik/knigopis/BookRepository.kt

@@ -34,7 +34,7 @@ class BookRepositoryImpl(
         ).map { (planned, finished) ->
             mutableListOf<Book>().apply {
                 if (planned.isNotEmpty()) {
-                    add(BookHeader(resources.getString(R.string.books_header_todo)))
+                    add(BookHeader(resources.getString(R.string.books_header_todo), planned.size))
                 }
                 addAll(planned)
                 addAll(finished)
@@ -78,7 +78,8 @@ class BookRepositoryImpl(
                                 resources.getString(R.string.books_header_done_first, readYear)
                             else ->
                                 resources.getString(R.string.books_header_done, readYear)
-                        }
+                        },
+                        count = 0 // todo
                     )
                 )
             }

+ 1 - 0
app/src/main/java/me/vadik/knigopis/adapters/books/BooksAdapter.kt

@@ -23,6 +23,7 @@ class BooksAdapter(
             holder.setTitle(header.title)
         }
         holder.showTopDivider(i > 0)
+        holder.setBooksCount(header.count)
     }
 
     override fun bindItemViewHolder(holder: BookItemViewHolder, book: FinishedBook) {

+ 10 - 0
app/src/main/java/me/vadik/knigopis/common/adapter/BookViewHolder.kt

@@ -5,6 +5,7 @@ import android.support.v7.widget.RecyclerView
 import android.view.View
 import kotlinx.android.synthetic.main.header.view.*
 import kotlinx.android.synthetic.main.user_book.view.*
+import me.vadik.knigopis.R
 import me.vadik.knigopis.utils.showNow
 
 sealed class BookViewHolder(view: View) : RecyclerView.ViewHolder(view)
@@ -21,6 +22,15 @@ class BookHeaderViewHolder(private val view: View) : BookViewHolder(view) {
         view.book_title.text = context.getString(titleRes)
     }
 
+    fun setBooksCount(count: Int) {
+        view.books_count.text = context.resources.getQuantityString(
+            R.plurals.common_header_books,
+            count,
+            count
+        )
+        view.books_count.showNow()
+    }
+
     fun showTopDivider(visible: Boolean) {
         view.header_divider.showNow(visible)
     }

+ 1 - 0
app/src/main/java/me/vadik/knigopis/model/BookHeader.kt

@@ -2,6 +2,7 @@ package me.vadik.knigopis.model
 
 class BookHeader(
     override val title: String,
+    val count: Int,
     override val id: String = "",
     override val author: String = ""
 ) : Book

+ 13 - 11
app/src/main/java/me/vadik/knigopis/user/UserActivity.kt

@@ -18,7 +18,6 @@ import me.vadik.knigopis.common.StickyHeaderInterface
 import me.vadik.knigopis.dialog.DialogFactory
 import me.vadik.knigopis.model.Book
 import me.vadik.knigopis.model.BookHeader
-import me.vadik.knigopis.model.FinishedBook
 import me.vadik.knigopis.utils.*
 import org.koin.android.ext.android.inject
 
@@ -38,6 +37,7 @@ class UserActivity : AppCompatActivity() {
     private val dialogs by inject<DialogFactory> { mapOf("activity" to this) }
     private val userId by lazy { intent.getStringExtra(EXTRA_USER_ID) }
     private val books = mutableListOf<Book>()
+    private val bookHeaders = mutableListOf<BookHeader>()
     private val booksAdapter = BooksAdapter(books, dialogs)
     private lateinit var unsubscribeOption: MenuItem
 
@@ -73,12 +73,8 @@ class UserActivity : AppCompatActivity() {
                     }
 
                     override fun bindHeaderData(header: View, headerPosition: Int) {
-                        val book = books[headerPosition]
-                        val title = if (book is FinishedBook) {
-                            book.readYear
-                        } else {
-                            book.title
-                        }.let {
+                        val book = bookHeaders[headerPosition]
+                        val title = book.title.let {
                             if (it.isEmpty()) {
                                 getString(R.string.books_header_done_other)
                             } else {
@@ -86,6 +82,13 @@ class UserActivity : AppCompatActivity() {
                             }
                         }
                         header.findViewById<TextView>(R.id.book_title).text = title
+                        header.findViewById<TextView>(R.id.books_count).text =
+                                resources.getQuantityString(
+                                    R.plurals.common_header_books,
+                                    book.count,
+                                    book.count
+                                )
+                        header.findViewById<TextView>(R.id.books_count).showNow()
                         header.findViewById<View>(R.id.header_bottom_divider).showNow()
                     }
 
@@ -95,9 +98,6 @@ class UserActivity : AppCompatActivity() {
                 }
             )
         )
-//        userBooksRecyclerView.addItemDecoration(
-//            DividerItemDecoration(this, layoutManager.orientation)
-//        )
         userBooksRecyclerView.adapter = booksAdapter
     }
 
@@ -114,7 +114,9 @@ class UserActivity : AppCompatActivity() {
             .doOnError { userBooksErrorPlaceholder.show() }
             .subscribe({
                 books.clear()
-                books.addAll(it)
+                books.addAll(it.map { it.first })
+                bookHeaders.clear()
+                bookHeaders.addAll(it.map { it.second })
                 booksAdapter.notifyDataSetChanged()
             }, {
                 logError("Cannot load user books", it)

+ 5 - 3
app/src/main/java/me/vadik/knigopis/user/UserInteractor.kt

@@ -16,7 +16,7 @@ interface UserInteractor {
 
     fun isSubscribed(userId: String): Single<Boolean>
 
-    fun getBooks(userId: String): Single<List<Book>>
+    fun getBooks(userId: String): Single<List<Pair<Book, BookHeader>>>
 
 }
 
@@ -40,7 +40,7 @@ class UserInteractorImpl(
             .map { subscriptions -> subscriptions.any { it.subUser.id == userId } }
             .io2main()
 
-    override fun getBooks(userId: String): Single<List<Book>> =
+    override fun getBooks(userId: String): Single<List<Pair<Book, BookHeader>>> =
         api.getUserBooks(userId)
             .map { books ->
                 books.groupBy { it.readYear }
@@ -48,7 +48,9 @@ class UserInteractorImpl(
                         year2.compareTo(year1)
                     })
                     .flatMap { (year, books) ->
-                        listOf(BookHeader(year), *books.toTypedArray())
+                        val header = BookHeader(year, books.size)
+                        val items = books.map { it to header }
+                        listOf(header to header, *items.toTypedArray())
                     }
             }
             .io2main()

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

@@ -20,10 +20,24 @@
         android:layout_marginEnd="16dp"
         android:layout_marginStart="16dp"
         android:fontFamily="sans-serif-medium"
-        android:textColor="@color/black_54"
+        android:textColor="?android:attr/textColorSecondary"
         android:textSize="14sp"
         tools:text="К прочтению" />
 
+    <TextView
+        android:id="@+id/books_count"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="end|center_vertical"
+        android:layout_marginEnd="16dp"
+        android:layout_marginStart="16dp"
+        android:fontFamily="sans-serif"
+        android:textColor="?android:attr/textColorTertiary"
+        android:textSize="14sp"
+        android:visibility="invisible"
+        tools:text="12 книг"
+        tools:visibility="visible" />
+
     <View
         android:id="@+id/header_bottom_divider"
         android:layout_width="match_parent"