diff --git a/.idea/navEditor.xml b/.idea/navEditor.xml index 18a4c9b1d1..16f8dca67c 100644 --- a/.idea/navEditor.xml +++ b/.idea/navEditor.xml @@ -311,6 +311,15 @@ + diff --git a/app/src/main/java/com/tangem/App.kt b/app/src/main/java/com/tangem/App.kt index 64d16a74e3..04bbe17063 100644 --- a/app/src/main/java/com/tangem/App.kt +++ b/app/src/main/java/com/tangem/App.kt @@ -4,12 +4,15 @@ import android.app.Application import androidx.appcompat.app.AppCompatDelegate import com.google.gson.Gson 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.PINStorage import com.tangem.card_common.data.Issuer 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.wallet.BuildConfig import java.io.InputStreamReader @@ -26,7 +29,6 @@ class App : Application() { } lateinit var networkComponent: NetworkComponent - lateinit var navigatorComponent: NavigatorComponent lateinit var toastHelperComponent: ToastHelperComponent lateinit var firmwaresStorage: Firmwares @@ -41,7 +43,6 @@ class App : Application() { instance = this networkComponent = DaggerNetworkComponent.create() - navigatorComponent = buildNavigatorComponent() toastHelperComponent = buildToastHelperComponent() PrefsManager.getInstance().init(this) @@ -76,11 +77,6 @@ class App : Application() { } } - private fun buildNavigatorComponent(): NavigatorComponent { - return DaggerNavigatorComponent.builder() - .build() - } - private fun buildToastHelperComponent(): ToastHelperComponent { return DaggerToastHelperComponent.builder() .build() diff --git a/app/src/main/java/com/tangem/di/Navigator.kt b/app/src/main/java/com/tangem/di/Navigator.kt deleted file mode 100644 index a1204b9470..0000000000 --- a/app/src/main/java/com/tangem/di/Navigator.kt +++ /dev/null @@ -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) - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/di/NavigatorComponent.kt b/app/src/main/java/com/tangem/di/NavigatorComponent.kt deleted file mode 100644 index 25990b46a1..0000000000 --- a/app/src/main/java/com/tangem/di/NavigatorComponent.kt +++ /dev/null @@ -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) - -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/di/NavigatorModule.kt b/app/src/main/java/com/tangem/di/NavigatorModule.kt index 0028345e74..b0bfb00afc 100644 --- a/app/src/main/java/com/tangem/di/NavigatorModule.kt +++ b/app/src/main/java/com/tangem/di/NavigatorModule.kt @@ -1,21 +1,13 @@ package com.tangem.di import com.tangem.ui.dialog.WaitSecurityDelayDialogNew - -import javax.inject.Singleton - import dagger.Module import dagger.Provides +import javax.inject.Singleton @Module internal class NavigatorModule { - @Singleton - @Provides - fun provideNavigator(): Navigator { - return Navigator() - } - @Singleton @Provides fun provideToastHelper(): ToastHelper { diff --git a/app/src/main/java/com/tangem/di/ToastHelperComponent.kt b/app/src/main/java/com/tangem/di/ToastHelperComponent.kt index 24d5165c5e..b98d944333 100644 --- a/app/src/main/java/com/tangem/di/ToastHelperComponent.kt +++ b/app/src/main/java/com/tangem/di/ToastHelperComponent.kt @@ -1,9 +1,5 @@ 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 dagger.Component import javax.inject.Singleton @@ -14,12 +10,4 @@ interface ToastHelperComponent { fun inject(activity: MainActivity) - fun inject(activity: LoadedWalletActivity) - - fun inject(activity: ConfirmTransactionActivity) - - fun inject(activity: PrepareTransactionActivity) - - fun inject(activity: EmptyWalletActivity) - } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/ui/activity/GlobalViewModel.kt b/app/src/main/java/com/tangem/ui/activity/GlobalViewModel.kt new file mode 100644 index 0000000000..639a9ac7d4 --- /dev/null +++ b/app/src/main/java/com/tangem/ui/activity/GlobalViewModel.kt @@ -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 +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/ui/activity/MainActivity.kt b/app/src/main/java/com/tangem/ui/activity/MainActivity.kt index 075ff25409..71be563abc 100644 --- a/app/src/main/java/com/tangem/ui/activity/MainActivity.kt +++ b/app/src/main/java/com/tangem/ui/activity/MainActivity.kt @@ -13,31 +13,29 @@ import android.os.Bundle import androidx.appcompat.app.AppCompatActivity import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat -import androidx.navigation.NavController -import androidx.navigation.Navigation +import androidx.lifecycle.ViewModelProviders import com.scottyab.rootbeer.RootBeer import com.tangem.App import com.tangem.Constant +import com.tangem.card_android.android.nfc.NfcLifecycleObserver import com.tangem.card_android.android.reader.NfcManager -import com.tangem.di.Navigator import com.tangem.di.ToastHelper import com.tangem.ui.dialog.RootFoundDialog import com.tangem.wallet.BuildConfig import com.tangem.wallet.R import javax.inject.Inject -class MainActivity : AppCompatActivity() { +class MainActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { companion object { val TAG: String = MainActivity::class.java.simpleName fun callingIntent(context: Context) = Intent(context, MainActivity::class.java) } - lateinit var navController: NavController - @Inject - internal lateinit var navigator: Navigator @Inject internal lateinit var toastHelper: ToastHelper + lateinit var viewModel: GlobalViewModel + lateinit var nfcManager: NfcManager // private var onNfcReaderCallback: NfcAdapter.ReaderCallback? = null @@ -54,15 +52,17 @@ class MainActivity : AppCompatActivity() { super.onCreate(savedInstanceState) 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) requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT verifyPermissions() + nfcManager = NfcManager(this, this) + lifecycle.addObserver(NfcLifecycleObserver(nfcManager)) + // // NFC // val intent = intent // 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) + } + } + } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/ui/fragment/BaseFragment.kt b/app/src/main/java/com/tangem/ui/fragment/BaseFragment.kt new file mode 100644 index 0000000000..7004f6e794 --- /dev/null +++ b/app/src/main/java/com/tangem/ui/fragment/BaseFragment.kt @@ -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" + } +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/ui/navigation/NavigationResult.kt b/app/src/main/java/com/tangem/ui/navigation/NavigationResult.kt new file mode 100644 index 0000000000..ffa42a3976 --- /dev/null +++ b/app/src/main/java/com/tangem/ui/navigation/NavigationResult.kt @@ -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) \ No newline at end of file diff --git a/app/src/main/java/com/tangem/ui/navigation/NavigationResultListener.kt b/app/src/main/java/com/tangem/ui/navigation/NavigationResultListener.kt new file mode 100644 index 0000000000..f0e1681864 --- /dev/null +++ b/app/src/main/java/com/tangem/ui/navigation/NavigationResultListener.kt @@ -0,0 +1,7 @@ +package com.tangem.ui.navigation + +import android.os.Bundle + +interface NavigationResultListener { + fun onNavigationResult(requestCode: String, resultCode: Int, data: Bundle? = null) +} \ No newline at end of file