Updated on 2026-08-14

This commit is contained in:
Tangem 2023-02-14 14:22:27 +03:00
commit b82373423a
4 changed files with 36 additions and 63 deletions

View file

@ -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)
}

View file

@ -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
}
}

View file

@ -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),

View file

@ -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<Keyboard> {
val keyboardState: MutableState<Keyboard> = 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
}