fix: 封面设置来源统一
This commit is contained in:
6 files changed
+5
-623
No files matched your search
@@ -600,8 +600,6 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
|
|||||||
|
|
||||||
val recordHeapDump get() = OtherConfig.recordHeapDump
|
val recordHeapDump get() = OtherConfig.recordHeapDump
|
||||||
|
|
||||||
val loadCoverOnlyWifi get() = appCtx.getPrefBoolean(PreferKey.loadCoverOnlyWifi, false)
|
|
||||||
|
|
||||||
val showAddToShelfAlert get() = OtherConfig.showAddToShelfAlert
|
val showAddToShelfAlert get() = OtherConfig.showAddToShelfAlert
|
||||||
|
|
||||||
var ignoreAudioFocus
|
var ignoreAudioFocus
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import com.bumptech.glide.request.RequestOptions
|
|||||||
import com.bumptech.glide.request.target.Target
|
import com.bumptech.glide.request.target.Target
|
||||||
import com.bumptech.glide.request.target.Target.SIZE_ORIGINAL
|
import com.bumptech.glide.request.target.Target.SIZE_ORIGINAL
|
||||||
import io.legado.app.R
|
import io.legado.app.R
|
||||||
import io.legado.app.constant.PreferKey
|
import io.legado.app.ui.config.coverConfig.CoverConfig
|
||||||
import io.legado.app.data.entities.BaseSource
|
import io.legado.app.data.entities.BaseSource
|
||||||
import io.legado.app.data.entities.Book
|
import io.legado.app.data.entities.Book
|
||||||
import io.legado.app.help.CacheManager
|
import io.legado.app.help.CacheManager
|
||||||
@@ -34,7 +34,6 @@ import io.legado.app.model.analyzeRule.AnalyzeUrl
|
|||||||
import io.legado.app.utils.BitmapUtils
|
import io.legado.app.utils.BitmapUtils
|
||||||
import io.legado.app.utils.GSON
|
import io.legado.app.utils.GSON
|
||||||
import io.legado.app.utils.fromJsonObject
|
import io.legado.app.utils.fromJsonObject
|
||||||
import io.legado.app.utils.getPrefString
|
|
||||||
import kotlinx.coroutines.currentCoroutineContext
|
import kotlinx.coroutines.currentCoroutineContext
|
||||||
import splitties.init.appCtx
|
import splitties.init.appCtx
|
||||||
import java.io.File
|
import java.io.File
|
||||||
@@ -50,8 +49,8 @@ object BookCover {
|
|||||||
@SuppressLint("UseCompatLoadingForDrawables")
|
@SuppressLint("UseCompatLoadingForDrawables")
|
||||||
get() {
|
get() {
|
||||||
val isNightTheme = AppConfig.isNightTheme
|
val isNightTheme = AppConfig.isNightTheme
|
||||||
val key = if (isNightTheme) PreferKey.defaultCoverDark else PreferKey.defaultCover
|
val pathStr = if (isNightTheme) CoverConfig.defaultCoverDark else CoverConfig.defaultCover
|
||||||
val paths = appCtx.getPrefString(key)?.split(",")?.filter { it.isNotBlank() }
|
val paths = pathStr.split(",").filter { it.isNotBlank() }
|
||||||
|
|
||||||
if (paths.isNullOrEmpty()) {
|
if (paths.isNullOrEmpty()) {
|
||||||
return appCtx.resources.getDrawable(R.drawable.image_cover_default, null)
|
return appCtx.resources.getDrawable(R.drawable.image_cover_default, null)
|
||||||
@@ -67,8 +66,8 @@ object BookCover {
|
|||||||
seed: Any? = null,
|
seed: Any? = null,
|
||||||
isNight: Boolean = AppConfig.isNightTheme
|
isNight: Boolean = AppConfig.isNightTheme
|
||||||
): String? {
|
): String? {
|
||||||
val key = if (isNight) PreferKey.defaultCoverDark else PreferKey.defaultCover
|
val pathStr = if (isNight) CoverConfig.defaultCoverDark else CoverConfig.defaultCover
|
||||||
val paths = appCtx.getPrefString(key)?.split(",")?.filter { it.isNotBlank() }
|
val paths = pathStr.split(",").filter { it.isNotBlank() }
|
||||||
if (paths.isNullOrEmpty()) return null
|
if (paths.isNullOrEmpty()) return null
|
||||||
val random = if (seed != null) Random(seed.hashCode()) else Random
|
val random = if (seed != null) Random(seed.hashCode()) else Random
|
||||||
return paths[random.nextInt(paths.size)]
|
return paths[random.nextInt(paths.size)]
|
||||||
|
|||||||
@@ -1,200 +0,0 @@
|
|||||||
package io.legado.app.ui.book.search
|
|
||||||
|
|
||||||
import android.content.Context
|
|
||||||
import android.os.Bundle
|
|
||||||
import android.view.ViewGroup
|
|
||||||
import android.widget.LinearLayout
|
|
||||||
import androidx.core.view.isVisible
|
|
||||||
import androidx.recyclerview.widget.DiffUtil
|
|
||||||
import io.legado.app.R
|
|
||||||
import io.legado.app.base.adapter.DiffRecyclerAdapter
|
|
||||||
import io.legado.app.base.adapter.ItemViewHolder
|
|
||||||
import io.legado.app.data.entities.SearchBook
|
|
||||||
import io.legado.app.databinding.ItemSearchBinding
|
|
||||||
import io.legado.app.help.config.AppConfig
|
|
||||||
import io.legado.app.domain.model.BookShelfState
|
|
||||||
import io.legado.app.ui.widget.text.AccentBgTextView
|
|
||||||
import io.legado.app.utils.dpToPx
|
|
||||||
import io.legado.app.utils.gone
|
|
||||||
import io.legado.app.utils.visible
|
|
||||||
|
|
||||||
|
|
||||||
class SearchAdapter(context: Context, val callBack: CallBack) :
|
|
||||||
DiffRecyclerAdapter<SearchBook, ItemSearchBinding>(context) {
|
|
||||||
|
|
||||||
override val keepScrollPosition = true
|
|
||||||
|
|
||||||
override val diffItemCallback: DiffUtil.ItemCallback<SearchBook>
|
|
||||||
get() = object : DiffUtil.ItemCallback<SearchBook>() {
|
|
||||||
|
|
||||||
override fun areItemsTheSame(oldItem: SearchBook, newItem: SearchBook): Boolean {
|
|
||||||
return when {
|
|
||||||
oldItem.name != newItem.name -> false
|
|
||||||
oldItem.author != newItem.author -> false
|
|
||||||
else -> true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun areContentsTheSame(oldItem: SearchBook, newItem: SearchBook): Boolean {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getChangePayload(oldItem: SearchBook, newItem: SearchBook): Any {
|
|
||||||
val payload = Bundle()
|
|
||||||
payload.putInt("origins", newItem.origins.size)
|
|
||||||
if (oldItem.coverUrl != newItem.coverUrl)
|
|
||||||
payload.putString("cover", newItem.coverUrl)
|
|
||||||
if (oldItem.kind != newItem.kind)
|
|
||||||
payload.putString("kind", newItem.kind)
|
|
||||||
if (oldItem.latestChapterTitle != newItem.latestChapterTitle)
|
|
||||||
payload.putString("last", newItem.latestChapterTitle)
|
|
||||||
if (oldItem.intro != newItem.intro)
|
|
||||||
payload.putString("intro", newItem.intro)
|
|
||||||
return payload
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun getViewBinding(parent: ViewGroup): ItemSearchBinding {
|
|
||||||
return ItemSearchBinding.inflate(inflater, parent, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun convert(
|
|
||||||
holder: ItemViewHolder,
|
|
||||||
binding: ItemSearchBinding,
|
|
||||||
item: SearchBook,
|
|
||||||
payloads: MutableList<Any>
|
|
||||||
) {
|
|
||||||
if (payloads.isEmpty()) {
|
|
||||||
bind(binding, item)
|
|
||||||
} else {
|
|
||||||
for (i in payloads.indices) {
|
|
||||||
val bundle = payloads[i] as Bundle
|
|
||||||
bindChange(binding, item, bundle)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun registerListener(holder: ItemViewHolder, binding: ItemSearchBinding) {
|
|
||||||
binding.llContent.setOnClickListener {
|
|
||||||
getItem(holder.layoutPosition)?.let {
|
|
||||||
callBack.showBookInfo(it.name, it.author, it.bookUrl)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun bind(binding: ItemSearchBinding, searchBook: SearchBook) {
|
|
||||||
binding.run {
|
|
||||||
tvName.text = searchBook.name
|
|
||||||
tvAuthor.text = context.getString(R.string.author_show, searchBook.author)
|
|
||||||
when (callBack.getBookShelfState(searchBook.name, searchBook.author, searchBook.bookUrl)) {
|
|
||||||
BookShelfState.IN_SHELF -> {
|
|
||||||
ivInBookshelf.isVisible = true
|
|
||||||
tvBookshelf.text = context.getString(R.string.remove_from_bookshelf)
|
|
||||||
}
|
|
||||||
BookShelfState.SAME_NAME_AUTHOR -> {
|
|
||||||
ivInBookshelf.isVisible = true
|
|
||||||
tvBookshelf.text = context.getString(R.string.same_name_book)
|
|
||||||
}
|
|
||||||
BookShelfState.NOT_IN_SHELF -> {
|
|
||||||
ivInBookshelf.isVisible = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
bvOriginCount.text = searchBook.origins.size.toString()
|
|
||||||
upLasted(binding, searchBook.latestChapterTitle)
|
|
||||||
tvIntroduce.text = searchBook.trimIntro(context)
|
|
||||||
upKind(binding, searchBook.getKindList())
|
|
||||||
ivCover.load(
|
|
||||||
searchBook.coverUrl,
|
|
||||||
searchBook.name,
|
|
||||||
searchBook.author,
|
|
||||||
AppConfig.loadCoverOnlyWifi,
|
|
||||||
searchBook.origin
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun bindChange(binding: ItemSearchBinding, searchBook: SearchBook, bundle: Bundle) {
|
|
||||||
binding.run {
|
|
||||||
bundle.keySet().forEach {
|
|
||||||
when (it) {
|
|
||||||
"origins" -> bvOriginCount.text = searchBook.origins.size.toString()
|
|
||||||
"last" -> upLasted(binding, searchBook.latestChapterTitle)
|
|
||||||
"intro" -> tvIntroduce.text = searchBook.trimIntro(context)
|
|
||||||
"kind" -> upKind(binding, searchBook.getKindList())
|
|
||||||
"isInBookshelf" -> {
|
|
||||||
when (callBack.getBookShelfState(searchBook.name, searchBook.author, searchBook.bookUrl)) {
|
|
||||||
BookShelfState.IN_SHELF -> {
|
|
||||||
ivInBookshelf.isVisible = true
|
|
||||||
tvBookshelf.text = context.getString(R.string.remove_from_bookshelf)
|
|
||||||
}
|
|
||||||
BookShelfState.SAME_NAME_AUTHOR -> {
|
|
||||||
ivInBookshelf.isVisible = true
|
|
||||||
tvBookshelf.text = context.getString(R.string.same_name_book)
|
|
||||||
}
|
|
||||||
BookShelfState.NOT_IN_SHELF -> {
|
|
||||||
ivInBookshelf.isVisible = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"cover" -> ivCover.load(
|
|
||||||
searchBook.coverUrl,
|
|
||||||
searchBook.name,
|
|
||||||
searchBook.author,
|
|
||||||
false,
|
|
||||||
searchBook.origin
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun upLasted(binding: ItemSearchBinding, latestChapterTitle: String?) {
|
|
||||||
binding.run {
|
|
||||||
if (latestChapterTitle.isNullOrEmpty()) {
|
|
||||||
tvLasted.gone()
|
|
||||||
} else {
|
|
||||||
tvLasted.text =
|
|
||||||
context.getString(R.string.lasted_show, latestChapterTitle)
|
|
||||||
tvLasted.visible()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun upKind(binding: ItemSearchBinding, kinds: List<String>) = binding.run {
|
|
||||||
if (kinds.isEmpty()) {
|
|
||||||
kindContainer.gone()
|
|
||||||
} else {
|
|
||||||
kindContainer.visible()
|
|
||||||
kindContainer.removeAllViews()
|
|
||||||
kinds.forEach { kind ->
|
|
||||||
val kindTextView = AccentBgTextView(context).apply {
|
|
||||||
layoutParams = LinearLayout.LayoutParams(
|
|
||||||
LinearLayout.LayoutParams.WRAP_CONTENT,
|
|
||||||
LinearLayout.LayoutParams.WRAP_CONTENT
|
|
||||||
).apply {
|
|
||||||
marginEnd = 4.dpToPx()
|
|
||||||
}
|
|
||||||
textSize = 11f
|
|
||||||
text = kind
|
|
||||||
setLines(1)
|
|
||||||
setSingleLine(true)
|
|
||||||
}
|
|
||||||
kindContainer.addView(kindTextView)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
interface CallBack {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 是否已经加入书架
|
|
||||||
*/
|
|
||||||
fun getBookShelfState(name: String, author: String, url: String?): BookShelfState
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 显示书籍详情
|
|
||||||
*/
|
|
||||||
fun showBookInfo(name: String, author: String, bookUrl: String)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,214 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
tools:context=".ui.book.search.SearchActivity">
|
|
||||||
|
|
||||||
<androidx.coordinatorlayout.widget.CoordinatorLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent">
|
|
||||||
|
|
||||||
<com.google.android.material.appbar.AppBarLayout
|
|
||||||
android:id="@+id/app_bar"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
app:liftOnScroll="false"
|
|
||||||
android:fitsSystemWindows="true"
|
|
||||||
app:statusBarForeground="?attr/colorSurface">
|
|
||||||
|
|
||||||
<com.google.android.material.search.SearchBar
|
|
||||||
android:id="@+id/search_bar"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:hint="@string/search_book_key"
|
|
||||||
app:menu="@menu/book_search"
|
|
||||||
app:navigationIcon="@drawable/ic_arrow_back"
|
|
||||||
app:navigationIconTint="?attr/colorOnSurface" />
|
|
||||||
|
|
||||||
<com.google.android.material.progressindicator.LinearProgressIndicator
|
|
||||||
android:id="@+id/refresh_progress_bar"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:visibility="invisible"
|
|
||||||
app:waveAmplitude="2dp"
|
|
||||||
app:waveSpeed="50dp"
|
|
||||||
app:wavelength="40dp" />
|
|
||||||
|
|
||||||
<com.google.android.material.card.MaterialCardView
|
|
||||||
android:id="@+id/cd_progress"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_alignParentStart="true"
|
|
||||||
android:layout_centerVertical="true"
|
|
||||||
android:layout_marginHorizontal="16dp"
|
|
||||||
android:layout_marginVertical="4dp"
|
|
||||||
android:scaleType="centerCrop"
|
|
||||||
android:visibility="invisible"
|
|
||||||
app:cardBackgroundColor="?attr/colorTertiaryContainer"
|
|
||||||
app:cardCornerRadius="4dp"
|
|
||||||
app:strokeWidth="0dp">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/tv_progress"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:paddingHorizontal="4dp"
|
|
||||||
android:paddingVertical="2dp"
|
|
||||||
android:text="@string/progress"
|
|
||||||
android:textColor="?attr/colorOnTertiaryContainer"
|
|
||||||
android:textSize="10sp"
|
|
||||||
android:textStyle="bold"
|
|
||||||
tools:ignore="SmallSp" />
|
|
||||||
|
|
||||||
</com.google.android.material.card.MaterialCardView>
|
|
||||||
</com.google.android.material.appbar.AppBarLayout>
|
|
||||||
|
|
||||||
<io.legado.app.ui.widget.EmptyMessageView
|
|
||||||
android:id="@+id/tv_empty_msg"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
app:messageText="@string/search_empty"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:gravity="center"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:visibility="visible"/>
|
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
|
||||||
android:id="@+id/recycler_view"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:clipToPadding="false"
|
|
||||||
tools:listitem="@layout/item_search"
|
|
||||||
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior"/>
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/ll_stop"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="bottom"
|
|
||||||
android:gravity="end"
|
|
||||||
android:orientation="horizontal">
|
|
||||||
|
|
||||||
<com.google.android.material.floatingactionbutton.FloatingActionButton
|
|
||||||
android:id="@+id/fb_start_stop"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_margin="16dp"
|
|
||||||
app:tint="?attr/colorOnTertiaryContainer"
|
|
||||||
app:backgroundTint="?attr/colorTertiaryContainer"
|
|
||||||
android:contentDescription="@string/stop"
|
|
||||||
android:src="@drawable/ic_stop_black_24dp"
|
|
||||||
android:visibility="invisible" />
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
</androidx.coordinatorlayout.widget.CoordinatorLayout>
|
|
||||||
|
|
||||||
<com.google.android.material.search.SearchView
|
|
||||||
android:id="@+id/search_view"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
app:menu="@menu/book_search"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
|
||||||
app:layout_constraintTop_toTopOf="parent">
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/ll_input_help"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:clickable="true"
|
|
||||||
android:focusable="true"
|
|
||||||
android:orientation="vertical"
|
|
||||||
android:visibility="visible">
|
|
||||||
|
|
||||||
<com.google.android.material.chip.ChipGroup
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
app:chipSpacingVertical="0dp"
|
|
||||||
android:layout_marginTop="8dp"
|
|
||||||
android:layout_marginHorizontal="16dp">
|
|
||||||
<com.google.android.material.chip.Chip
|
|
||||||
android:id="@+id/chip_precision_search"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:checkable="true"
|
|
||||||
android:text="@string/precision_search"/>
|
|
||||||
<com.google.android.material.chip.Chip
|
|
||||||
android:id="@+id/chip_search_scope"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:text="@string/all_source"/>
|
|
||||||
<com.google.android.material.chip.Chip
|
|
||||||
android:id="@+id/chip_group"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:visibility="gone"
|
|
||||||
android:checkable="true"
|
|
||||||
android:text="@string/search_select_group"/>
|
|
||||||
</com.google.android.material.chip.ChipGroup>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/tv_book_show"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:paddingHorizontal="16dp"
|
|
||||||
android:paddingVertical="16dp"
|
|
||||||
android:text="@string/bookshelf"
|
|
||||||
android:textSize="16sp"
|
|
||||||
android:textStyle="bold"
|
|
||||||
android:visibility="visible" />
|
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
|
||||||
android:id="@+id/rv_bookshelf_search"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:visibility="visible" />
|
|
||||||
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal"
|
|
||||||
android:paddingHorizontal="16dp">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/tv_history"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_gravity="center_vertical"
|
|
||||||
android:text="@string/searchHistory"
|
|
||||||
android:textSize="16sp"
|
|
||||||
android:textStyle="bold" />
|
|
||||||
|
|
||||||
<View
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:layout_weight="1" />
|
|
||||||
|
|
||||||
<com.google.android.material.button.MaterialButton
|
|
||||||
android:id="@+id/tv_clear_history"
|
|
||||||
style="@style/Widget.Material3Expressive.Button"
|
|
||||||
android:text="@string/delete_all"
|
|
||||||
app:backgroundTint="?attr/colorSecondaryContainer"
|
|
||||||
app:iconTint="?attr/colorOnSecondaryContainer"
|
|
||||||
android:textColor="?attr/colorOnSecondaryContainer"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
app:icon="@drawable/ic_clear_all"
|
|
||||||
app:strokeColor="?attr/colorSecondaryContainer"
|
|
||||||
app:iconGravity="textStart" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
|
||||||
android:id="@+id/rv_history_key"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent" />
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
</com.google.android.material.search.SearchView>
|
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
||||||
|
|
||||||
@@ -1,35 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
tools:context=".ui.book.search.SearchActivity">
|
|
||||||
|
|
||||||
<io.legado.app.ui.widget.TitleBar
|
|
||||||
android:id="@+id/title_bar"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
app:contentInsetStartWithNavigation="0dp"
|
|
||||||
app:layout_constraintTop_toTopOf="parent"
|
|
||||||
app:title="@string/discovery" />
|
|
||||||
|
|
||||||
<io.legado.app.ui.widget.dynamiclayout.DynamicFrameLayout
|
|
||||||
android:id="@+id/content_view"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="0dp"
|
|
||||||
app:layout_constraintBottom_toBottomOf="parent"
|
|
||||||
app:layout_constraintTop_toBottomOf="@id/title_bar">
|
|
||||||
|
|
||||||
|
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
|
||||||
android:id="@+id/recycler_view"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="match_parent"
|
|
||||||
android:clipToPadding="false"
|
|
||||||
app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
|
|
||||||
tools:listitem="@layout/item_search" />
|
|
||||||
|
|
||||||
</io.legado.app.ui.widget.dynamiclayout.DynamicFrameLayout>
|
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
||||||
@@ -1,166 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
|
||||||
<com.google.android.material.card.MaterialCardView xmlns:android="http://schemas.android.com/apk/res/android"
|
|
||||||
xmlns:tools="http://schemas.android.com/tools"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
app:strokeWidth="0dp"
|
|
||||||
xmlns:app="http://schemas.android.com/apk/res-auto"
|
|
||||||
android:layout_marginHorizontal="8dp"
|
|
||||||
android:layout_marginVertical="4dp">
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/ll_content"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:padding="8dp"
|
|
||||||
android:clickable="true"
|
|
||||||
android:background="?attr/selectableItemBackground"
|
|
||||||
android:orientation="horizontal"
|
|
||||||
android:scrollbars="none">
|
|
||||||
|
|
||||||
<!-- 封面图片 -->
|
|
||||||
<com.google.android.material.card.MaterialCardView
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
app:cardCornerRadius="8dp"
|
|
||||||
app:strokeWidth="0dp">
|
|
||||||
|
|
||||||
<io.legado.app.ui.widget.image.CoverImageView
|
|
||||||
android:id="@+id/iv_cover"
|
|
||||||
android:layout_width="80dp"
|
|
||||||
android:layout_height="110dp"
|
|
||||||
android:contentDescription="@string/img_cover"
|
|
||||||
android:scaleType="centerCrop"
|
|
||||||
android:src="@drawable/image_cover_default"
|
|
||||||
android:transitionName="img_cover"
|
|
||||||
tools:ignore="UnusedAttribute" />
|
|
||||||
|
|
||||||
<!-- 书架内标记 -->
|
|
||||||
<com.google.android.material.card.MaterialCardView
|
|
||||||
android:id="@+id/iv_in_bookshelf"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_alignParentStart="true"
|
|
||||||
android:layout_centerVertical="true"
|
|
||||||
android:layout_margin="4dp"
|
|
||||||
android:scaleType="centerCrop"
|
|
||||||
android:visibility="visible"
|
|
||||||
app:cardBackgroundColor="?attr/colorTertiaryContainer"
|
|
||||||
app:cardCornerRadius="4dp"
|
|
||||||
app:strokeWidth="0dp">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/tv_bookshelf"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:paddingHorizontal="4dp"
|
|
||||||
android:paddingVertical="2dp"
|
|
||||||
android:text="@string/remove_from_bookshelf"
|
|
||||||
android:textColor="?attr/colorOnTertiaryContainer"
|
|
||||||
android:textStyle="bold"
|
|
||||||
android:textSize="9sp"
|
|
||||||
tools:ignore="SmallSp" />
|
|
||||||
|
|
||||||
</com.google.android.material.card.MaterialCardView>
|
|
||||||
|
|
||||||
</com.google.android.material.card.MaterialCardView>
|
|
||||||
|
|
||||||
|
|
||||||
<!-- 右侧内容区域 -->
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:layout_marginStart="8dp"
|
|
||||||
android:layout_gravity="center"
|
|
||||||
android:orientation="vertical">
|
|
||||||
|
|
||||||
<!-- 标题行 -->
|
|
||||||
<androidx.constraintlayout.widget.ConstraintLayout
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/tv_name"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:singleLine="true"
|
|
||||||
android:text="@string/app_name"
|
|
||||||
android:textSize="16sp"
|
|
||||||
android:textStyle="bold"
|
|
||||||
app:layout_constraintEnd_toStartOf="@id/cd_count"
|
|
||||||
app:layout_constraintStart_toStartOf="parent"
|
|
||||||
app:layout_constraintTop_toTopOf="parent" />
|
|
||||||
|
|
||||||
<com.google.android.material.card.MaterialCardView
|
|
||||||
android:id="@+id/cd_count"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:visibility="gone"
|
|
||||||
android:layout_marginVertical="4dp"
|
|
||||||
app:cardBackgroundColor="?attr/colorSurfaceContainer"
|
|
||||||
app:cardCornerRadius="4dp"
|
|
||||||
app:layout_constraintBottom_toBottomOf="@id/tv_name"
|
|
||||||
app:layout_constraintEnd_toEndOf="parent"
|
|
||||||
app:layout_constraintTop_toTopOf="@id/tv_name"
|
|
||||||
app:strokeWidth="0dp">
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/bv_originCount"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:paddingHorizontal="4dp"
|
|
||||||
android:paddingVertical="2dp"
|
|
||||||
android:text="@string/text"
|
|
||||||
android:textColor="?attr/colorPrimary"
|
|
||||||
android:textSize="10sp"
|
|
||||||
android:textStyle="bold"
|
|
||||||
tools:ignore="SmallSp" />
|
|
||||||
</com.google.android.material.card.MaterialCardView>
|
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
|
||||||
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/tv_author"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:textColor="?attr/colorSecondary"
|
|
||||||
android:lines="1"
|
|
||||||
android:singleLine="true"
|
|
||||||
android:text="@string/author"
|
|
||||||
android:textSize="12sp" />
|
|
||||||
|
|
||||||
<!-- 最后阅读 -->
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/tv_lasted"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:ellipsize="end"
|
|
||||||
android:lines="1"
|
|
||||||
android:text="@string/last_read"
|
|
||||||
android:textSize="11sp" />
|
|
||||||
|
|
||||||
<!-- 简介 -->
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/tv_introduce"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:maxLines="2"
|
|
||||||
android:ellipsize="end"
|
|
||||||
android:text="@string/book_intro"
|
|
||||||
android:textSize="11sp" />
|
|
||||||
|
|
||||||
<HorizontalScrollView
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:scrollbars="none"
|
|
||||||
android:layout_marginTop="2dp">
|
|
||||||
<LinearLayout
|
|
||||||
android:id="@+id/kind_container"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:orientation="horizontal" />
|
|
||||||
</HorizontalScrollView>
|
|
||||||
|
|
||||||
</LinearLayout>
|
|
||||||
</LinearLayout>
|
|
||||||
</com.google.android.material.card.MaterialCardView>
|
|
||||||
Reference in new issue
Block a user