Fix MainActivity insets

pull/127/head
Koitharu 4 years ago
parent 52dbd70c2f
commit 88a3589f1d
No known key found for this signature in database
GPG Key ID: 8E861F8CE6E7CE27

@ -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,20 +203,10 @@ class ChaptersFragment : BaseFragment<FragmentChaptersBinding>(),
} }
override fun onWindowInsetsChanged(insets: Insets) { 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( binding.recyclerViewChapters.updatePadding(
left = insets.left,
right = insets.right,
bottom = insets.bottom + binding.spinnerBranches.height, bottom = insets.bottom + binding.spinnerBranches.height,
) )
} }
}
private fun onChaptersChanged(list: List<ChapterListItem>) { private fun onChaptersChanged(list: List<ChapterListItem>) {
chaptersAdapter?.items = list chaptersAdapter?.items = list

@ -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,23 +95,14 @@ 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(
left = insets.left,
right = insets.right
)
updateLayoutParams<ViewGroup.MarginLayoutParams> {
topMargin = insets.top topMargin = insets.top
} }
} binding.root.updatePadding(
val tabs = binding.tabs
if (tabs != null && tabs.parent !is Toolbar) {
tabs.updatePadding(
left = insets.left, left = insets.left,
right = insets.right right = insets.right
) )
} }
}
private fun onNewChaptersChanged(newChapters: Int) { private fun onNewChaptersChanged(newChapters: Int) {
val tab = binding.tabs?.getTabAt(1) ?: return val tab = binding.tabs?.getTabAt(1) ?: return

@ -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) {
root.updatePaddingRelative(
start = insets.getStart(root),
bottom = insets.bottom, 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

Loading…
Cancel
Save