From 2f9c2d9ab656d5ed7c83e02dc123eb1c661104d3 Mon Sep 17 00:00:00 2001 From: Koitharu Date: Tue, 22 Aug 2023 12:11:09 +0300 Subject: [PATCH] Option to swap first two navigation items --- .../kotatsu/core/prefs/AppSettings.kt | 4 +++ .../core/ui/util/ActivityRecreationHandle.kt | 5 ++++ .../koitharu/kotatsu/core/util/ext/Android.kt | 2 +- .../koitharu/kotatsu/main/ui/MainActivity.kt | 3 +- .../kotatsu/main/ui/MainNavigationDelegate.kt | 30 +++++++++++++++---- .../kotatsu/reader/ui/ReaderActivity.kt | 2 +- .../settings/AppearanceSettingsFragment.kt | 9 ++++-- .../res/layout-w600dp-land/activity_main.xml | 2 +- app/src/main/res/layout/activity_main.xml | 4 +-- app/src/main/res/menu/nav_bottom_alt.xml | 25 ++++++++++++++++ app/src/main/res/values/arrays.xml | 5 +++- app/src/main/res/values/constants.xml | 4 +++ app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/pref_appearance.xml | 12 ++++++-- 14 files changed, 91 insertions(+), 17 deletions(-) create mode 100644 app/src/main/res/menu/nav_bottom_alt.xml diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt index 0530b2e73..573a17d0a 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/prefs/AppSettings.kt @@ -51,6 +51,9 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) { val isAmoledTheme: Boolean get() = prefs.getBoolean(KEY_THEME_AMOLED, false) + val isFavoritesNavItemFirst: Boolean + get() = (prefs.getString(KEY_FIRST_NAV_ITEM, null)?.toIntOrNull() ?: 0) == 1 + var gridSize: Int get() = prefs.getInt(KEY_GRID_SIZE, 100) set(value) = prefs.edit { putInt(KEY_GRID_SIZE, value) } @@ -452,6 +455,7 @@ class AppSettings @Inject constructor(@ApplicationContext context: Context) { const val KEY_LOCAL_MANGA_DIRS = "local_manga_dirs" const val KEY_DISABLE_NSFW = "no_nsfw" const val KEY_RELATED_MANGA = "related_manga" + const val KEY_FIRST_NAV_ITEM = "nav_first" // About const val KEY_APP_UPDATE = "app_update" diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/util/ActivityRecreationHandle.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/util/ActivityRecreationHandle.kt index 46c1d0f9e..e7f481f36 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/util/ActivityRecreationHandle.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/ui/util/ActivityRecreationHandle.kt @@ -25,4 +25,9 @@ class ActivityRecreationHandle @Inject constructor() : DefaultActivityLifecycleC val snapshot = activities.keys.toList() snapshot.forEach { ActivityCompat.recreate(it) } } + + fun recreate(cls: Class) { + val activity = activities.keys.find { x -> x.javaClass == cls } ?: return + ActivityCompat.recreate(activity) + } } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/core/util/ext/Android.kt b/app/src/main/kotlin/org/koitharu/kotatsu/core/util/ext/Android.kt index 271e3a1a5..d5af3b6b3 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/core/util/ext/Android.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/core/util/ext/Android.kt @@ -102,7 +102,7 @@ fun SharedPreferences.observe(key: String, valueProducer: suspend () -> T): } }.distinctUntilChanged() -fun Lifecycle.postDelayed(runnable: Runnable, delay: Long) { +fun Lifecycle.postDelayed(delay: Long, runnable: Runnable) { coroutineScope.launch { delay(delay) runnable.run() diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/MainActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/MainActivity.kt index 233dde479..c0c543272 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/MainActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/MainActivity.kt @@ -116,9 +116,10 @@ class MainActivity : BaseActivity(), AppBarOwner, BottomNav navigationDelegate = MainNavigationDelegate( navBar = checkNotNull(bottomNav ?: viewBinding.navRail), fragmentManager = supportFragmentManager, + settings = settings, ) navigationDelegate.addOnFragmentChangedListener(this) - navigationDelegate.onCreate() + navigationDelegate.onCreate(savedInstanceState) appUpdateBadge = OptionsMenuBadgeHelper(viewBinding.toolbar, R.id.action_app_update) diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/MainNavigationDelegate.kt b/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/MainNavigationDelegate.kt index 9397bfee8..e7e432879 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/MainNavigationDelegate.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/main/ui/MainNavigationDelegate.kt @@ -1,14 +1,17 @@ package org.koitharu.kotatsu.main.ui +import android.os.Bundle import android.view.MenuItem import androidx.activity.OnBackPressedCallback import androidx.annotation.IdRes +import androidx.core.view.isEmpty import androidx.core.view.iterator import androidx.fragment.app.Fragment import androidx.fragment.app.FragmentManager import com.google.android.material.navigation.NavigationBarView import com.google.android.material.transition.MaterialFadeThrough import org.koitharu.kotatsu.R +import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.core.ui.util.RecyclerViewOwner import org.koitharu.kotatsu.core.util.ext.firstVisibleItemPosition import org.koitharu.kotatsu.core.util.ext.isAnimationsEnabled @@ -23,7 +26,10 @@ private const val TAG_PRIMARY = "primary" class MainNavigationDelegate( private val navBar: NavigationBarView, private val fragmentManager: FragmentManager, -) : OnBackPressedCallback(false), NavigationBarView.OnItemSelectedListener, NavigationBarView.OnItemReselectedListener { + private val settings: AppSettings, +) : OnBackPressedCallback(false), + NavigationBarView.OnItemSelectedListener, + NavigationBarView.OnItemReselectedListener { private val listeners = LinkedList() @@ -56,14 +62,26 @@ class MainNavigationDelegate( navBar.selectedItemId = R.id.nav_history } - fun onCreate() { - primaryFragment?.let { - onFragmentChanged(it, fromUser = false) - val itemId = getItemId(it) + fun onCreate(savedInstanceState: Bundle?) { + if (navBar.menu.isEmpty()) { + val menuRes = if (settings.isFavoritesNavItemFirst) R.menu.nav_bottom_alt else R.menu.nav_bottom + navBar.inflateMenu(menuRes) + } + val fragment = primaryFragment + if (fragment != null) { + onFragmentChanged(fragment, fromUser = false) + val itemId = getItemId(fragment) if (navBar.selectedItemId != itemId) { navBar.selectedItemId = itemId } - } ?: onNavigationItemSelected(navBar.selectedItemId) + } else { + val itemId = if (savedInstanceState == null) { + firstItem()?.itemId ?: navBar.selectedItemId + } else { + navBar.selectedItemId + } + onNavigationItemSelected(itemId) + } } fun setCounterAt(position: Int, counter: Int) { diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt index 63702d529..4e8f25a78 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/reader/ui/ReaderActivity.kt @@ -163,7 +163,7 @@ class ReaderActivity : readerManager.replace(mode) } if (viewBinding.appbarTop.isVisible) { - lifecycle.postDelayed(hideUiRunnable, TimeUnit.SECONDS.toMillis(1)) + lifecycle.postDelayed(TimeUnit.SECONDS.toMillis(1), hideUiRunnable) } viewBinding.slider.isRtl = mode == ReaderMode.REVERSED } diff --git a/app/src/main/kotlin/org/koitharu/kotatsu/settings/AppearanceSettingsFragment.kt b/app/src/main/kotlin/org/koitharu/kotatsu/settings/AppearanceSettingsFragment.kt index 039293ce6..67d8a4b78 100644 --- a/app/src/main/kotlin/org/koitharu/kotatsu/settings/AppearanceSettingsFragment.kt +++ b/app/src/main/kotlin/org/koitharu/kotatsu/settings/AppearanceSettingsFragment.kt @@ -10,7 +10,6 @@ import android.provider.Settings import android.view.View import androidx.appcompat.app.AppCompatDelegate import androidx.core.app.LocaleManagerCompat -import androidx.core.view.postDelayed import androidx.preference.ListPreference import androidx.preference.Preference import dagger.hilt.android.AndroidEntryPoint @@ -21,8 +20,10 @@ import org.koitharu.kotatsu.core.ui.BasePreferenceFragment import org.koitharu.kotatsu.core.ui.util.ActivityRecreationHandle import org.koitharu.kotatsu.core.util.ext.getLocalesConfig import org.koitharu.kotatsu.core.util.ext.map +import org.koitharu.kotatsu.core.util.ext.postDelayed import org.koitharu.kotatsu.core.util.ext.setDefaultValueCompat import org.koitharu.kotatsu.core.util.ext.toList +import org.koitharu.kotatsu.main.ui.MainActivity import org.koitharu.kotatsu.parsers.util.names import org.koitharu.kotatsu.parsers.util.toTitleCase import org.koitharu.kotatsu.settings.utils.ActivityListPreference @@ -92,11 +93,15 @@ class AppearanceSettingsFragment : AppSettings.KEY_APP_LOCALE -> { AppCompatDelegate.setApplicationLocales(settings.appLocales) } + + AppSettings.KEY_FIRST_NAV_ITEM -> { + activityRecreationHandle.recreate(MainActivity::class.java) + } } } private fun postRestart() { - view?.postDelayed(400) { + viewLifecycleOwner.lifecycle.postDelayed(400) { activityRecreationHandle.recreateAll() } } diff --git a/app/src/main/res/layout-w600dp-land/activity_main.xml b/app/src/main/res/layout-w600dp-land/activity_main.xml index e566cad6f..232109c22 100644 --- a/app/src/main/res/layout-w600dp-land/activity_main.xml +++ b/app/src/main/res/layout-w600dp-land/activity_main.xml @@ -16,7 +16,7 @@ app:headerLayout="@layout/navigation_rail_fab" app:labelVisibilityMode="labeled" app:layout_constraintStart_toStartOf="parent" - app:menu="@menu/nav_bottom" /> + tools:menu="@menu/nav_bottom" /> + tools:ignore="KeyboardInaccessibleWidget" + tools:menu="@menu/nav_bottom" /> diff --git a/app/src/main/res/menu/nav_bottom_alt.xml b/app/src/main/res/menu/nav_bottom_alt.xml new file mode 100644 index 000000000..2408e6ec0 --- /dev/null +++ b/app/src/main/res/menu/nav_bottom_alt.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + diff --git a/app/src/main/res/values/arrays.xml b/app/src/main/res/values/arrays.xml index 9969d64b1..1f0cb2988 100644 --- a/app/src/main/res/values/arrays.xml +++ b/app/src/main/res/values/arrays.xml @@ -70,5 +70,8 @@ @string/system_default @string/advanced - Advanced + + @string/history + @string/favourites + diff --git a/app/src/main/res/values/constants.xml b/app/src/main/res/values/constants.xml index c62bb5477..ab014ce7c 100644 --- a/app/src/main/res/values/constants.xml +++ b/app/src/main/res/values/constants.xml @@ -60,4 +60,8 @@ #21005E #7D5260 + + 0 + 1 + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 97c90eaed..79dee1e32 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -475,4 +475,5 @@ Disable NSFW Too many requests. Try again later Show a list of related manga. In some cases it may be inaccurate or missing + Advanced diff --git a/app/src/main/res/xml/pref_appearance.xml b/app/src/main/res/xml/pref_appearance.xml index ead9e176a..0d3744269 100644 --- a/app/src/main/res/xml/pref_appearance.xml +++ b/app/src/main/res/xml/pref_appearance.xml @@ -55,10 +55,18 @@ + + + android:title="@string/language" />