Просмотр исходного кода

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

HapeLee 1 год назад
Родитель
Сommit
44b35590d4

+ 2 - 2
app/src/main/java/io/legato/kazusa/constant/PreferKey.kt

@@ -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"
 }

+ 6 - 0
app/src/main/java/io/legato/kazusa/help/config/AppConfig.kt

@@ -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)
+        }
+
 }
 

+ 4 - 0
app/src/main/java/io/legato/kazusa/ui/config/ThemeConfigFragment.kt

@@ -158,6 +158,10 @@ class ThemeConfigFragment : PreferenceFragmentCompat(),
             PreferKey.bgImageN -> {
                 upPreferenceSummary(key, getPrefString(key))
             }
+
+            PreferKey.tabletInterface -> {
+                recreateActivities()
+            }
         }
 
     }

+ 97 - 22
app/src/main/java/io/legato/kazusa/ui/main/MainActivity.kt

@@ -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
         }

+ 0 - 28
app/src/main/res/layout-land/activity_main.xml

@@ -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
app/src/main/res/layout/activity_main.xml

@@ -7,11 +7,11 @@
 
     <androidx.viewpager.widget.ViewPager
         android:id="@+id/view_pager_main"
-        android:layout_width="match_parent"
+        android:layout_width="0dp"
         android:layout_height="0dp"
         app:layout_constraintBottom_toTopOf="@id/bottom_navigation_view"
         app:layout_constraintEnd_toEndOf="parent"
-        app:layout_constraintStart_toStartOf="parent"
+        app:layout_constraintStart_toEndOf="@id/navigation_rail_view"
         app:layout_constraintTop_toTopOf="parent"
         tools:ignore="SpeakableTextPresentCheck" />
 
@@ -20,9 +20,23 @@
         android:id="@+id/bottom_navigation_view"
         android:layout_width="match_parent"
         android:layout_height="wrap_content"
+        android:visibility="visible"
         app:layout_constraintBottom_toBottomOf="parent"
         app:layout_constraintEnd_toEndOf="parent"
         app:layout_constraintStart_toStartOf="parent"
         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>

+ 26 - 0
app/src/main/res/layout/navigation_rail_fab.xml

@@ -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 - 0
app/src/main/res/values-zh/arrays.xml

@@ -124,5 +124,11 @@
         <item>@string/bookshelf_px_5</item>
     </string-array>
 
+    <string-array name="tabletInterface">
+        <item>自动</item>
+        <item>总是</item>
+        <item>横屏时</item>
+        <item>关闭</item>
+    </string-array>
 
 </resources>

+ 1 - 0
app/src/main/res/values-zh/strings.xml

@@ -1242,4 +1242,5 @@
     <string name="system_media_control_compatibility_change">系统媒体控件兼容性更改</string>
     <string name="system_media_control_compatibility_change_summary">当锁屏不显示系统媒体控件时可以尝试开启,比如 OneUI 7.0或 OriginOS 等</string>
     <string name="read_aloud_pause_resume">朗读暂停/继续</string>
+    <string name="tabletInterface">平板界面</string>
 </resources>

+ 7 - 0
app/src/main/res/values/array_values.xml

@@ -64,4 +64,11 @@
         <item>en</item>
     </string-array>
 
+    <string-array name="tabletInterface_value">
+        <item>auto</item>
+        <item>always</item>
+        <item>landscape</item>
+        <item>off</item>
+    </string-array>
+
 </resources>

+ 7 - 0
app/src/main/res/values/arrays.xml

@@ -152,6 +152,13 @@
 		<item>English</item>
 	</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">
 		<item>BookSource</item>
 		<item>RssSource</item>

+ 1 - 0
app/src/main/res/values/strings.xml

@@ -1247,4 +1247,5 @@
     <string name="system_media_control_compatibility_change_summary">当锁屏不显示系统媒体控件时可以尝试开启,比如 OneUI 7.0或 OriginOS 等</string>
     <string name="read_aloud_pause_resume">朗读暂停/继续</string>
     <string name="play_mode">播放模式</string>
+    <string name="tabletInterface">平板界面</string>
 </resources>

+ 7 - 0
app/src/main/res/xml/pref_config_theme.xml

@@ -40,6 +40,13 @@
             app:iconSpaceReserved="false"
             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
             android:key="welcomeStyle"
             android:title="@string/welcome_style"