diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt index edb7f97415..c7e835f68b 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt @@ -153,6 +153,8 @@ object PreferenceKeys { const val alwaysShowChapterTransition = "always_show_chapter_transition" + const val hideBottomNavOnScroll = "hide_bottom_nav_on_scroll" + const val enableDoh = "enable_doh" fun trackUsername(syncId: Int) = "pref_mangasync_username_$syncId" diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt index 342db58f3f..53248fcde0 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt @@ -289,5 +289,7 @@ class PreferencesHelper(val context: Context) { fun shownHopperSwipeTutorial() = flowPrefs.getBoolean("shown_hopper_swipe", false) + fun hideBottomNavOnScroll() = flowPrefs.getBoolean(Keys.hideBottomNavOnScroll, true) + fun enableDoh() = prefs.getBoolean(Keys.enableDoh, false) } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionBottomSheet.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionBottomSheet.kt index f096002f32..58be714390 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionBottomSheet.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/extension/ExtensionBottomSheet.kt @@ -9,16 +9,18 @@ import eu.davidea.flexibleadapter.FlexibleAdapter import eu.davidea.flexibleadapter.items.IFlexible import eu.kanade.tachiyomi.R import eu.kanade.tachiyomi.extension.model.Extension +import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.ui.source.SourceController import eu.kanade.tachiyomi.util.system.getResourceColor -import eu.kanade.tachiyomi.util.view.RecyclerWindowInsetsListener import eu.kanade.tachiyomi.util.view.collapse import eu.kanade.tachiyomi.util.view.doOnApplyWindowInsets import eu.kanade.tachiyomi.util.view.expand import eu.kanade.tachiyomi.util.view.isExpanded import eu.kanade.tachiyomi.util.view.updateLayoutParams +import eu.kanade.tachiyomi.util.view.updatePaddingRelative import eu.kanade.tachiyomi.util.view.withFadeTransaction import kotlinx.android.synthetic.main.extensions_bottom_sheet.view.* +import kotlinx.android.synthetic.main.main_activity.* class ExtensionBottomSheet @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null) : LinearLayout(context, attrs), @@ -51,9 +53,12 @@ class ExtensionBottomSheet @JvmOverloads constructor(context: Context, attrs: At ext_recycler.adapter = adapter ext_recycler.setHasFixedSize(true) ext_recycler.addItemDecoration(ExtensionDividerItemDecoration(context)) - ext_recycler.setOnApplyWindowInsetsListener(RecyclerWindowInsetsListener) adapter?.fastScroller = fast_scroller this.controller = controller + ext_recycler.doOnApplyWindowInsets { view, _, _ -> + val bottomBar = (this@ExtensionBottomSheet.controller.activity as? MainActivity)?.bottom_nav + view.updatePaddingRelative(bottom = bottomBar?.height ?: 0) + } presenter.onCreate() updateExtTitle() diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt index 14a8c13d26..2d92b04930 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/LibraryController.kt @@ -69,14 +69,15 @@ import eu.kanade.tachiyomi.ui.migration.manga.design.PreMigrationController import eu.kanade.tachiyomi.ui.reader.ReaderActivity import eu.kanade.tachiyomi.ui.source.global_search.GlobalSearchController import eu.kanade.tachiyomi.util.system.dpToPx +import eu.kanade.tachiyomi.util.system.getBottomGestureInsets import eu.kanade.tachiyomi.util.system.getResourceColor import eu.kanade.tachiyomi.util.system.launchUI -import eu.kanade.tachiyomi.util.view.applyWindowInsetsForRootController import eu.kanade.tachiyomi.util.view.collapse import eu.kanade.tachiyomi.util.view.expand import eu.kanade.tachiyomi.util.view.getItemView import eu.kanade.tachiyomi.util.view.gone import eu.kanade.tachiyomi.util.view.hide +import eu.kanade.tachiyomi.util.view.invisible import eu.kanade.tachiyomi.util.view.isExpanded import eu.kanade.tachiyomi.util.view.isHidden import eu.kanade.tachiyomi.util.view.isVisible @@ -86,18 +87,24 @@ import eu.kanade.tachiyomi.util.view.setStyle import eu.kanade.tachiyomi.util.view.snack import eu.kanade.tachiyomi.util.view.updateLayoutParams import eu.kanade.tachiyomi.util.view.updatePaddingRelative +import eu.kanade.tachiyomi.util.view.visible import eu.kanade.tachiyomi.util.view.visibleIf import eu.kanade.tachiyomi.util.view.withFadeTransaction import eu.kanade.tachiyomi.widget.EndAnimatorListener import kotlinx.android.synthetic.main.filter_bottom_sheet.* +import kotlinx.android.synthetic.main.filter_bottom_sheet.view.* import kotlinx.android.synthetic.main.library_grid_recycler.* +import kotlinx.android.synthetic.main.library_grid_recycler.recycler import kotlinx.android.synthetic.main.library_list_controller.* +import kotlinx.android.synthetic.main.library_list_controller.shadow2 import kotlinx.android.synthetic.main.main_activity.* import kotlinx.android.synthetic.main.rounded_category_hopper.* +import kotlinx.android.synthetic.main.source_controller.* import kotlinx.coroutines.delay import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import kotlin.math.abs +import kotlin.math.max import kotlin.math.roundToInt import kotlin.random.Random import kotlin.random.nextInt @@ -167,6 +174,7 @@ class LibraryController( private var scrollDistance = 0f private val scrollDistanceTilHidden = 1000.dpToPx private var textAnim: ViewPropertyAnimator? = null + var startingFiltersY = 0f var hopperGravity: Int = preferences.hopperGravity().get() set(value) { field = value @@ -201,6 +209,7 @@ class LibraryController( override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { super.onScrolled(recyclerView, dx, dy) val recyclerCover = recycler_cover ?: return + val bottomBar = activity?.bottom_nav if (!recyclerCover.isClickable && isAnimatingHopper != true) { category_hopper_frame.translationY += dy category_hopper_frame.translationY = @@ -222,6 +231,23 @@ class LibraryController( showCategoryText(currentCategory.name) } } + if (bottomBar != null) { + if (filter_bottom_sheet.sheetBehavior.isHidden()) { + val pad = bottomBar.translationY - bottomBar.height + filter_bottom_sheet.translationY = pad + } else { + filter_bottom_sheet.translationY = 0f + } + val pad = bottomBar.translationY - bottomBar.height + shadow2.translationY = pad + filter_bottom_sheet.updatePaddingRelative( + bottom = max( + (-bottomBar.translationY + bottomBar.height).toInt(), + view?.rootWindowInsets?.getBottomGestureInsets() ?: 0 + ) + ) + filter_bottom_sheet.sheetBehavior?.peekHeight = 60.dpToPx + filter_bottom_sheet.paddingBottom + } val savedCurrentCategory = getHeader(true)?.category ?: return if (savedCurrentCategory.order != lastUsedCategory) { lastUsedCategory = savedCurrentCategory.order @@ -237,20 +263,22 @@ class LibraryController( fast_scroller.showScrollbar() } RecyclerView.SCROLL_STATE_IDLE -> { - val shortAnimationDuration = resources?.getInteger( - android.R.integer.config_shortAnimTime - ) ?: 0 - if (!recyclerCover.isClickable) { - category_hopper_frame.animate().translationY( - if (category_hopper_frame.translationY > 25f.dpToPx) 50f.dpToPx - else 0f - ).setDuration(shortAnimationDuration.toLong()).start() - } + updateHopperPosition() } } } } + fun updateHopperPosition(show: Boolean = false) { + val shortAnimationDuration = resources?.getInteger( + android.R.integer.config_shortAnimTime + ) ?: 0 + category_hopper_frame.animate().translationY( + if (!show && category_hopper_frame.translationY > 25f.dpToPx) 50f.dpToPx + else 0f + ).setDuration(shortAnimationDuration.toLong()).start() + } + fun saveActiveCategory(category: Category) { activeCategory = category.order val headerItem = getHeader() ?: return @@ -322,7 +350,6 @@ class LibraryController( override fun onViewCreated(view: View) { super.onViewCreated(view) - view.applyWindowInsetsForRootController(activity!!.bottom_nav) if (!::presenter.isInitialized) presenter = LibraryPresenter(this) adapter = LibraryCategoryAdapter(this) @@ -643,7 +670,9 @@ class LibraryController( } private fun setRecyclerLayout() { - recycler.updatePaddingRelative(bottom = 50.dpToPx) + recycler.post { + recycler.updatePaddingRelative(bottom = 50.dpToPx + (activity?.bottom_nav?.height ?: 0)) + } if (libraryLayout == 0) { recycler.spanCount = 1 recycler.updatePaddingRelative( @@ -668,7 +697,7 @@ class LibraryController( override fun onChangeStarted(handler: ControllerChangeHandler, type: ControllerChangeType) { super.onChangeStarted(handler, type) if (type.isEnter) { - view?.applyWindowInsetsForRootController(activity!!.bottom_nav) + filter_bottom_sheet.visible() presenter.getLibrary() DownloadService.callListeners() LibraryUpdateService.setListener(this) @@ -677,6 +706,9 @@ class LibraryController( showDropdown() } else { closeTip() + if (filter_bottom_sheet.sheetBehavior.isHidden()) { + filter_bottom_sheet.invisible() + } activity?.toolbar?.hideDropdown() } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/library/filter/FilterBottomSheet.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/library/filter/FilterBottomSheet.kt index d472a59e83..b5992ada2d 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/library/filter/FilterBottomSheet.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/library/filter/FilterBottomSheet.kt @@ -21,6 +21,7 @@ import eu.kanade.tachiyomi.data.preference.getOrDefault import eu.kanade.tachiyomi.data.track.TrackManager import eu.kanade.tachiyomi.ui.library.LibraryController import eu.kanade.tachiyomi.ui.library.LibraryGroup +import eu.kanade.tachiyomi.ui.main.MainActivity import eu.kanade.tachiyomi.util.system.dpToPx import eu.kanade.tachiyomi.util.system.launchUI import eu.kanade.tachiyomi.util.view.collapse @@ -34,6 +35,7 @@ import eu.kanade.tachiyomi.util.view.visibleIf import kotlinx.android.synthetic.main.filter_bottom_sheet.view.* import kotlinx.android.synthetic.main.library_grid_recycler.* import kotlinx.android.synthetic.main.library_list_controller.* +import kotlinx.android.synthetic.main.main_activity.* import kotlinx.coroutines.CoroutineStart import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.GlobalScope @@ -94,6 +96,7 @@ class FilterBottomSheet @JvmOverloads constructor(context: Context, attrs: Attri var onGroupClicked: (Int) -> Unit = { _ -> } var pager: View? = null var controller: LibraryController? = null + var bottomBarHeight = 0 fun onCreate(controller: LibraryController) { clearButton = clear_button @@ -102,6 +105,9 @@ class FilterBottomSheet @JvmOverloads constructor(context: Context, attrs: Attri sheetBehavior?.isHideable = true this.controller = controller pager = controller.recycler + pager?.post { + bottomBarHeight = (this@FilterBottomSheet.controller?.activity as? MainActivity)?.bottom_nav?.height ?: 0 + } val shadow2: View = controller.shadow2 val shadow: View = controller.shadow sheetBehavior?.addBottomSheetCallback( @@ -111,6 +117,9 @@ class FilterBottomSheet @JvmOverloads constructor(context: Context, attrs: Attri shadow2.alpha = (1 - max(0f, progress)) * 0.25f shadow.alpha = 1 + min(0f, progress) updateRootPadding(progress) + val bottomBar = (this@FilterBottomSheet.controller?.activity as? MainActivity)?.bottom_nav ?: return + val pad = bottomBar.translationY - bottomBar.height + translationY = pad * -min(0f, progress) } override fun onStateChanged(p0: View, state: Int) { @@ -183,7 +192,7 @@ class FilterBottomSheet @JvmOverloads constructor(context: Context, attrs: Attri val shadow = controller?.shadow ?: return if (state == BottomSheetBehavior.STATE_COLLAPSED) { shadow.alpha = 1f - pager?.updatePaddingRelative(bottom = sheetBehavior?.peekHeight ?: 0 + 10.dpToPx) + pager?.updatePaddingRelative(bottom = sheetBehavior?.peekHeight ?: 0 + 10.dpToPx + bottomBarHeight) } if (state == BottomSheetBehavior.STATE_EXPANDED) { pill.alpha = 0f @@ -192,7 +201,7 @@ class FilterBottomSheet @JvmOverloads constructor(context: Context, attrs: Attri onGroupClicked(ACTION_HIDE_FILTER_TIP) reSortViews() shadow.alpha = 0f - pager?.updatePaddingRelative(bottom = 10.dpToPx) + pager?.updatePaddingRelative(bottom = 10.dpToPx + bottomBarHeight) } } @@ -210,9 +219,9 @@ class FilterBottomSheet @JvmOverloads constructor(context: Context, attrs: Attri val percent = (trueProgress * 100).roundToInt() val value = (percent * (maxHeight - minHeight) / 100) + minHeight if (trueProgress >= 0) - pager?.updatePaddingRelative(bottom = value + 10.dpToPx) + pager?.updatePaddingRelative(bottom = value + 10.dpToPx + bottomBarHeight) else - pager?.updatePaddingRelative(bottom = (minHeight * (1 + trueProgress)).toInt()) + pager?.updatePaddingRelative(bottom = (minHeight * (1 + trueProgress)).toInt() + bottomBarHeight) } fun hasActiveFilters() = filterItems.any { it.isActivated } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt index be4b883ebb..2793e0ed48 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/main/MainActivity.kt @@ -238,6 +238,9 @@ open class MainActivity : BaseActivity(), DownloadServiceListener { top = insets.systemWindowInsetTop ) bottom_nav.updatePadding(bottom = insets.systemWindowInsetBottom) + bottom_view.updateLayoutParams { + height = insets.systemWindowInsetBottom + } } router = Conductor.attachRouter(this, container, savedInstanceState) @@ -270,6 +273,7 @@ open class MainActivity : BaseActivity(), DownloadServiceListener { syncActivityViewWithController(to, from, isPush) appbar.y = 0f + bottom_nav.translationY = 0f snackBar?.dismiss() } @@ -281,6 +285,7 @@ open class MainActivity : BaseActivity(), DownloadServiceListener { handler: ControllerChangeHandler ) { appbar.y = 0f + bottom_nav.translationY = 0f showDLQueueTutorial() } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsController.kt index 22e0aa893c..49ec519c64 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/recents/RecentsController.kt @@ -38,7 +38,6 @@ import eu.kanade.tachiyomi.ui.recently_read.RecentlyReadController import eu.kanade.tachiyomi.ui.recently_read.RemoveHistoryDialog import eu.kanade.tachiyomi.util.system.dpToPx import eu.kanade.tachiyomi.util.system.toast -import eu.kanade.tachiyomi.util.view.applyWindowInsetsForRootController import eu.kanade.tachiyomi.util.view.expand import eu.kanade.tachiyomi.util.view.isExpanded import eu.kanade.tachiyomi.util.view.requestPermissionsSafe @@ -103,7 +102,6 @@ class RecentsController(bundle: Bundle? = null) : */ override fun onViewCreated(view: View) { super.onViewCreated(view) - view.applyWindowInsetsForRootController(activity!!.bottom_nav) // Initialize adapter adapter = RecentMangaAdapter(this) recycler.adapter = adapter @@ -127,6 +125,7 @@ class RecentsController(bundle: Bundle? = null) : swipeRefreshLayout = swipe_refresh, afterInsets = { headerHeight = it.systemWindowInsetTop + appBarHeight + recycler.updatePaddingRelative(bottom = activity!!.bottom_nav.height) } ) @@ -432,7 +431,6 @@ class RecentsController(bundle: Bundle? = null) : override fun onChangeStarted(handler: ControllerChangeHandler, type: ControllerChangeType) { super.onChangeStarted(handler, type) if (type.isEnter) { - view?.applyWindowInsetsForRootController(activity!!.bottom_nav) if (type == ControllerChangeType.POP_ENTER) presenter.onCreate() dl_bottom_sheet.dismiss() } else { diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsGeneralController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsGeneralController.kt index c847801c9d..bae34258fb 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsGeneralController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsGeneralController.kt @@ -44,29 +44,6 @@ class SettingsGeneralController : SettingsController() { } } - intListPreference(activity) { - key = Keys.theme - titleRes = R.string.app_theme - entriesRes = arrayOf( - R.string.white_theme, - R.string.light_blue, - R.string.dark, - R.string.amoled_black, - R.string.dark_blue, - R.string.system_default, - R.string - .system_default_amoled, - R.string.system_default_all_blue - ) - entryValues = listOf(1, 8, 2, 3, 4, 5, 6, 7) - defaultValue = 5 - - onChange { - activity?.recreate() - true - } - } - listPreference(activity) { key = Keys.dateFormat titleRes = R.string.date_format @@ -153,5 +130,39 @@ class SettingsGeneralController : SettingsController() { } } } + + preferenceCategory { + titleRes = R.string.display + + intListPreference(activity) { + key = Keys.theme + titleRes = R.string.app_theme + entriesRes = arrayOf( + R.string.white_theme, + R.string.light_blue, + R.string.dark, + R.string.amoled_black, + R.string.dark_blue, + R.string.system_default, + R.string + .system_default_amoled, + R.string.system_default_all_blue + ) + entryValues = listOf(1, 8, 2, 3, 4, 5, 6, 7) + defaultValue = 5 + + onChange { + activity?.recreate() + true + } + } + + switchPreference { + key = Keys.hideBottomNavOnScroll + titleRes = R.string.hide_bottom_nav + summaryRes = R.string.hides_on_scroll + defaultValue = true + } + } } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/source/SourceController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/source/SourceController.kt index a1ed0eb2d0..19bea7a0e9 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/ui/source/SourceController.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/ui/source/SourceController.kt @@ -10,6 +10,7 @@ import android.view.MenuItem import android.view.View import android.view.ViewGroup import androidx.appcompat.widget.SearchView +import androidx.recyclerview.widget.RecyclerView import com.bluelinelabs.conductor.ControllerChangeHandler import com.bluelinelabs.conductor.ControllerChangeType import com.bluelinelabs.conductor.RouterTransaction @@ -32,7 +33,8 @@ import eu.kanade.tachiyomi.ui.setting.SettingsSourcesController import eu.kanade.tachiyomi.ui.source.browse.BrowseSourceController import eu.kanade.tachiyomi.ui.source.global_search.GlobalSearchController import eu.kanade.tachiyomi.ui.source.latest.LatestUpdatesController -import eu.kanade.tachiyomi.util.view.applyWindowInsetsForRootController +import eu.kanade.tachiyomi.util.system.getBottomGestureInsets +import eu.kanade.tachiyomi.util.system.spToPx import eu.kanade.tachiyomi.util.view.collapse import eu.kanade.tachiyomi.util.view.expand import eu.kanade.tachiyomi.util.view.isCollapsed @@ -41,11 +43,17 @@ import eu.kanade.tachiyomi.util.view.requestPermissionsSafe import eu.kanade.tachiyomi.util.view.scrollViewWith import eu.kanade.tachiyomi.util.view.setOnQueryTextChangeListener import eu.kanade.tachiyomi.util.view.snack +import eu.kanade.tachiyomi.util.view.updatePaddingRelative import eu.kanade.tachiyomi.util.view.withFadeTransaction import kotlinx.android.parcel.Parcelize import kotlinx.android.synthetic.main.extensions_bottom_sheet.* +import kotlinx.android.synthetic.main.extensions_bottom_sheet.sheet_layout +import kotlinx.android.synthetic.main.filter_bottom_sheet.* +import kotlinx.android.synthetic.main.library_list_controller.* import kotlinx.android.synthetic.main.main_activity.* +import kotlinx.android.synthetic.main.rounded_category_hopper.* import kotlinx.android.synthetic.main.source_controller.* +import kotlinx.android.synthetic.main.source_controller.shadow2 import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get import kotlin.math.max @@ -112,7 +120,6 @@ class SourceController : override fun onViewCreated(view: View) { super.onViewCreated(view) - view.applyWindowInsetsForRootController(activity!!.bottom_nav) adapter = SourceAdapter(this) @@ -129,6 +136,19 @@ class SourceController : recycler, afterInsets = { headerHeight = it.systemWindowInsetTop + appBarHeight + recycler.updatePaddingRelative(bottom = activity?.bottom_nav?.height ?: 0) + } + ) + + recycler?.post { + setBottomPadding() + } + recycler.addOnScrollListener( + object : RecyclerView.OnScrollListener() { + override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) { + super.onScrolled(recyclerView, dx, dy) + setBottomPadding() + } } ) @@ -154,6 +174,9 @@ class SourceController : setTitle() activity?.invalidateOptionsMenu() } + val bottomBar = activity?.bottom_nav ?: return + val pad = bottomBar.translationY - bottomBar.height + ext_bottom_sheet.updatePaddingRelative(bottom = (pad * (1 - max(progress, 0f))).toInt()) } override fun onStateChanged(p0: View, state: Int) { @@ -187,6 +210,22 @@ class SourceController : } } + fun setBottomPadding() { + val bottomBar = activity?.bottom_nav ?: return + ext_bottom_sheet.updatePaddingRelative( + bottom = + if (ext_bottom_sheet.sheetBehavior.isExpanded()) 0 else + max( + (-bottomBar.translationY + bottomBar.height).toInt(), + this@SourceController.view?.rootWindowInsets?.getBottomGestureInsets() + ?: 0 + ) + ) + val pad = bottomBar.translationY - bottomBar.height + shadow2.translationY = pad + ext_bottom_sheet.sheetBehavior?.peekHeight = 48.spToPx + ext_bottom_sheet.paddingBottom + } + override fun showSheet() { ext_bottom_sheet.sheetBehavior?.expand() } @@ -217,7 +256,6 @@ class SourceController : override fun onChangeStarted(handler: ControllerChangeHandler, type: ControllerChangeType) { super.onChangeStarted(handler, type) if (!type.isPush && handler is SettingsSourcesFadeChangeHandler) { - view?.applyWindowInsetsForRootController(activity!!.bottom_nav) ext_bottom_sheet.updateExtTitle() ext_bottom_sheet.presenter.refreshExtensions() } diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt index 43a63c8eec..c2acf33e93 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/system/ContextExtensions.kt @@ -128,6 +128,9 @@ val Int.pxToDp: Int val Int.dpToPx: Int get() = (this * Resources.getSystem().displayMetrics.density).toInt() +val Int.spToPx: Int + get() = (this * Resources.getSystem().displayMetrics.scaledDensity).toInt() + val Float.dpToPx: Float get() = (this * Resources.getSystem().displayMetrics.density) diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/view/ControllerExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/view/ControllerExtensions.kt index 1af397acaf..d629540b04 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/view/ControllerExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/view/ControllerExtensions.kt @@ -19,11 +19,14 @@ import com.bluelinelabs.conductor.ControllerChangeType import com.bluelinelabs.conductor.RouterTransaction import com.bluelinelabs.conductor.changehandler.FadeChangeHandler import eu.kanade.tachiyomi.R +import eu.kanade.tachiyomi.data.preference.PreferencesHelper import eu.kanade.tachiyomi.ui.main.BottomSheetController import eu.kanade.tachiyomi.ui.manga.MangaDetailsController import eu.kanade.tachiyomi.util.system.dpToPx import eu.kanade.tachiyomi.util.system.getResourceColor import kotlinx.android.synthetic.main.main_activity.* +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get import kotlin.math.abs import kotlin.random.Random @@ -210,6 +213,8 @@ fun Controller.scrollViewWith( ) ?: 0 activity!!.appbar.animate().y(0f).setDuration(shortAnimationDuration.toLong()) .start() + activity!!.bottom_nav?.animate()?.translationYBy(0f)?.setDuration(shortAnimationDuration.toLong()) + ?.start() lastY = 0f if (elevate) elevateFunc(false) } else { @@ -219,14 +224,32 @@ fun Controller.scrollViewWith( -activity!!.appbar.height.toFloat(), 0f ) - if (( - ( - activity!!.appbar.y <= -activity!!.appbar.height.toFloat() || - dy == 0 && activity!!.appbar.y == 0f - ) || dy == 0 - ) && !elevate - ) + val tabBar = activity!!.bottom_nav + if (tabBar != null && tabBar.isVisible()) { + val preferences: PreferencesHelper = Injekt.get() + if (preferences.hideBottomNavOnScroll().get()) { + tabBar.translationY += dy + tabBar.translationY = MathUtils.clamp( + tabBar.translationY, + 0f, + tabBar.height.toFloat() + ) + activity!!.bottom_view?.translationY = tabBar.translationY + } else if (tabBar.translationY != 0f) { + tabBar.translationY = 0f + activity!!.bottom_view?.translationY = 0f + } + } + if (!elevate && ( + dy == 0 || + ( + activity!!.appbar.y <= -activity!!.appbar.height.toFloat() || + dy == 0 && activity!!.appbar.y == 0f + ) + ) + ) { elevateFunc(true) + } lastY = activity!!.appbar.y } } diff --git a/app/src/main/java/eu/kanade/tachiyomi/util/view/ViewExtensions.kt b/app/src/main/java/eu/kanade/tachiyomi/util/view/ViewExtensions.kt index 9b6481b0ed..34ca1f0d9c 100644 --- a/app/src/main/java/eu/kanade/tachiyomi/util/view/ViewExtensions.kt +++ b/app/src/main/java/eu/kanade/tachiyomi/util/view/ViewExtensions.kt @@ -183,25 +183,6 @@ fun View.checkHeightThen(f: () -> Unit) { ) } -fun View.applyWindowInsetsForRootController(bottomNav: View) { - viewTreeObserver.addOnGlobalLayoutListener( - object : ViewTreeObserver.OnGlobalLayoutListener { - override fun onGlobalLayout() { - if (bottomNav.height > 0) { - viewTreeObserver.removeOnGlobalLayoutListener(this) - setOnApplyWindowInsetsListener { view, insets -> - view.updateLayoutParams { - bottomMargin = bottomNav.height - } - insets - } - requestApplyInsetsWhenAttached() - } - } - } - ) -} - fun View.requestApplyInsetsWhenAttached() { if (isAttachedToWindow) { requestApplyInsets() diff --git a/app/src/main/res/layout/main_activity.xml b/app/src/main/res/layout/main_activity.xml index fa3196c728..d323551a33 100644 --- a/app/src/main/res/layout/main_activity.xml +++ b/app/src/main/res/layout/main_activity.xml @@ -62,6 +62,16 @@ + + Check for updates Automatically check for new app versions Secure screen + Auto-Hide bottom navigation + Hides when scrolling Hide Tachiyomi from the recents screen Security