From a4d139009fb8102f678f3e7ca065c77a40ca058a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D1=83=D1=80=D0=BD=D0=B0=D1=82=20=D0=90=D0=BD=D0=B4?= =?UTF-8?q?=D1=80=D0=B5=D0=B9?= Date: Fri, 14 Aug 2026 21:18:27 +0300 Subject: [PATCH] feat: compact book library and catalog cards --- app/build.gradle.kts | 4 +- .../app/ui/qbooks/QBooksCatalogAdapter.kt | 1 - .../app/ui/qbooks/QBooksLibraryFragment.kt | 29 ---- app/src/main/res/drawable/ic_download.xml | 9 + .../main/res/layout/fragment_bookshelf.xml | 157 +++++++----------- .../res/layout/fragment_qbooks_library.xml | 45 ----- app/src/main/res/layout/item_qbooks_book.xml | 35 ++-- 7 files changed, 81 insertions(+), 199 deletions(-) create mode 100644 app/src/main/res/drawable/ic_download.xml diff --git a/app/build.gradle.kts b/app/build.gradle.kts index bfa691f..5492c98 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -19,8 +19,8 @@ android { applicationId = "com.aletheia.app" minSdk = 24 targetSdk = 36 - versionCode = 48 - versionName = "2.37" + versionCode = 50 + versionName = "2.39" buildConfigField( "String", diff --git a/app/src/main/java/com/aletheia/app/ui/qbooks/QBooksCatalogAdapter.kt b/app/src/main/java/com/aletheia/app/ui/qbooks/QBooksCatalogAdapter.kt index b3d86d7..3fb1e6f 100644 --- a/app/src/main/java/com/aletheia/app/ui/qbooks/QBooksCatalogAdapter.kt +++ b/app/src/main/java/com/aletheia/app/ui/qbooks/QBooksCatalogAdapter.kt @@ -90,7 +90,6 @@ class QBooksCatalogAdapter( val formatText = context.getString(R.string.qbooks_format_label, book.format.uppercase()) binding.bookTitle.text = book.title binding.bookAuthor.text = book.author - binding.bookFormat.text = formatText binding.bookCover.setBookCover(book.coverImage, R.drawable.default_cover) binding.root.contentDescription = context.getString( R.string.a11y_qbooks_book_card, diff --git a/app/src/main/java/com/aletheia/app/ui/qbooks/QBooksLibraryFragment.kt b/app/src/main/java/com/aletheia/app/ui/qbooks/QBooksLibraryFragment.kt index 9891f43..c01767e 100644 --- a/app/src/main/java/com/aletheia/app/ui/qbooks/QBooksLibraryFragment.kt +++ b/app/src/main/java/com/aletheia/app/ui/qbooks/QBooksLibraryFragment.kt @@ -154,15 +154,6 @@ class QBooksLibraryFragment : Fragment() { val pageUrl = if (reset) null else nextPageUrl val query = currentSearchQuery() isLoading = true - setOverview( - getString( - if (reset) R.string.qbooks_catalog_overview_loading_title - else R.string.qbooks_catalog_overview_loading_more_title - ), - getString(if (reset) R.string.qbooks_catalog_loading else R.string.qbooks_catalog_loading_more), - query.takeIf(String::isNotBlank)?.let { getString(R.string.qbooks_catalog_query_meta, it) } - ) - loadJob = viewLifecycleOwner.lifecycleScope.launch { val cached = app.qBooksService.getCachedCatalogPage(query, pageToLoad, PAGE_SIZE, pageUrl) if (_binding == null || generation != requestGeneration) return@launch @@ -226,17 +217,6 @@ class QBooksLibraryFragment : Fragment() { } else { getString(R.string.qbooks_catalog_empty_query, query) } - val detail = if (query.isBlank()) { - resources.getQuantityString(R.plurals.qbooks_catalog_summary, count, count) - } else { - resources.getQuantityString(R.plurals.qbooks_catalog_search_summary, count, count, query) - } - val hint = if (hasMoreBooks) R.string.qbooks_catalog_more_hint else R.string.qbooks_catalog_end_hint - setOverview( - getString(R.string.qbooks_catalog_overview_title), - detail, - if (count == 0) null else getString(hint) - ) } private fun renderError(message: String) { @@ -247,20 +227,11 @@ class QBooksLibraryFragment : Fragment() { binding.notConfiguredCard.visibility = if (isConfigured) View.GONE else View.VISIBLE binding.errorCard.visibility = if (isConfigured) View.VISIBLE else View.GONE binding.errorText.text = message - binding.catalogOverviewCard.visibility = View.GONE binding.emptyResultsCard.visibility = View.GONE binding.swipeRefresh.isRefreshing = false isLoading = false } - private fun setOverview(title: String, detail: String, meta: String?) { - binding.catalogOverviewCard.visibility = View.VISIBLE - binding.catalogOverviewTitleText.text = title - binding.catalogStatusText.text = detail - binding.catalogOverviewMetaText.text = meta.orEmpty() - binding.catalogOverviewMetaText.visibility = if (meta.isNullOrBlank()) View.GONE else View.VISIBLE - } - private fun loadMetadataAndCovers(books: List, generation: Int) { books.forEach { book -> coverJobs += viewLifecycleOwner.lifecycleScope.launch { diff --git a/app/src/main/res/drawable/ic_download.xml b/app/src/main/res/drawable/ic_download.xml new file mode 100644 index 0000000..514f7a4 --- /dev/null +++ b/app/src/main/res/drawable/ic_download.xml @@ -0,0 +1,9 @@ + + + diff --git a/app/src/main/res/layout/fragment_bookshelf.xml b/app/src/main/res/layout/fragment_bookshelf.xml index e11d464..2d8641f 100644 --- a/app/src/main/res/layout/fragment_bookshelf.xml +++ b/app/src/main/res/layout/fragment_bookshelf.xml @@ -75,9 +75,11 @@ + android:paddingStart="14dp" + android:paddingTop="12dp" + android:paddingEnd="14dp" + android:paddingBottom="14dp"> - + + + + + + + + android:layout_marginTop="4dp" + android:scrollbars="none"> - + + + + + + + + - - + android:layout_marginTop="8dp" + android:clipToPadding="false" + android:contentDescription="@string/a11y_books_list" + android:scrollbars="none" /> @@ -196,85 +232,6 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:textSize="16sp" /> - + android:layout_width="40dp" + android:layout_height="40dp" + android:layout_marginStart="8dp" + android:insetTop="0dp" + android:insetBottom="0dp" + android:minWidth="40dp" + android:minHeight="40dp" + android:padding="8dp" + app:icon="@drawable/ic_download" + app:iconGravity="textStart" + app:iconPadding="0dp" />