Attempt to fix insets

pull/189/head
Zakhar Timoshenko 4 years ago
parent af901baff3
commit 70de4f750c

@ -22,6 +22,7 @@ import org.koitharu.kotatsu.explore.ui.adapter.ExploreListEventListener
import org.koitharu.kotatsu.explore.ui.model.ExploreItem import org.koitharu.kotatsu.explore.ui.model.ExploreItem
import org.koitharu.kotatsu.favourites.ui.categories.FavouriteCategoriesActivity import org.koitharu.kotatsu.favourites.ui.categories.FavouriteCategoriesActivity
import org.koitharu.kotatsu.history.ui.HistoryActivity 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.Manga
import org.koitharu.kotatsu.parsers.model.MangaSource import org.koitharu.kotatsu.parsers.model.MangaSource
import org.koitharu.kotatsu.search.ui.MangaListActivity import org.koitharu.kotatsu.search.ui.MangaListActivity
@ -108,11 +109,13 @@ class ExploreFragment : BaseFragment<FragmentExploreBinding>(),
override fun onEmptyActionClick() = onManageClick(requireView()) override fun onEmptyActionClick() = onManageClick(requireView())
private fun onError(e: Throwable) { private fun onError(e: Throwable) {
Snackbar.make( val snackbar = Snackbar.make(
binding.recyclerView, binding.recyclerView,
e.getDisplayMessage(resources), e.getDisplayMessage(resources),
Snackbar.LENGTH_SHORT Snackbar.LENGTH_SHORT
).show() )
snackbar.anchorView = (activity as? BottomNavOwner)?.bottomNav
snackbar.show()
} }
private fun onOpenManga(manga: Manga) { private fun onOpenManga(manga: Manga) {

@ -85,7 +85,7 @@ class ReadingProgressDrawable(
paint.color = backgroundColor paint.color = backgroundColor
canvas.drawCircle(cx, cy, radius, paint) canvas.drawCircle(cx, cy, radius, paint)
} }
val innerRadius = radius - paint.strokeWidth / 2.5f val innerRadius = radius - paint.strokeWidth / 2f
paint.style = Paint.Style.STROKE paint.style = Paint.Style.STROKE
if (hasOutline) { if (hasOutline) {
paint.color = outlineColor paint.color = outlineColor

@ -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.ItemSizeResolver
import org.koitharu.kotatsu.list.ui.MangaSelectionDecoration import org.koitharu.kotatsu.list.ui.MangaSelectionDecoration
import org.koitharu.kotatsu.list.ui.model.ListModel 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.Manga
import org.koitharu.kotatsu.parsers.util.flattenTo import org.koitharu.kotatsu.parsers.util.flattenTo
import org.koitharu.kotatsu.utils.ShareHelper import org.koitharu.kotatsu.utils.ShareHelper
@ -171,11 +172,13 @@ class LibraryFragment :
} }
private fun onError(e: Throwable) { private fun onError(e: Throwable) {
Snackbar.make( val snackbar = Snackbar.make(
binding.recyclerView, binding.recyclerView,
e.getDisplayMessage(resources), e.getDisplayMessage(resources),
Snackbar.LENGTH_SHORT, Snackbar.LENGTH_SHORT,
).show() )
snackbar.anchorView = (activity as? BottomNavOwner)?.bottomNav
snackbar.show()
} }
private fun onActionDone(action: ReversibleAction) { private fun onActionDone(action: ReversibleAction) {
@ -185,6 +188,7 @@ class LibraryFragment :
if (handle != null) { if (handle != null) {
snackbar.setAction(R.string.undo) { handle.reverseAsync() } snackbar.setAction(R.string.undo) { handle.reverseAsync() }
} }
snackbar.anchorView = (activity as? BottomNavOwner)?.bottomNav
snackbar.show() snackbar.show()
} }

@ -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.ListModel
import org.koitharu.kotatsu.list.ui.model.MangaItemModel import org.koitharu.kotatsu.list.ui.model.MangaItemModel
import org.koitharu.kotatsu.main.ui.AppBarOwner 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.main.ui.MainActivity
import org.koitharu.kotatsu.parsers.model.Manga import org.koitharu.kotatsu.parsers.model.Manga
import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.parsers.model.MangaTag
@ -155,6 +156,7 @@ abstract class MangaListFragment :
val handle = action.handle val handle = action.handle
val length = if (handle == null) Snackbar.LENGTH_SHORT else Snackbar.LENGTH_LONG val length = if (handle == null) Snackbar.LENGTH_SHORT else Snackbar.LENGTH_LONG
val snackbar = Snackbar.make(binding.recyclerView, action.stringResId, length) val snackbar = Snackbar.make(binding.recyclerView, action.stringResId, length)
snackbar.anchorView = (activity as? BottomNavOwner)?.bottomNav
if (handle != null) { if (handle != null) {
snackbar.setAction(R.string.undo) { handle.reverseAsync() } snackbar.setAction(R.string.undo) { handle.reverseAsync() }
} }

@ -0,0 +1,8 @@
package org.koitharu.kotatsu.main.ui
import org.koitharu.kotatsu.base.ui.widgets.KotatsuBottomNavigationView
interface BottomNavOwner {
val bottomNav: KotatsuBottomNavigationView?
}

@ -20,6 +20,7 @@ import androidx.transition.TransitionManager
import com.google.android.material.R as materialR import com.google.android.material.R as materialR
import com.google.android.material.appbar.AppBarLayout import com.google.android.material.appbar.AppBarLayout
import com.google.android.material.appbar.AppBarLayout.LayoutParams.* 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.navigation.NavigationBarView
import com.google.android.material.snackbar.Snackbar import com.google.android.material.snackbar.Snackbar
import kotlinx.coroutines.Dispatchers 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.koin.androidx.viewmodel.ext.android.viewModel
import org.koitharu.kotatsu.R import org.koitharu.kotatsu.R
import org.koitharu.kotatsu.base.ui.BaseActivity 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.core.prefs.AppSettings
import org.koitharu.kotatsu.databinding.ActivityMainBinding import org.koitharu.kotatsu.databinding.ActivityMainBinding
import org.koitharu.kotatsu.details.ui.DetailsActivity import org.koitharu.kotatsu.details.ui.DetailsActivity
@ -59,6 +61,7 @@ private const val TAG_SEARCH = "search"
class MainActivity : class MainActivity :
BaseActivity<ActivityMainBinding>(), BaseActivity<ActivityMainBinding>(),
AppBarOwner, AppBarOwner,
BottomNavOwner,
View.OnClickListener, View.OnClickListener,
View.OnFocusChangeListener, View.OnFocusChangeListener,
SearchSuggestionListener, SearchSuggestionListener,
@ -72,15 +75,18 @@ class MainActivity :
override val appBar: AppBarLayout override val appBar: AppBarLayout
get() = binding.appbar get() = binding.appbar
override val bottomNav: KotatsuBottomNavigationView?
get() = binding.bottomNav
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(ActivityMainBinding.inflate(layoutInflater)) setContentView(ActivityMainBinding.inflate(layoutInflater))
navBar = checkNotNull(binding.bottomNav ?: binding.navRail) navBar = checkNotNull(bottomNav ?: binding.navRail)
if (binding.bottomNav != null) { if (bottomNav != null) {
ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, insets -> ViewCompat.setOnApplyWindowInsetsListener(binding.root) { _, insets ->
if (insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom > 0) { if (insets.getInsets(WindowInsetsCompat.Type.navigationBars()).bottom > 0) {
val elevation = binding.bottomNav?.elevation ?: 0f val elevation = bottomNav?.elevation ?: 0f
window.setNavigationBarTransparentCompat(this@MainActivity, elevation) window.setNavigationBarTransparentCompat(this@MainActivity, elevation)
} }
insets insets
@ -269,7 +275,7 @@ class MainActivity :
} }
private fun onError(e: Throwable) { 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) { private fun onCountersChanged(counters: SparseIntArray) {
@ -331,7 +337,7 @@ class MainActivity :
} }
private fun showNav(visible: Boolean) { private fun showNav(visible: Boolean) {
binding.bottomNav?.run { bottomNav?.run {
if (visible) { if (visible) {
slideUp() slideUp()
} else { } else {

@ -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.adapter.MangaListListener
import org.koitharu.kotatsu.list.ui.model.ListHeader import org.koitharu.kotatsu.list.ui.model.ListHeader
import org.koitharu.kotatsu.list.ui.model.ListModel 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.Manga
import org.koitharu.kotatsu.parsers.model.MangaTag import org.koitharu.kotatsu.parsers.model.MangaTag
import org.koitharu.kotatsu.tracker.ui.adapter.FeedAdapter import org.koitharu.kotatsu.tracker.ui.adapter.FeedAdapter
@ -63,7 +64,7 @@ class FeedFragment :
setColorSchemeColors(context.getThemeColor(com.google.android.material.R.attr.colorOnPrimary)) setColorSchemeColors(context.getThemeColor(com.google.android.material.R.attr.colorOnPrimary))
isEnabled = false 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.content.observe(viewLifecycleOwner, this::onListChanged)
viewModel.onError.observe(viewLifecycleOwner, this::onError) viewModel.onError.observe(viewLifecycleOwner, this::onError)
@ -101,19 +102,23 @@ class FeedFragment :
} }
private fun onFeedCleared() { private fun onFeedCleared() {
Snackbar.make( val snackbar = Snackbar.make(
binding.recyclerView, binding.recyclerView,
R.string.updates_feed_cleared, R.string.updates_feed_cleared,
Snackbar.LENGTH_LONG Snackbar.LENGTH_LONG
).show() )
snackbar.anchorView = (activity as? BottomNavOwner)?.bottomNav
snackbar.show()
} }
private fun onError(e: Throwable) { private fun onError(e: Throwable) {
Snackbar.make( val snackbar = Snackbar.make(
binding.recyclerView, binding.recyclerView,
e.getDisplayMessage(resources), e.getDisplayMessage(resources),
Snackbar.LENGTH_SHORT Snackbar.LENGTH_SHORT
).show() )
snackbar.anchorView = (activity as? BottomNavOwner)?.bottomNav
snackbar.show()
} }
private fun onIsTrackerRunningChanged(isRunning: Boolean) { private fun onIsTrackerRunningChanged(isRunning: Boolean) {

@ -14,6 +14,7 @@ import org.koitharu.kotatsu.tracker.work.TrackWorker
class FeedMenuProvider( class FeedMenuProvider(
private val snackbarHost: View, private val snackbarHost: View,
private val anchorView: View,
private val viewModel: FeedViewModel, private val viewModel: FeedViewModel,
) : MenuProvider { ) : MenuProvider {
@ -27,11 +28,13 @@ class FeedMenuProvider(
override fun onMenuItemSelected(menuItem: MenuItem): Boolean = when (menuItem.itemId) { override fun onMenuItemSelected(menuItem: MenuItem): Boolean = when (menuItem.itemId) {
R.id.action_update -> { R.id.action_update -> {
TrackWorker.startNow(context) TrackWorker.startNow(context)
Snackbar.make( val snackbar = Snackbar.make(
snackbarHost, snackbarHost,
R.string.feed_will_update_soon, R.string.feed_will_update_soon,
Snackbar.LENGTH_LONG, Snackbar.LENGTH_LONG,
).show() )
snackbar.anchorView = anchorView
snackbar.show()
true true
} }
R.id.action_clear_feed -> { R.id.action_clear_feed -> {

@ -5,12 +5,18 @@
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"> android:layout_height="match_parent">
<androidx.fragment.app.FragmentContainerView
android:id="@id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior" />
<com.google.android.material.appbar.KotatsuAppBarLayout <com.google.android.material.appbar.KotatsuAppBarLayout
android:id="@+id/appbar" android:id="@+id/appbar"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:fitsSystemWindows="true" android:fitsSystemWindows="true"
app:elevation="0dp"> android:stateListAnimator="@null">
<com.google.android.material.appbar.MaterialToolbar <com.google.android.material.appbar.MaterialToolbar
android:id="@id/toolbar" android:id="@id/toolbar"
@ -20,10 +26,4 @@
</com.google.android.material.appbar.KotatsuAppBarLayout> </com.google.android.material.appbar.KotatsuAppBarLayout>
<androidx.fragment.app.FragmentContainerView
android:id="@id/container"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="com.google.android.material.appbar.AppBarLayout$ScrollingViewBehavior" />
</org.koitharu.kotatsu.base.ui.widgets.KotatsuCoordinatorLayout> </org.koitharu.kotatsu.base.ui.widgets.KotatsuCoordinatorLayout>

@ -66,15 +66,18 @@
android:id="@+id/fab" android:id="@+id/fab"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_margin="16dp" android:layout_marginHorizontal="16dp"
android:layout_marginBottom="-4dp"
android:text="@string/_continue" android:text="@string/_continue"
android:visibility="gone" android:visibility="gone"
app:backgroundTint="?attr/colorContainer" app:backgroundTint="?attr/colorContainer"
app:icon="@drawable/ic_read" app:icon="@drawable/ic_read"
app:layout_anchor="@id/container" app:layout_anchor="@id/bottomNav"
app:layout_anchorGravity="bottom|end" app:layout_anchorGravity="top|end"
app:layout_behavior="org.koitharu.kotatsu.base.ui.util.ShrinkOnScrollBehavior" app:layout_behavior="org.koitharu.kotatsu.base.ui.util.ShrinkOnScrollBehavior"
app:layout_insetEdge="bottom"
app:layout_dodgeInsetEdges="bottom" app:layout_dodgeInsetEdges="bottom"
android:paddingBottom="8dp"
tools:visibility="visible" /> tools:visibility="visible" />
<org.koitharu.kotatsu.base.ui.widgets.KotatsuBottomNavigationView <org.koitharu.kotatsu.base.ui.widgets.KotatsuBottomNavigationView

@ -23,12 +23,16 @@
android:id="@+id/layout_sync" android:id="@+id/layout_sync"
layout="@layout/layout_synchronization" layout="@layout/layout_synchronization"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" /> android:layout_height="wrap_content"
android:visibility="gone"
tools:visibility="visible" />
<com.google.android.material.divider.MaterialDivider <com.google.android.material.divider.MaterialDivider
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginVertical="@dimen/margin_small" /> android:layout_marginVertical="@dimen/margin_small"
android:visibility="gone"
tools:visibility="visible" />
<include <include
android:id="@+id/layout_storage" android:id="@+id/layout_storage"

Loading…
Cancel
Save