增加平板界面配置,更新主页面

This commit is contained in:
HapeLee
2025-09-03 04:15:06 +08:00
parent deb945dfbc
commit 44b35590d4
13 changed files with 180 additions and 54 deletions
@@ -209,8 +209,8 @@ object PreferKey {
const val delayBookLoadEnable = "delayBookLoadEnable"
const val sharedElementEnterTransitionEnable = "sharedElementEnterTransitionEnable"
const val bookshelfLayoutGridLandscape = "bookshelfLayoutGridLandscape"
const val bookshelfLayoutGridPortrait = "bookshelfLayoutGridPortrait"
const val tabletInterface = "tabletInterface"
}
@@ -808,5 +808,11 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
appCtx.putPrefBoolean(PreferKey.mangaVolumeKeyPage, value)
}
var tabletInterface
get() = appCtx.getPrefString(PreferKey.tabletInterface, "auto")
set(value) {
appCtx.putPrefString(PreferKey.tabletInterface, value)
}
}
@@ -158,6 +158,10 @@ class ThemeConfigFragment : PreferenceFragmentCompat(),
PreferKey.bgImageN -> {
upPreferenceSummary(key, getPrefString(key))
}
PreferKey.tabletInterface -> {
recreateActivities()
}
}
}
@@ -5,12 +5,16 @@ package io.legato.kazusa.ui.main
import android.content.res.Configuration
import android.os.Bundle
import android.text.format.DateUtils
import android.view.Gravity
import android.view.MenuItem
import android.view.MotionEvent
import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.ImageView
import androidx.activity.addCallback
import androidx.activity.viewModels
import androidx.core.view.get
import androidx.core.view.isVisible
import androidx.core.view.postDelayed
import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
@@ -18,6 +22,7 @@ import androidx.fragment.app.FragmentStatePagerAdapter
import androidx.lifecycle.lifecycleScope
import androidx.viewpager.widget.ViewPager
import com.google.android.material.bottomnavigation.BottomNavigationView
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
import com.google.android.material.navigation.NavigationBarView
import io.legato.kazusa.BuildConfig
import io.legato.kazusa.R
@@ -35,6 +40,7 @@ import io.legato.kazusa.help.storage.Backup
import io.legato.kazusa.lib.dialogs.alert
import io.legato.kazusa.service.BaseReadAloudService
import io.legato.kazusa.ui.about.CrashLogsDialog
import io.legato.kazusa.ui.book.search.SearchActivity
import io.legato.kazusa.ui.main.bookshelf.BaseBookshelfFragment
import io.legato.kazusa.ui.main.bookshelf.books.BookshelfFragment1
import io.legato.kazusa.ui.main.bookshelf.books.BookshelfFragment2
@@ -44,9 +50,9 @@ import io.legato.kazusa.ui.main.my.MyFragment
import io.legato.kazusa.ui.main.rss.RssFragment
import io.legato.kazusa.ui.welcome.WelcomeActivity
import io.legato.kazusa.ui.widget.dialog.TextDialog
import io.legato.kazusa.utils.dpToPx
import io.legato.kazusa.utils.gone
import io.legato.kazusa.utils.hideSoftInput
import io.legato.kazusa.utils.isCreated
import io.legato.kazusa.utils.observeEvent
import io.legato.kazusa.utils.setNavigationBarColorAuto
import io.legato.kazusa.utils.shouldHideSoftInput
@@ -107,6 +113,10 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
return
}
if (savedInstanceState != null) {
pagePosition = savedInstanceState.getInt("currentPagePosition", 0)
}
onBackPressedDispatcher.addCallback(this) {
if (pagePosition != 0) {
binding.viewPagerMain.currentItem = 0
@@ -133,6 +143,7 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
upBottomMenu()
initView()
upHomePage()
bindNavigationListener()
}
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
@@ -212,12 +223,6 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
viewPagerMain.offscreenPageLimit = 3
viewPagerMain.adapter = adapter
viewPagerMain.addOnPageChangeListener(PageChangeCallback())
getNavigationBarView().apply {
setOnItemSelectedListener { onNavigationItemSelected(it) }
setOnItemReselectedListener { onNavigationItemReselected(it) }
}
window.setNavigationBarColorAuto(themeColor(com.google.android.material.R.attr.colorSurfaceContainer))
}
@@ -287,6 +292,7 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putInt("currentPagePosition", pagePosition)
if (AppConfig.autoRefreshBook) {
outState.putBoolean("isAutoRefreshedBook", true)
}
@@ -333,18 +339,33 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
}
private fun getNavigationBarView(): NavigationBarView {
return findViewById(
if (resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT)
R.id.bottom_navigation_view
else
R.id.navigation_rail_view
)
val tabletInterface = AppConfig.tabletInterface
val orientation = resources.configuration.orientation
val smallestWidthDp = resources.configuration.smallestScreenWidthDp
val useRail = when (tabletInterface) {
"always" -> true
"landscape" -> orientation == Configuration.ORIENTATION_LANDSCAPE
"off" -> false
"auto" -> smallestWidthDp >= 600
else -> false
}
// 控制显隐
binding.navigationRailView.isVisible = useRail
binding.bottomNavigationView.isVisible = !useRail
return if (useRail) binding.navigationRailView else binding.bottomNavigationView
}
private fun upBottomMenu() {
val menu = getNavigationBarView().menu
val navView = getNavigationBarView()
val menu = navView.menu
menu.findItem(R.id.menu_discovery).isVisible = AppConfig.showDiscovery
menu.findItem(R.id.menu_rss).isVisible = AppConfig.showRSS
var index = 0
if (AppConfig.showDiscovery) {
index++
@@ -357,9 +378,65 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
index++
realPositions[index] = idMy
bottomMenuCount = index + 1
adapter.notifyDataSetChanged()
if (AppConfig.showBottomView) getNavigationBarView().visible()
else binding.bottomNavigationView?.gone()
if (AppConfig.showBottomView) {
navView.visible()
} else {
binding.bottomNavigationView.gone()
binding.navigationRailView.gone()
}
val efab =
binding.navigationRailView.headerView?.findViewById<ExtendedFloatingActionButton>(R.id.nav_fab)
efab?.let { it.isExtended = false }
val lp =
binding.navigationRailView.headerView?.let { it.layoutParams as FrameLayout.LayoutParams }
lp!!.gravity = Gravity.START
binding.navigationRailView.headerView?.setPadding(
12.dpToPx(),
12.dpToPx(),
12.dpToPx(),
12.dpToPx()
)
binding.navigationRailView.headerView?.findViewById<ExtendedFloatingActionButton>(R.id.nav_fab)
?.setOnClickListener {
startActivity<SearchActivity>()
}
binding.navigationRailView.headerView?.findViewById<ImageView>(R.id.nav_botton)
?.setOnClickListener {
efab?.let { it1 ->
if (it1.isExtended) {
efab.isExtended = false
binding.navigationRailView.collapse()
} else {
efab.isExtended = true
binding.navigationRailView.expand()
}
}
}
}
private fun bindNavigationListener() {
val navView = getNavigationBarView()
navView.setOnItemSelectedListener { onNavigationItemSelected(it) }
navView.setOnItemReselectedListener { onNavigationItemReselected(it) }
binding.viewPagerMain.post {
binding.viewPagerMain.setCurrentItem(pagePosition, false)
getNavigationBarView().menu[pagePosition].isChecked = true
}
}
private fun updateNavigationRailFab(position: Int) {
binding.navigationRailView.headerView?.gone()
val fragmentId = getFragmentId(position)
if (fragmentId == idBookshelf1 || fragmentId == idBookshelf2 || fragmentId == idBookshelf3) {
binding.navigationRailView.headerView?.visible()
}
}
private fun upHomePage() {
@@ -397,7 +474,9 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
override fun onPageSelected(position: Int) {
pagePosition = position
getNavigationBarView().menu[realPositions[position]].isChecked = true
val navView = getNavigationBarView()
navView.menu[realPositions[position]].isChecked = true
updateNavigationRailFab(position)
}
}
@@ -443,11 +522,7 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
}
override fun instantiateItem(container: ViewGroup, position: Int): Any {
var fragment = super.instantiateItem(container, position) as Fragment
if (fragment.isCreated && getItemPosition(fragment) == POSITION_NONE) {
destroyItem(container, position, fragment)
fragment = super.instantiateItem(container, position) as Fragment
}
val fragment = super.instantiateItem(container, position) as Fragment
fragmentMap[getId(position)] = fragment
return fragment
}