Fix MainActivity insets
This commit is contained in:
@@ -31,7 +31,7 @@ abstract class BaseActivity<B : ViewBinding> : AppCompatActivity(), OnApplyWindo
|
|||||||
@Suppress("LeakingThis")
|
@Suppress("LeakingThis")
|
||||||
protected val exceptionResolver = ExceptionResolver(this)
|
protected val exceptionResolver = ExceptionResolver(this)
|
||||||
|
|
||||||
private var lastInsets: Insets = Insets.NONE
|
private var lastInsets: Insets? = null
|
||||||
|
|
||||||
override fun onCreate(savedInstanceState: Bundle?) {
|
override fun onCreate(savedInstanceState: Bundle?) {
|
||||||
val settings = get<AppSettings>()
|
val settings = get<AppSettings>()
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import androidx.core.graphics.Insets
|
|||||||
import androidx.core.view.OnApplyWindowInsetsListener
|
import androidx.core.view.OnApplyWindowInsetsListener
|
||||||
import androidx.core.view.ViewCompat
|
import androidx.core.view.ViewCompat
|
||||||
import androidx.core.view.WindowInsetsCompat
|
import androidx.core.view.WindowInsetsCompat
|
||||||
|
import androidx.core.view.doOnNextLayout
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.viewbinding.ViewBinding
|
import androidx.viewbinding.ViewBinding
|
||||||
import org.koitharu.kotatsu.core.exceptions.resolve.ExceptionResolver
|
import org.koitharu.kotatsu.core.exceptions.resolve.ExceptionResolver
|
||||||
@@ -23,7 +24,7 @@ abstract class BaseFragment<B : ViewBinding> : Fragment(), OnApplyWindowInsetsLi
|
|||||||
@Suppress("LeakingThis")
|
@Suppress("LeakingThis")
|
||||||
protected val exceptionResolver = ExceptionResolver(this)
|
protected val exceptionResolver = ExceptionResolver(this)
|
||||||
|
|
||||||
private var lastInsets: Insets = Insets.NONE
|
private var lastInsets: Insets? = null
|
||||||
|
|
||||||
override fun onCreateView(
|
override fun onCreateView(
|
||||||
inflater: LayoutInflater,
|
inflater: LayoutInflater,
|
||||||
@@ -37,12 +38,18 @@ abstract class BaseFragment<B : ViewBinding> : Fragment(), OnApplyWindowInsetsLi
|
|||||||
|
|
||||||
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
|
||||||
super.onViewCreated(view, savedInstanceState)
|
super.onViewCreated(view, savedInstanceState)
|
||||||
lastInsets = Insets.NONE
|
|
||||||
ViewCompat.setOnApplyWindowInsetsListener(view, this)
|
ViewCompat.setOnApplyWindowInsetsListener(view, this)
|
||||||
|
view.doOnNextLayout {
|
||||||
|
// Listener may not be called
|
||||||
|
if (lastInsets == null) {
|
||||||
|
onWindowInsetsChanged(Insets.NONE)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun onDestroyView() {
|
override fun onDestroyView() {
|
||||||
viewBinding = null
|
viewBinding = null
|
||||||
|
lastInsets = null
|
||||||
super.onDestroyView()
|
super.onDestroyView()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -203,19 +203,9 @@ class ChaptersFragment : BaseFragment<FragmentChaptersBinding>(),
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onWindowInsetsChanged(insets: Insets) {
|
override fun onWindowInsetsChanged(insets: Insets) {
|
||||||
val root = binding.root
|
binding.recyclerViewChapters.updatePadding(
|
||||||
if (root.parent is FragmentContainerView) {
|
bottom = insets.bottom + binding.spinnerBranches.height,
|
||||||
binding.recyclerViewChapters.updatePaddingRelative(
|
)
|
||||||
end = insets.getEnd(root),
|
|
||||||
bottom = insets.bottom + binding.spinnerBranches.height,
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
binding.recyclerViewChapters.updatePadding(
|
|
||||||
left = insets.left,
|
|
||||||
right = insets.right,
|
|
||||||
bottom = insets.bottom + binding.spinnerBranches.height,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onChaptersChanged(list: List<ChapterListItem>) {
|
private fun onChaptersChanged(list: List<ChapterListItem>) {
|
||||||
|
|||||||
@@ -9,7 +9,6 @@ import android.view.MenuItem
|
|||||||
import android.view.ViewGroup
|
import android.view.ViewGroup
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.appcompat.view.ActionMode
|
import androidx.appcompat.view.ActionMode
|
||||||
import androidx.appcompat.widget.Toolbar
|
|
||||||
import androidx.core.content.pm.ShortcutManagerCompat
|
import androidx.core.content.pm.ShortcutManagerCompat
|
||||||
import androidx.core.graphics.Insets
|
import androidx.core.graphics.Insets
|
||||||
import androidx.core.net.toFile
|
import androidx.core.net.toFile
|
||||||
@@ -96,22 +95,13 @@ class DetailsActivity : BaseActivity<ActivityDetailsBinding>(), TabLayoutMediato
|
|||||||
binding.snackbar.updatePadding(
|
binding.snackbar.updatePadding(
|
||||||
bottom = insets.bottom
|
bottom = insets.bottom
|
||||||
)
|
)
|
||||||
with(binding.toolbar) {
|
binding.toolbar.updateLayoutParams<ViewGroup.MarginLayoutParams> {
|
||||||
updatePadding(
|
topMargin = insets.top
|
||||||
left = insets.left,
|
|
||||||
right = insets.right
|
|
||||||
)
|
|
||||||
updateLayoutParams<ViewGroup.MarginLayoutParams> {
|
|
||||||
topMargin = insets.top
|
|
||||||
}
|
|
||||||
}
|
|
||||||
val tabs = binding.tabs
|
|
||||||
if (tabs != null && tabs.parent !is Toolbar) {
|
|
||||||
tabs.updatePadding(
|
|
||||||
left = insets.left,
|
|
||||||
right = insets.right
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
|
binding.root.updatePadding(
|
||||||
|
left = insets.left,
|
||||||
|
right = insets.right
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onNewChaptersChanged(newChapters: Int) {
|
private fun onNewChaptersChanged(newChapters: Int) {
|
||||||
|
|||||||
@@ -13,8 +13,6 @@ import androidx.core.net.toUri
|
|||||||
import androidx.core.text.parseAsHtml
|
import androidx.core.text.parseAsHtml
|
||||||
import androidx.core.view.isVisible
|
import androidx.core.view.isVisible
|
||||||
import androidx.core.view.updatePadding
|
import androidx.core.view.updatePadding
|
||||||
import androidx.core.view.updatePaddingRelative
|
|
||||||
import androidx.fragment.app.FragmentContainerView
|
|
||||||
import coil.ImageLoader
|
import coil.ImageLoader
|
||||||
import coil.request.ImageRequest
|
import coil.request.ImageRequest
|
||||||
import coil.util.CoilUtils
|
import coil.util.CoilUtils
|
||||||
@@ -234,19 +232,9 @@ class DetailsFragment : BaseFragment<FragmentDetailsBinding>(), View.OnClickList
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onWindowInsetsChanged(insets: Insets) {
|
override fun onWindowInsetsChanged(insets: Insets) {
|
||||||
val root = binding.root
|
binding.root.updatePadding(
|
||||||
if (root.parent is FragmentContainerView) {
|
bottom = insets.bottom,
|
||||||
root.updatePaddingRelative(
|
)
|
||||||
start = insets.getStart(root),
|
|
||||||
bottom = insets.bottom,
|
|
||||||
)
|
|
||||||
} else {
|
|
||||||
root.updatePadding(
|
|
||||||
left = insets.left,
|
|
||||||
right = insets.right,
|
|
||||||
bottom = insets.bottom,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun bindTags(manga: Manga) {
|
private fun bindTags(manga: Manga) {
|
||||||
|
|||||||
@@ -176,17 +176,19 @@ abstract class MangaListFragment : BaseFragment<FragmentListBinding>(),
|
|||||||
val headerHeight = (activity as? AppBarOwner)?.appBar?.measureHeight() ?: insets.top
|
val headerHeight = (activity as? AppBarOwner)?.appBar?.measureHeight() ?: insets.top
|
||||||
binding.root.updatePadding(
|
binding.root.updatePadding(
|
||||||
left = insets.left,
|
left = insets.left,
|
||||||
right = insets.right
|
right = insets.right,
|
||||||
)
|
)
|
||||||
if (activity is MainActivity) {
|
if (activity is MainActivity) {
|
||||||
|
val topOffsetDiff = binding.recyclerView.paddingTop - headerHeight
|
||||||
binding.recyclerView.updatePadding(
|
binding.recyclerView.updatePadding(
|
||||||
top = headerHeight,
|
top = headerHeight,
|
||||||
bottom = insets.bottom
|
bottom = insets.bottom,
|
||||||
)
|
)
|
||||||
|
binding.recyclerView.scrollBy(0, topOffsetDiff)
|
||||||
binding.swipeRefreshLayout.setProgressViewOffset(
|
binding.swipeRefreshLayout.setProgressViewOffset(
|
||||||
true,
|
true,
|
||||||
headerHeight + resources.resolveDp(-72),
|
headerHeight + resources.resolveDp(-72),
|
||||||
headerHeight + resources.resolveDp(10)
|
headerHeight + resources.resolveDp(10),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,13 +10,15 @@ import android.view.ViewGroup.MarginLayoutParams
|
|||||||
import androidx.appcompat.app.ActionBarDrawerToggle
|
import androidx.appcompat.app.ActionBarDrawerToggle
|
||||||
import androidx.core.content.ContextCompat
|
import androidx.core.content.ContextCompat
|
||||||
import androidx.core.graphics.Insets
|
import androidx.core.graphics.Insets
|
||||||
import androidx.core.view.*
|
import androidx.core.view.GravityCompat
|
||||||
|
import androidx.core.view.ViewCompat
|
||||||
|
import androidx.core.view.updateLayoutParams
|
||||||
|
import androidx.core.view.updatePadding
|
||||||
import androidx.drawerlayout.widget.DrawerLayout
|
import androidx.drawerlayout.widget.DrawerLayout
|
||||||
import androidx.fragment.app.Fragment
|
import androidx.fragment.app.Fragment
|
||||||
import androidx.fragment.app.FragmentTransaction
|
import androidx.fragment.app.FragmentTransaction
|
||||||
import androidx.fragment.app.commit
|
import androidx.fragment.app.commit
|
||||||
import androidx.lifecycle.lifecycleScope
|
import androidx.lifecycle.lifecycleScope
|
||||||
import androidx.recyclerview.widget.RecyclerView
|
|
||||||
import androidx.swiperefreshlayout.widget.CircularProgressDrawable
|
import androidx.swiperefreshlayout.widget.CircularProgressDrawable
|
||||||
import com.google.android.material.appbar.AppBarLayout
|
import com.google.android.material.appbar.AppBarLayout
|
||||||
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
import com.google.android.material.dialog.MaterialAlertDialogBuilder
|
||||||
@@ -104,15 +106,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>(),
|
|||||||
}
|
}
|
||||||
|
|
||||||
with(binding.navigationView) {
|
with(binding.navigationView) {
|
||||||
val menuView =
|
ViewCompat.setOnApplyWindowInsetsListener(this, NavigationViewInsetsListener())
|
||||||
findViewById<RecyclerView>(com.google.android.material.R.id.design_navigation_view)
|
|
||||||
ViewCompat.setOnApplyWindowInsetsListener(navHeaderBinding.root) { v, insets ->
|
|
||||||
val systemWindowInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars())
|
|
||||||
v.updatePadding(top = systemWindowInsets.top)
|
|
||||||
// NavigationView doesn't dispatch insets to the menu view, so pad the bottom here.
|
|
||||||
menuView.updatePadding(bottom = systemWindowInsets.bottom)
|
|
||||||
insets
|
|
||||||
}
|
|
||||||
addHeaderView(navHeaderBinding.root)
|
addHeaderView(navHeaderBinding.root)
|
||||||
setNavigationItemSelectedListener(this@MainActivity)
|
setNavigationItemSelectedListener(this@MainActivity)
|
||||||
}
|
}
|
||||||
@@ -219,14 +213,16 @@ class MainActivity : BaseActivity<ActivityMainBinding>(),
|
|||||||
}
|
}
|
||||||
|
|
||||||
override fun onWindowInsetsChanged(insets: Insets) {
|
override fun onWindowInsetsChanged(insets: Insets) {
|
||||||
binding.toolbarCard.updateLayoutParams<MarginLayoutParams> {
|
|
||||||
topMargin = insets.top + resources.resolveDp(8)
|
|
||||||
}
|
|
||||||
binding.fab.updateLayoutParams<MarginLayoutParams> {
|
binding.fab.updateLayoutParams<MarginLayoutParams> {
|
||||||
bottomMargin = insets.bottom + topMargin
|
bottomMargin = insets.bottom + topMargin
|
||||||
leftMargin = insets.left + topMargin
|
|
||||||
rightMargin = insets.right + topMargin
|
|
||||||
}
|
}
|
||||||
|
binding.toolbarCard.updateLayoutParams<MarginLayoutParams> {
|
||||||
|
topMargin = insets.top + bottomMargin
|
||||||
|
}
|
||||||
|
binding.root.updatePadding(
|
||||||
|
left = insets.left,
|
||||||
|
right = insets.right,
|
||||||
|
)
|
||||||
binding.container.updateLayoutParams<MarginLayoutParams> {
|
binding.container.updateLayoutParams<MarginLayoutParams> {
|
||||||
topMargin = -(binding.appbar.measureHeight())
|
topMargin = -(binding.appbar.measureHeight())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package org.koitharu.kotatsu.main.ui
|
||||||
|
|
||||||
|
import android.view.View
|
||||||
|
import androidx.core.view.OnApplyWindowInsetsListener
|
||||||
|
import androidx.core.view.WindowInsetsCompat
|
||||||
|
import androidx.core.view.updatePadding
|
||||||
|
import java.lang.ref.WeakReference
|
||||||
|
import com.google.android.material.R as materialR
|
||||||
|
|
||||||
|
class NavigationViewInsetsListener : OnApplyWindowInsetsListener {
|
||||||
|
|
||||||
|
private var menuViewRef: WeakReference<View>? = null
|
||||||
|
|
||||||
|
override fun onApplyWindowInsets(v: View, insets: WindowInsetsCompat): WindowInsetsCompat {
|
||||||
|
val menuView = menuViewRef?.get() ?: v.findViewById<View>(materialR.id.design_navigation_view).also {
|
||||||
|
menuViewRef = WeakReference(it)
|
||||||
|
}
|
||||||
|
val systemWindowInsets = insets.getInsets(WindowInsetsCompat.Type.systemBars())
|
||||||
|
v.updatePadding(top = systemWindowInsets.top)
|
||||||
|
// NavigationView doesn't dispatch insets to the menu view, so pad the bottom here.
|
||||||
|
menuView.updatePadding(bottom = systemWindowInsets.bottom)
|
||||||
|
return WindowInsetsCompat.CONSUMED
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -32,16 +32,15 @@
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
app:elevation="0dp"
|
app:elevation="0dp"
|
||||||
|
android:paddingLeft="16dp"
|
||||||
|
android:paddingRight="16dp"
|
||||||
app:liftOnScroll="false">
|
app:liftOnScroll="false">
|
||||||
|
|
||||||
<FrameLayout
|
<FrameLayout
|
||||||
android:id="@+id/toolbar_card"
|
android:id="@+id/toolbar_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="54dp"
|
android:layout_height="54dp"
|
||||||
android:layout_marginStart="16dp"
|
android:layout_marginVertical="8dp"
|
||||||
android:layout_marginTop="8dp"
|
|
||||||
android:layout_marginEnd="16dp"
|
|
||||||
android:layout_marginBottom="8dp"
|
|
||||||
android:background="@drawable/toolbar_background">
|
android:background="@drawable/toolbar_background">
|
||||||
|
|
||||||
<com.google.android.material.appbar.MaterialToolbar
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
|
|||||||
@@ -22,6 +22,8 @@
|
|||||||
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:paddingLeft="16dp"
|
||||||
|
android:paddingRight="16dp"
|
||||||
android:background="@null"
|
android:background="@null"
|
||||||
android:stateListAnimator="@null">
|
android:stateListAnimator="@null">
|
||||||
|
|
||||||
@@ -29,10 +31,7 @@
|
|||||||
android:id="@+id/toolbar_card"
|
android:id="@+id/toolbar_card"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:layout_height="48dp"
|
android:layout_height="48dp"
|
||||||
android:layout_marginStart="16dp"
|
android:layout_marginVertical="8dp"
|
||||||
android:layout_marginTop="8dp"
|
|
||||||
android:layout_marginEnd="16dp"
|
|
||||||
android:layout_marginBottom="8dp"
|
|
||||||
android:background="@drawable/toolbar_background">
|
android:background="@drawable/toolbar_background">
|
||||||
|
|
||||||
<com.google.android.material.appbar.MaterialToolbar
|
<com.google.android.material.appbar.MaterialToolbar
|
||||||
|
|||||||
Reference in New Issue
Block a user