diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f09883d42e..0680d8b5e1 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -138,9 +138,12 @@ - + + String) { val opener = openers.getOrPut(config) { when (config) { - is SprinklrConfig -> SprinklrChatOpener(getSprinklrUserId(), config, store) + is SprinklrConfig -> SprinklrChatOpener(getSprinklrUserId(), config, store, foregroundActivityObserver) is ZendeskConfig -> ZendeskChatOpener(getZendeskUserId(), config, foregroundActivityObserver) } } diff --git a/app/src/main/java/com/tangem/tap/common/chat/opener/implementation/SprinklrChatOpener.kt b/app/src/main/java/com/tangem/tap/common/chat/opener/implementation/SprinklrChatOpener.kt index e7be1411f6..d5923097f4 100644 --- a/app/src/main/java/com/tangem/tap/common/chat/opener/implementation/SprinklrChatOpener.kt +++ b/app/src/main/java/com/tangem/tap/common/chat/opener/implementation/SprinklrChatOpener.kt @@ -1,22 +1,27 @@ package com.tangem.tap.common.chat.opener.implementation import android.content.Context +import android.content.Intent +import com.tangem.tap.ForegroundActivityObserver import com.tangem.tap.common.chat.SprinklrConfig import com.tangem.tap.common.chat.opener.ChatOpener -import com.tangem.tap.common.extensions.dispatchOnMain import com.tangem.tap.common.redux.AppState -import com.tangem.tap.common.redux.navigation.AppScreen -import com.tangem.tap.common.redux.navigation.NavigationAction import com.tangem.tap.features.sprinklr.redux.SprinklrAction +import com.tangem.tap.features.sprinklr.ui.SprinklrActivity +import com.tangem.tap.withForegroundActivity import org.rekotlin.Store internal class SprinklrChatOpener( private val userId: String, private val config: SprinklrConfig, private val store: Store, + private val foregroundActivityObserver: ForegroundActivityObserver, ) : ChatOpener { override fun open(feedbackDataBuilder: (Context) -> String) { store.dispatch(SprinklrAction.Init(userId, config)) - store.dispatchOnMain(NavigationAction.NavigateTo(AppScreen.Sprinklr)) + foregroundActivityObserver.withForegroundActivity { activity -> + val intent = Intent(activity, SprinklrActivity::class.java) + activity.startActivity(intent) + } } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/extensions/Navigation.kt b/app/src/main/java/com/tangem/tap/common/extensions/Navigation.kt index 21dd970381..711e7ed172 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/Navigation.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/Navigation.kt @@ -25,7 +25,6 @@ import com.tangem.tap.features.onboarding.products.wallet.ui.OnboardingWalletFra import com.tangem.tap.features.saveWallet.ui.SaveWalletBottomSheetFragment import com.tangem.tap.features.send.ui.SendFragment import com.tangem.tap.features.shop.ui.ShopFragment -import com.tangem.tap.features.sprinklr.ui.SprinklrFragment import com.tangem.tap.features.tokens.addCustomToken.AddCustomTokenFragment import com.tangem.tap.features.tokens.ui.AddTokensFragment import com.tangem.tap.features.wallet.ui.WalletDetailsFragment @@ -121,6 +120,5 @@ private fun fragmentFactory(screen: AppScreen): Fragment { AppScreen.Welcome -> WelcomeFragment() AppScreen.SaveWallet -> SaveWalletBottomSheetFragment() AppScreen.WalletSelector -> WalletSelectorBottomSheetFragment() - AppScreen.Sprinklr -> SprinklrFragment() } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/common/redux/navigation/NavigationState.kt b/app/src/main/java/com/tangem/tap/common/redux/navigation/NavigationState.kt index 3f313ef210..cf60dc79f6 100644 --- a/app/src/main/java/com/tangem/tap/common/redux/navigation/NavigationState.kt +++ b/app/src/main/java/com/tangem/tap/common/redux/navigation/NavigationState.kt @@ -26,5 +26,4 @@ enum class AppScreen( Welcome, SaveWallet(isDialogFragment = true), WalletSelector(isDialogFragment = true), - Sprinklr, } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/sprinklr/redux/model/SprinklrUrl.kt b/app/src/main/java/com/tangem/tap/features/sprinklr/redux/model/SprinklrUrl.kt index 2a76172029..2d1eb1be87 100644 --- a/app/src/main/java/com/tangem/tap/features/sprinklr/redux/model/SprinklrUrl.kt +++ b/app/src/main/java/com/tangem/tap/features/sprinklr/redux/model/SprinklrUrl.kt @@ -6,8 +6,8 @@ internal sealed class SprinklrUrl { class Prod(userId: String, baseUrl: String, appId: String) : SprinklrUrl() { private val locale = java.util.Locale.getDefault().language - override val url: String = "$baseUrl/page?" + - "appId=$appId" + + override val url: String = "$baseUrl/page" + + "?appId=$appId" + "&device=$Device" + "&enableClose=$CloseEnabled" + "&zoom=$ZoomEnabled" + diff --git a/app/src/main/java/com/tangem/tap/features/sprinklr/ui/SprinklrFragment.kt b/app/src/main/java/com/tangem/tap/features/sprinklr/ui/SprinklrActivity.kt similarity index 83% rename from app/src/main/java/com/tangem/tap/features/sprinklr/ui/SprinklrFragment.kt rename to app/src/main/java/com/tangem/tap/features/sprinklr/ui/SprinklrActivity.kt index 3e7e7b824e..28b3053441 100644 --- a/app/src/main/java/com/tangem/tap/features/sprinklr/ui/SprinklrFragment.kt +++ b/app/src/main/java/com/tangem/tap/features/sprinklr/ui/SprinklrActivity.kt @@ -2,23 +2,26 @@ package com.tangem.tap.features.sprinklr.ui import android.os.Bundle import androidx.activity.compose.BackHandler +import androidx.activity.viewModels import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.systemBarsPadding import androidx.compose.runtime.Composable import androidx.compose.runtime.State import androidx.compose.runtime.collectAsState import androidx.compose.ui.Modifier -import androidx.fragment.app.viewModels import com.tangem.core.analytics.Analytics -import com.tangem.core.ui.fragments.ComposeFragment +import com.tangem.core.ui.fragments.ComposeActivity import com.tangem.tap.common.analytics.events.Chat -internal class SprinklrFragment : ComposeFragment() { +internal class SprinklrActivity : ComposeActivity() { private val viewModel by viewModels() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) Analytics.send(Chat.ScreenOpened()) + viewModel.setNavigateBackCallback { + this.finish() + } } @Composable diff --git a/app/src/main/java/com/tangem/tap/features/sprinklr/ui/SprinklrViewModel.kt b/app/src/main/java/com/tangem/tap/features/sprinklr/ui/SprinklrViewModel.kt index 1c23eef584..989b813d19 100644 --- a/app/src/main/java/com/tangem/tap/features/sprinklr/ui/SprinklrViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/sprinklr/ui/SprinklrViewModel.kt @@ -24,7 +24,6 @@ internal class SprinklrViewModel : ViewModel(), StoreSubscriber { prevState.copy( initialUrl = state.url, sprinklrDomains = state.sprinklrDomains, - onNavigateBack = this::navigateBack, onNewUrl = { updateWebContentOrOpenExternalUrl(it) }, ) } @@ -34,6 +33,14 @@ internal class SprinklrViewModel : ViewModel(), StoreSubscriber { store.unsubscribe(this) } + fun setNavigateBackCallback(callback: () -> Unit) { + stateInternal.update { prevState -> + prevState.copy( + onNavigateBack = callback, + ) + } + } + private fun subscribeToStoreChanges() { store.subscribe(this) { appState -> appState.skip { old, new -> old.sprinklrState == new.sprinklrState } @@ -41,10 +48,6 @@ internal class SprinklrViewModel : ViewModel(), StoreSubscriber { } } - private fun navigateBack() { - store.dispatchOnMain(NavigationAction.PopBackTo()) - } - private fun WebContent.updateWebContentOrOpenExternalUrl(url: String): WebContent { return if (isExternalUrl(url)) { store.dispatchOnMain(NavigationAction.OpenUrl(url)) diff --git a/core/ui/src/main/java/com/tangem/core/ui/fragments/ComposeActivity.kt b/core/ui/src/main/java/com/tangem/core/ui/fragments/ComposeActivity.kt new file mode 100644 index 0000000000..b14a8f3c9d --- /dev/null +++ b/core/ui/src/main/java/com/tangem/core/ui/fragments/ComposeActivity.kt @@ -0,0 +1,11 @@ +package com.tangem.core.ui.fragments + +import android.os.Bundle +import androidx.appcompat.app.AppCompatActivity + +abstract class ComposeActivity : AppCompatActivity(), ComposeScreen { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(createComposeView(context = this)) + } +} \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/fragments/ComposeBottomSheetFragment.kt b/core/ui/src/main/java/com/tangem/core/ui/fragments/ComposeBottomSheetFragment.kt index 35dab6bca0..3161add9a8 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/fragments/ComposeBottomSheetFragment.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/fragments/ComposeBottomSheetFragment.kt @@ -10,8 +10,6 @@ import androidx.annotation.FloatRange import androidx.compose.foundation.background import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.runtime.Composable -import androidx.compose.runtime.State import androidx.compose.ui.Modifier import androidx.compose.ui.platform.ComposeView import com.google.android.material.bottomsheet.BottomSheetBehavior @@ -20,7 +18,7 @@ import com.google.android.material.bottomsheet.BottomSheetDialogFragment import com.tangem.core.ui.R import com.tangem.core.ui.res.TangemTheme -abstract class ComposeBottomSheetFragment : BottomSheetDialogFragment() { +abstract class ComposeBottomSheetFragment : BottomSheetDialogFragment(), ComposeScreen { open val initialBottomSheetState = BottomSheetBehavior.STATE_EXPANDED @FloatRange(from = 0.0, to = 1.0) @@ -47,7 +45,7 @@ abstract class ComposeBottomSheetFragment : BottomSheetDialogFragme return dialog } - private fun createComposeView(context: Context): View { + override fun createComposeView(context: Context): View { return ComposeView(context).apply { setContent { TangemTheme { @@ -67,13 +65,4 @@ abstract class ComposeBottomSheetFragment : BottomSheetDialogFragme } } } - - @Composable - protected abstract fun provideState(): State - - @Composable - protected abstract fun ScreenContent( - modifier: Modifier, - state: ScreenState, - ) } \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/fragments/ComposeFragment.kt b/core/ui/src/main/java/com/tangem/core/ui/fragments/ComposeFragment.kt index 863f22f185..d7ab04a268 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/fragments/ComposeFragment.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/fragments/ComposeFragment.kt @@ -1,21 +1,12 @@ package com.tangem.core.ui.fragments -import android.content.Context import android.os.Bundle import android.view.LayoutInflater import android.view.View import android.view.ViewGroup -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.runtime.Composable -import androidx.compose.runtime.State -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.ComposeView import androidx.fragment.app.Fragment -import com.tangem.core.ui.components.SystemBarsEffect -import com.tangem.core.ui.res.TangemTheme -abstract class ComposeFragment : Fragment() { +abstract class ComposeFragment : Fragment(), ComposeScreen { override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -23,35 +14,4 @@ abstract class ComposeFragment : Fragment() { ): View { return createComposeView(inflater.context) } - - private fun createComposeView(context: Context): View { - return ComposeView(context).apply { - setContent { - TangemTheme { - val backgroundColor = TangemTheme.colors.background.primary - SystemBarsEffect { - setSystemBarsColor( - color = backgroundColor, - ) - } - - ScreenContent( - modifier = Modifier - .fillMaxSize() - .background(color = backgroundColor), - state = provideState().value, - ) - } - } - } - } - - @Composable - protected abstract fun provideState(): State - - @Composable - protected abstract fun ScreenContent( - modifier: Modifier, - state: ScreenState, - ) } \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/fragments/ComposeScreen.kt b/core/ui/src/main/java/com/tangem/core/ui/fragments/ComposeScreen.kt new file mode 100644 index 0000000000..8404a4867d --- /dev/null +++ b/core/ui/src/main/java/com/tangem/core/ui/fragments/ComposeScreen.kt @@ -0,0 +1,45 @@ +package com.tangem.core.ui.fragments + +import android.content.Context +import android.view.View +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.Composable +import androidx.compose.runtime.State +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.ComposeView +import com.tangem.core.ui.components.SystemBarsEffect +import com.tangem.core.ui.res.TangemTheme + +internal interface ComposeScreen { + fun createComposeView(context: Context): View { + return ComposeView(context).apply { + setContent { + TangemTheme { + val backgroundColor = TangemTheme.colors.background.primary + SystemBarsEffect { + setSystemBarsColor( + color = backgroundColor, + ) + } + + ScreenContent( + modifier = Modifier + .fillMaxSize() + .background(color = backgroundColor), + state = provideState().value, + ) + } + } + } + } + + @Composable + fun provideState(): State + + @Composable + fun ScreenContent( + modifier: Modifier, + state: ScreenState, + ) +} \ No newline at end of file