From 36871cc5c9664ba3f06f0557009a2e408bf4471e Mon Sep 17 00:00:00 2001 From: Tangem Date: Sun, 23 Jun 2024 23:36:32 +0400 Subject: [PATCH] Updated on 2026-08-14 --- app/build.gradle.kts | 2 + .../java/com/tangem/tap/DecomposeFragment.kt | 20 +++++-- .../routing/impl/DefaultRoutingComponent.kt | 5 ++ .../tangem/tap/routing/utils/ChildFactory.kt | 4 ++ .../tangem/tap/routing/utils/RouteMappers.kt | 3 +- .../ComposableContentComponent.kt | 2 +- .../ui/decompose/ComposableDialogComponent.kt | 14 +++++ .../details/component/DetailsComponent.kt | 2 +- .../component/UserWalletListComponent.kt | 2 +- .../features/details/ui/DetailsScreen.kt | 2 +- features/wallet-settings/api/.gitignore | 1 + features/wallet-settings/api/build.gradle.kts | 19 +++++++ .../component/RenameWalletComponent.kt | 16 ++++++ .../component/WalletSettingsComponent.kt | 14 +++++ features/wallet-settings/impl/.gitignore | 1 + .../wallet-settings/impl/build.gradle.kts | 52 +++++++++++++++++++ settings.gradle.kts | 3 ++ 17 files changed, 152 insertions(+), 10 deletions(-) rename core/ui/src/main/java/com/tangem/core/ui/{ => decompose}/ComposableContentComponent.kt (88%) create mode 100644 core/ui/src/main/java/com/tangem/core/ui/decompose/ComposableDialogComponent.kt create mode 100644 features/wallet-settings/api/.gitignore create mode 100644 features/wallet-settings/api/build.gradle.kts create mode 100644 features/wallet-settings/api/src/main/kotlin/com/tangem/feature/walletsettings/component/RenameWalletComponent.kt create mode 100644 features/wallet-settings/api/src/main/kotlin/com/tangem/feature/walletsettings/component/WalletSettingsComponent.kt create mode 100644 features/wallet-settings/impl/.gitignore create mode 100644 features/wallet-settings/impl/build.gradle.kts diff --git a/app/build.gradle.kts b/app/build.gradle.kts index fa383da707..c6f66b3c04 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -140,6 +140,8 @@ dependencies { implementation(projects.features.disclaimer.impl) implementation(projects.features.pushNotifications.api) implementation(projects.features.pushNotifications.impl) + implementation(projects.features.walletSettings.api) + implementation(projects.features.walletSettings.impl) /** AndroidX libraries */ implementation(deps.androidx.core.ktx) diff --git a/app/src/main/java/com/tangem/tap/DecomposeFragment.kt b/app/src/main/java/com/tangem/tap/DecomposeFragment.kt index 0a78c5558c..296704a5e1 100644 --- a/app/src/main/java/com/tangem/tap/DecomposeFragment.kt +++ b/app/src/main/java/com/tangem/tap/DecomposeFragment.kt @@ -2,15 +2,17 @@ package com.tangem.tap import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.core.os.bundleOf import androidx.fragment.app.Fragment import com.tangem.core.decompose.context.AppComponentContext import com.tangem.core.decompose.factory.ComponentFactory -import com.tangem.core.ui.ComposableContentComponent import com.tangem.core.ui.UiDependencies +import com.tangem.core.ui.decompose.ComposableContentComponent import com.tangem.core.ui.message.EventMessageEffect import com.tangem.core.ui.screen.ComposeFragment import com.tangem.utils.Provider import dagger.hilt.android.AndroidEntryPoint +import java.util.WeakHashMap import javax.inject.Inject @AndroidEntryPoint @@ -20,7 +22,10 @@ internal class DecomposeFragment : ComposeFragment() { override lateinit var uiDependencies: UiDependencies private val component by lazy(mode = LazyThreadSafetyMode.NONE) { - requireNotNull(componentBuilder?.build()) { + val tag = requireArguments().getString(TAG_KEY) + val builder = componentsBuilders[tag] + + requireNotNull(builder?.build()) { "Component builder is not set, call newInstance() for DecomposeFragment creation first." } } @@ -46,16 +51,21 @@ internal class DecomposeFragment : ComposeFragment() { companion object { - private var componentBuilder: ComponentBuilder<*, *, *>? = null + private const val TAG_KEY = "tag" + + private val componentsBuilders = WeakHashMap>() fun > newInstance( + tag: String, contextProvider: Provider, params: P, componentFactory: F, ): Fragment { - this@Companion.componentBuilder = ComponentBuilder(contextProvider, params, componentFactory) + this@Companion.componentsBuilders[tag] = ComponentBuilder(contextProvider, params, componentFactory) - return DecomposeFragment() + return DecomposeFragment().apply { + this.arguments = bundleOf(TAG_KEY to tag) + } } } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/routing/impl/DefaultRoutingComponent.kt b/app/src/main/java/com/tangem/tap/routing/impl/DefaultRoutingComponent.kt index ece22bfeb5..e766371cb7 100644 --- a/app/src/main/java/com/tangem/tap/routing/impl/DefaultRoutingComponent.kt +++ b/app/src/main/java/com/tangem/tap/routing/impl/DefaultRoutingComponent.kt @@ -5,6 +5,7 @@ import com.arkivanov.decompose.router.stack.ChildStack import com.arkivanov.decompose.router.stack.childStack import com.arkivanov.decompose.value.Value import com.arkivanov.essenty.backhandler.BackCallback +import com.arkivanov.essenty.lifecycle.doOnDestroy import com.tangem.common.routing.AppRoute import com.tangem.core.decompose.context.AppComponentContext import com.tangem.core.decompose.context.childByContext @@ -34,6 +35,10 @@ internal class DefaultRoutingComponent @AssistedInject constructor( init { backHandler.register(backCallback) + + lifecycle.doOnDestroy { + childFactory.doOnDestroy() + } } private fun getInitialRoute(): AppRoute = AppRoute.Initial 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 3a6bcba601..dc76ad9db0 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 @@ -163,6 +163,10 @@ internal class ChildFactory @Inject constructor( } } + fun doOnDestroy() { + componentContexts.clear() + } + private fun contextProvider( appRoute: AppRoute, contextFactory: (route: AppRoute) -> AppComponentContext, diff --git a/app/src/main/java/com/tangem/tap/routing/utils/RouteMappers.kt b/app/src/main/java/com/tangem/tap/routing/utils/RouteMappers.kt index 201f65ecad..bdade79e4e 100644 --- a/app/src/main/java/com/tangem/tap/routing/utils/RouteMappers.kt +++ b/app/src/main/java/com/tangem/tap/routing/utils/RouteMappers.kt @@ -5,7 +5,7 @@ import com.tangem.common.routing.AppRoute import com.tangem.common.routing.bundle.RouteBundleParams import com.tangem.core.decompose.context.AppComponentContext import com.tangem.core.decompose.factory.ComponentFactory -import com.tangem.core.ui.ComposableContentComponent +import com.tangem.core.ui.decompose.ComposableContentComponent import com.tangem.tap.DecomposeFragment import com.tangem.tap.routing.RoutingComponent.Child import com.tangem.utils.Provider @@ -29,6 +29,7 @@ internal fun Unit + + @Composable + @Suppress("TopLevelComposableFunctions") // TODO: Remove this check + fun Dialog() +} \ No newline at end of file diff --git a/features/details/api/src/main/kotlin/com/tangem/features/details/component/DetailsComponent.kt b/features/details/api/src/main/kotlin/com/tangem/features/details/component/DetailsComponent.kt index 8634199b45..f2546ffc26 100644 --- a/features/details/api/src/main/kotlin/com/tangem/features/details/component/DetailsComponent.kt +++ b/features/details/api/src/main/kotlin/com/tangem/features/details/component/DetailsComponent.kt @@ -1,7 +1,7 @@ package com.tangem.features.details.component import com.tangem.core.decompose.factory.ComponentFactory -import com.tangem.core.ui.ComposableContentComponent +import com.tangem.core.ui.decompose.ComposableContentComponent import com.tangem.domain.wallets.models.UserWalletId interface DetailsComponent : ComposableContentComponent { diff --git a/features/details/api/src/main/kotlin/com/tangem/features/details/component/UserWalletListComponent.kt b/features/details/api/src/main/kotlin/com/tangem/features/details/component/UserWalletListComponent.kt index 37791d71d0..7908aa5ede 100644 --- a/features/details/api/src/main/kotlin/com/tangem/features/details/component/UserWalletListComponent.kt +++ b/features/details/api/src/main/kotlin/com/tangem/features/details/component/UserWalletListComponent.kt @@ -1,7 +1,7 @@ package com.tangem.features.details.component import com.tangem.core.decompose.context.AppComponentContext -import com.tangem.core.ui.ComposableContentComponent +import com.tangem.core.ui.decompose.ComposableContentComponent interface UserWalletListComponent : ComposableContentComponent { diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/ui/DetailsScreen.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/ui/DetailsScreen.kt index 7146703e70..c1db3e35bd 100644 --- a/features/details/impl/src/main/kotlin/com/tangem/features/details/ui/DetailsScreen.kt +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/ui/DetailsScreen.kt @@ -16,10 +16,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.input.nestedscroll.nestedScroll import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview -import com.tangem.core.ui.ComposableContentComponent import com.tangem.core.ui.components.appbar.models.TopAppBarMedium import com.tangem.core.ui.components.block.BlockItem import com.tangem.core.ui.components.snackbar.TangemSnackbarHost +import com.tangem.core.ui.decompose.ComposableContentComponent import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.res.LocalSnackbarHostState import com.tangem.core.ui.res.TangemTheme diff --git a/features/wallet-settings/api/.gitignore b/features/wallet-settings/api/.gitignore new file mode 100644 index 0000000000..796b96d1c4 --- /dev/null +++ b/features/wallet-settings/api/.gitignore @@ -0,0 +1 @@ +/build diff --git a/features/wallet-settings/api/build.gradle.kts b/features/wallet-settings/api/build.gradle.kts new file mode 100644 index 0000000000..7c48ae5a59 --- /dev/null +++ b/features/wallet-settings/api/build.gradle.kts @@ -0,0 +1,19 @@ +plugins { + alias(deps.plugins.android.library) + alias(deps.plugins.kotlin.android) + id("configuration") +} + +android { + namespace = "com.tangem.feature.walletsettings.api" +} + +dependencies { + + /* Project - Domain */ + implementation(projects.domain.wallets.models) + + /* Project - Core */ + implementation(projects.core.decompose) + implementation(projects.core.ui) +} \ No newline at end of file diff --git a/features/wallet-settings/api/src/main/kotlin/com/tangem/feature/walletsettings/component/RenameWalletComponent.kt b/features/wallet-settings/api/src/main/kotlin/com/tangem/feature/walletsettings/component/RenameWalletComponent.kt new file mode 100644 index 0000000000..4d3b21b9f1 --- /dev/null +++ b/features/wallet-settings/api/src/main/kotlin/com/tangem/feature/walletsettings/component/RenameWalletComponent.kt @@ -0,0 +1,16 @@ +package com.tangem.feature.walletsettings.component + +import com.tangem.core.decompose.factory.ComponentFactory +import com.tangem.core.ui.decompose.ComposableDialogComponent +import com.tangem.domain.wallets.models.UserWalletId + +interface RenameWalletComponent : ComposableDialogComponent { + + data class Params( + val userWalletId: UserWalletId, + val currentName: String, + val onDismiss: () -> Unit, + ) + + interface Factory : ComponentFactory +} \ No newline at end of file diff --git a/features/wallet-settings/api/src/main/kotlin/com/tangem/feature/walletsettings/component/WalletSettingsComponent.kt b/features/wallet-settings/api/src/main/kotlin/com/tangem/feature/walletsettings/component/WalletSettingsComponent.kt new file mode 100644 index 0000000000..2c8cdd889a --- /dev/null +++ b/features/wallet-settings/api/src/main/kotlin/com/tangem/feature/walletsettings/component/WalletSettingsComponent.kt @@ -0,0 +1,14 @@ +package com.tangem.feature.walletsettings.component + +import com.tangem.core.decompose.factory.ComponentFactory +import com.tangem.core.ui.decompose.ComposableContentComponent +import com.tangem.domain.wallets.models.UserWalletId + +interface WalletSettingsComponent : ComposableContentComponent { + + data class Params( + val userWalletId: UserWalletId, + ) + + interface Factory : ComponentFactory +} \ No newline at end of file diff --git a/features/wallet-settings/impl/.gitignore b/features/wallet-settings/impl/.gitignore new file mode 100644 index 0000000000..796b96d1c4 --- /dev/null +++ b/features/wallet-settings/impl/.gitignore @@ -0,0 +1 @@ +/build diff --git a/features/wallet-settings/impl/build.gradle.kts b/features/wallet-settings/impl/build.gradle.kts new file mode 100644 index 0000000000..a94b469537 --- /dev/null +++ b/features/wallet-settings/impl/build.gradle.kts @@ -0,0 +1,52 @@ +plugins { + alias(deps.plugins.android.library) + alias(deps.plugins.kotlin.android) + alias(deps.plugins.kotlin.kapt) + alias(deps.plugins.kotlin.serialization) + alias(deps.plugins.hilt.android) + id("configuration") +} + +android { + namespace = "com.tangem.feature.walletsettings.impl" +} + +dependencies { + + /* Project - API */ + implementation(projects.features.walletSettings.api) + + /* Project - Core */ + implementation(projects.core.decompose) + implementation(projects.core.ui) + implementation(projects.core.featuretoggles) + implementation(projects.core.navigation) + implementation(projects.core.analytics.models) + implementation(projects.common.routing) + + /* Project - Domain */ + implementation(projects.domain.wallets) + implementation(projects.domain.wallets.models) + + /* AndroidX */ + implementation(deps.androidx.fragment.ktx) + implementation(deps.androidx.activity.compose) + implementation(deps.lifecycle.compose) + + /* Compose */ + implementation(deps.compose.ui) + implementation(deps.compose.ui.tooling) + implementation(deps.compose.accompanist.systemUiController) + implementation(deps.compose.foundation) + implementation(deps.compose.material3) + implementation(deps.compose.shimmer) + implementation(deps.decompose.ext.compose) + + /* DI */ + implementation(deps.hilt.android) + kapt(deps.hilt.kapt) + + /* Other */ + implementation(deps.kotlin.immutable.collections) + implementation(deps.timber) +} \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index acbedb8b55..14ba5ff49e 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -183,6 +183,9 @@ include(":features:disclaimer:impl") include(":features:push-notifications:api") include(":features:push-notifications:impl") + +include(":features:wallet-settings:api") +include(":features:wallet-settings:impl") // endregion Feature modules // region Domain modules