Updated on 2026-08-14
This commit is contained in:
parent
768b44f44f
commit
e4039b220c
10 changed files with 64 additions and 22 deletions
|
|
@ -1,11 +1,11 @@
|
||||||
package com.tangem.tap.common.extensions
|
package com.tangem.tap.common.extensions
|
||||||
|
|
||||||
import com.tangem.core.navigation.NavigationAction
|
|
||||||
import com.tangem.core.navigation.StateDialog
|
import com.tangem.core.navigation.StateDialog
|
||||||
import com.tangem.domain.common.extensions.withMainContext
|
import com.tangem.domain.common.extensions.withMainContext
|
||||||
import com.tangem.domain.wallets.models.UserWallet
|
import com.tangem.domain.wallets.models.UserWallet
|
||||||
import com.tangem.tap.common.redux.AppState
|
import com.tangem.tap.common.redux.AppState
|
||||||
import com.tangem.tap.common.redux.global.GlobalAction
|
import com.tangem.tap.common.redux.global.GlobalAction
|
||||||
|
import com.tangem.tap.common.share.shareManager
|
||||||
import com.tangem.tap.common.url.urlOpener
|
import com.tangem.tap.common.url.urlOpener
|
||||||
import com.tangem.tap.domain.TapError
|
import com.tangem.tap.domain.TapError
|
||||||
import com.tangem.tap.proxy.redux.DaggerGraphState
|
import com.tangem.tap.proxy.redux.DaggerGraphState
|
||||||
|
|
@ -88,7 +88,7 @@ fun Store<*>.dispatchOpenUrl(url: String) {
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Store<*>.dispatchShare(url: String) {
|
fun Store<*>.dispatchShare(url: String) {
|
||||||
dispatch(NavigationAction.Share(url))
|
shareManager.shareText(url)
|
||||||
}
|
}
|
||||||
|
|
||||||
inline fun <reified T> Store<AppState>.inject(getDependency: DaggerGraphState.() -> T?): T {
|
inline fun <reified T> Store<AppState>.inject(getDependency: DaggerGraphState.() -> T?): T {
|
||||||
|
|
|
||||||
|
|
@ -3,7 +3,10 @@
|
||||||
package com.tangem.tap.common.extensions
|
package com.tangem.tap.common.extensions
|
||||||
|
|
||||||
import android.app.Activity
|
import android.app.Activity
|
||||||
import android.content.*
|
import android.content.ClipData
|
||||||
|
import android.content.ClipboardManager
|
||||||
|
import android.content.Context
|
||||||
|
import android.content.ContextWrapper
|
||||||
import android.graphics.drawable.Drawable
|
import android.graphics.drawable.Drawable
|
||||||
import android.view.View
|
import android.view.View
|
||||||
import androidx.annotation.*
|
import androidx.annotation.*
|
||||||
|
|
@ -78,16 +81,6 @@ fun Context.getFromClipboard(default: CharSequence? = null): CharSequence? {
|
||||||
return clipData.getItemAt(0).text
|
return clipData.getItemAt(0).text
|
||||||
}
|
}
|
||||||
|
|
||||||
fun Context.shareText(text: String) {
|
|
||||||
val sendIntent: Intent = Intent().apply {
|
|
||||||
action = Intent.ACTION_SEND
|
|
||||||
putExtra(Intent.EXTRA_TEXT, text)
|
|
||||||
type = "text/plain"
|
|
||||||
}
|
|
||||||
val shareIntent = Intent.createChooser(sendIntent, null)
|
|
||||||
startActivity(shareIntent)
|
|
||||||
}
|
|
||||||
|
|
||||||
fun View.getString(resId: Int, vararg formatArgs: Any?): String {
|
fun View.getString(resId: Int, vararg formatArgs: Any?): String {
|
||||||
return context.getString(resId, *formatArgs)
|
return context.getString(resId, *formatArgs)
|
||||||
}
|
}
|
||||||
|
|
@ -7,7 +7,10 @@ import android.provider.Settings
|
||||||
import com.tangem.core.navigation.AppScreen
|
import com.tangem.core.navigation.AppScreen
|
||||||
import com.tangem.core.navigation.NavigationAction
|
import com.tangem.core.navigation.NavigationAction
|
||||||
import com.tangem.tap.activityResultCaller
|
import com.tangem.tap.activityResultCaller
|
||||||
import com.tangem.tap.common.extensions.*
|
import com.tangem.tap.common.extensions.dispatchDialogShow
|
||||||
|
import com.tangem.tap.common.extensions.dispatchOnMain
|
||||||
|
import com.tangem.tap.common.extensions.openFragment
|
||||||
|
import com.tangem.tap.common.extensions.popBackTo
|
||||||
import com.tangem.tap.common.redux.AppState
|
import com.tangem.tap.common.redux.AppState
|
||||||
import com.tangem.tap.store
|
import com.tangem.tap.store
|
||||||
import org.rekotlin.Middleware
|
import org.rekotlin.Middleware
|
||||||
|
|
@ -71,9 +74,6 @@ val navigationMiddleware: Middleware<AppState> = { _, state ->
|
||||||
}
|
}
|
||||||
activityResultCaller.activityResultLauncher?.launch(intent)
|
activityResultCaller.activityResultLauncher?.launch(intent)
|
||||||
}
|
}
|
||||||
is NavigationAction.Share -> {
|
|
||||||
navState?.activity?.get()?.shareText(action.data)
|
|
||||||
}
|
|
||||||
is NavigationAction.ActivityCreated,
|
is NavigationAction.ActivityCreated,
|
||||||
is NavigationAction.ActivityDestroyed,
|
is NavigationAction.ActivityDestroyed,
|
||||||
-> Unit
|
-> Unit
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
package com.tangem.tap.common.share
|
||||||
|
|
||||||
|
import android.content.Intent
|
||||||
|
import com.tangem.core.navigation.share.ShareManager
|
||||||
|
import com.tangem.tap.foregroundActivityObserver
|
||||||
|
import com.tangem.tap.withForegroundActivity
|
||||||
|
|
||||||
|
internal val shareManager = IntentShareManager
|
||||||
|
|
||||||
|
internal object IntentShareManager : ShareManager {
|
||||||
|
|
||||||
|
override fun shareText(text: String) {
|
||||||
|
foregroundActivityObserver.withForegroundActivity { activity ->
|
||||||
|
val sendIntent: Intent = Intent().apply {
|
||||||
|
action = Intent.ACTION_SEND
|
||||||
|
putExtra(Intent.EXTRA_TEXT, text)
|
||||||
|
type = "text/plain"
|
||||||
|
}
|
||||||
|
val shareIntent = Intent.createChooser(sendIntent, null)
|
||||||
|
|
||||||
|
activity.startActivity(shareIntent)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -1,8 +1,10 @@
|
||||||
package com.tangem.tap.di
|
package com.tangem.tap.di
|
||||||
|
|
||||||
import com.tangem.core.navigation.feedback.FeedbackManager
|
import com.tangem.core.navigation.feedback.FeedbackManager
|
||||||
|
import com.tangem.core.navigation.share.ShareManager
|
||||||
import com.tangem.core.navigation.url.UrlOpener
|
import com.tangem.core.navigation.url.UrlOpener
|
||||||
import com.tangem.tap.common.feedback.ProxyFeedbackManager
|
import com.tangem.tap.common.feedback.ProxyFeedbackManager
|
||||||
|
import com.tangem.tap.common.share.IntentShareManager
|
||||||
import com.tangem.tap.common.url.CustomTabsUrlOpener
|
import com.tangem.tap.common.url.CustomTabsUrlOpener
|
||||||
import dagger.Module
|
import dagger.Module
|
||||||
import dagger.Provides
|
import dagger.Provides
|
||||||
|
|
@ -14,6 +16,10 @@ import javax.inject.Singleton
|
||||||
@InstallIn(SingletonComponent::class)
|
@InstallIn(SingletonComponent::class)
|
||||||
internal object UtilsModule {
|
internal object UtilsModule {
|
||||||
|
|
||||||
|
@Provides
|
||||||
|
@Singleton
|
||||||
|
fun provideShareManager(): ShareManager = IntentShareManager
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@Singleton
|
@Singleton
|
||||||
fun provideUrlOpener(): UrlOpener = CustomTabsUrlOpener
|
fun provideUrlOpener(): UrlOpener = CustomTabsUrlOpener
|
||||||
|
|
|
||||||
|
|
@ -23,8 +23,6 @@ sealed class NavigationAction : Action {
|
||||||
|
|
||||||
data class OpenDialog(val stateDialog: StateDialog) : NavigationAction()
|
data class OpenDialog(val stateDialog: StateDialog) : NavigationAction()
|
||||||
|
|
||||||
data class Share(val data: String) : NavigationAction()
|
|
||||||
|
|
||||||
data class ActivityCreated(val activity: WeakReference<AppCompatActivity>) : NavigationAction()
|
data class ActivityCreated(val activity: WeakReference<AppCompatActivity>) : NavigationAction()
|
||||||
|
|
||||||
data class ActivityDestroyed(val activity: WeakReference<AppCompatActivity>) : NavigationAction()
|
data class ActivityDestroyed(val activity: WeakReference<AppCompatActivity>) : NavigationAction()
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,8 @@
|
||||||
|
package com.tangem.core.navigation.share
|
||||||
|
|
||||||
|
class DummyShareManager : ShareManager {
|
||||||
|
|
||||||
|
override fun shareText(text: String) {
|
||||||
|
/* no-op */
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -0,0 +1,6 @@
|
||||||
|
package com.tangem.core.navigation.share
|
||||||
|
|
||||||
|
interface ShareManager {
|
||||||
|
|
||||||
|
fun shareText(text: String)
|
||||||
|
}
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
package com.tangem.feature.tokendetails.di
|
package com.tangem.feature.tokendetails.di
|
||||||
|
|
||||||
import com.tangem.core.navigation.ReduxNavController
|
import com.tangem.core.navigation.ReduxNavController
|
||||||
|
import com.tangem.core.navigation.share.ShareManager
|
||||||
import com.tangem.core.navigation.url.UrlOpener
|
import com.tangem.core.navigation.url.UrlOpener
|
||||||
import com.tangem.feature.tokendetails.presentation.router.DefaultTokenDetailsRouter
|
import com.tangem.feature.tokendetails.presentation.router.DefaultTokenDetailsRouter
|
||||||
import com.tangem.features.tokendetails.navigation.TokenDetailsRouter
|
import com.tangem.features.tokendetails.navigation.TokenDetailsRouter
|
||||||
|
|
@ -16,7 +17,11 @@ internal object TokenDetailsRouterModule {
|
||||||
|
|
||||||
@Provides
|
@Provides
|
||||||
@ActivityScoped
|
@ActivityScoped
|
||||||
fun provideTokenDetailsRouter(reduxNavController: ReduxNavController, urlOpener: UrlOpener): TokenDetailsRouter {
|
fun provideTokenDetailsRouter(
|
||||||
return DefaultTokenDetailsRouter(reduxNavController, urlOpener)
|
reduxNavController: ReduxNavController,
|
||||||
|
urlOpener: UrlOpener,
|
||||||
|
shareManager: ShareManager,
|
||||||
|
): TokenDetailsRouter {
|
||||||
|
return DefaultTokenDetailsRouter(reduxNavController, urlOpener, shareManager)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -5,6 +5,7 @@ import androidx.fragment.app.Fragment
|
||||||
import com.tangem.core.navigation.AppScreen
|
import com.tangem.core.navigation.AppScreen
|
||||||
import com.tangem.core.navigation.NavigationAction
|
import com.tangem.core.navigation.NavigationAction
|
||||||
import com.tangem.core.navigation.ReduxNavController
|
import com.tangem.core.navigation.ReduxNavController
|
||||||
|
import com.tangem.core.navigation.share.ShareManager
|
||||||
import com.tangem.core.navigation.url.UrlOpener
|
import com.tangem.core.navigation.url.UrlOpener
|
||||||
import com.tangem.domain.tokens.model.CryptoCurrency
|
import com.tangem.domain.tokens.model.CryptoCurrency
|
||||||
import com.tangem.domain.wallets.models.UserWalletId
|
import com.tangem.domain.wallets.models.UserWalletId
|
||||||
|
|
@ -14,6 +15,7 @@ import com.tangem.features.tokendetails.navigation.TokenDetailsRouter
|
||||||
internal class DefaultTokenDetailsRouter(
|
internal class DefaultTokenDetailsRouter(
|
||||||
private val reduxNavController: ReduxNavController,
|
private val reduxNavController: ReduxNavController,
|
||||||
private val urlOpener: UrlOpener,
|
private val urlOpener: UrlOpener,
|
||||||
|
private val shareManager: ShareManager,
|
||||||
) : InnerTokenDetailsRouter {
|
) : InnerTokenDetailsRouter {
|
||||||
|
|
||||||
override fun getEntryFragment(): Fragment = TokenDetailsFragment()
|
override fun getEntryFragment(): Fragment = TokenDetailsFragment()
|
||||||
|
|
@ -27,7 +29,7 @@ internal class DefaultTokenDetailsRouter(
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun share(text: String) {
|
override fun share(text: String) {
|
||||||
reduxNavController.navigate(NavigationAction.Share(text))
|
shareManager.shareText(text)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun openTokenDetails(userWalletId: UserWalletId, currency: CryptoCurrency) {
|
override fun openTokenDetails(userWalletId: UserWalletId, currency: CryptoCurrency) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue