Side Nav Override

Taken from tachiyomiorg/tachiyomi@0df23ab878

This only overrides the side nav layout via changing the screen width, not smallest screen width, so other parts of tablet ui are unaffected, therefore it is not named the same as upstream, nor placed in the same settings section

Co-Authored-By: Ivan Iskandar <12537387+ivaniskandar@users.noreply.github.com>
This commit is contained in:
Jays2Kings 2021-09-07 13:14:03 -04:00
parent cceb416c34
commit 4376a4685b
8 changed files with 67 additions and 3 deletions

View file

@ -233,6 +233,8 @@ object PreferenceKeys {
const val incognitoMode = "incognito_mode"
const val sideNavMode = "side_nav_mode"
const val shouldAutoUpdate = "should_auto_update"
const val autoUpdateExtensions = "auto_update_extensions"

View file

@ -433,6 +433,8 @@ class PreferencesHelper(val context: Context) {
fun hasPromptedBeforeUpdateAll() = flowPrefs.getBoolean("has_prompted_update_all", false)
fun sideNavMode() = flowPrefs.getInt(Keys.sideNavMode, 0)
fun shouldAutoUpdate() = prefs.getInt(Keys.shouldAutoUpdate, AutoUpdaterJob.ONLY_ON_UNMETERED)
fun autoUpdateExtensions() = prefs.getInt(Keys.autoUpdateExtensions, AutoUpdaterJob.ONLY_ON_UNMETERED)

View file

@ -4,6 +4,7 @@ import android.animation.AnimatorSet
import android.animation.ValueAnimator
import android.app.Dialog
import android.app.assist.AssistContent
import android.content.Context
import android.content.Intent
import android.graphics.Color
import android.graphics.Rect
@ -26,7 +27,6 @@ import android.webkit.WebView
import androidx.annotation.IdRes
import androidx.appcompat.graphics.drawable.DrawerArrowDrawable
import androidx.appcompat.widget.Toolbar
import androidx.core.animation.addListener
import androidx.core.content.ContextCompat
import androidx.core.graphics.ColorUtils
import androidx.core.net.toUri
@ -80,6 +80,7 @@ import eu.kanade.tachiyomi.util.system.getResourceColor
import eu.kanade.tachiyomi.util.system.hasSideNavBar
import eu.kanade.tachiyomi.util.system.isBottomTappable
import eu.kanade.tachiyomi.util.system.launchUI
import eu.kanade.tachiyomi.util.system.prepareSideNavContext
import eu.kanade.tachiyomi.util.system.toast
import eu.kanade.tachiyomi.util.view.blurBehindWindow
import eu.kanade.tachiyomi.util.view.doOnApplyWindowInsets
@ -138,6 +139,10 @@ open class MainActivity : BaseActivity<MainActivityBinding>(), DownloadServiceLi
extraViewForUndo = extraViewToCheck
}
override fun attachBaseContext(newBase: Context?) {
super.attachBaseContext(newBase?.prepareSideNavContext())
}
val toolbarHeight: Int
get() = max(binding.toolbar.height, binding.cardFrame.height)

View file

@ -35,6 +35,7 @@ import coil.request.ImageRequest
import com.afollestad.materialdialogs.MaterialDialog
import com.afollestad.materialdialogs.checkbox.checkBoxPrompt
import com.afollestad.materialdialogs.checkbox.isCheckPromptChecked
import com.afollestad.materialdialogs.utils.MDUtil.isLandscape
import com.bluelinelabs.conductor.ControllerChangeHandler
import com.bluelinelabs.conductor.ControllerChangeType
import com.google.android.material.snackbar.BaseTransientBottomBar
@ -205,8 +206,7 @@ class MangaDetailsController :
/** Check if device is tablet, and use a second recycler to hold the details header if so */
private fun setTabletMode(view: View) {
isTablet = view.context.isTablet() &&
view.context.resources.configuration?.orientation == Configuration.ORIENTATION_LANDSCAPE
isTablet = view.context.isTablet() && view.context.isLandscape()
binding.tabletOverlay.isVisible = isTablet
binding.tabletRecycler.isVisible = isTablet
binding.tabletDivider.isVisible = isTablet

View file

@ -8,6 +8,7 @@ import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.asImmediateFlow
import eu.kanade.tachiyomi.data.preference.asImmediateFlowIn
import eu.kanade.tachiyomi.util.system.SideNavMode
import eu.kanade.tachiyomi.util.system.appDelegateNightMode
import eu.kanade.tachiyomi.util.system.dpToPx
import eu.kanade.tachiyomi.util.system.getPrefTheme
@ -106,6 +107,22 @@ class SettingsAppearanceController : SettingsController() {
context.resources.displayMetrics.heightPixels
) >= 720.dpToPx
}
intListPreference(activity) {
key = Keys.sideNavMode
titleRes = R.string.use_side_navigation
val values = SideNavMode.values()
entriesRes = values.map { it.stringRes }.toTypedArray()
entryValues = values.map { it.prefValue }
defaultValue = SideNavMode.DEFAULT.prefValue
onChange {
activity?.recreate()
true
}
}
infoPreference(R.string.by_default_side_nav_info)
}
}

View file

@ -0,0 +1,10 @@
package eu.kanade.tachiyomi.util.system
import androidx.annotation.StringRes
import eu.kanade.tachiyomi.R
enum class SideNavMode(val prefValue: Int, @StringRes val stringRes: Int) {
DEFAULT(0, R.string.default_behavior),
NEVER(1, R.string.never),
ALWAYS(2, R.string.always),
}

View file

@ -33,9 +33,14 @@ import androidx.core.content.ContextCompat
import androidx.core.net.toUri
import com.nononsenseapps.filepicker.FilePickerActivity
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.widget.CustomLayoutPickerActivity
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import java.io.File
private const val TABLET_UI_MIN_SCREEN_WIDTH_DP = 720
/**
* Display a toast in this context.
*
@ -170,6 +175,26 @@ fun Context.notificationBuilder(
return builder
}
fun Context.prepareSideNavContext(): Context {
val configuration = resources.configuration
val expected = when (Injekt.get<PreferencesHelper>().sideNavMode().get()) {
SideNavMode.ALWAYS.prefValue -> true
SideNavMode.NEVER.prefValue -> false
else -> null
}
if (expected != null) {
val overrideConf = Configuration()
overrideConf.setTo(configuration)
overrideConf.screenWidthDp = if (expected) {
overrideConf.screenWidthDp.coerceAtLeast(TABLET_UI_MIN_SCREEN_WIDTH_DP)
} else {
overrideConf.screenWidthDp.coerceAtMost(TABLET_UI_MIN_SCREEN_WIDTH_DP - 1)
}
return createConfigurationContext(overrideConf)
}
return this
}
/**
* Convenience method to acquire a partial wake lock.
*/

View file

@ -674,6 +674,9 @@
<string name="secure_screen">Secure screen</string>
<string name="hide_bottom_nav">Auto-hide bottom navigation</string>
<string name="side_nav_icon_alignment">Side navigation icon alignment</string>
<string name="use_side_navigation">Use side navigation</string>
<string name="default_behavior">Default behavior</string>
<string name="by_default_side_nav_info">By default, side navigation shows up on landscape on certain phones and small tablets, and always for larger tablets</string>
<string name="follow_system_theme">Follow system theme</string>
<string name="pure_black_dark_mode">Pure black dark mode</string>
<string name="hides_on_scroll">Hides when scrolling</string>