From 61e2ace5c80ffe2aecc2d3fcca97a406fd4307e0 Mon Sep 17 00:00:00 2001 From: FooIbar <118464521+FooIbar@users.noreply.github.com> Date: Wed, 1 Nov 2023 22:55:05 +0800 Subject: [PATCH] Fix insets on API < 29 --- .../com/hippo/ehviewer/util/WindowInsetsUtil.kt | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/app/src/main/kotlin/com/hippo/ehviewer/util/WindowInsetsUtil.kt b/app/src/main/kotlin/com/hippo/ehviewer/util/WindowInsetsUtil.kt index a6323d291..8f16e08d0 100644 --- a/app/src/main/kotlin/com/hippo/ehviewer/util/WindowInsetsUtil.kt +++ b/app/src/main/kotlin/com/hippo/ehviewer/util/WindowInsetsUtil.kt @@ -1,5 +1,6 @@ package com.hippo.ehviewer.util +import android.graphics.Rect import android.view.View import androidx.compose.foundation.layout.WindowInsets import androidx.compose.runtime.Composable @@ -13,7 +14,21 @@ import kotlin.contracts.contract inline fun buildWindowInsets(builderAction: WindowInsetsCompat.Builder.() -> Unit): WindowInsetsCompat { contract { callsInPlace(builderAction, InvocationKind.EXACTLY_ONCE) } - val builder = WindowInsetsCompat.Builder() + val builder = if (isAtLeastQ) { + WindowInsetsCompat.Builder() + } else { + // TODO: Report to google issue tracker + // On API 20-28, WindowInsetsCompat.Builder() will copy the WindowInsets.CONSUMED static field, + // which isConsumed() returns true, resulting in the insets not being dispatched + runCatching { + val constructor = android.view.WindowInsets::class.java.getConstructor(Rect::class.java) + val platformInsets = constructor.newInstance(Rect()) + WindowInsetsCompat.Builder(WindowInsetsCompat.toWindowInsetsCompat(platformInsets)) + }.getOrElse { + it.printStackTrace() + WindowInsetsCompat.Builder() + } + } builder.builderAction() return builder.build() }