From af1a481bdbdc0d454abfb4eca76f47397dd36b37 Mon Sep 17 00:00:00 2001 From: TwistedUmbrellaX <1173913+AbandonedCart@users.noreply.github.com> Date: Sun, 10 Mar 2024 04:21:14 -0400 Subject: [PATCH] Cleaning up navigation (#234) * fix: align bottom to top with RTL * fix: clean up the overlapping decor * feat: match theme color with navbar * fix: measure view on return to view --- app/src/main/java/ani/dantotsu/Functions.kt | 61 +++++++++++-------- .../main/java/ani/dantotsu/MainActivity.kt | 24 ++------ .../dantotsu/media/manga/MangaReadFragment.kt | 1 + .../manga/mangareader/MangaReaderActivity.kt | 18 ++++-- .../settings/DevelopersDialogFragment.kt | 6 ++ app/src/main/res/values/themes.xml | 1 + 6 files changed, 61 insertions(+), 50 deletions(-) diff --git a/app/src/main/java/ani/dantotsu/Functions.kt b/app/src/main/java/ani/dantotsu/Functions.kt index cdc8ffdd..d52c9465 100644 --- a/app/src/main/java/ani/dantotsu/Functions.kt +++ b/app/src/main/java/ani/dantotsu/Functions.kt @@ -135,7 +135,7 @@ fun logger(e: Any?, print: Boolean = true) { } -fun initActivity(a: Activity) { +fun initActivityTheme(a: Activity) { val window = a.window WindowCompat.setDecorFitsSystemWindows(window, false) val darkMode = PrefManager.getVal(PrefName.DarkMode) @@ -156,7 +156,7 @@ fun initActivity(a: Activity) { navBarHeight = this.getInsets(WindowInsetsCompat.Type.systemBars()).bottom } } - a.hideStatusBar() + WindowInsetsControllerCompat(window, window.decorView).hide(WindowInsetsCompat.Type.statusBars()) if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P && statusBarHeight == 0 && a.resources.configuration.orientation == Configuration.ORIENTATION_PORTRAIT) { window.decorView.rootWindowInsets?.displayCutout?.apply { if (boundingRects.size > 0) { @@ -176,40 +176,47 @@ fun initActivity(a: Activity) { } } -@Suppress("DEPRECATION") fun Activity.hideSystemBars() { - window.decorView.systemUiVisibility = ( - View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY - or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION - or View.SYSTEM_UI_FLAG_FULLSCREEN - or View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION - or View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN - ) + WindowInsetsControllerCompat(window, window.decorView).let { controller -> + controller.systemBarsBehavior = + WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE + controller.hide(WindowInsetsCompat.Type.systemBars()) + } } -@Suppress("DEPRECATION") -fun Activity.hideStatusBar() { - window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN) +fun Activity.setNavigationTheme() { + val a = TypedValue() + theme.resolveAttribute(android.R.attr.colorBackground, a, true) + if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q && a.isColorType) + || (a.type >= TypedValue.TYPE_FIRST_COLOR_INT && a.type <= TypedValue.TYPE_LAST_COLOR_INT)) { + window.navigationBarColor = a.data + } } open class BottomSheetDialogFragment : BottomSheetDialogFragment() { override fun onStart() { super.onStart() - val window = dialog?.window - val decorView: View = window?.decorView ?: return - decorView.systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN - if (this.resources.configuration.orientation != Configuration.ORIENTATION_PORTRAIT) { - val behavior = BottomSheetBehavior.from(requireView().parent as View) - behavior.state = BottomSheetBehavior.STATE_EXPANDED + dialog?.window?.let { window -> + WindowCompat.setDecorFitsSystemWindows(window, false) + val immersiveMode: Boolean = PrefManager.getVal(PrefName.ImmersiveMode) + if (immersiveMode) { + WindowInsetsControllerCompat( + window, window.decorView + ).hide(WindowInsetsCompat.Type.statusBars()) + } + if (this.resources.configuration.orientation != Configuration.ORIENTATION_PORTRAIT) { + val behavior = BottomSheetBehavior.from(requireView().parent as View) + behavior.state = BottomSheetBehavior.STATE_EXPANDED + } + val typedValue = TypedValue() + val theme = requireContext().theme + theme.resolveAttribute( + com.google.android.material.R.attr.colorSurface, + typedValue, + true + ) + window.navigationBarColor = typedValue.data } - val typedValue = TypedValue() - val theme = requireContext().theme - theme.resolveAttribute( - com.google.android.material.R.attr.colorSurface, - typedValue, - true - ) - window.navigationBarColor = typedValue.data } override fun show(manager: FragmentManager, tag: String?) { diff --git a/app/src/main/java/ani/dantotsu/MainActivity.kt b/app/src/main/java/ani/dantotsu/MainActivity.kt index ba47d2fb..3b2d7323 100644 --- a/app/src/main/java/ani/dantotsu/MainActivity.kt +++ b/app/src/main/java/ani/dantotsu/MainActivity.kt @@ -146,24 +146,14 @@ class MainActivity : AppCompatActivity() { finish() } doubleBackToExitPressedOnce = true - WindowInsetsControllerCompat(window, window.decorView) - .show(WindowInsetsCompat.Type.navigationBars()) snackString(this@MainActivity.getString(R.string.back_to_exit)).apply { this?.addCallback(object : BaseTransientBottomBar.BaseCallback() { override fun onDismissed(transientBottomBar: Snackbar?, event: Int) { super.onDismissed(transientBottomBar, event) - WindowInsetsControllerCompat(window, window.decorView).let { controller -> - controller.systemBarsBehavior = - WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE - controller.hide(WindowInsetsCompat.Type.navigationBars()) - } + doubleBackToExitPressedOnce = false } }) } - Handler(Looper.getMainLooper()).postDelayed( - { doubleBackToExitPressedOnce = false }, - 2000 - ) } val preferences: SourcePreferences = Injekt.get() @@ -219,7 +209,7 @@ class MainActivity : AppCompatActivity() { binding.root.doOnAttach { - initActivity(this) + initActivityTheme(this) selectedOption = if (fragment != null) { when (fragment) { AnimeFragment::class.java.name -> 0 @@ -369,13 +359,11 @@ class MainActivity : AppCompatActivity() { override fun onResume() { super.onResume() - - WindowCompat.setDecorFitsSystemWindows(window, false) - - WindowInsetsControllerCompat(window, window.decorView).let { controller -> - controller.systemBarsBehavior = WindowInsetsControllerCompat.BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE - controller.hide(WindowInsetsCompat.Type.navigationBars()) + initActivityTheme(this) + binding.includedNavbar.navbarContainer.updateLayoutParams { + bottomMargin = navBarHeight } + window.navigationBarColor = getColor(android.R.color.transparent) } //ViewPager diff --git a/app/src/main/java/ani/dantotsu/media/manga/MangaReadFragment.kt b/app/src/main/java/ani/dantotsu/media/manga/MangaReadFragment.kt index 2d570043..6b979319 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/MangaReadFragment.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/MangaReadFragment.kt @@ -601,6 +601,7 @@ open class MangaReadFragment : Fragment(), ScanlatorSelectionListener { super.onResume() binding.mediaInfoProgressBar.visibility = progress binding.animeSourceRecycler.layoutManager?.onRestoreInstanceState(state) + requireActivity().setNavigationTheme() } override fun onPause() { diff --git a/app/src/main/java/ani/dantotsu/media/manga/mangareader/MangaReaderActivity.kt b/app/src/main/java/ani/dantotsu/media/manga/mangareader/MangaReaderActivity.kt index a6ce9bd3..3665eb3e 100644 --- a/app/src/main/java/ani/dantotsu/media/manga/mangareader/MangaReaderActivity.kt +++ b/app/src/main/java/ani/dantotsu/media/manga/mangareader/MangaReaderActivity.kt @@ -285,7 +285,7 @@ class MangaReaderActivity : AppCompatActivity() { binding.mangaReaderNextChapter.performClick() } binding.mangaReaderNextChapter.setOnClickListener { - if (defaultSettings.direction == RIGHT_TO_LEFT) { + if (defaultSettings.direction == RIGHT_TO_LEFT || defaultSettings.direction == BOTTOM_TO_TOP) { if (currentChapterIndex > 0) change(currentChapterIndex - 1) else snackString(getString(R.string.first_chapter)) } else { @@ -298,7 +298,7 @@ class MangaReaderActivity : AppCompatActivity() { binding.mangaReaderPreviousChapter.performClick() } binding.mangaReaderPreviousChapter.setOnClickListener { - if (defaultSettings.direction == RIGHT_TO_LEFT) { + if (defaultSettings.direction == RIGHT_TO_LEFT || defaultSettings.direction == BOTTOM_TO_TOP) { if (chaptersArr.size > currentChapterIndex + 1) progress { change(currentChapterIndex + 1) } else snackString(getString(R.string.next_chapter_not_found)) } else { @@ -315,7 +315,7 @@ class MangaReaderActivity : AppCompatActivity() { PrefManager.setCustomVal("${media.id}_current_chp", chap.number) currentChapterIndex = chaptersArr.indexOf(chap.number) binding.mangaReaderChapterSelect.setSelection(currentChapterIndex) - if (defaultSettings.direction == RIGHT_TO_LEFT) { + if (defaultSettings.direction == RIGHT_TO_LEFT || defaultSettings.direction == BOTTOM_TO_TOP) { binding.mangaReaderNextChap.text = chaptersTitleArr.getOrNull(currentChapterIndex - 1) ?: "" binding.mangaReaderPrevChap.text = @@ -439,6 +439,10 @@ class MangaReaderActivity : AppCompatActivity() { if ((defaultSettings.direction == TOP_TO_BOTTOM || defaultSettings.direction == BOTTOM_TO_TOP)) { binding.mangaReaderSwipy.vertical = true if (defaultSettings.direction == TOP_TO_BOTTOM) { + binding.mangaReaderNextChap.text = + chaptersTitleArr.getOrNull(currentChapterIndex + 1) ?: "" + binding.mangaReaderPrevChap.text = + chaptersTitleArr.getOrNull(currentChapterIndex - 1) ?: "" binding.BottomSwipeText.text = chaptersTitleArr.getOrNull(currentChapterIndex + 1) ?: getString(R.string.no_chapter) binding.TopSwipeText.text = chaptersTitleArr.getOrNull(currentChapterIndex - 1) @@ -450,6 +454,10 @@ class MangaReaderActivity : AppCompatActivity() { binding.mangaReaderNextChapter.performClick() } } else { + binding.mangaReaderNextChap.text = + chaptersTitleArr.getOrNull(currentChapterIndex - 1) ?: "" + binding.mangaReaderPrevChap.text = + chaptersTitleArr.getOrNull(currentChapterIndex + 1) ?: "" binding.BottomSwipeText.text = chaptersTitleArr.getOrNull(currentChapterIndex - 1) ?: getString(R.string.no_chapter) binding.TopSwipeText.text = chaptersTitleArr.getOrNull(currentChapterIndex + 1) @@ -729,7 +737,7 @@ class MangaReaderActivity : AppCompatActivity() { val screenWidth = Resources.getSystem().displayMetrics.widthPixels //if in the 1st 1/5th of the screen width, left and lower than 1/5th of the screen height, left if (screenWidth / 5 in x + 1.. screenWidth - screenWidth / 5 && y > screenWidth / 5) { - pressLocation = if (defaultSettings.direction == RIGHT_TO_LEFT) { + pressLocation = if (defaultSettings.direction == RIGHT_TO_LEFT || defaultSettings.direction == BOTTOM_TO_TOP) { pressPos.LEFT } else { pressPos.RIGHT diff --git a/app/src/main/java/ani/dantotsu/settings/DevelopersDialogFragment.kt b/app/src/main/java/ani/dantotsu/settings/DevelopersDialogFragment.kt index b7a12ad1..564c0aaa 100644 --- a/app/src/main/java/ani/dantotsu/settings/DevelopersDialogFragment.kt +++ b/app/src/main/java/ani/dantotsu/settings/DevelopersDialogFragment.kt @@ -25,6 +25,12 @@ class DevelopersDialogFragment : BottomSheetDialogFragment() { "Contributor", "https://github.com/aayush2622" ), + Developer( + "AbandonedCart", + "https://avatars.githubusercontent.com/u/1173913?v=4", + "Contributor", + "https://github.com/AbandonedCart" + ), Developer( "Sadwhy", "https://avatars.githubusercontent.com/u/99601717?v=4", diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index e1d6f959..87eb6f03 100644 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -1,6 +1,7 @@