From 9a5bfa4b261bb0d0f322145ec42bd852afe3a0f2 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 18 Dec 2024 14:57:19 +0400 Subject: [PATCH] Updated on 2026-08-14 --- .../clipboard/DefaultClipboardManager.kt | 19 +++++++++++++++++++ .../common/clipboard/MockClipboardManager.kt | 2 ++ .../com/tangem/tap/common/extensions/UI.kt | 18 ------------------ .../walletconnect/WalletConnectMiddleware.kt | 1 - .../ui/walletconnect/WalletConnectScreen.kt | 10 +++------- .../walletconnect/WalletConnectScreenState.kt | 2 +- .../walletconnect/WalletConnectViewModel.kt | 8 +++++++- .../core/ui/clipboard/ClipboardManager.kt | 7 +++++++ .../state/factory/TokenDetailsStateFactory.kt | 4 ++-- .../viewmodels/TokenDetailsViewModel.kt | 2 +- 10 files changed, 42 insertions(+), 31 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/clipboard/DefaultClipboardManager.kt b/app/src/main/java/com/tangem/tap/common/clipboard/DefaultClipboardManager.kt index 3d2ac51e00..73f2ebd5ef 100644 --- a/app/src/main/java/com/tangem/tap/common/clipboard/DefaultClipboardManager.kt +++ b/app/src/main/java/com/tangem/tap/common/clipboard/DefaultClipboardManager.kt @@ -2,9 +2,11 @@ package com.tangem.tap.common.clipboard import android.content.ClipData import android.content.ClipDescription +import android.content.ClipDescription.MIMETYPE_TEXT_PLAIN import android.os.Build import android.os.PersistableBundle import com.tangem.core.ui.clipboard.ClipboardManager +import timber.log.Timber import android.content.ClipboardManager as AndroidClipboardManager internal class DefaultClipboardManager(private val clipboardManager: AndroidClipboardManager) : ClipboardManager { @@ -17,6 +19,23 @@ internal class DefaultClipboardManager(private val clipboardManager: AndroidClip clipboardManager.setPrimaryClip(clip) } + override fun getText(default: String?): String? { + val clip = clipboardManager.primaryClip + + if (clip == null || clip.itemCount == 0) { + Timber.d("Clipboard is empty") + return default + } + + val clipDescription = clipboardManager.primaryClipDescription + if (clipDescription?.hasMimeType(MIMETYPE_TEXT_PLAIN) == false) { + Timber.d("Clipboard doesn't contain text") + return default + } + + return clip.getItemAt(0).text?.toString() + } + private fun ClipDescription.setAsSensitive() { extras = PersistableBundle().apply { putBoolean(getExtraIsSensitiveFlag(), true) diff --git a/app/src/main/java/com/tangem/tap/common/clipboard/MockClipboardManager.kt b/app/src/main/java/com/tangem/tap/common/clipboard/MockClipboardManager.kt index 49b339455c..8013aa18f1 100644 --- a/app/src/main/java/com/tangem/tap/common/clipboard/MockClipboardManager.kt +++ b/app/src/main/java/com/tangem/tap/common/clipboard/MockClipboardManager.kt @@ -8,4 +8,6 @@ internal object MockClipboardManager : ClipboardManager { override fun setText(text: String, isSensitive: Boolean, label: String) { Timber.w("Clipboard Manager not available") } + + override fun getText(default: String?): String? = null } \ No newline at end of file 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 9af9912fa5..355da51669 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 @@ -2,8 +2,6 @@ package com.tangem.tap.common.extensions -import android.content.ClipData -import android.content.ClipboardManager import android.content.Context import android.graphics.drawable.Drawable import android.view.View @@ -53,22 +51,6 @@ fun View.hide(invokeBeforeStateChanged: (() -> Unit)? = null) { this.visibility = View.GONE } -fun Context.copyToClipboard(value: Any, label: String = "") { - val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager ?: return - - val clip: ClipData = ClipData.newPlainText(label, value.toString()) - clipboard.setPrimaryClip(clip) -} - -fun Context.getFromClipboard(default: CharSequence? = null): CharSequence? { - val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as? ClipboardManager - ?: return default - val clipData = clipboard.primaryClip ?: return default - if (clipData.itemCount == 0) return default - - return clipData.getItemAt(0).text -} - fun View.getString(resId: Int, vararg formatArgs: Any?): String { return context.getString(resId, *formatArgs) } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt index fd477038f6..d4d46d362c 100644 --- a/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt +++ b/app/src/main/java/com/tangem/tap/features/details/redux/walletconnect/WalletConnectMiddleware.kt @@ -59,7 +59,6 @@ class WalletConnectMiddleware { is WalletConnectAction.StartWalletConnect -> { val uri = action.copiedUri if (uri != null && isWalletConnectUri(uri)) { - // TODO check store.dispatchOnMain(WalletConnectAction.ShowClipboardOrScanQrDialog(uri)) } else { store.dispatchNavigationAction { push(AppRoute.QrScanning(SourceType.WALLET_CONNECT)) } diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/WalletConnectScreen.kt b/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/WalletConnectScreen.kt index fb8d8a36df..b25fe77799 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/WalletConnectScreen.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/WalletConnectScreen.kt @@ -5,13 +5,12 @@ import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn import androidx.compose.foundation.lazy.items import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.* +import androidx.compose.material3.* import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -19,7 +18,6 @@ import com.tangem.core.analytics.Analytics import com.tangem.core.ui.extensions.stringResourceSafe import com.tangem.core.ui.res.TangemTheme import com.tangem.tap.common.analytics.events.Settings -import com.tangem.tap.common.extensions.getFromClipboard import com.tangem.tap.features.details.ui.common.SettingsScreensScaffold import com.tangem.wallet.R import kotlinx.collections.immutable.persistentListOf @@ -30,8 +28,6 @@ internal fun WalletConnectScreen( onBackClick: () -> Unit, modifier: Modifier = Modifier, ) { - val context = LocalContext.current - SettingsScreensScaffold( modifier = modifier, content = { @@ -46,7 +42,7 @@ internal fun WalletConnectScreen( AddSessionFab( onAddSession = { Analytics.send(Settings.ButtonStartWalletConnectSession()) - state.onAddSession(context.getFromClipboard()?.toString()) + state.onAddSession() }, ) } @@ -60,7 +56,7 @@ internal fun WalletConnectScreen( private fun AddSessionFab(onAddSession: () -> Unit, modifier: Modifier = Modifier) { FloatingActionButton( onClick = onAddSession, - backgroundColor = TangemTheme.colors.button.primary, + containerColor = TangemTheme.colors.button.primary, contentColor = TangemTheme.colors.icon.primary2, shape = RoundedCornerShape(16.dp), modifier = modifier, diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/WalletConnectScreenState.kt b/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/WalletConnectScreenState.kt index a9a526616d..0a3d429cd6 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/WalletConnectScreenState.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/WalletConnectScreenState.kt @@ -6,7 +6,7 @@ internal data class WalletConnectScreenState( val sessions: ImmutableList, val isLoading: Boolean = false, val onRemoveSession: (String) -> Unit = {}, - val onAddSession: (String?) -> Unit = {}, + val onAddSession: () -> Unit = {}, ) data class WcSessionForScreen( diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/WalletConnectViewModel.kt b/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/WalletConnectViewModel.kt index 284583f633..2ee11076ee 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/WalletConnectViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/walletconnect/WalletConnectViewModel.kt @@ -2,6 +2,7 @@ package com.tangem.tap.features.details.ui.walletconnect import androidx.lifecycle.* import arrow.core.getOrElse +import com.tangem.core.ui.clipboard.ClipboardManager import com.tangem.domain.qrscanning.models.SourceType import com.tangem.domain.qrscanning.usecases.ListenToQrScanningUseCase import com.tangem.tap.features.details.redux.walletconnect.WalletConnectAction @@ -17,6 +18,7 @@ import javax.inject.Inject @HiltViewModel internal class WalletConnectViewModel @Inject constructor( private val listenToQrScanningUseCase: ListenToQrScanningUseCase, + private val clipboardManager: ClipboardManager, ) : ViewModel(), DefaultLifecycleObserver { override fun onCreate(owner: LifecycleOwner) { @@ -35,7 +37,11 @@ internal class WalletConnectViewModel @Inject constructor( sessions.toImmutableList(), isLoading = state.loading, onRemoveSession = { sessionUri -> onRemoveSession(sessionUri, sessions) }, - onAddSession = { copiedUri -> store.dispatch(WalletConnectAction.StartWalletConnect(copiedUri)) }, + onAddSession = { + store.dispatch( + WalletConnectAction.StartWalletConnect(copiedUri = clipboardManager.getText()), + ) + }, ) } diff --git a/core/ui/src/main/java/com/tangem/core/ui/clipboard/ClipboardManager.kt b/core/ui/src/main/java/com/tangem/core/ui/clipboard/ClipboardManager.kt index 0ca96e8d67..cfac79d5c4 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/clipboard/ClipboardManager.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/clipboard/ClipboardManager.kt @@ -17,4 +17,11 @@ interface ClipboardManager { * @param label label */ fun setText(text: String, isSensitive: Boolean, label: String = "") + + /** + * Get text (text/plain) from clipboard + * + * @param default default value + */ + fun getText(default: String? = null): String? } \ No newline at end of file diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsStateFactory.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsStateFactory.kt index acf4c8236d..3b8855cb32 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsStateFactory.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsStateFactory.kt @@ -250,7 +250,7 @@ internal class TokenDetailsStateFactory( currency: CryptoCurrency, networkAddress: NetworkAddress, onCopyClick: (String) -> Unit, - sendShareAnalyticsEvent: () -> Unit, + onShareClick: () -> Unit, ): TokenDetailsState { return currentStateProvider().copy( bottomSheetConfig = TangemBottomSheetConfig( @@ -263,7 +263,7 @@ internal class TokenDetailsStateFactory( addresses = networkAddress.availableAddresses.mapToAddressModels(currency).toImmutableList(), showMemoDisclaimer = currency.network.transactionExtrasType != Network.TransactionExtrasType.NONE, onCopyClick = onCopyClick, - onShareClick = sendShareAnalyticsEvent, + onShareClick = onShareClick, ), ), ) diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt index 99c375e49e..4468d59ff8 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/viewmodels/TokenDetailsViewModel.kt @@ -592,7 +592,7 @@ internal class TokenDetailsViewModel @Inject constructor( analyticsEventsHandler.send(TokenReceiveAnalyticsEvent.ButtonCopyAddress(cryptoCurrency.symbol)) clipboardManager.setText(text = it, isSensitive = true) }, - sendShareAnalyticsEvent = { + onShareClick = { analyticsEventsHandler.send(TokenReceiveAnalyticsEvent.ButtonShareAddress(cryptoCurrency.symbol)) }, )