diff --git a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt index b214d04f0..332fb2e17 100644 --- a/app/src/main/java/io/legado/app/ui/main/MainActivity.kt +++ b/app/src/main/java/io/legado/app/ui/main/MainActivity.kt @@ -50,6 +50,7 @@ import io.legado.app.ui.main.bookshelf.BaseBookshelfFragment import io.legado.app.ui.main.bookshelf.books.BookshelfFragment1 import io.legado.app.ui.main.bookshelf.books.BookshelfFragment2 import io.legado.app.ui.main.bookshelf.books.BookshelfFragment3 +import io.legado.app.ui.main.bookshelf.books.BookshelfFragment4 import io.legado.app.ui.main.explore.ExploreFragment import io.legado.app.ui.main.my.MyFragment import io.legado.app.ui.main.rss.RssFragment @@ -86,6 +87,7 @@ open class MainActivity : VMBaseActivity(), private val idBookshelf1 = 11 private val idBookshelf2 = 12 private val idBookshelf3 = 13 + private val idBookshelf4 = 14 private val idExplore = 1 private val idRss = 2 private val idMy = 3 @@ -508,6 +510,7 @@ open class MainActivity : VMBaseActivity(), 0 -> idBookshelf1 1 -> idBookshelf2 2 -> idBookshelf3 + 3 -> idBookshelf4 else -> idBookshelf1 } } @@ -543,6 +546,7 @@ open class MainActivity : VMBaseActivity(), idBookshelf1 -> BookshelfFragment1(position) idBookshelf2 -> BookshelfFragment2(position) idBookshelf3 -> BookshelfFragment3(position) + idBookshelf4 -> BookshelfFragment4(position) idExplore -> ExploreFragment(position) idRss -> RssFragment(position) else -> MyFragment(position) diff --git a/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BookshelfFragment4.kt b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BookshelfFragment4.kt new file mode 100644 index 000000000..ab93e76e5 --- /dev/null +++ b/app/src/main/java/io/legado/app/ui/main/bookshelf/books/BookshelfFragment4.kt @@ -0,0 +1,164 @@ +@file:Suppress("DEPRECATION") + +package io.legado.app.ui.main.bookshelf.books + +import android.annotation.SuppressLint +import android.os.Build +import android.os.Bundle +import android.view.View +import androidx.appcompat.widget.SearchView +import androidx.fragment.app.Fragment +import androidx.viewpager2.adapter.FragmentStateAdapter +import com.google.android.material.tabs.TabLayout +import com.google.android.material.tabs.TabLayoutMediator +import io.legado.app.R +import io.legado.app.data.appDb +import io.legado.app.data.entities.Book +import io.legado.app.data.entities.BookGroup +import io.legado.app.databinding.FragmentBookshelf1Binding +import io.legado.app.databinding.FragmentBookshelf4Binding +import io.legado.app.help.config.AppConfig +import io.legado.app.ui.book.group.GroupEditDialog +import io.legado.app.ui.book.search.SearchActivity +import io.legado.app.ui.main.bookshelf.BaseBookshelfFragment +import io.legado.app.utils.showDialogFragment +import io.legado.app.utils.toastOnUi +import io.legado.app.utils.viewbindingdelegate.viewBinding +import kotlin.collections.set + +/** + * 书架界面 + */ +class BookshelfFragment4() : BaseBookshelfFragment(R.layout.fragment_bookshelf4), + TabLayout.OnTabSelectedListener, + SearchView.OnQueryTextListener { + + constructor(position: Int) : this() { + val bundle = Bundle() + bundle.putInt("position", position) + arguments = bundle + } + + private val binding by viewBinding(FragmentBookshelf4Binding::bind) + + private val bookGroups = mutableListOf() + private val fragmentMap = hashMapOf() + override val groupId: Long get() = selectedGroup?.groupId ?: 0 + + private lateinit var adapter: TabFragmentPageAdapter + + override val books: List + get() { + val fragment = fragmentMap[groupId] + return fragment?.getBooks() ?: emptyList() + } + + override fun onFragmentCreated(view: View, savedInstanceState: Bundle?) { + setSupportToolbar(binding.topBar) + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.S) + binding.titleBar.fitsSystemWindows = true + initView() + initBookGroupData() + } + + private val selectedGroup: BookGroup? + get() = bookGroups.getOrNull(binding.viewPagerBookshelf.currentItem) + + private fun initView() { + adapter = TabFragmentPageAdapter(this) + binding.viewPagerBookshelf.adapter = adapter + binding.viewPagerBookshelf.offscreenPageLimit = 1 + + TabLayoutMediator(binding.tabLayout, binding.viewPagerBookshelf) { tab, position -> + tab.text = bookGroups[position].groupName + }.attach() + } + + override fun onQueryTextSubmit(query: String?): Boolean { + SearchActivity.start(requireContext(), query) + return false + } + + override fun onQueryTextChange(newText: String?): Boolean { + return false + } + + @SuppressLint("NotifyDataSetChanged") + @Synchronized + override fun upGroup(data: List) { + if (data.isEmpty()) { + appDb.bookGroupDao.enableGroup(BookGroup.IdAll) + } else { + if (data != bookGroups) { + bookGroups.clear() + bookGroups.addAll(data) + adapter.notifyDataSetChanged() + adapter = TabFragmentPageAdapter(this) + binding.viewPagerBookshelf.adapter = adapter + + TabLayoutMediator(binding.tabLayout, binding.viewPagerBookshelf) { tab, position -> + tab.text = bookGroups[position].groupName + }.attach() + + selectLastTab() + + binding.tabLayout.post { + for (i in 0 until bookGroups.size) { + binding.tabLayout.getTabAt(i)?.view?.setOnLongClickListener { + showDialogFragment(GroupEditDialog(bookGroups[i])) + true + } + } + } + } + } + } + + override fun upSort() { + childFragmentManager.fragments.forEach { + if (it is BooksFragment) { + val position = it.position + val group = bookGroups.getOrNull(position) ?: return@forEach + it.setEnableRefresh(group.enableRefresh) + it.upBookSort(group.getRealBookSort()) + } + } + } + + private fun selectLastTab() { + binding.tabLayout.post { + binding.tabLayout.removeOnTabSelectedListener(this) + binding.tabLayout.getTabAt(AppConfig.saveTabPosition)?.select() + binding.tabLayout.addOnTabSelectedListener(this) + } + } + + override fun onTabReselected(tab: TabLayout.Tab) { + selectedGroup?.let { group -> + fragmentMap[group.groupId]?.let { + toastOnUi("${group.groupName}(${it.getBooksCount()})") + } + } + } + + override fun onTabUnselected(tab: TabLayout.Tab) = Unit + + override fun onTabSelected(tab: TabLayout.Tab) { + AppConfig.saveTabPosition = tab.position + } + + override fun gotoTop() { + fragmentMap[groupId]?.gotoTop() + } + + private inner class TabFragmentPageAdapter(fragment: Fragment) : FragmentStateAdapter(fragment) { + override fun getItemCount(): Int = bookGroups.size + + override fun createFragment(position: Int): Fragment { + val group = bookGroups[position] + val fragment = BooksFragment(position, group) + fragmentMap[group.groupId] = fragment + return fragment + } + } +} \ No newline at end of file diff --git a/app/src/main/res/layout/dialog_bookshelf_config.xml b/app/src/main/res/layout/dialog_bookshelf_config.xml index 3ebabaaec..c863ef71e 100644 --- a/app/src/main/res/layout/dialog_bookshelf_config.xml +++ b/app/src/main/res/layout/dialog_bookshelf_config.xml @@ -93,7 +93,7 @@ @@ -103,7 +103,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:checkableBehavior="single" - android:paddingBottom="8dp" app:selectionRequired="true" app:singleSelection="true" /> @@ -111,6 +110,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="center_vertical" + android:paddingVertical="8dp" android:text="@string/sortview" android:textSize="14sp" android:textStyle="bold" /> @@ -119,7 +119,6 @@ android:id="@+id/chip_group_layout" android:layout_width="match_parent" android:layout_height="wrap_content" - app:chipSpacingVertical="0dp" android:checkableBehavior="single" app:selectionRequired="true" app:singleSelection="true"> @@ -191,6 +190,7 @@ android:id="@+id/chipGroupOrder" android:layout_width="wrap_content" android:layout_height="wrap_content" + android:layout_marginVertical="8dp" app:selectionRequired="true" app:singleSelection="true"> @@ -218,7 +218,6 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" - app:chipSpacingVertical="0dp" app:selectionRequired="true" app:singleSelection="true" /> diff --git a/app/src/main/res/layout/fragment_bookshelf4.xml b/app/src/main/res/layout/fragment_bookshelf4.xml new file mode 100644 index 000000000..1602875d7 --- /dev/null +++ b/app/src/main/res/layout/fragment_bookshelf4.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-zh/arrays.xml b/app/src/main/res/values-zh/arrays.xml index 9f5a3f334..351251b3c 100644 --- a/app/src/main/res/values-zh/arrays.xml +++ b/app/src/main/res/values-zh/arrays.xml @@ -11,6 +11,7 @@ 标签 文件夹 隐藏标签 + 材料标签 @@ -183,7 +184,7 @@ 不显示标题 - 不显示 + 不显示章节 Disable title and chapter display diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 8a3dc94ec..890a306eb 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -16,6 +16,7 @@ Tab Folder Hide Tab + Material Tab diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 081058acb..f016ec7c2 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -35,6 +35,7 @@