From 88a3589f1d9bc9bb154aee075d2406b85905e3bc Mon Sep 17 00:00:00 2001 From: Koitharu Date: Sun, 13 Mar 2022 09:53:31 +0200 Subject: [PATCH] Fix MainActivity insets --- .../koitharu/kotatsu/base/ui/BaseActivity.kt | 2 +- .../koitharu/kotatsu/base/ui/BaseFragment.kt | 11 ++++++-- .../kotatsu/details/ui/ChaptersFragment.kt | 16 ++--------- .../kotatsu/details/ui/DetailsActivity.kt | 22 ++++----------- .../kotatsu/details/ui/DetailsFragment.kt | 18 ++---------- .../kotatsu/list/ui/MangaListFragment.kt | 8 ++++-- .../koitharu/kotatsu/main/ui/MainActivity.kt | 28 ++++++++----------- .../main/ui/NavigationViewInsetsListener.kt | 24 ++++++++++++++++ .../res/layout-w720dp-land/activity_main.xml | 7 ++--- app/src/main/res/layout/activity_main.xml | 7 ++--- 10 files changed, 69 insertions(+), 74 deletions(-) create mode 100644 app/src/main/java/org/koitharu/kotatsu/main/ui/NavigationViewInsetsListener.kt diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt index c14d81151..a6fc2c466 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseActivity.kt @@ -31,7 +31,7 @@ abstract class BaseActivity : 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() diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseFragment.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseFragment.kt index 25ca6a503..f7b90fa01 100644 --- a/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/BaseFragment.kt @@ -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 : 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 : 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() } diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt index 4f4d1e1a5..4e66273a4 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/ChaptersFragment.kt @@ -203,19 +203,9 @@ class ChaptersFragment : BaseFragment(), } 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) { diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt index 7bea427f3..10c22b67a 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsActivity.kt @@ -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(), TabLayoutMediato binding.snackbar.updatePadding( bottom = insets.bottom ) - with(binding.toolbar) { - updatePadding( - left = insets.left, - right = insets.right - ) - updateLayoutParams { - 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 { + topMargin = insets.top } + binding.root.updatePadding( + left = insets.left, + right = insets.right + ) } private fun onNewChaptersChanged(newChapters: Int) { diff --git a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt index 47993dd60..0b271ef64 100644 --- a/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt +++ b/app/src/main/java/org/koitharu/kotatsu/details/ui/DetailsFragment.kt @@ -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(), 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) { 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 70b2d8c93..796a479f3 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 @@ -176,17 +176,19 @@ abstract class MangaListFragment : BaseFragment(), 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), ) } } 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 989159104..be471f458 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 @@ -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(), } with(binding.navigationView) { - val menuView = - findViewById(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(), } override fun onWindowInsetsChanged(insets: Insets) { - binding.toolbarCard.updateLayoutParams { - topMargin = insets.top + resources.resolveDp(8) - } binding.fab.updateLayoutParams { bottomMargin = insets.bottom + topMargin - leftMargin = insets.left + topMargin - rightMargin = insets.right + topMargin } + binding.toolbarCard.updateLayoutParams { + topMargin = insets.top + bottomMargin + } + binding.root.updatePadding( + left = insets.left, + right = insets.right, + ) binding.container.updateLayoutParams { topMargin = -(binding.appbar.measureHeight()) } diff --git a/app/src/main/java/org/koitharu/kotatsu/main/ui/NavigationViewInsetsListener.kt b/app/src/main/java/org/koitharu/kotatsu/main/ui/NavigationViewInsetsListener.kt new file mode 100644 index 000000000..f3a66a8fa --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/main/ui/NavigationViewInsetsListener.kt @@ -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? = null + + override fun onApplyWindowInsets(v: View, insets: WindowInsetsCompat): WindowInsetsCompat { + val menuView = menuViewRef?.get() ?: v.findViewById(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 + } +} \ No newline at end of file diff --git a/app/src/main/res/layout-w720dp-land/activity_main.xml b/app/src/main/res/layout-w720dp-land/activity_main.xml index df67c21a0..c2b7c9e5c 100644 --- a/app/src/main/res/layout-w720dp-land/activity_main.xml +++ b/app/src/main/res/layout-w720dp-land/activity_main.xml @@ -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"> @@ -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">