From da4a76eff141cd80e47ed44b1e78d528b60a9015 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 13 Feb 2023 18:13:13 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../com/tangem/tap/common/extensions/UI.kt | 9 +-- .../compose/HangingOverKeyboardView.kt | 14 ++--- .../tokens/ui/compose/CurrenciesScreen.kt | 15 +---- .../com/tangem/core/ui/components/Keyboard.kt | 61 ++++++++----------- 4 files changed, 36 insertions(+), 63 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/extensions/UI.kt b/app/src/main/java/com/tangem/tap/common/extensions/UI.kt index 28bfaad264..57aaf407ec 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/UI.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/UI.kt @@ -9,7 +9,6 @@ import android.content.Context import android.content.ContextWrapper import android.content.Intent import android.graphics.drawable.Drawable -import android.util.DisplayMetrics import android.util.TypedValue import android.view.View import android.view.ViewGroup @@ -91,12 +90,6 @@ fun Context.dpToPixels(dp: Int): Int = this.resources.displayMetrics, ).toInt() -fun Context.pixelsToDp(pixels: Int): Int { - return (pixels.toFloat() / - (resources.displayMetrics.densityDpi.toFloat() / DisplayMetrics.DENSITY_DEFAULT)) - .toInt() -} - tailrec fun Context?.getActivity(): Activity? = this as? Activity ?: (this as? ContextWrapper)?.baseContext?.getActivity() @@ -118,7 +111,7 @@ fun MaterialCardView.setMargins( fun View.hideKeyboard() { val inputMethodManager = - context.getSystemService(android.content.Context.INPUT_METHOD_SERVICE) as? InputMethodManager + context.getSystemService(Context.INPUT_METHOD_SERVICE) as? InputMethodManager inputMethodManager?.hideSoftInputFromWindow(this.windowToken, 0) } diff --git a/app/src/main/java/com/tangem/tap/features/tokens/addCustomToken/compose/HangingOverKeyboardView.kt b/app/src/main/java/com/tangem/tap/features/tokens/addCustomToken/compose/HangingOverKeyboardView.kt index ceae8063fa..269a3177a6 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/addCustomToken/compose/HangingOverKeyboardView.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/addCustomToken/compose/HangingOverKeyboardView.kt @@ -5,12 +5,11 @@ import androidx.compose.foundation.layout.BoxScope import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.runtime.State +import androidx.compose.runtime.remember import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.tangem.core.ui.components.Keyboard -import com.tangem.tangem_sdk_new.extensions.pxToDp /** [REDACTED_AUTHOR] @@ -22,13 +21,10 @@ fun HangingOverKeyboardView( spaceBetweenKeyboard: Dp = 0.dp, content: @Composable (BoxScope.() -> Unit) ) { - val context = LocalContext.current - val padding = when (keyboardState.value) { - Keyboard.Closed -> 0.dp - is Keyboard.Opened -> { - val keyboardHeight = (keyboardState.value as Keyboard.Opened).height - val keyboardPadding = context.pxToDp(keyboardHeight.toFloat()).dp - keyboardPadding + spaceBetweenKeyboard + val padding = remember(keyboardState) { + when (val state = keyboardState.value) { + is Keyboard.Closed -> 0.dp + is Keyboard.Opened -> state.height + spaceBetweenKeyboard } } diff --git a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrenciesScreen.kt b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrenciesScreen.kt index 88cc970852..f236111d4a 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrenciesScreen.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/ui/compose/CurrenciesScreen.kt @@ -22,10 +22,8 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.colorResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.unit.dp import com.tangem.blockchain.common.Blockchain import com.tangem.core.analytics.Analytics import com.tangem.core.ui.components.Keyboard @@ -40,7 +38,6 @@ import com.tangem.tap.common.analytics.events.ManageTokens import com.tangem.tap.common.compose.extensions.addAndNotify import com.tangem.tap.common.compose.extensions.removeAndNotify import com.tangem.tap.common.extensions.dispatchDialogShow -import com.tangem.tap.common.extensions.pixelsToDp import com.tangem.tap.common.redux.AppDialog import com.tangem.tap.domain.tokens.Currency import com.tangem.tap.features.tokens.redux.ContractAddress @@ -65,7 +62,7 @@ fun CurrenciesScreen( val addedTokensState = remember { mutableStateOf(tokensState.value.addedTokens) } val addedBlockchainsState = remember { mutableStateOf(tokensState.value.addedBlockchains) } - val isKeyboardOpen by keyboardAsState() + val keyboardState by keyboardAsState() val onAddCurrencyToggleClick = { currency: Currency, token: TokenWithBlockchain? -> val blockchain = Blockchain.fromNetworkId(currency.id) @@ -94,7 +91,7 @@ fun CurrenciesScreen( Scaffold( floatingActionButton = { if (tokensState.value.allowToAdd) { - SaveChangesButton(isKeyboardOpen) { + SaveChangesButton(keyboardState) { onSaveChanges(addedTokensState.value, addedBlockchainsState.value) } } @@ -224,15 +221,9 @@ private fun AnalyticsParam.CurrencyType.sendOff() { @Composable fun SaveChangesButton(keyboardState: Keyboard, onSaveChanges: () -> Unit) { - val padding = if (keyboardState is Keyboard.Opened) { - LocalContext.current.pixelsToDp(keyboardState.height) - } else { - 0 - } - PrimaryButton( modifier = Modifier - .padding(bottom = padding.dp) + .padding(bottom = keyboardState.height) .padding(horizontal = TangemTheme.dimens.spacing16) .fillMaxWidth(), text = stringResource(id = R.string.common_save_changes), diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/Keyboard.kt b/core/ui/src/main/java/com/tangem/core/ui/components/Keyboard.kt index 072332f939..4baf118b61 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/Keyboard.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/Keyboard.kt @@ -1,54 +1,47 @@ package com.tangem.core.ui.components -import android.graphics.Rect -import android.view.ViewTreeObserver +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.exclude +import androidx.compose.foundation.layout.ime +import androidx.compose.foundation.layout.navigationBars import androidx.compose.runtime.Composable -import androidx.compose.runtime.DisposableEffect -import androidx.compose.runtime.MutableState import androidx.compose.runtime.State -import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.remember -import androidx.compose.ui.platform.LocalView +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.unit.Dp +import androidx.compose.ui.unit.dp -sealed class Keyboard { - data class Opened(val height: Int) : Keyboard() - object Closed : Keyboard() +sealed interface Keyboard { + val height: Dp + + data class Opened(override val height: Dp) : Keyboard + + object Closed : Keyboard { + override val height: Dp = 0.dp + } } /** * Allows to subscribe to a soft keyboard to detect when it's open/closed */ -@Suppress("MagicNumber") +@Deprecated("Use Modifier.imePadding() on pure Compose screens (without XML layouts)") @Composable fun keyboardAsState(): State { - val keyboardState: MutableState = remember { mutableStateOf(Keyboard.Closed) } - val view = LocalView.current - val discrepancy = remember { - mutableStateOf(0) - } - DisposableEffect(view) { - val onGlobalListener = ViewTreeObserver.OnGlobalLayoutListener { - val rect = Rect() - view.getWindowVisibleDisplayFrame(rect) - val screenHeight = view.rootView.height - val keypadHeight: Int = screenHeight - (rect.bottom + rect.top) - discrepancy.value - if (discrepancy.value == 0) { - discrepancy.value = keypadHeight - if (keypadHeight == 0) discrepancy.value = 1 - } + val density = LocalDensity.current + val imeInsets = WindowInsets.ime + .exclude(WindowInsets.navigationBars) + .getBottom(density) - keyboardState.value = if (keypadHeight > screenHeight * 0.15) { - Keyboard.Opened(keypadHeight) + return remember(imeInsets) { + derivedStateOf { + if (imeInsets > 0) { + Keyboard.Opened( + height = with(density) { imeInsets.toDp() }, + ) } else { Keyboard.Closed } } - view.viewTreeObserver.addOnGlobalLayoutListener(onGlobalListener) - - onDispose { - view.viewTreeObserver.removeOnGlobalLayoutListener(onGlobalListener) - } } - - return keyboardState } \ No newline at end of file