Updated on 2026-08-14

This commit is contained in:
Tangem 2019-08-23 15:37:04 +03:00
parent c56705f4cb
commit c13348a018
11 changed files with 150 additions and 170 deletions

9
.idea/navEditor.xml generated
View file

@ -311,6 +311,15 @@
<option name="y" value="15" /> <option name="y" value="15" />
</Point> </Point>
</option> </option>
<option name="myPositions">
<map>
<entry key="action_purgeFragment_to_loadedWalletFragment">
<value>
<LayoutPositions />
</value>
</entry>
</map>
</option>
</LayoutPositions> </LayoutPositions>
</value> </value>
</entry> </entry>

View file

@ -4,12 +4,15 @@ import android.app.Application
import androidx.appcompat.app.AppCompatDelegate import androidx.appcompat.app.AppCompatDelegate
import com.google.gson.Gson import com.google.gson.Gson
import com.google.gson.reflect.TypeToken import com.google.gson.reflect.TypeToken
import com.tangem.data.local.PendingTransactionsStorage
import com.tangem.card_android.android.data.Firmwares import com.tangem.card_android.android.data.Firmwares
import com.tangem.card_android.android.data.PINStorage import com.tangem.card_android.android.data.PINStorage
import com.tangem.card_common.data.Issuer import com.tangem.card_common.data.Issuer
import com.tangem.data.dp.PrefsManager import com.tangem.data.dp.PrefsManager
import com.tangem.di.* import com.tangem.data.local.PendingTransactionsStorage
import com.tangem.di.DaggerNetworkComponent
import com.tangem.di.DaggerToastHelperComponent
import com.tangem.di.NetworkComponent
import com.tangem.di.ToastHelperComponent
import com.tangem.server_android.data.LocalStorage import com.tangem.server_android.data.LocalStorage
import com.tangem.wallet.BuildConfig import com.tangem.wallet.BuildConfig
import java.io.InputStreamReader import java.io.InputStreamReader
@ -26,7 +29,6 @@ class App : Application() {
} }
lateinit var networkComponent: NetworkComponent lateinit var networkComponent: NetworkComponent
lateinit var navigatorComponent: NavigatorComponent
lateinit var toastHelperComponent: ToastHelperComponent lateinit var toastHelperComponent: ToastHelperComponent
lateinit var firmwaresStorage: Firmwares lateinit var firmwaresStorage: Firmwares
@ -41,7 +43,6 @@ class App : Application() {
instance = this instance = this
networkComponent = DaggerNetworkComponent.create() networkComponent = DaggerNetworkComponent.create()
navigatorComponent = buildNavigatorComponent()
toastHelperComponent = buildToastHelperComponent() toastHelperComponent = buildToastHelperComponent()
PrefsManager.getInstance().init(this) PrefsManager.getInstance().init(this)
@ -76,11 +77,6 @@ class App : Application() {
} }
} }
private fun buildNavigatorComponent(): NavigatorComponent {
return DaggerNavigatorComponent.builder()
.build()
}
private fun buildToastHelperComponent(): ToastHelperComponent { private fun buildToastHelperComponent(): ToastHelperComponent {
return DaggerToastHelperComponent.builder() return DaggerToastHelperComponent.builder()
.build() .build()

View file

@ -1,92 +0,0 @@
package com.tangem.di
import android.app.Activity
import android.nfc.Tag
import com.tangem.Constant
import com.tangem.wallet.TangemContext
import com.tangem.ui.PrepareTransactionActivity
import com.tangem.ui.activity.*
import com.tangem.wallet.BuildConfig
class Navigator {
fun showSettings(context: Activity) {
context.startActivity(SettingsActivity.callingIntent(context))
}
fun showMain(context: Activity) {
context.startActivity(MainActivity.callingIntent(context))
}
fun showLogo(context: Activity, autoHide: Boolean) {
context.startActivity(LogoActivity.callingIntent(context, autoHide))
}
fun showPinSave(context: Activity, hasPin2: Boolean) {
context.startActivity(PinSaveActivity.callingIntent(context, hasPin2))
}
fun showPinRequest(context: Activity, mode: String) {
context.startActivityForResult(PinRequestActivity.callingIntent(context, mode), Constant.REQUEST_CODE_ENTER_PIN_ACTIVITY)
}
fun showQrScanActivity(context: Activity, requestCode: Int) {
context.startActivityForResult(QrScanActivity.callingIntent(context), requestCode)
}
fun showPinRequestRequestPin(context: Activity, mode: String, ctx: TangemContext, newPin: String) {
context.startActivityForResult(PinRequestActivity.callingIntentRequestPin(context, mode, ctx, newPin), Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN)
}
fun showPinRequestRequestPin2(context: Activity, mode: String, ctx: TangemContext, newPin2: String) {
context.startActivityForResult(PinRequestActivity.callingIntentRequestPin2(context, mode, ctx, newPin2), Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN)
}
fun showPinRequestRequestPin2(context: Activity, mode: String, ctx: TangemContext) {
context.startActivityForResult(PinRequestActivity.callingIntentRequestPin2(context, mode, ctx), Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN)
}
fun showPinRequestConfirmNewPin(context: Activity, mode: String, newPin: String) {
context.startActivityForResult(PinRequestActivity.callingIntentConfirmPin(context, mode, newPin), Constant.REQUEST_CODE_ENTER_NEW_PIN)
}
fun showPinRequestConfirmNewPin2(context: Activity, mode: String, newPin2: String) {
context.startActivityForResult(PinRequestActivity.callingIntentConfirmPin2(context, mode, newPin2), Constant.REQUEST_CODE_ENTER_NEW_PIN2)
}
fun showLoadedWallet(context: Activity, lastTag: Tag, ctx: TangemContext) {
context.startActivityForResult(LoadedWalletActivity.callingIntent(context, lastTag, ctx), Constant.REQUEST_CODE_SHOW_CARD_ACTIVITY)
}
fun showEmptyWallet(context: Activity, ctx: TangemContext) {
context.startActivity(EmptyWalletActivity.callingIntent(context, ctx))
}
fun showVerifyCard(context: Activity, ctx: TangemContext) {
context.startActivityForResult(VerifyCardActivity.callingIntent(context, ctx), Constant.REQUEST_CODE_VERIFY_CARD)
}
fun showPinSwap(context: Activity, newPIN: String, newPIN2: String) {
context.startActivityForResult(PinSwapActivity.callingIntent(context, newPIN, newPIN2), Constant.REQUEST_CODE_SWAP_PIN)
}
fun showPurge(context: Activity, ctx: TangemContext) {
context.startActivityForResult(PurgeActivity.callingIntent(context, ctx), Constant.REQUEST_CODE_PURGE)
}
fun showPrepareTransaction(context: Activity, ctx: TangemContext) {
when (BuildConfig.FLAVOR) {
Constant.FLAVOR_TANGEM_CARDANO -> {
context.startActivity(PrepareTransactionActivity.callingIntent(context, ctx))
}
else -> {
context.startActivityForResult(PrepareTransactionActivity.callingIntent(context, ctx), Constant.REQUEST_CODE_SEND_TRANSACTION)
}
}
}
fun showCreateNewWallet(context: Activity, ctx: TangemContext) {
context.startActivityForResult(CreateNewWalletActivity.callingIntent(context, ctx), Constant.REQUEST_CODE_CREATE_NEW_WALLET_ACTIVITY)
}
}

View file

@ -1,39 +0,0 @@
package com.tangem.di
import com.tangem.ui.activity.EmptyWalletActivity
import com.tangem.ui.activity.LoadedWalletActivity
import com.tangem.ui.activity.LogoActivity
import com.tangem.ui.activity.MainActivity
import com.tangem.ui.activity.PrepareCryptonitOtherApiWithdrawalActivity
import com.tangem.ui.activity.PrepareKrakenWithdrawalActivity
import com.tangem.ui.PrepareTransactionActivity
import com.tangem.ui.activity.PurgeActivity
import com.tangem.ui.activity.VerifyCardActivity
import javax.inject.Singleton
import dagger.Component
@Singleton
@Component(modules = [NavigatorModule::class])
interface NavigatorComponent {
fun inject(activity: LogoActivity)
fun inject(activity: MainActivity)
fun inject(activity: PurgeActivity)
fun inject(activity: PrepareTransactionActivity)
fun inject(activity: PrepareCryptonitOtherApiWithdrawalActivity)
fun inject(activity: PrepareKrakenWithdrawalActivity)
fun inject(activity: LoadedWalletActivity)
fun inject(activity: VerifyCardActivity)
fun inject(activity: EmptyWalletActivity)
}

View file

@ -1,21 +1,13 @@
package com.tangem.di package com.tangem.di
import com.tangem.ui.dialog.WaitSecurityDelayDialogNew import com.tangem.ui.dialog.WaitSecurityDelayDialogNew
import javax.inject.Singleton
import dagger.Module import dagger.Module
import dagger.Provides import dagger.Provides
import javax.inject.Singleton
@Module @Module
internal class NavigatorModule { internal class NavigatorModule {
@Singleton
@Provides
fun provideNavigator(): Navigator {
return Navigator()
}
@Singleton @Singleton
@Provides @Provides
fun provideToastHelper(): ToastHelper { fun provideToastHelper(): ToastHelper {

View file

@ -1,9 +1,5 @@
package com.tangem.di package com.tangem.di
import com.tangem.ui.ConfirmTransactionActivity
import com.tangem.ui.PrepareTransactionActivity
import com.tangem.ui.activity.EmptyWalletActivity
import com.tangem.ui.activity.LoadedWalletActivity
import com.tangem.ui.activity.MainActivity import com.tangem.ui.activity.MainActivity
import dagger.Component import dagger.Component
import javax.inject.Singleton import javax.inject.Singleton
@ -14,12 +10,4 @@ interface ToastHelperComponent {
fun inject(activity: MainActivity) fun inject(activity: MainActivity)
fun inject(activity: LoadedWalletActivity)
fun inject(activity: ConfirmTransactionActivity)
fun inject(activity: PrepareTransactionActivity)
fun inject(activity: EmptyWalletActivity)
} }

View file

@ -0,0 +1,8 @@
package com.tangem.ui.activity
import androidx.lifecycle.ViewModel
import com.tangem.ui.navigation.NavigationResult
class GlobalViewModel : ViewModel() {
var navigationResult: NavigationResult? = null
}

View file

@ -13,31 +13,29 @@ import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat import androidx.core.content.ContextCompat
import androidx.navigation.NavController import androidx.lifecycle.ViewModelProviders
import androidx.navigation.Navigation
import com.scottyab.rootbeer.RootBeer import com.scottyab.rootbeer.RootBeer
import com.tangem.App import com.tangem.App
import com.tangem.Constant import com.tangem.Constant
import com.tangem.card_android.android.nfc.NfcLifecycleObserver
import com.tangem.card_android.android.reader.NfcManager import com.tangem.card_android.android.reader.NfcManager
import com.tangem.di.Navigator
import com.tangem.di.ToastHelper import com.tangem.di.ToastHelper
import com.tangem.ui.dialog.RootFoundDialog import com.tangem.ui.dialog.RootFoundDialog
import com.tangem.wallet.BuildConfig import com.tangem.wallet.BuildConfig
import com.tangem.wallet.R import com.tangem.wallet.R
import javax.inject.Inject import javax.inject.Inject
class MainActivity : AppCompatActivity() { class MainActivity : AppCompatActivity(), NfcAdapter.ReaderCallback {
companion object { companion object {
val TAG: String = MainActivity::class.java.simpleName val TAG: String = MainActivity::class.java.simpleName
fun callingIntent(context: Context) = Intent(context, MainActivity::class.java) fun callingIntent(context: Context) = Intent(context, MainActivity::class.java)
} }
lateinit var navController: NavController
@Inject
internal lateinit var navigator: Navigator
@Inject @Inject
internal lateinit var toastHelper: ToastHelper internal lateinit var toastHelper: ToastHelper
lateinit var viewModel: GlobalViewModel
lateinit var nfcManager: NfcManager
// private var onNfcReaderCallback: NfcAdapter.ReaderCallback? = null // private var onNfcReaderCallback: NfcAdapter.ReaderCallback? = null
@ -54,15 +52,17 @@ class MainActivity : AppCompatActivity() {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main) setContentView(R.layout.activity_main)
navController = Navigation.findNavController(this, R.id.nav_host_fragment) viewModel = ViewModelProviders.of(this).get(GlobalViewModel::class.java)
App.navigatorComponent.inject(this)
App.toastHelperComponent.inject(this) App.toastHelperComponent.inject(this)
requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
verifyPermissions() verifyPermissions()
nfcManager = NfcManager(this, this)
lifecycle.addObserver(NfcLifecycleObserver(nfcManager))
// // NFC // // NFC
// val intent = intent // val intent = intent
// if (intent != null && (NfcAdapter.ACTION_TECH_DISCOVERED == intent.action || NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action)) { // if (intent != null && (NfcAdapter.ACTION_TECH_DISCOVERED == intent.action || NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action)) {
@ -85,4 +85,14 @@ class MainActivity : AppCompatActivity() {
} }
} }
override fun onTagDiscovered(tag: Tag) {
val activeFragment = supportFragmentManager.findFragmentById(R.id.nav_host_fragment)
?.childFragmentManager?.primaryNavigationFragment
if (activeFragment is NfcAdapter.ReaderCallback) {
activeFragment.onTagDiscovered(tag)
} else {
nfcManager.ignoreTag(tag)
}
}
} }

View file

@ -0,0 +1,96 @@
package com.tangem.ui.fragment
import android.os.Bundle
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.annotation.IdRes
import androidx.fragment.app.Fragment
import androidx.navigation.fragment.NavHostFragment.findNavController
import com.tangem.ui.activity.MainActivity
import com.tangem.ui.navigation.NavigationResult
import com.tangem.ui.navigation.NavigationResultListener
abstract class BaseFragment : Fragment() {
protected val requestCode: String
get() = arguments?.getString(ARGUMENT_NAVIGATION_REQUEST_CODE, REQUEST_CODE_NOT_SET)
?: REQUEST_CODE_NOT_SET
protected val navigatedBack: Boolean
get() = (activity as? MainActivity)?.viewModel?.navigationResult != null
protected abstract val layoutId: Int
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Log.d("LIFECYCLE", "onCreate: ${this::class.java.simpleName}")
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(layoutId, container, false)
}
override fun onStart() {
super.onStart()
Log.d("LIFECYCLE", "onStart: ${this::class.java.simpleName}")
if (this is NavigationResultListener) {
val navigationResult = (activity as? MainActivity)?.viewModel?.navigationResult
navigationResult?.run {
onNavigationResult(this.requestCode, this.resultCode, this.data)
(activity as? MainActivity)?.viewModel?.navigationResult = null
}
}
}
override fun onPause() {
super.onPause()
Log.d("LIFECYCLE", "onPause: ${this::class.java.simpleName}")
}
override fun onStop() {
super.onStop()
Log.d("LIFECYCLE", "onStop: ${this::class.java.simpleName}")
}
override fun onDestroy() {
super.onDestroy()
Log.d("LIFECYCLE", "onDestroy: ${this::class.java.simpleName}")
}
protected fun navigateUp(@IdRes destination: Int = DESTINATION_NOT_SET): Boolean {
return if (destination == DESTINATION_NOT_SET) {
findNavController(this).popBackStack()
} else {
findNavController(this).popBackStack(destination, true)
}
}
protected fun navigateForResult(requestCode: String, @IdRes destination: Int, data: Bundle? = null) {
val argumentsWithRequestCode = (data ?: Bundle()).apply {
putString(ARGUMENT_NAVIGATION_REQUEST_CODE, requestCode)
}
navigateToDestination(destination, argumentsWithRequestCode)
}
protected fun navigateToDestination(@IdRes destination: Int, data: Bundle? = null) {
try {
findNavController(this).navigate(destination, data)
} catch (e: IllegalArgumentException) {
Log.w(this::class.java.simpleName, e.message)
}
}
protected fun navigateBackWithResult(resultCode: Int, data: Bundle? = null,
@IdRes destination: Int = DESTINATION_NOT_SET): Boolean {
(requireActivity() as MainActivity).viewModel.navigationResult =
NavigationResult(requestCode, resultCode, data)
return navigateUp(destination)
}
companion object {
private const val ARGUMENT_NAVIGATION_REQUEST_CODE = "NAVIGATION_REQUEST_CODE"
private const val DESTINATION_NOT_SET = -1
private const val REQUEST_CODE_NOT_SET = "REQUEST_CODE_NOT_SET"
}
}

View file

@ -0,0 +1,5 @@
package com.tangem.ui.navigation
import android.os.Bundle
data class NavigationResult(val requestCode: String, val resultCode: Int, val data: Bundle? = null)

View file

@ -0,0 +1,7 @@
package com.tangem.ui.navigation
import android.os.Bundle
interface NavigationResultListener {
fun onNavigationResult(requestCode: String, resultCode: Int, data: Bundle? = null)
}