diff --git a/commons/src/main/kotlin/org/fossify/commons/activities/EdgeToEdgeActivity.kt b/commons/src/main/kotlin/org/fossify/commons/activities/EdgeToEdgeActivity.kt index 3b5eb1b55..7200fa0c1 100644 --- a/commons/src/main/kotlin/org/fossify/commons/activities/EdgeToEdgeActivity.kt +++ b/commons/src/main/kotlin/org/fossify/commons/activities/EdgeToEdgeActivity.kt @@ -20,6 +20,7 @@ import org.fossify.commons.extensions.getContrastColor import org.fossify.commons.extensions.getProperBackgroundColor import org.fossify.commons.extensions.onApplyWindowInsets import org.fossify.commons.extensions.setSystemBarsAppearance +import org.fossify.commons.extensions.updateMarginWithBase import org.fossify.commons.extensions.updatePaddingWithBase import org.fossify.commons.views.MyAppBarLayout @@ -47,6 +48,7 @@ abstract class EdgeToEdgeActivity : AppCompatActivity() { padTopSystem: List = emptyList(), padBottomSystem: List = emptyList(), padBottomImeAndSystem: List = emptyList(), + moveBottomSystem: List = emptyList() ) { onApplyWindowInsets { insets -> val system = insets.getInsetsIgnoringVisibility(Type.systemBars()) @@ -55,6 +57,7 @@ abstract class EdgeToEdgeActivity : AppCompatActivity() { padTopSystem.forEach { it.updatePaddingWithBase(top = system.top) } padBottomSystem.forEach { it.updatePaddingWithBase(bottom = system.bottom) } padBottomImeAndSystem.forEach { it.updatePaddingWithBase(bottom = imeAndSystem.bottom) } + moveBottomSystem.forEach { it.updateMarginWithBase(bottom = system.bottom) } if (padCutout) { val cutout = insets.getInsets(Type.displayCutout()) diff --git a/commons/src/main/kotlin/org/fossify/commons/extensions/View.kt b/commons/src/main/kotlin/org/fossify/commons/extensions/View.kt index 16464671d..42904ef00 100644 --- a/commons/src/main/kotlin/org/fossify/commons/extensions/View.kt +++ b/commons/src/main/kotlin/org/fossify/commons/extensions/View.kt @@ -3,8 +3,14 @@ package org.fossify.commons.extensions import android.content.Context import android.view.HapticFeedbackConstants import android.view.View +import android.view.ViewGroup import android.view.ViewTreeObserver import androidx.annotation.Px +import androidx.core.view.marginBottom +import androidx.core.view.marginLeft +import androidx.core.view.marginRight +import androidx.core.view.marginTop +import androidx.core.view.updateLayoutParams import androidx.core.view.updatePadding import androidx.core.view.updatePaddingRelative import org.fossify.commons.R @@ -100,6 +106,33 @@ fun View.updatePaddingWithBase( left = base[0] + left, top = base[1] + top, right = base[2] + right, - bottom = base[3] + bottom + bottom = base.last() + bottom ) } + +fun View.ensureBaseMargin(): IntArray { + val key = R.id.tag_base_margin + val base = getTag(key) as? IntArray + if (base != null) return base + val arr = intArrayOf(marginLeft, marginTop, marginRight, marginBottom) + setTag(key, arr) + return arr +} + +fun View.updateMarginWithBase( + @Px left: Int = 0, + @Px top: Int = 0, + @Px right: Int = 0, + @Px bottom: Int = 0, +) { + val base = ensureBaseMargin() + try { + updateLayoutParams { + leftMargin = base[0] + left + topMargin = base[1] + top + rightMargin = base[2] + right + bottomMargin = base.last() + bottom + } + } catch (ignored: ClassCastException) { + } +} diff --git a/commons/src/main/kotlin/org/fossify/commons/views/MyFloatingActionButton.kt b/commons/src/main/kotlin/org/fossify/commons/views/MyFloatingActionButton.kt index 9a7a2d475..20e84fd68 100644 --- a/commons/src/main/kotlin/org/fossify/commons/views/MyFloatingActionButton.kt +++ b/commons/src/main/kotlin/org/fossify/commons/views/MyFloatingActionButton.kt @@ -6,25 +6,43 @@ import android.util.AttributeSet import androidx.core.view.ViewCompat import androidx.core.view.WindowInsetsCompat import com.google.android.material.floatingactionbutton.FloatingActionButton +import org.fossify.commons.R import org.fossify.commons.extensions.applyColorFilter import org.fossify.commons.extensions.getContrastColor +import org.fossify.commons.extensions.updateMarginWithBase open class MyFloatingActionButton : FloatingActionButton { + private var applyWindowInsets = false + constructor(context: Context) : super(context) - constructor(context: Context, attrs: AttributeSet) : super(context, attrs) + constructor(context: Context, attrs: AttributeSet) : super(context, attrs) { + init(context, attrs) + } constructor(context: Context, attrs: AttributeSet, defStyle: Int) : super( context, attrs, defStyle - ) + ) { + init(context, attrs) + } + + private fun init(context: Context, attrs: AttributeSet) { + context.theme.obtainStyledAttributes(attrs, R.styleable.MyFloatingActionButton, 0, 0).apply { + try { + applyWindowInsets = getBoolean(R.styleable.MyFloatingActionButton_applyWindowInsets, false) + } finally { + recycle() + } + } - init { - ViewCompat.setOnApplyWindowInsetsListener(this) { _, insets -> - val system = insets.getInsetsIgnoringVisibility(WindowInsetsCompat.Type.systemBars()) - translationY = -system.bottom.toFloat() - insets + if (applyWindowInsets) { + ViewCompat.setOnApplyWindowInsetsListener(this) { _, insets -> + val system = insets.getInsetsIgnoringVisibility(WindowInsetsCompat.Type.systemBars()) + updateMarginWithBase(bottom = system.bottom) + insets + } } } diff --git a/commons/src/main/res/values/attrs.xml b/commons/src/main/res/values/attrs.xml index f1b2becf8..187fd3a56 100644 --- a/commons/src/main/res/values/attrs.xml +++ b/commons/src/main/res/values/attrs.xml @@ -7,4 +7,8 @@ + + + + diff --git a/commons/src/main/res/values/ids.xml b/commons/src/main/res/values/ids.xml index 3fdb40bfa..46572132a 100644 --- a/commons/src/main/res/values/ids.xml +++ b/commons/src/main/res/values/ids.xml @@ -8,4 +8,5 @@ +