소스 검색

[修复] 在文件夹布局进入文件夹时,为底部图标添加一个返回按钮,以解决某些设备上无法正确返回至顶的问题

HapeLee 10 달 전
부모
커밋
0ce96c1f0d

+ 39 - 7
app/src/main/java/io/legado/app/ui/main/MainActivity.kt

@@ -9,7 +9,6 @@ import android.os.Bundle
 import android.text.format.DateUtils
 import android.text.format.DateUtils
 import android.view.Gravity
 import android.view.Gravity
 import android.view.MenuItem
 import android.view.MenuItem
-import android.view.MotionEvent
 import android.widget.FrameLayout
 import android.widget.FrameLayout
 import android.widget.ImageView
 import android.widget.ImageView
 import androidx.activity.OnBackPressedCallback
 import androidx.activity.OnBackPressedCallback
@@ -33,6 +32,7 @@ import io.legado.app.base.VMBaseActivity
 import io.legado.app.constant.AppConst.appInfo
 import io.legado.app.constant.AppConst.appInfo
 import io.legado.app.constant.EventBus
 import io.legado.app.constant.EventBus
 import io.legado.app.constant.PreferKey
 import io.legado.app.constant.PreferKey
+import io.legado.app.data.entities.BookGroup
 import io.legado.app.databinding.ActivityMainBinding
 import io.legado.app.databinding.ActivityMainBinding
 import io.legado.app.help.AppWebDav
 import io.legado.app.help.AppWebDav
 import io.legado.app.help.book.BookHelp
 import io.legado.app.help.book.BookHelp
@@ -58,10 +58,8 @@ import io.legado.app.ui.welcome.WelcomeActivity
 import io.legado.app.ui.widget.dialog.TextDialog
 import io.legado.app.ui.widget.dialog.TextDialog
 import io.legado.app.utils.getPrefBoolean
 import io.legado.app.utils.getPrefBoolean
 import io.legado.app.utils.gone
 import io.legado.app.utils.gone
-import io.legado.app.utils.hideSoftInput
 import io.legado.app.utils.observeEvent
 import io.legado.app.utils.observeEvent
 import io.legado.app.utils.setNavigationBarColorAuto
 import io.legado.app.utils.setNavigationBarColorAuto
-import io.legado.app.utils.shouldHideSoftInput
 import io.legado.app.utils.showDialogFragment
 import io.legado.app.utils.showDialogFragment
 import io.legado.app.utils.startActivity
 import io.legado.app.utils.startActivity
 import io.legado.app.utils.themeColor
 import io.legado.app.utils.themeColor
@@ -183,10 +181,15 @@ open class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
     override fun onNavigationItemReselected(item: MenuItem) {
     override fun onNavigationItemReselected(item: MenuItem) {
         when (item.itemId) {
         when (item.itemId) {
             R.id.menu_bookshelf -> {
             R.id.menu_bookshelf -> {
-                if (System.currentTimeMillis() - bookshelfReselected > 300) {
-                    bookshelfReselected = System.currentTimeMillis()
+                val fragment = fragmentMap[getFragmentId(0)] as? BookshelfFragment2
+                if (fragment != null && fragment.groupId != BookGroup.IdRoot) {
+                    fragment.back()
                 } else {
                 } else {
-                    (fragmentMap[getFragmentId(0)] as? BaseBookshelfFragment)?.gotoTop()
+                    if (System.currentTimeMillis() - bookshelfReselected > 300) {
+                        bookshelfReselected = System.currentTimeMillis()
+                    } else {
+                        fragment?.gotoTop()
+                    }
                 }
                 }
             }
             }
 
 
@@ -341,6 +344,7 @@ open class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
         observeEvent<Boolean>(EventBus.NOTIFY_MAIN) {
         observeEvent<Boolean>(EventBus.NOTIFY_MAIN) {
             binding.apply {
             binding.apply {
                 upBottomMenu()
                 upBottomMenu()
+                updateBookshelfIcon(true)
                 if (it) {
                 if (it) {
                     viewPagerMain.setCurrentItem(bottomMenuCount - 1, false)
                     viewPagerMain.setCurrentItem(bottomMenuCount - 1, false)
                 }
                 }
@@ -474,6 +478,22 @@ open class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
 
 
     }
     }
 
 
+    private fun updateBookshelfIcon(isRoot: Boolean) {
+        val navView = getNavigationBarView()
+        val bookshelfMenuItem = navView.menu.findItem(R.id.menu_bookshelf) ?: return
+
+        if (isRoot) {
+            bookshelfMenuItem.setIcon(R.drawable.ic_bottom_books)
+        } else {
+            val currentFragment = fragmentMap[getFragmentId(0)]
+            if (currentFragment is BookshelfFragment2) {
+                bookshelfMenuItem.setIcon(R.drawable.ic_arrow_back)
+            } else {
+                bookshelfMenuItem.setIcon(R.drawable.ic_bottom_books)
+            }
+        }
+    }
+
     private fun upHomePage() {
     private fun upHomePage() {
         when (AppConfig.defaultHomePage) {
         when (AppConfig.defaultHomePage) {
             "bookshelf" -> {}
             "bookshelf" -> {}
@@ -515,6 +535,12 @@ open class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
                 idMy -> R.id.menu_my_config
                 idMy -> R.id.menu_my_config
                 else -> R.id.menu_bookshelf
                 else -> R.id.menu_bookshelf
             }
             }
+            if (position == 0) {
+                val fragment = fragmentMap[getFragmentId(0)] as? BookshelfFragment2
+                updateBookshelfIcon(fragment?.groupId == BookGroup.IdRoot)
+            } else {
+                updateBookshelfIcon(true)
+            }
             updateBackCallbackState()
             updateBackCallbackState()
         }
         }
     }
     }
@@ -532,7 +558,13 @@ open class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
         override fun createFragment(position: Int): Fragment {
         override fun createFragment(position: Int): Fragment {
             val fragment = when (getFragmentId(position)) {
             val fragment = when (getFragmentId(position)) {
                 idBookshelf1 -> BookshelfFragment1(position)
                 idBookshelf1 -> BookshelfFragment1(position)
-                idBookshelf2 -> BookshelfFragment2(position)
+                idBookshelf2 -> BookshelfFragment2(position).apply {
+                    this.onGroupIdChangedListener = { isRoot ->
+                        if (pagePosition == 0) {
+                            updateBookshelfIcon(isRoot)
+                        }
+                    }
+                }
                 idBookshelf3 -> BookshelfFragment3(position)
                 idBookshelf3 -> BookshelfFragment3(position)
                 idBookshelf4 -> BookshelfFragment4(position)
                 idBookshelf4 -> BookshelfFragment4(position)
                 idExplore -> ExploreFragment(position)
                 idExplore -> ExploreFragment(position)

+ 10 - 3
app/src/main/java/io/legado/app/ui/main/bookshelf/books/BookshelfFragment2.kt

@@ -54,7 +54,6 @@ import io.legado.app.utils.startActivityForBook
 import io.legado.app.utils.viewbindingdelegate.viewBinding
 import io.legado.app.utils.viewbindingdelegate.viewBinding
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.Job
 import kotlinx.coroutines.Job
-import kotlinx.coroutines.delay
 import kotlinx.coroutines.flow.catch
 import kotlinx.coroutines.flow.catch
 import kotlinx.coroutines.flow.conflate
 import kotlinx.coroutines.flow.conflate
 import kotlinx.coroutines.flow.flowOn
 import kotlinx.coroutines.flow.flowOn
@@ -111,6 +110,8 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
         }
         }
     }
     }
 
 
+    var onGroupIdChangedListener: ((isRoot: Boolean) -> Unit)? = null
+
     private var bookGroups: List<BookGroup> = emptyList()
     private var bookGroups: List<BookGroup> = emptyList()
     private var booksFlowJob: Job? = null
     private var booksFlowJob: Job? = null
     override var groupId = BookGroup.Companion.IdRoot
     override var groupId = BookGroup.Companion.IdRoot
@@ -138,9 +139,15 @@ class BookshelfFragment2() : BaseBookshelfFragment(R.layout.fragment_bookshelf2)
         requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, backCallback)
         requireActivity().onBackPressedDispatcher.addCallback(viewLifecycleOwner, backCallback)
     }
     }
 
 
+    override fun onDestroyView() {
+        onGroupIdChangedListener?.invoke(true)
+        super.onDestroyView()
+    }
+
     private fun updateBackCallbackState() {
     private fun updateBackCallbackState() {
-        //每次进出书架时,判断是否启用回调
-        backCallback.isEnabled = groupId != BookGroup.IdRoot
+        val isRoot = groupId == BookGroup.IdRoot
+        backCallback.isEnabled = !isRoot
+        onGroupIdChangedListener?.invoke(isRoot)
     }
     }
 
 
     @Suppress("UNCHECKED_CAST")
     @Suppress("UNCHECKED_CAST")

+ 1 - 1
gradle/libs.versions.toml

@@ -11,7 +11,7 @@ datastorePreferences = "1.2.0"
 foundation = "1.10.0"
 foundation = "1.10.0"
 kotlin = "2.3.0"
 kotlin = "2.3.0"
 kotlinxCoroutinesAndroid = "1.10.2"
 kotlinxCoroutinesAndroid = "1.10.2"
-ksp = "2.2.21-2.0.4"
+ksp = "2.3.4"
 agp = "8.13.2"
 agp = "8.13.2"
 appcompat = "1.7.1"
 appcompat = "1.7.1"
 colorpicker = "1.1.0"
 colorpicker = "1.1.0"