From 70de4f750c14fb20e6c8044e9bd5ae7a3ac2885a Mon Sep 17 00:00:00 2001 From: Zakhar Timoshenko Date: Thu, 21 Jul 2022 23:14:40 +0300 Subject: [PATCH] Attempt to fix insets --- .../kotatsu/explore/ui/ExploreFragment.kt | 9 ++++++--- .../history/ui/util/ReadingProgressDrawable.kt | 4 ++-- .../kotatsu/library/ui/LibraryFragment.kt | 8 ++++++-- .../kotatsu/list/ui/MangaListFragment.kt | 2 ++ .../koitharu/kotatsu/main/ui/BottomNavOwner.kt | 8 ++++++++ .../org/koitharu/kotatsu/main/ui/MainActivity.kt | 16 +++++++++++----- .../koitharu/kotatsu/tracker/ui/FeedFragment.kt | 15 ++++++++++----- .../kotatsu/tracker/ui/FeedMenuProvider.kt | 9 ++++++--- app/src/main/res/layout/activity_container.xml | 16 ++++++++-------- app/src/main/res/layout/activity_main.xml | 11 +++++++---- app/src/main/res/layout/fragment_tools.xml | 8 ++++++-- 11 files changed, 72 insertions(+), 34 deletions(-) create mode 100644 app/src/main/java/org/koitharu/kotatsu/main/ui/BottomNavOwner.kt diff --git a/app/src/main/java/org/koitharu/kotatsu/explore/ui/ExploreFragment.kt b/app/src/main/java/org/koitharu/kotatsu/explore/ui/ExploreFragment.kt index 5c61a640a..ad399e426 100644 --- a/app/src/main/java/org/koitharu/kotatsu/explore/ui/ExploreFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/explore/ui/ExploreFragment.kt @@ -22,6 +22,7 @@ import org.koitharu.kotatsu.explore.ui.adapter.ExploreListEventListener import org.koitharu.kotatsu.explore.ui.model.ExploreItem import org.koitharu.kotatsu.favourites.ui.categories.FavouriteCategoriesActivity import org.koitharu.kotatsu.history.ui.HistoryActivity +import org.koitharu.kotatsu.main.ui.BottomNavOwner import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.search.ui.MangaListActivity @@ -108,11 +109,13 @@ class ExploreFragment : BaseFragment(), override fun onEmptyActionClick() = onManageClick(requireView()) private fun onError(e: Throwable) { - Snackbar.make( + val snackbar = Snackbar.make( binding.recyclerView, e.getDisplayMessage(resources), Snackbar.LENGTH_SHORT - ).show() + ) + snackbar.anchorView = (activity as? BottomNavOwner)?.bottomNav + snackbar.show() } private fun onOpenManga(manga: Manga) { @@ -124,4 +127,4 @@ class ExploreFragment : BaseFragment(), fun newInstance() = ExploreFragment() } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/history/ui/util/ReadingProgressDrawable.kt b/app/src/main/java/org/koitharu/kotatsu/history/ui/util/ReadingProgressDrawable.kt index bedc80871..dc4d1e22b 100644 --- a/app/src/main/java/org/koitharu/kotatsu/history/ui/util/ReadingProgressDrawable.kt +++ b/app/src/main/java/org/koitharu/kotatsu/history/ui/util/ReadingProgressDrawable.kt @@ -85,7 +85,7 @@ class ReadingProgressDrawable( paint.color = backgroundColor canvas.drawCircle(cx, cy, radius, paint) } - val innerRadius = radius - paint.strokeWidth / 2.5f + val innerRadius = radius - paint.strokeWidth / 2f paint.style = Paint.Style.STROKE if (hasOutline) { paint.color = outlineColor @@ -139,4 +139,4 @@ class ReadingProgressDrawable( paint.getTextBounds(text, 0, text.length, tempRect) return testTextSize * width / tempRect.width() } -} \ No newline at end of file +} diff --git a/app/src/main/java/org/koitharu/kotatsu/library/ui/LibraryFragment.kt b/app/src/main/java/org/koitharu/kotatsu/library/ui/LibraryFragment.kt index 558a7e982..e722d70a2 100644 --- a/app/src/main/java/org/koitharu/kotatsu/library/ui/LibraryFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/library/ui/LibraryFragment.kt @@ -26,6 +26,7 @@ import org.koitharu.kotatsu.library.ui.model.LibrarySectionModel import org.koitharu.kotatsu.list.ui.ItemSizeResolver import org.koitharu.kotatsu.list.ui.MangaSelectionDecoration import org.koitharu.kotatsu.list.ui.model.ListModel +import org.koitharu.kotatsu.main.ui.BottomNavOwner import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.util.flattenTo import org.koitharu.kotatsu.utils.ShareHelper @@ -171,11 +172,13 @@ class LibraryFragment : } private fun onError(e: Throwable) { - Snackbar.make( + val snackbar = Snackbar.make( binding.recyclerView, e.getDisplayMessage(resources), Snackbar.LENGTH_SHORT, - ).show() + ) + snackbar.anchorView = (activity as? BottomNavOwner)?.bottomNav + snackbar.show() } private fun onActionDone(action: ReversibleAction) { @@ -185,6 +188,7 @@ class LibraryFragment : if (handle != null) { snackbar.setAction(R.string.undo) { handle.reverseAsync() } } + snackbar.anchorView = (activity as? BottomNavOwner)?.bottomNav snackbar.show() } diff --git a/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt b/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt index 952708a02..5ee304e37 100644 --- a/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/list/ui/MangaListFragment.kt @@ -41,6 +41,7 @@ import org.koitharu.kotatsu.list.ui.model.ListHeader import org.koitharu.kotatsu.list.ui.model.ListModel import org.koitharu.kotatsu.list.ui.model.MangaItemModel import org.koitharu.kotatsu.main.ui.AppBarOwner +import org.koitharu.kotatsu.main.ui.BottomNavOwner import org.koitharu.kotatsu.main.ui.MainActivity import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaTag @@ -155,6 +156,7 @@ abstract class MangaListFragment : val handle = action.handle val length = if (handle == null) Snackbar.LENGTH_SHORT else Snackbar.LENGTH_LONG val snackbar = Snackbar.make(binding.recyclerView, action.stringResId, length) + snackbar.anchorView = (activity as? BottomNavOwner)?.bottomNav if (handle != null) { snackbar.setAction(R.string.undo) { handle.reverseAsync() } } diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/BottomNavOwner.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/BottomNavOwner.kt new file mode 100644 index 000000000..3d254e8ee --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/BottomNavOwner.kt @@ -0,0 +1,8 @@ +package org.koitharu.kotatsu.main.ui + +import org.koitharu.kotatsu.base.ui.widgets.KotatsuBottomNavigationView + +interface BottomNavOwner { + + val bottomNav: KotatsuBottomNavigationView? +} diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt index 6ecd72fb9..d27e388a3 100644 --- a/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/MainActivity.kt @@ -20,6 +20,7 @@ import androidx.transition.TransitionManager import com.google.android.material.R as materialR import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.AppBarLayout.LayoutParams.* +import com.google.android.material.bottomnavigation.BottomNavigationView import com.google.android.material.navigation.NavigationBarView import com.google.android.material.snackbar.Snackbar import kotlinx.coroutines.Dispatchers @@ -29,6 +30,7 @@ import org.koin.android.ext.android.get import org.koin.androidx.viewmodel.ext.android.viewModel import org.koitharu.kotatsu.R import org.koitharu.kotatsu.base.ui.BaseActivity +import org.koitharu.kotatsu.base.ui.widgets.KotatsuBottomNavigationView import org.koitharu.kotatsu.core.prefs.AppSettings import org.koitharu.kotatsu.databinding.ActivityMainBinding import org.koitharu.kotatsu.details.ui.DetailsActivity @@ -59,6 +61,7 @@ private const val TAG_SEARCH = "search" class MainActivity : BaseActivity(), AppBarOwner, + BottomNavOwner, View.OnClickListener, View.OnFocusChangeListener, SearchSuggestionListener, @@ -72,15 +75,18 @@ class MainActivity : override val appBar: AppBarLayout get() = binding.appbar + override val bottomNav: KotatsuBottomNavigationView? + get() = binding.bottomNav + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(ActivityMainBinding.inflate(layoutInflater)) - navBar = checkNotNull(binding.bottomNav ?: binding.navRail) - if (binding.bottomNav != null) { + navBar = checkNotNull(bottomNav ?: binding.navRail) + if (bottomNav != null) { ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, insets -> if (insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom > 0) { - val elevation = binding.bottomNav?.elevation ?: 0f + val elevation = bottomNav?.elevation ?: 0f window.setNavigationBarTransparentCompat(this@MainActivity, elevation) } insets @@ -269,7 +275,7 @@ class MainActivity : } private fun onError(e: Throwable) { - Snackbar.make(binding.container, e.getDisplayMessage(resources), Snackbar.LENGTH_SHORT).show() + Snackbar.make(binding.container, e.getDisplayMessage(resources), Snackbar.LENGTH_SHORT).setAnchorView(bottomNav).show() } private fun onCountersChanged(counters: SparseIntArray) { @@ -331,7 +337,7 @@ class MainActivity : } private fun showNav(visible: Boolean) { - binding.bottomNav?.run { + bottomNav?.run { if (visible) { slideUp() } else { diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt index 51413c691..c5a9e5b09 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedFragment.kt @@ -18,6 +18,7 @@ import org.koitharu.kotatsu.details.ui.DetailsActivity import org.koitharu.kotatsu.list.ui.adapter.MangaListListener import org.koitharu.kotatsu.list.ui.model.ListHeader import org.koitharu.kotatsu.list.ui.model.ListModel +import org.koitharu.kotatsu.main.ui.BottomNavOwner import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.tracker.ui.adapter.FeedAdapter @@ -63,7 +64,7 @@ class FeedFragment : setColorSchemeColors(context.getThemeColor(com.google.android.material.R.attr.colorOnPrimary)) isEnabled = false } - addMenuProvider(FeedMenuProvider(binding.recyclerView, viewModel)) + addMenuProvider(FeedMenuProvider(binding.recyclerView, (activity as? BottomNavOwner)?.bottomNav ?: binding.recyclerView, viewModel)) viewModel.content.observe(viewLifecycleOwner, this::onListChanged) viewModel.onError.observe(viewLifecycleOwner, this::onError) @@ -101,19 +102,23 @@ class FeedFragment : } private fun onFeedCleared() { - Snackbar.make( + val snackbar = Snackbar.make( binding.recyclerView, R.string.updates_feed_cleared, Snackbar.LENGTH_LONG - ).show() + ) + snackbar.anchorView = (activity as? BottomNavOwner)?.bottomNav + snackbar.show() } private fun onError(e: Throwable) { - Snackbar.make( + val snackbar = Snackbar.make( binding.recyclerView, e.getDisplayMessage(resources), Snackbar.LENGTH_SHORT - ).show() + ) + snackbar.anchorView = (activity as? BottomNavOwner)?.bottomNav + snackbar.show() } private fun onIsTrackerRunningChanged(isRunning: Boolean) { diff --git a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedMenuProvider.kt b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedMenuProvider.kt index 655f02f8b..6a201b1c1 100644 --- a/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedMenuProvider.kt +++ b/app/src/main/java/org/koitharu/kotatsu/tracker/ui/FeedMenuProvider.kt @@ -14,6 +14,7 @@ import org.koitharu.kotatsu.tracker.work.TrackWorker class FeedMenuProvider( private val snackbarHost: View, + private val anchorView: View, private val viewModel: FeedViewModel, ) : MenuProvider { @@ -27,11 +28,13 @@ class FeedMenuProvider( override fun onMenuItemSelected(menuItem: MenuItem): Boolean = when (menuItem.itemId) { R.id.action_update -> { TrackWorker.startNow(context) - Snackbar.make( + val snackbar = Snackbar.make( snackbarHost, R.string.feed_will_update_soon, Snackbar.LENGTH_LONG, - ).show() + ) + snackbar.anchorView = anchorView + snackbar.show() true } R.id.action_clear_feed -> { @@ -51,4 +54,4 @@ class FeedMenuProvider( } else -> false } -} \ No newline at end of file +} diff --git a/app/src/main/res/layout/activity_container.xml b/app/src/main/res/layout/activity_container.xml index a5e87e0e5..7d470c867 100644 --- a/app/src/main/res/layout/activity_container.xml +++ b/app/src/main/res/layout/activity_container.xml @@ -5,12 +5,18 @@ android:layout_width="match_parent" android:layout_height="match_parent"> + + + android:stateListAnimator="@null"> - - - \ No newline at end of file + diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index cba54b5f6..12eb5358d 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -66,15 +66,18 @@ android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_margin="16dp" + android:layout_marginHorizontal="16dp" + android:layout_marginBottom="-4dp" android:text="@string/_continue" android:visibility="gone" app:backgroundTint="?attr/colorContainer" app:icon="@drawable/ic_read" - app:layout_anchor="@id/container" - app:layout_anchorGravity="bottom|end" + app:layout_anchor="@id/bottomNav" + app:layout_anchorGravity="top|end" app:layout_behavior="org.koitharu.kotatsu.base.ui.util.ShrinkOnScrollBehavior" + app:layout_insetEdge="bottom" app:layout_dodgeInsetEdges="bottom" + android:paddingBottom="8dp" tools:visibility="visible" /> - \ No newline at end of file + diff --git a/app/src/main/res/layout/fragment_tools.xml b/app/src/main/res/layout/fragment_tools.xml index 8219cdaac..bff867d07 100644 --- a/app/src/main/res/layout/fragment_tools.xml +++ b/app/src/main/res/layout/fragment_tools.xml @@ -23,12 +23,16 @@ android:id="@+id/layout_sync" layout="@layout/layout_synchronization" android:layout_width="match_parent" - android:layout_height="wrap_content" /> + android:layout_height="wrap_content" + android:visibility="gone" + tools:visibility="visible" /> + android:layout_marginVertical="@dimen/margin_small" + android:visibility="gone" + tools:visibility="visible" />