Updated on 2026-08-14

This commit is contained in:
Tangem 2024-06-13 11:16:12 +04:00
parent 69aeaf5776
commit e38a822f0b
10 changed files with 50 additions and 80 deletions

View file

@ -0,0 +1,28 @@
package com.tangem.tap.common.finisher
import android.content.Intent
import com.tangem.core.navigation.finisher.AppFinisher
import com.tangem.tap.MainActivity
import com.tangem.tap.foregroundActivityObserver
import com.tangem.tap.withForegroundActivity
internal class AndroidAppFinisher : AppFinisher {
override fun finish() {
foregroundActivityObserver.withForegroundActivity { activity ->
activity.finish()
}
}
override fun restart() {
foregroundActivityObserver.withForegroundActivity { activity ->
activity.finish()
val intent = Intent(activity, MainActivity::class.java).apply {
flags = Intent.FLAG_ACTIVITY_CLEAR_TOP
}
activity.startActivity(intent)
Runtime.getRuntime().exit(0)
}
}
}

View file

@ -6,10 +6,8 @@ import com.tangem.domain.exchange.RampStateManager
import com.tangem.domain.tokens.GetPolkadotCheckHasImmortalUseCase
import com.tangem.domain.tokens.GetPolkadotCheckHasResetUseCase
import com.tangem.domain.tokens.repository.PolkadotAccountHealthCheckRepository
import com.tangem.feature.tester.ActivityClassWrapper
import com.tangem.tap.MainActivity
import com.tangem.tap.domain.sdk.TangemSdkManager
import com.tangem.tap.domain.scanCard.repository.DefaultScanCardRepository
import com.tangem.tap.domain.sdk.TangemSdkManager
import com.tangem.tap.network.exchangeServices.DefaultRampManager
import com.tangem.tap.proxy.AppStateHolder
import dagger.Module
@ -67,10 +65,4 @@ internal object ActivityModule {
): GetPolkadotCheckHasImmortalUseCase {
return GetPolkadotCheckHasImmortalUseCase(polkadotAccountHealthCheckRepository)
}
@Provides
@Singleton
fun provideActivityClassWrapper(): ActivityClassWrapper {
return ActivityClassWrapper(MainActivity::class.java)
}
}

View file

@ -1,9 +1,11 @@
package com.tangem.tap.di
import com.tangem.core.navigation.feedback.FeedbackManager
import com.tangem.core.navigation.finisher.AppFinisher
import com.tangem.core.navigation.share.ShareManager
import com.tangem.core.navigation.url.UrlOpener
import com.tangem.tap.common.feedback.ProxyFeedbackManager
import com.tangem.tap.common.finisher.AndroidAppFinisher
import com.tangem.tap.common.share.IntentShareManager
import com.tangem.tap.common.url.CustomTabsUrlOpener
import dagger.Module
@ -27,4 +29,8 @@ internal object UtilsModule {
@Provides
@Singleton
fun provideFeedbackManager(): FeedbackManager = ProxyFeedbackManager()
@Provides
@Singleton
fun provideAppFinisher(): AppFinisher = AndroidAppFinisher()
}

View file

@ -0,0 +1,8 @@
package com.tangem.core.navigation.finisher
interface AppFinisher {
fun finish()
fun restart()
}

View file

@ -39,6 +39,7 @@ dependencies {
implementation(projects.core.featuretoggles)
implementation(projects.core.ui)
implementation(projects.core.utils)
implementation(projects.core.navigation)
/** Feature Apis */
implementation(projects.features.tester.api)

View file

@ -1,12 +0,0 @@
package com.tangem.feature.tester
import android.app.Activity
/**
* Wraps the main activity class to avoid type erasure issues during injection.
*
* @property clazz activity class
*/
class ActivityClassWrapper(
val clazz: Class<out Activity>,
)

View file

@ -1,27 +0,0 @@
package com.tangem.feature.tester.apprestarter
import android.app.Activity
import android.content.Context
import android.content.Intent
import com.tangem.feature.tester.ActivityClassWrapper
import com.tangem.features.tester.api.AppRestarter
/**
* Entity that kills the process and restarts the main activity
* @property context Activity context
*/
internal class DefaultAppRestarter(
private val context: Context,
private val activityClassWrapper: ActivityClassWrapper,
) : AppRestarter {
override fun restart() {
if (context !is Activity) return
context.finish()
context.startActivity(
Intent(context, activityClassWrapper.clazz).apply { flags = Intent.FLAG_ACTIVITY_CLEAR_TOP },
)
Runtime.getRuntime().exit(0)
}
}

View file

@ -1,26 +0,0 @@
package com.tangem.feature.tester.di
import android.content.Context
import com.tangem.feature.tester.ActivityClassWrapper
import com.tangem.feature.tester.apprestarter.DefaultAppRestarter
import com.tangem.features.tester.api.AppRestarter
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ActivityComponent
import dagger.hilt.android.qualifiers.ActivityContext
import dagger.hilt.android.scopes.ActivityScoped
@Module
@InstallIn(ActivityComponent::class)
internal object RestarterModule {
@Provides
@ActivityScoped
fun provideAppRestarter(
@ActivityContext context: Context,
activityClassWrapper: ActivityClassWrapper,
): AppRestarter {
return DefaultAppRestarter(context, activityClassWrapper)
}
}

View file

@ -6,6 +6,7 @@ import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import com.tangem.core.navigation.finisher.AppFinisher
import com.tangem.core.ui.UiDependencies
import com.tangem.core.ui.components.SystemBarsEffect
import com.tangem.core.ui.res.TangemTheme
@ -18,7 +19,6 @@ import com.tangem.feature.tester.presentation.menu.state.TesterMenuContentState
import com.tangem.feature.tester.presentation.menu.ui.TesterMenuScreen
import com.tangem.feature.tester.presentation.navigation.InnerTesterRouter
import com.tangem.feature.tester.presentation.navigation.TesterScreen
import com.tangem.features.tester.api.AppRestarter
import com.tangem.features.tester.api.TesterRouter
import dagger.hilt.android.AndroidEntryPoint
import javax.inject.Inject
@ -35,7 +35,7 @@ internal class TesterActivity : ComposeActivity() {
lateinit var testerRouter: TesterRouter
@Inject
lateinit var appRestarter: AppRestarter
lateinit var appFinisher: AppFinisher
private val innerTesterRouter: InnerTesterRouter
get() = requireNotNull(testerRouter as? InnerTesterRouter) {
@ -70,7 +70,7 @@ internal class TesterActivity : ComposeActivity() {
composable(route = TesterScreen.FEATURE_TOGGLES.name) {
val viewModel = hiltViewModel<FeatureTogglesViewModel>().apply {
setupInteractions(innerTesterRouter, appRestarter)
setupInteractions(innerTesterRouter, appFinisher)
}
FeatureTogglesScreen(state = viewModel.uiState)

View file

@ -7,10 +7,10 @@ import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.tangem.core.featuretoggle.manager.FeatureTogglesManager
import com.tangem.core.featuretoggle.manager.MutableFeatureTogglesManager
import com.tangem.core.navigation.finisher.AppFinisher
import com.tangem.feature.tester.presentation.featuretoggles.models.TesterFeatureToggle
import com.tangem.feature.tester.presentation.featuretoggles.state.FeatureTogglesContentState
import com.tangem.feature.tester.presentation.navigation.InnerTesterRouter
import com.tangem.features.tester.api.AppRestarter
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.launch
@ -40,10 +40,10 @@ internal class FeatureTogglesViewModel @Inject constructor(
}
/** Setup navigation state property by router [router] and provides app restart method by [appRestarter] */
fun setupInteractions(router: InnerTesterRouter, appRestarter: AppRestarter) {
fun setupInteractions(router: InnerTesterRouter, appFinisher: AppFinisher) {
uiState = uiState.copy(
onBackClick = router::back,
onApplyChangesClick = appRestarter::restart,
onApplyChangesClick = appFinisher::restart,
)
}