Fix MainActivity insets

This commit is contained in:
Koitharu
2022-03-13 09:53:31 +02:00
parent 52dbd70c2f
commit 88a3589f1d
10 changed files with 69 additions and 74 deletions

View File

@@ -31,7 +31,7 @@ abstract class BaseActivity<B : ViewBinding> : AppCompatActivity(), OnApplyWindo
@Suppress("LeakingThis")
protected val exceptionResolver = ExceptionResolver(this)
private var lastInsets: Insets = Insets.NONE
private var lastInsets: Insets? = null
override fun onCreate(savedInstanceState: Bundle?) {
val settings = get<AppSettings>()

View File

@@ -9,6 +9,7 @@ import androidx.core.graphics.Insets
import androidx.core.view.OnApplyWindowInsetsListener
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.core.view.doOnNextLayout
import androidx.fragment.app.Fragment
import androidx.viewbinding.ViewBinding
import org.koitharu.kotatsu.core.exceptions.resolve.ExceptionResolver
@@ -23,7 +24,7 @@ abstract class BaseFragment<B : ViewBinding> : Fragment(), OnApplyWindowInsetsLi
@Suppress("LeakingThis")
protected val exceptionResolver = ExceptionResolver(this)
private var lastInsets: Insets = Insets.NONE
private var lastInsets: Insets? = null
override fun onCreateView(
inflater: LayoutInflater,
@@ -37,12 +38,18 @@ abstract class BaseFragment<B : ViewBinding> : Fragment(), OnApplyWindowInsetsLi
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
lastInsets = Insets.NONE
ViewCompat.setOnApplyWindowInsetsListener(view, this)
view.doOnNextLayout {
// Listener may not be called
if (lastInsets == null) {
onWindowInsetsChanged(Insets.NONE)
}
}
}
override fun onDestroyView() {
viewBinding = null
lastInsets = null
super.onDestroyView()
}

View File

@@ -203,19 +203,9 @@ class ChaptersFragment : BaseFragment<FragmentChaptersBinding>(),
}
override fun onWindowInsetsChanged(insets: Insets) {
val root = binding.root
if (root.parent is FragmentContainerView) {
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,
)
}
binding.recyclerViewChapters.updatePadding(
bottom = insets.bottom + binding.spinnerBranches.height,
)
}
private fun onChaptersChanged(list: List<ChapterListItem>) {

View File

@@ -9,7 +9,6 @@ import android.view.MenuItem
import android.view.ViewGroup
import android.widget.Toast
import androidx.appcompat.view.ActionMode
import androidx.appcompat.widget.Toolbar
import androidx.core.content.pm.ShortcutManagerCompat
import androidx.core.graphics.Insets
import androidx.core.net.toFile
@@ -96,22 +95,13 @@ class DetailsActivity : BaseActivity<ActivityDetailsBinding>(), TabLayoutMediato
binding.snackbar.updatePadding(
bottom = insets.bottom
)
with(binding.toolbar) {
updatePadding(
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.toolbar.updateLayoutParams<ViewGroup.MarginLayoutParams> {
topMargin = insets.top
}
binding.root.updatePadding(
left = insets.left,
right = insets.right
)
}
private fun onNewChaptersChanged(newChapters: Int) {

View File

@@ -13,8 +13,6 @@ import androidx.core.net.toUri
import androidx.core.text.parseAsHtml
import androidx.core.view.isVisible
import androidx.core.view.updatePadding
import androidx.core.view.updatePaddingRelative
import androidx.fragment.app.FragmentContainerView
import coil.ImageLoader
import coil.request.ImageRequest
import coil.util.CoilUtils
@@ -234,19 +232,9 @@ class DetailsFragment : BaseFragment<FragmentDetailsBinding>(), View.OnClickList
}
override fun onWindowInsetsChanged(insets: Insets) {
val root = binding.root
if (root.parent is FragmentContainerView) {
root.updatePaddingRelative(
start = insets.getStart(root),
bottom = insets.bottom,
)
} else {
root.updatePadding(
left = insets.left,
right = insets.right,
bottom = insets.bottom,
)
}
binding.root.updatePadding(
bottom = insets.bottom,
)
}
private fun bindTags(manga: Manga) {

View File

@@ -176,17 +176,19 @@ abstract class MangaListFragment : BaseFragment<FragmentListBinding>(),
val headerHeight = (activity as? AppBarOwner)?.appBar?.measureHeight() ?: insets.top
binding.root.updatePadding(
left = insets.left,
right = insets.right
right = insets.right,
)
if (activity is MainActivity) {
val topOffsetDiff = binding.recyclerView.paddingTop - headerHeight
binding.recyclerView.updatePadding(
top = headerHeight,
bottom = insets.bottom
bottom = insets.bottom,
)
binding.recyclerView.scrollBy(0, topOffsetDiff)
binding.swipeRefreshLayout.setProgressViewOffset(
true,
headerHeight + resources.resolveDp(-72),
headerHeight + resources.resolveDp(10)
headerHeight + resources.resolveDp(10),
)
}
}

View File

@@ -10,13 +10,15 @@ import android.view.ViewGroup.MarginLayoutParams
import androidx.appcompat.app.ActionBarDrawerToggle
import androidx.core.content.ContextCompat
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.fragment.app.Fragment
import androidx.fragment.app.FragmentTransaction
import androidx.fragment.app.commit
import androidx.lifecycle.lifecycleScope
import androidx.recyclerview.widget.RecyclerView
import androidx.swiperefreshlayout.widget.CircularProgressDrawable
import com.google.android.material.appbar.AppBarLayout
import com.google.android.material.dialog.MaterialAlertDialogBuilder
@@ -104,15 +106,7 @@ class MainActivity : BaseActivity<ActivityMainBinding>(),
}
with(binding.navigationView) {
val menuView =
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
}
ViewCompat.setOnApplyWindowInsetsListener(this, NavigationViewInsetsListener())
addHeaderView(navHeaderBinding.root)
setNavigationItemSelectedListener(this@MainActivity)
}
@@ -219,14 +213,16 @@ class MainActivity : BaseActivity<ActivityMainBinding>(),
}
override fun onWindowInsetsChanged(insets: Insets) {
binding.toolbarCard.updateLayoutParams<MarginLayoutParams> {
topMargin = insets.top + resources.resolveDp(8)
}
binding.fab.updateLayoutParams<MarginLayoutParams> {
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> {
topMargin = -(binding.appbar.measureHeight())
}

View File

@@ -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
}
}

View File

@@ -32,16 +32,15 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:elevation="0dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
app:liftOnScroll="false">
<FrameLayout
android:id="@+id/toolbar_card"
android:layout_width="match_parent"
android:layout_height="54dp"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="8dp"
android:layout_marginVertical="8dp"
android:background="@drawable/toolbar_background">
<com.google.android.material.appbar.MaterialToolbar

View File

@@ -22,6 +22,8 @@
android:id="@+id/appbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:background="@null"
android:stateListAnimator="@null">
@@ -29,10 +31,7 @@
android:id="@+id/toolbar_card"
android:layout_width="match_parent"
android:layout_height="48dp"
android:layout_marginStart="16dp"
android:layout_marginTop="8dp"
android:layout_marginEnd="16dp"
android:layout_marginBottom="8dp"
android:layout_marginVertical="8dp"
android:background="@drawable/toolbar_background">
<com.google.android.material.appbar.MaterialToolbar