diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index b7a7f549c4..3312184dff 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -198,6 +198,8 @@ dependencies {
implementation(projects.features.biometry.impl)
implementation(projects.features.nft.api)
implementation(projects.features.nft.impl)
+ implementation(projects.features.walletconnect.api)
+ implementation(projects.features.walletconnect.impl)
/** AndroidX libraries */
implementation(deps.androidx.core.ktx)
diff --git a/app/src/main/java/com/tangem/tap/domain/walletconnect2/toggles/WalletConnectFeatureToggles.kt b/app/src/main/java/com/tangem/tap/domain/walletconnect2/toggles/WalletConnectFeatureToggles.kt
index a6da04800a..e0f2e4a722 100644
--- a/app/src/main/java/com/tangem/tap/domain/walletconnect2/toggles/WalletConnectFeatureToggles.kt
+++ b/app/src/main/java/com/tangem/tap/domain/walletconnect2/toggles/WalletConnectFeatureToggles.kt
@@ -8,4 +8,7 @@ internal class WalletConnectFeatureToggles(
val isSolanaTxSignEnabled: Boolean
get() = featureTogglesManager.isFeatureEnabled(name = "WC_SOLANA_TX_SIGN_ENABLED")
+
+ val isRedesignedWalletConnectEnabled: Boolean
+ get() = featureTogglesManager.isFeatureEnabled("WALLET_CONNECT_REDESIGN_ENABLED")
}
\ No newline at end of file
diff --git a/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt b/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt
index 2d9bd2853d..d4cd6dd17c 100644
--- a/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt
+++ b/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt
@@ -22,6 +22,7 @@ import com.tangem.features.swap.SwapComponent
import com.tangem.features.tester.api.TesterRouter
import com.tangem.features.tokendetails.TokenDetailsComponent
import com.tangem.features.wallet.WalletEntryComponent
+import com.tangem.tap.domain.walletconnect2.toggles.WalletConnectFeatureToggles
import com.tangem.tap.features.details.ui.appcurrency.api.AppCurrencySelectorComponent
import com.tangem.tap.features.details.ui.appsettings.api.AppSettingsComponent
import com.tangem.tap.features.details.ui.cardsettings.api.CardSettingsComponent
@@ -43,6 +44,7 @@ import com.tangem.utils.Provider
import dagger.hilt.android.scopes.ActivityScoped
import java.util.WeakHashMap
import javax.inject.Inject
+import com.tangem.features.walletconnect.components.WalletConnectEntryComponent as RedisegnedWalletConnectComponent
@ActivityScoped
@Suppress("LongParameterList", "LargeClass")
@@ -78,8 +80,10 @@ internal class ChildFactory @Inject constructor(
private val walletComponentFactory: WalletEntryComponent.Factory,
private val sendComponentFactoryV2: com.tangem.features.send.v2.api.SendComponent.Factory,
private val sendFeatureToggles: SendFeatureToggles,
+ private val redesignedWalletConnectComponentFactory: RedisegnedWalletConnectComponent.Factory,
private val testerRouter: TesterRouter,
private val routingFeatureToggles: RoutingFeatureToggles,
+ private val walletConnectFeatureToggles: WalletConnectFeatureToggles,
) {
fun createChild(route: AppRoute, contextFactory: (route: AppRoute) -> AppComponentContext): Child {
@@ -296,11 +300,19 @@ internal class ChildFactory @Inject constructor(
)
}
is AppRoute.WalletConnectSessions -> {
- createComponentChild(
- contextProvider = contextProvider(route, contextFactory),
- params = Unit,
- componentFactory = walletConnectComponentFactory,
- )
+ if (walletConnectFeatureToggles.isRedesignedWalletConnectEnabled) {
+ createComponentChild(
+ contextProvider = contextProvider(route, contextFactory),
+ params = Unit,
+ componentFactory = redesignedWalletConnectComponentFactory,
+ )
+ } else {
+ createComponentChild(
+ contextProvider = contextProvider(route, contextFactory),
+ params = Unit,
+ componentFactory = walletConnectComponentFactory,
+ )
+ }
}
is AppRoute.QrScanning -> {
val source = when (route.source) {
@@ -574,11 +586,19 @@ internal class ChildFactory @Inject constructor(
)
}
is AppRoute.WalletConnectSessions -> {
- route.asComponentChild(
- contextProvider = contextProvider(route, contextFactory),
- params = Unit,
- componentFactory = walletConnectComponentFactory,
- )
+ if (walletConnectFeatureToggles.isRedesignedWalletConnectEnabled) {
+ route.asComponentChild(
+ contextProvider = contextProvider(route, contextFactory),
+ params = Unit,
+ componentFactory = redesignedWalletConnectComponentFactory,
+ )
+ } else {
+ route.asComponentChild(
+ contextProvider = contextProvider(route, contextFactory),
+ params = Unit,
+ componentFactory = walletConnectComponentFactory,
+ )
+ }
}
is AppRoute.CurrencyDetails -> {
route.asComponentChild(
diff --git a/core/config-toggles/src/main/assets/configs/feature_toggles_config.json b/core/config-toggles/src/main/assets/configs/feature_toggles_config.json
index 6a2792b3a9..df8f975239 100644
--- a/core/config-toggles/src/main/assets/configs/feature_toggles_config.json
+++ b/core/config-toggles/src/main/assets/configs/feature_toggles_config.json
@@ -78,5 +78,9 @@
{
"name": "SEND_V2_ENABLED",
"version": "undefined"
+ },
+ {
+ "name": "WALLET_CONNECT_REDESIGN_ENABLED",
+ "version": "undefined"
}
]
diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml
index 6761a8065b..d9ab14d913 100644
--- a/core/res/src/main/res/values/strings.xml
+++ b/core/res/src/main/res/values/strings.xml
@@ -126,6 +126,7 @@
Delete
Disabled
+ Disconnect
Done
Enable
Enabled
@@ -1213,6 +1214,13 @@
This is a Testnet card. It cannot process transactions and should only be used for testing and development purposes.
For testing purposes only
Balance may be outdated. Refresh the page.
+ Connections
+ Disconnect all
+ Text about discnected all dApps
+ Disconect All dApps
+ New connection
+ Connect your wallet to a different dApps
+ No sessions
Discard
You have an interrupted backup. Do you want to resume?
Yes, resume
diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/dropdownmenu/TangemDropdownItem.kt b/core/ui/src/main/java/com/tangem/core/ui/components/dropdownmenu/TangemDropdownItem.kt
new file mode 100644
index 0000000000..b29403e17d
--- /dev/null
+++ b/core/ui/src/main/java/com/tangem/core/ui/components/dropdownmenu/TangemDropdownItem.kt
@@ -0,0 +1,47 @@
+package com.tangem.core.ui.components.dropdownmenu
+
+import android.content.res.Configuration
+import androidx.compose.foundation.background
+import androidx.compose.foundation.clickable
+import androidx.compose.foundation.layout.padding
+import androidx.compose.material3.Text
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.Modifier
+import androidx.compose.ui.tooling.preview.Preview
+import com.tangem.core.ui.R
+import com.tangem.core.ui.extensions.TextReference
+import com.tangem.core.ui.extensions.resolveReference
+import com.tangem.core.ui.res.TangemTheme
+import com.tangem.core.ui.res.TangemThemePreview
+
+@Suppress("ComposableEventParameterNaming")
+@Composable
+fun TangemDropdownItem(item: TangemDropdownMenuItem, dismissParent: () -> Unit, modifier: Modifier = Modifier) {
+ Text(
+ modifier = modifier
+ .clickable {
+ dismissParent()
+ item.onClick()
+ }
+ .padding(vertical = TangemTheme.dimens.spacing8, horizontal = TangemTheme.dimens.spacing16),
+ text = item.title.resolveReference(),
+ style = TangemTheme.typography.button.copy(color = item.textColorProvider()),
+ )
+}
+
+@Preview
+@Preview(uiMode = Configuration.UI_MODE_NIGHT_YES)
+@Composable
+private fun Preview_TokenDetailsAppBarDropdownItem() {
+ TangemThemePreview {
+ TangemDropdownItem(
+ modifier = Modifier.background(TangemTheme.colors.background.primary),
+ dismissParent = {},
+ item = TangemDropdownMenuItem(
+ title = TextReference.Res(id = R.string.token_details_hide_token),
+ textColorProvider = { TangemTheme.colors.text.warning },
+ onClick = { },
+ ),
+ )
+ }
+}
\ No newline at end of file
diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/ui/components/DropdownMenu.kt b/core/ui/src/main/java/com/tangem/core/ui/components/dropdownmenu/TangemDropdownMenu.kt
similarity index 90%
rename from features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/ui/components/DropdownMenu.kt
rename to core/ui/src/main/java/com/tangem/core/ui/components/dropdownmenu/TangemDropdownMenu.kt
index fa6ff8aca3..6974bc2d7a 100644
--- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/ui/components/DropdownMenu.kt
+++ b/core/ui/src/main/java/com/tangem/core/ui/components/dropdownmenu/TangemDropdownMenu.kt
@@ -1,11 +1,17 @@
@file:Suppress("TopLevelPropertyNaming")
-package com.tangem.feature.tokendetails.presentation.tokendetails.ui.components
+
+package com.tangem.core.ui.components.dropdownmenu
import androidx.compose.animation.core.*
-import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.layout.Column
+import androidx.compose.foundation.layout.ColumnScope
+import androidx.compose.foundation.layout.IntrinsicSize
+import androidx.compose.foundation.layout.width
import androidx.compose.foundation.rememberScrollState
import androidx.compose.foundation.verticalScroll
-import androidx.compose.material3.*
+import androidx.compose.material3.Card
+import androidx.compose.material3.CardDefaults
+import androidx.compose.material3.DropdownMenu
import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.TransformOrigin
@@ -15,16 +21,19 @@ import androidx.compose.ui.unit.*
import androidx.compose.ui.window.Popup
import androidx.compose.ui.window.PopupPositionProvider
import androidx.compose.ui.window.PopupProperties
+import com.tangem.core.ui.res.TangemTheme
+import kotlin.math.max
+import kotlin.math.min
/**
* Just copy paste [DropdownMenu] from material3 with deleting vertical paddings.
*/
@Composable
-internal fun TangemDropdownMenu(
+fun TangemDropdownMenu(
expanded: Boolean,
onDismissRequest: () -> Unit,
modifier: Modifier = Modifier,
- offset: DpOffset = DpOffset(0.dp, 0.dp),
+ offset: DpOffset = DpOffset(x = TangemTheme.dimens.spacing20, y = TangemTheme.dimens.spacing10.times(-1)),
properties: PopupProperties = PopupProperties(focusable = true),
content: @Composable ColumnScope.() -> Unit,
) {
@@ -142,10 +151,7 @@ private fun calculateTransformOrigin(parentBounds: IntRect, menuBounds: IntRect)
menuBounds.width == 0 -> 0f
else -> {
val intersectionCenter =
- (
- kotlin.math.max(parentBounds.left, menuBounds.left) +
- kotlin.math.min(parentBounds.right, menuBounds.right)
- ) / 2
+ (max(parentBounds.left, menuBounds.left) + min(parentBounds.right, menuBounds.right)) / 2
(intersectionCenter - menuBounds.left).toFloat() / menuBounds.width
}
}
@@ -155,10 +161,7 @@ private fun calculateTransformOrigin(parentBounds: IntRect, menuBounds: IntRect)
menuBounds.height == 0 -> 0f
else -> {
val intersectionCenter =
- (
- kotlin.math.max(parentBounds.top, menuBounds.top) +
- kotlin.math.min(parentBounds.bottom, menuBounds.bottom)
- ) / 2
+ (max(parentBounds.top, menuBounds.top) + min(parentBounds.bottom, menuBounds.bottom)) / 2
(intersectionCenter - menuBounds.top).toFloat() / menuBounds.height
}
}
diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/dropdownmenu/TangemDropdownMenuItem.kt b/core/ui/src/main/java/com/tangem/core/ui/components/dropdownmenu/TangemDropdownMenuItem.kt
new file mode 100644
index 0000000000..7d239636dd
--- /dev/null
+++ b/core/ui/src/main/java/com/tangem/core/ui/components/dropdownmenu/TangemDropdownMenuItem.kt
@@ -0,0 +1,11 @@
+package com.tangem.core.ui.components.dropdownmenu
+
+import androidx.compose.runtime.Composable
+import androidx.compose.ui.graphics.Color
+import com.tangem.core.ui.extensions.TextReference
+
+data class TangemDropdownMenuItem(
+ val title: TextReference,
+ val textColorProvider: @Composable () -> Color,
+ val onClick: () -> Unit,
+)
\ No newline at end of file
diff --git a/core/ui/src/main/res/drawable/img_wallet_connect_76.xml b/core/ui/src/main/res/drawable/img_wallet_connect_76.xml
new file mode 100644
index 0000000000..a24b3060f6
--- /dev/null
+++ b/core/ui/src/main/res/drawable/img_wallet_connect_76.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/TokenDetailsPreviewData.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/TokenDetailsPreviewData.kt
index 01d0aec7ba..7ce2014bc1 100644
--- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/TokenDetailsPreviewData.kt
+++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/TokenDetailsPreviewData.kt
@@ -3,6 +3,7 @@ package com.tangem.feature.tokendetails.presentation.tokendetails
import androidx.compose.ui.graphics.Color
import androidx.paging.PagingData
import com.tangem.core.ui.components.containers.pullToRefresh.PullToRefreshConfig
+import com.tangem.core.ui.components.dropdownmenu.TangemDropdownMenuItem
import com.tangem.core.ui.components.marketprice.MarketPriceBlockState
import com.tangem.core.ui.components.marketprice.PriceChangeState
import com.tangem.core.ui.components.marketprice.PriceChangeType
@@ -27,7 +28,7 @@ internal object TokenDetailsPreviewData {
onBackClick = {},
tokenDetailsAppBarMenuConfig = TokenDetailsAppBarMenuConfig(
persistentListOf(
- TokenDetailsAppBarMenuConfig.MenuItem(
+ TangemDropdownMenuItem(
title = TextReference.Res(id = R.string.token_details_hide_token),
textColorProvider = { TangemTheme.colors.text.warning },
onClick = { },
diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/TokenDetailsAppBarMenuConfig.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/TokenDetailsAppBarMenuConfig.kt
index 4926ba0b4a..c5299ec1d5 100644
--- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/TokenDetailsAppBarMenuConfig.kt
+++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/TokenDetailsAppBarMenuConfig.kt
@@ -1,14 +1,6 @@
package com.tangem.feature.tokendetails.presentation.tokendetails.state
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.graphics.Color
-import com.tangem.core.ui.extensions.TextReference
+import com.tangem.core.ui.components.dropdownmenu.TangemDropdownMenuItem
import kotlinx.collections.immutable.ImmutableList
-internal data class TokenDetailsAppBarMenuConfig(val items: ImmutableList