From 1b3af7069062f52cb8faf26486d8b47f924b5b4c Mon Sep 17 00:00:00 2001 From: Koitharu Date: Thu, 14 Apr 2022 08:06:16 +0300 Subject: [PATCH] Add WindowInsetHolder view --- .../base/ui/widgets/WindowInsetHolder.kt | 72 +++++++++++++++++++ .../res/layout-w720dp-land/activity_main.xml | 3 +- app/src/main/res/layout/activity_main.xml | 2 - 3 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/WindowInsetHolder.kt diff --git a/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/WindowInsetHolder.kt b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/WindowInsetHolder.kt new file mode 100644 index 000000000..0d915dc4f --- /dev/null +++ b/app/src/main/java/org/koitharu/kotatsu/base/ui/widgets/WindowInsetHolder.kt @@ -0,0 +1,72 @@ +package org.koitharu.kotatsu.base.ui.widgets + +import android.annotation.SuppressLint +import android.content.Context +import android.util.AttributeSet +import android.view.Gravity +import android.view.View +import android.view.WindowInsets +import android.widget.FrameLayout +import android.widget.LinearLayout +import androidx.annotation.AttrRes +import androidx.coordinatorlayout.widget.CoordinatorLayout +import androidx.core.view.WindowInsetsCompat + +class WindowInsetHolder @JvmOverloads constructor( + context: Context, + attrs: AttributeSet? = null, + @AttrRes defStyleAttr: Int = 0, +) : View(context, attrs, defStyleAttr) { + + private var desiredHeight = 0 + private var desiredWidth = 0 + + @SuppressLint("RtlHardcoded") + override fun dispatchApplyWindowInsets(insets: WindowInsets): WindowInsets { + val barsInsets = WindowInsetsCompat.toWindowInsetsCompat(insets, this) + .getInsets(WindowInsetsCompat.Type.systemBars()) + val gravity = getLayoutGravity() + val newWidth = when (gravity and Gravity.HORIZONTAL_GRAVITY_MASK) { + Gravity.LEFT -> barsInsets.left + Gravity.RIGHT -> barsInsets.right + else -> 0 + } + val newHeight = when (gravity and Gravity.VERTICAL_GRAVITY_MASK) { + Gravity.TOP -> barsInsets.top + Gravity.BOTTOM -> barsInsets.bottom + else -> 0 + } + if (newWidth != desiredWidth || newHeight != desiredHeight) { + desiredWidth = newWidth + desiredHeight = newHeight + requestLayout() + } + return super.dispatchApplyWindowInsets(insets) + } + + override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) { + val widthMode = MeasureSpec.getMode(widthMeasureSpec) + val heightMode = MeasureSpec.getMode(heightMeasureSpec) + super.onMeasure( + if (desiredWidth == 0 || widthMode == MeasureSpec.EXACTLY) { + widthMeasureSpec + } else { + MeasureSpec.makeMeasureSpec(desiredWidth, widthMode) + }, + if (desiredHeight == 0 || heightMode == MeasureSpec.EXACTLY) { + heightMeasureSpec + } else { + MeasureSpec.makeMeasureSpec(desiredHeight, heightMode) + }, + ) + } + + private fun getLayoutGravity(): Int { + return when (val lp = layoutParams) { + is FrameLayout.LayoutParams -> lp.gravity + is LinearLayout.LayoutParams -> lp.gravity + is CoordinatorLayout.LayoutParams -> lp.gravity + else -> Gravity.NO_GRAVITY + } + } +} \ 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 10570546c..1e507fbdc 100644 --- a/app/src/main/res/layout-w720dp-land/activity_main.xml +++ b/app/src/main/res/layout-w720dp-land/activity_main.xml @@ -32,6 +32,7 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="16dp" + android:background="@null" android:paddingRight="16dp" app:elevation="0dp" app:liftOnScroll="false"> @@ -81,8 +82,6 @@ android:text="@string/_continue" android:visibility="gone" app:backgroundTint="?attr/colorContainer" - app:behavior_autoHide="true" - app:behavior_autoShrink="true" app:icon="@drawable/ic_read" app:layout_anchor="@id/container" app:layout_anchorGravity="bottom|end" diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 78c3d932c..5b1c1571f 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -75,8 +75,6 @@ android:text="@string/_continue" android:visibility="gone" app:backgroundTint="?attr/colorContainer" - app:behavior_autoHide="true" - app:behavior_autoShrink="true" app:icon="@drawable/ic_read" app:layout_anchor="@id/container" app:layout_anchorGravity="bottom|end"