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

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 delayBookLoadEnable = "delayBookLoadEnable"
const val sharedElementEnterTransitionEnable = "sharedElementEnterTransitionEnable" const val sharedElementEnterTransitionEnable = "sharedElementEnterTransitionEnable"
const val bookshelfLayoutGridLandscape = "bookshelfLayoutGridLandscape" const val bookshelfLayoutGridLandscape = "bookshelfLayoutGridLandscape"
const val bookshelfLayoutGridPortrait = "bookshelfLayoutGridPortrait" const val bookshelfLayoutGridPortrait = "bookshelfLayoutGridPortrait"
const val tabletInterface = "tabletInterface"
} }
@@ -808,5 +808,11 @@ object AppConfig : SharedPreferences.OnSharedPreferenceChangeListener {
appCtx.putPrefBoolean(PreferKey.mangaVolumeKeyPage, value) 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 -> { PreferKey.bgImageN -> {
upPreferenceSummary(key, getPrefString(key)) upPreferenceSummary(key, getPrefString(key))
} }
PreferKey.tabletInterface -> {
recreateActivities()
}
} }
} }
@@ -5,12 +5,16 @@ package io.legato.kazusa.ui.main
import android.content.res.Configuration import android.content.res.Configuration
import android.os.Bundle import android.os.Bundle
import android.text.format.DateUtils import android.text.format.DateUtils
import android.view.Gravity
import android.view.MenuItem import android.view.MenuItem
import android.view.MotionEvent import android.view.MotionEvent
import android.view.ViewGroup import android.view.ViewGroup
import android.widget.FrameLayout
import android.widget.ImageView
import androidx.activity.addCallback import androidx.activity.addCallback
import androidx.activity.viewModels import androidx.activity.viewModels
import androidx.core.view.get import androidx.core.view.get
import androidx.core.view.isVisible
import androidx.core.view.postDelayed import androidx.core.view.postDelayed
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager import androidx.fragment.app.FragmentManager
@@ -18,6 +22,7 @@ import androidx.fragment.app.FragmentStatePagerAdapter
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.viewpager.widget.ViewPager import androidx.viewpager.widget.ViewPager
import com.google.android.material.bottomnavigation.BottomNavigationView import com.google.android.material.bottomnavigation.BottomNavigationView
import com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
import com.google.android.material.navigation.NavigationBarView import com.google.android.material.navigation.NavigationBarView
import io.legato.kazusa.BuildConfig import io.legato.kazusa.BuildConfig
import io.legato.kazusa.R 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.lib.dialogs.alert
import io.legato.kazusa.service.BaseReadAloudService import io.legato.kazusa.service.BaseReadAloudService
import io.legato.kazusa.ui.about.CrashLogsDialog 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.BaseBookshelfFragment
import io.legato.kazusa.ui.main.bookshelf.books.BookshelfFragment1 import io.legato.kazusa.ui.main.bookshelf.books.BookshelfFragment1
import io.legato.kazusa.ui.main.bookshelf.books.BookshelfFragment2 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.main.rss.RssFragment
import io.legato.kazusa.ui.welcome.WelcomeActivity import io.legato.kazusa.ui.welcome.WelcomeActivity
import io.legato.kazusa.ui.widget.dialog.TextDialog 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.gone
import io.legato.kazusa.utils.hideSoftInput import io.legato.kazusa.utils.hideSoftInput
import io.legato.kazusa.utils.isCreated
import io.legato.kazusa.utils.observeEvent import io.legato.kazusa.utils.observeEvent
import io.legato.kazusa.utils.setNavigationBarColorAuto import io.legato.kazusa.utils.setNavigationBarColorAuto
import io.legato.kazusa.utils.shouldHideSoftInput import io.legato.kazusa.utils.shouldHideSoftInput
@@ -107,6 +113,10 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
return return
} }
if (savedInstanceState != null) {
pagePosition = savedInstanceState.getInt("currentPagePosition", 0)
}
onBackPressedDispatcher.addCallback(this) { onBackPressedDispatcher.addCallback(this) {
if (pagePosition != 0) { if (pagePosition != 0) {
binding.viewPagerMain.currentItem = 0 binding.viewPagerMain.currentItem = 0
@@ -133,6 +143,7 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
upBottomMenu() upBottomMenu()
initView() initView()
upHomePage() upHomePage()
bindNavigationListener()
} }
override fun dispatchTouchEvent(ev: MotionEvent): Boolean { override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
@@ -212,12 +223,6 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
viewPagerMain.offscreenPageLimit = 3 viewPagerMain.offscreenPageLimit = 3
viewPagerMain.adapter = adapter viewPagerMain.adapter = adapter
viewPagerMain.addOnPageChangeListener(PageChangeCallback()) viewPagerMain.addOnPageChangeListener(PageChangeCallback())
getNavigationBarView().apply {
setOnItemSelectedListener { onNavigationItemSelected(it) }
setOnItemReselectedListener { onNavigationItemReselected(it) }
}
window.setNavigationBarColorAuto(themeColor(com.google.android.material.R.attr.colorSurfaceContainer)) window.setNavigationBarColorAuto(themeColor(com.google.android.material.R.attr.colorSurfaceContainer))
} }
@@ -287,6 +292,7 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
override fun onSaveInstanceState(outState: Bundle) { override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState) super.onSaveInstanceState(outState)
outState.putInt("currentPagePosition", pagePosition)
if (AppConfig.autoRefreshBook) { if (AppConfig.autoRefreshBook) {
outState.putBoolean("isAutoRefreshedBook", true) outState.putBoolean("isAutoRefreshedBook", true)
} }
@@ -333,18 +339,33 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
} }
private fun getNavigationBarView(): NavigationBarView { private fun getNavigationBarView(): NavigationBarView {
return findViewById( val tabletInterface = AppConfig.tabletInterface
if (resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) val orientation = resources.configuration.orientation
R.id.bottom_navigation_view val smallestWidthDp = resources.configuration.smallestScreenWidthDp
else
R.id.navigation_rail_view 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() { 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_discovery).isVisible = AppConfig.showDiscovery
menu.findItem(R.id.menu_rss).isVisible = AppConfig.showRSS menu.findItem(R.id.menu_rss).isVisible = AppConfig.showRSS
var index = 0 var index = 0
if (AppConfig.showDiscovery) { if (AppConfig.showDiscovery) {
index++ index++
@@ -357,9 +378,65 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
index++ index++
realPositions[index] = idMy realPositions[index] = idMy
bottomMenuCount = index + 1 bottomMenuCount = index + 1
adapter.notifyDataSetChanged() 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() { private fun upHomePage() {
@@ -397,7 +474,9 @@ class MainActivity : VMBaseActivity<ActivityMainBinding, MainViewModel>(),
override fun onPageSelected(position: Int) { override fun onPageSelected(position: Int) {
pagePosition = position 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 { override fun instantiateItem(container: ViewGroup, position: Int): Any {
var fragment = super.instantiateItem(container, position) as Fragment val 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
}
fragmentMap[getId(position)] = fragment fragmentMap[getId(position)] = fragment
return fragment return fragment
} }
@@ -1,28 +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"
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.google.android.material.navigationrail.NavigationRailView
android:id="@+id/navigation_rail_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="?attr/colorSurfaceContainer"
app:menuGravity="center"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:menu="@menu/main_bnv" />
<androidx.viewpager.widget.ViewPager
android:id="@+id/view_pager_main"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@id/navigation_rail_view"
app:layout_constraintEnd_toEndOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
+16 -2
View File
@@ -7,11 +7,11 @@
<androidx.viewpager.widget.ViewPager <androidx.viewpager.widget.ViewPager
android:id="@+id/view_pager_main" android:id="@+id/view_pager_main"
android:layout_width="match_parent" android:layout_width="0dp"
android:layout_height="0dp" android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@id/bottom_navigation_view" app:layout_constraintBottom_toTopOf="@id/bottom_navigation_view"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toEndOf="@id/navigation_rail_view"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
tools:ignore="SpeakableTextPresentCheck" /> tools:ignore="SpeakableTextPresentCheck" />
@@ -20,9 +20,23 @@
android:id="@+id/bottom_navigation_view" android:id="@+id/bottom_navigation_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:visibility="visible"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:menu="@menu/main_bnv" /> app:menu="@menu/main_bnv" />
<com.google.android.material.navigationrail.NavigationRailView
android:id="@+id/navigation_rail_view"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:background="?attr/colorSurfaceContainer"
android:visibility="visible"
app:headerLayout="@layout/navigation_rail_fab"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:menu="@menu/main_bnv"
app:menuGravity="center" />
</androidx.constraintlayout.widget.ConstraintLayout> </androidx.constraintlayout.widget.ConstraintLayout>
@@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/navigation_rail_fab"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="top|start"
android:clipChildren="false"
android:clipToPadding="false"
android:orientation="vertical">
<ImageView
android:id="@+id/nav_botton"
android:layout_width="56dp"
android:layout_height="56dp"
android:scaleType="center"
android:src="@drawable/ic_menu" />
<com.google.android.material.floatingactionbutton.ExtendedFloatingActionButton
android:id="@+id/nav_fab"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/search"
app:icon="@drawable/ic_search" />
</LinearLayout>
+6
View File
@@ -124,5 +124,11 @@
<item>@string/bookshelf_px_5</item> <item>@string/bookshelf_px_5</item>
</string-array> </string-array>
<string-array name="tabletInterface">
<item>自动</item>
<item>总是</item>
<item>横屏时</item>
<item>关闭</item>
</string-array>
</resources> </resources>
+1
View File
@@ -1242,4 +1242,5 @@
<string name="system_media_control_compatibility_change">系统媒体控件兼容性更改</string> <string name="system_media_control_compatibility_change">系统媒体控件兼容性更改</string>
<string name="system_media_control_compatibility_change_summary">当锁屏不显示系统媒体控件时可以尝试开启,比如 OneUI 7.0或 OriginOS 等</string> <string name="system_media_control_compatibility_change_summary">当锁屏不显示系统媒体控件时可以尝试开启,比如 OneUI 7.0或 OriginOS 等</string>
<string name="read_aloud_pause_resume">朗读暂停/继续</string> <string name="read_aloud_pause_resume">朗读暂停/继续</string>
<string name="tabletInterface">平板界面</string>
</resources> </resources>
+7
View File
@@ -64,4 +64,11 @@
<item>en</item> <item>en</item>
</string-array> </string-array>
<string-array name="tabletInterface_value">
<item>auto</item>
<item>always</item>
<item>landscape</item>
<item>off</item>
</string-array>
</resources> </resources>
+7
View File
@@ -152,6 +152,13 @@
<item>English</item> <item>English</item>
</string-array> </string-array>
<string-array name="tabletInterface">
<item>Auto</item>
<item>Always</item>
<item>In_Landscape_Mode</item>
<item>Off</item>
</string-array>
<string-array name="rule_type"> <string-array name="rule_type">
<item>BookSource</item> <item>BookSource</item>
<item>RssSource</item> <item>RssSource</item>
+1
View File
@@ -1247,4 +1247,5 @@
<string name="system_media_control_compatibility_change_summary">当锁屏不显示系统媒体控件时可以尝试开启,比如 OneUI 7.0或 OriginOS 等</string> <string name="system_media_control_compatibility_change_summary">当锁屏不显示系统媒体控件时可以尝试开启,比如 OneUI 7.0或 OriginOS 等</string>
<string name="read_aloud_pause_resume">朗读暂停/继续</string> <string name="read_aloud_pause_resume">朗读暂停/继续</string>
<string name="play_mode">播放模式</string> <string name="play_mode">播放模式</string>
<string name="tabletInterface">平板界面</string>
</resources> </resources>
@@ -40,6 +40,13 @@
app:iconSpaceReserved="false" app:iconSpaceReserved="false"
app:icons="@array/icons" /> app:icons="@array/icons" />
<io.legato.kazusa.lib.prefs.NameListPreference
android:defaultValue="auto"
android:key="tabletInterface"
android:title="@string/tabletInterface"
app:entries="@array/tabletInterface"
app:entryValues="@array/tabletInterface_value" />
<io.legato.kazusa.lib.prefs.Preference <io.legato.kazusa.lib.prefs.Preference
android:key="welcomeStyle" android:key="welcomeStyle"
android:title="@string/welcome_style" android:title="@string/welcome_style"