From 09ef09c8b2fb57ec23b41fffb27bd30b19f16ba4 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 23 Aug 2019 15:45:14 +0300 Subject: [PATCH] Updated on 2026-08-14 --- app/src/main/AndroidManifest.xml | 96 +------- app/src/main/java/com/tangem/Constant.kt | 70 +++--- .../ConfirmWithFingerprintTask.java | 28 +-- .../StartFingerprintReaderTask.java | 26 ++- .../ui/activity/LoadedWalletActivity.kt | 50 ---- .../tangem/ui/activity/SettingsActivity.kt | 30 --- .../tangem/ui/activity/VerifyCardActivity.kt | 43 ---- .../ui/dialog/WaitSecurityDelayDialog.java | 14 +- .../LogoFragment.kt} | 38 +-- .../com/tangem/ui/fragment/MainFragment.kt | 88 ++++--- .../PurgeFragment.kt} | 94 ++++---- .../QrScanFragment.kt} | 46 ++-- .../SendTransactionFragment.kt} | 62 +++-- .../tangem/ui/fragment/SettingsFragment.kt | 23 ++ .../{VerifyCard.kt => VerifyCardFragment.kt} | 217 ++++++++++-------- ...areCryptonitOtherApiWithdrawalFragment.kt} | 109 ++++----- .../PrepareCryptonitWithdrawalFragment.kt} | 71 +++--- .../PrepareKrakenWithdrawalFragment.kt} | 94 +++----- .../pin/PinRequestFragment.kt} | 176 +++++++------- .../pin/PinSaveFragment.kt} | 72 +++--- .../pin/PinSwapFragment.kt} | 92 ++++---- .../wallet/CreateNewWalletFragment.kt} | 86 +++---- .../wallet/EmptyWalletFragment.kt} | 133 ++++++----- .../{ => wallet}/LoadedWalletFragment.kt | 214 ++++++++++------- .../{ => wallet}/LoadedWalletViewModel.kt | 3 +- .../res/layout/activity_loaded_wallet.xml | 21 -- .../main/res/layout/activity_verify_card.xml | 18 -- app/src/main/res/layout/fr_loaded_wallet.xml | 5 +- app/src/main/res/layout/fr_verify_card.xml | 5 +- ...let.xml => fragment_create_new_wallet.xml} | 3 +- ...y_wallet.xml => fragment_empty_wallet.xml} | 1 - .../{activity_logo.xml => fragment_logo.xml} | 1 - ...n_request.xml => fragment_pin_request.xml} | 3 +- ...ity_pin_save.xml => fragment_pin_save.xml} | 3 +- ...ity_pin_swap.xml => fragment_pin_swap.xml} | 3 +- ...repare_cryptonit_other_api_withdrawal.xml} | 3 +- ...fragment_prepare_cryptonit_withdrawal.xml} | 3 +- ...=> fragment_prepare_kraken_withdrawal.xml} | 3 +- ...{activity_purge.xml => fragment_purge.xml} | 3 +- ...tion.xml => fragment_send_transaction.xml} | 4 +- ...ity_settings.xml => fragment_settings.xml} | 17 +- .../res/layout/layout_progress_horizontal.xml | 2 +- app/src/main/res/navigation/main_graph.xml | 178 +++++++++++++- app/src/main/res/values/styles.xml | 13 ++ ...ivity.kt => ConfirmTransactionFragment.kt} | 169 +++++++------- ...ivity.kt => PrepareTransactionFragment.kt} | 80 +++---- ...Activity.kt => SignTransactionFragment.kt} | 149 ++++++------ ...n.xml => fragment_confirm_transaction.xml} | 2 +- ...n.xml => fragment_prepare_transaction.xml} | 2 +- ...tion.xml => fragment_sign_transaction.xml} | 3 +- ...ivity.kt => ConfirmTransactionFragment.kt} | 170 +++++++------- ...ivity.kt => PrepareTransactionFragment.kt} | 88 +++---- ...Activity.kt => SignTransactionFragment.kt} | 128 +++++------ ...n.xml => fragment_confirm_transaction.xml} | 1 - ...n.xml => fragment_prepare_transaction.xml} | 1 - ...tion.xml => fragment_sign_transaction.xml} | 3 +- 56 files changed, 1443 insertions(+), 1617 deletions(-) delete mode 100644 app/src/main/java/com/tangem/ui/activity/LoadedWalletActivity.kt delete mode 100644 app/src/main/java/com/tangem/ui/activity/SettingsActivity.kt delete mode 100644 app/src/main/java/com/tangem/ui/activity/VerifyCardActivity.kt rename app/src/main/java/com/tangem/ui/{activity/LogoActivity.kt => fragment/LogoFragment.kt} (62%) rename app/src/main/java/com/tangem/ui/{activity/PurgeActivity.kt => fragment/PurgeFragment.kt} (70%) rename app/src/main/java/com/tangem/ui/{activity/QrScanActivity.kt => fragment/QrScanFragment.kt} (55%) rename app/src/main/java/com/tangem/ui/{activity/SendTransactionActivity.kt => fragment/SendTransactionFragment.kt} (60%) rename app/src/main/java/com/tangem/ui/fragment/{VerifyCard.kt => VerifyCardFragment.kt} (67%) rename app/src/main/java/com/tangem/ui/{activity/PrepareCryptonitOtherApiWithdrawalActivity.kt => fragment/additional/PrepareCryptonitOtherApiWithdrawalFragment.kt} (58%) rename app/src/main/java/com/tangem/ui/{activity/PrepareCryptonitWithdrawalActivity.kt => fragment/additional/PrepareCryptonitWithdrawalFragment.kt} (69%) rename app/src/main/java/com/tangem/ui/{activity/PrepareKrakenWithdrawalActivity.kt => fragment/additional/PrepareKrakenWithdrawalFragment.kt} (72%) rename app/src/main/java/com/tangem/ui/{activity/PinRequestActivity.kt => fragment/pin/PinRequestFragment.kt} (63%) rename app/src/main/java/com/tangem/ui/{activity/PinSaveActivity.kt => fragment/pin/PinSaveFragment.kt} (83%) rename app/src/main/java/com/tangem/ui/{activity/PinSwapActivity.kt => fragment/pin/PinSwapFragment.kt} (65%) rename app/src/main/java/com/tangem/ui/{activity/CreateNewWalletActivity.kt => fragment/wallet/CreateNewWalletFragment.kt} (66%) rename app/src/main/java/com/tangem/ui/{activity/EmptyWalletActivity.kt => fragment/wallet/EmptyWalletFragment.kt} (62%) rename app/src/main/java/com/tangem/ui/fragment/{ => wallet}/LoadedWalletFragment.kt (76%) rename app/src/main/java/com/tangem/ui/fragment/{ => wallet}/LoadedWalletViewModel.kt (95%) delete mode 100644 app/src/main/res/layout/activity_loaded_wallet.xml delete mode 100644 app/src/main/res/layout/activity_verify_card.xml rename app/src/main/res/layout/{activity_create_new_wallet.xml => fragment_create_new_wallet.xml} (93%) rename app/src/main/res/layout/{activity_empty_wallet.xml => fragment_empty_wallet.xml} (96%) rename app/src/main/res/layout/{activity_logo.xml => fragment_logo.xml} (98%) rename app/src/main/res/layout/{activity_pin_request.xml => fragment_pin_request.xml} (95%) rename app/src/main/res/layout/{activity_pin_save.xml => fragment_pin_save.xml} (96%) rename app/src/main/res/layout/{activity_pin_swap.xml => fragment_pin_swap.xml} (94%) rename app/src/main/res/layout/{activity_prepare_cryptonit_other_api_withdrawal.xml => fragment_prepare_cryptonit_other_api_withdrawal.xml} (99%) rename app/src/main/res/layout/{activity_prepare_cryptonit_withdrawal.xml => fragment_prepare_cryptonit_withdrawal.xml} (99%) rename app/src/main/res/layout/{activity_prepare_kraken_withdrawal.xml => fragment_prepare_kraken_withdrawal.xml} (99%) rename app/src/main/res/layout/{activity_purge.xml => fragment_purge.xml} (94%) rename app/src/main/res/layout/{activity_send_transaction.xml => fragment_send_transaction.xml} (90%) rename app/src/main/res/layout/{activity_settings.xml => fragment_settings.xml} (61%) rename app/src/tangemAccess/java/com/tangem/ui/{ConfirmTransactionActivity.kt => ConfirmTransactionFragment.kt} (61%) rename app/src/tangemAccess/java/com/tangem/ui/{PrepareTransactionActivity.kt => PrepareTransactionFragment.kt} (68%) rename app/src/tangemAccess/java/com/tangem/ui/{SignTransactionActivity.kt => SignTransactionFragment.kt} (64%) rename app/src/tangemAccess/res/layout/{activity_confirm_transaction.xml => fragment_confirm_transaction.xml} (99%) rename app/src/tangemAccess/res/layout/{activity_prepare_transaction.xml => fragment_prepare_transaction.xml} (99%) rename app/src/tangemAccess/res/layout/{activity_sign_transaction.xml => fragment_sign_transaction.xml} (96%) rename app/src/tangemCardano/java/com/tangem/ui/{ConfirmTransactionActivity.kt => ConfirmTransactionFragment.kt} (64%) rename app/src/tangemCardano/java/com/tangem/ui/{PrepareTransactionActivity.kt => PrepareTransactionFragment.kt} (70%) rename app/src/tangemCardano/java/com/tangem/ui/{SignTransactionActivity.kt => SignTransactionFragment.kt} (73%) rename app/src/tangemCardano/res/layout/{activity_confirm_transaction.xml => fragment_confirm_transaction.xml} (99%) rename app/src/tangemCardano/res/layout/{activity_prepare_transaction.xml => fragment_prepare_transaction.xml} (99%) rename app/src/tangemCardano/res/layout/{activity_sign_transaction.xml => fragment_sign_transaction.xml} (96%) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index da617682cb..c88f40cd56 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -38,7 +38,8 @@ @@ -46,13 +47,6 @@ - - - @@ -77,92 +71,6 @@ android:name="android.nfc.action.TECH_DISCOVERED" android:resource="@xml/nfc_tech_filter" /> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/java/com/tangem/Constant.kt b/app/src/main/java/com/tangem/Constant.kt index 2346fa8fd4..5fcec8f2a6 100644 --- a/app/src/main/java/com/tangem/Constant.kt +++ b/app/src/main/java/com/tangem/Constant.kt @@ -26,75 +26,75 @@ object Constant { const val INTENT_TYPE_TEXT_PLAIN = "text/plain" - // LoadedWalletFragment, VerifyCard - const val REQUEST_CODE_SEND_TRANSACTION = 1 - const val REQUEST_CODE_PURGE = 2 - const val REQUEST_CODE_REQUEST_PIN2_FOR_PURGE = 3 - const val REQUEST_CODE_VERIFY_CARD = 4 - const val REQUEST_CODE_ENTER_NEW_PIN = 5 - const val REQUEST_CODE_ENTER_NEW_PIN2 = 6 - const val REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN = 7 - const val REQUEST_CODE_SWAP_PIN = 8 - const val REQUEST_CODE_RECEIVE_TRANSACTION = 9 + // LoadedWalletFragment, VerifyCardFragment + const val REQUEST_CODE_SEND_TRANSACTION = "REQUEST_CODE_SEND_TRANSACTION" + const val REQUEST_CODE_PURGE = "REQUEST_CODE_PURGE" + const val REQUEST_CODE_REQUEST_PIN2_FOR_PURGE = "REQUEST_CODE_REQUEST_PIN2_FOR_PURGE" + const val REQUEST_CODE_VERIFY_CARD = "REQUEST_CODE_VERIFY_CARD" + const val REQUEST_CODE_ENTER_NEW_PIN = "REQUEST_CODE_ENTER_NEW_PIN" + const val REQUEST_CODE_ENTER_NEW_PIN2 = "REQUEST_CODE_ENTER_NEW_PIN2" + const val REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN = "REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN" + const val REQUEST_CODE_SWAP_PIN = "REQUEST_CODE_SWAP_PIN" + const val REQUEST_CODE_RECEIVE_TRANSACTION = "REQUEST_CODE_RECEIVE_TRANSACTION" - // MainActivity - const val REQUEST_CODE_SHOW_CARD_ACTIVITY = 1 - const val REQUEST_CODE_ENTER_PIN_ACTIVITY = 2 - const val REQUEST_CODE_SEND_EMAIL = 3 + // MainFragment + const val REQUEST_CODE_SHOW_CARD_ACTIVITY = "REQUEST_CODE_SHOW_CARD_ACTIVITY" + const val REQUEST_CODE_ENTER_PIN_ACTIVITY = "REQUEST_CODE_ENTER_PIN_ACTIVITY" + const val REQUEST_CODE_SEND_EMAIL = "REQUEST_CODE_SEND_EMAIL" const val REQUEST_CODE_REQUEST_CAMERA_PERMISSIONS = 3 const val EXTRA_LAST_DISCOVERED_TAG = "extra_last_tag" const val EXTRA_PIN2 = "PIN2" - // LogoActivity + // LogoFragment const val EXTRA_AUTO_HIDE = "extra_auto_hide" const val MILLIS_AUTO_HIDE = 1000 - // PinRequestActivity + // PinRequestFragment const val KEY_ALIAS = "pinKey" const val KEYSTORE = "AndroidKeyStore" - // QrScanActivity + // QrScanFragment const val EXTRA_QR_CODE = "QRCode" - // PinSwapActivity + // PinSwapFragment const val EXTRA_CONFIRM_PIN = "confirmPIN" const val EXTRA_CONFIRM_PIN_2 = "confirmPIN2" const val EXTRA_NEW_PIN = "newPIN" const val EXTRA_NEW_PIN_2 = "newPIN2" - // CreateNewWalletActivity + // CreateNewWalletFragment const val RESULT_INVALID_PIN = Activity.RESULT_FIRST_USER - // EmptyWalletActivity - const val REQUEST_CODE_CREATE_NEW_WALLET_ACTIVITY = 2 - const val REQUEST_CODE_REQUEST_PIN2 = 3 + // EmptyWalletFragment + const val REQUEST_CODE_CREATE_NEW_WALLET_ACTIVITY = "REQUEST_CODE_CREATE_NEW_WALLET_ACTIVITY" + const val REQUEST_CODE_REQUEST_PIN2 = "REQUEST_CODE_REQUEST_PIN2" - // ConfirmTransactionActivity - const val REQUEST_CODE_SIGN_TRANSACTION = 1 - const val REQUEST_CODE_REQUEST_PIN2_ = 2 + // ConfirmTransactionFragment + const val REQUEST_CODE_SIGN_TRANSACTION = "REQUEST_CODE_SIGN_TRANSACTION" + const val REQUEST_CODE_REQUEST_PIN2_ = "REQUEST_CODE_REQUEST_PIN2_" - // SendTransactionActivity + // SendTransactionFragment const val EXTRA_TX: String = "TX" - // SignTransactionActivity + // SignTransactionFragment const val EXTRA_AMOUNT = "Amount" const val EXTRA_AMOUNT_CURRENCY = "AmountCurrency" const val EXTRA_FEE = "Fee" const val EXTRA_FEE_CURRENCY = "FeeCurrency" const val EXTRA_FEE_INCLUDED = "FeeIncluded" const val EXTRA_TARGET_ADDRESS = "TargetAddress" - const val REQUEST_CODE_SEND_TRANSACTION_ = 1 + const val REQUEST_CODE_SEND_TRANSACTION_ = "REQUEST_CODE_SEND_TRANSACTION_" const val RESULT_INVALID_PIN_ = Activity.RESULT_FIRST_USER - // PrepareTransactionActivity - const val REQUEST_CODE_SCAN_QR = 1 - const val REQUEST_CODE_SEND_TRANSACTION__ = 2 + // PrepareTransactionFragment + const val REQUEST_CODE_SCAN_QR = "REQUEST_CODE_SCAN_QR" + const val REQUEST_CODE_SEND_TRANSACTION__ = "REQUEST_CODE_SEND_TRANSACTION__" - // PrepareCryptonitOtherApiWithdrawalActivity - const val REQUEST_CODE_SCAN_QR_KEY = 1 - const val REQUEST_CODE_SCAN_QR_SECRET = 2 - const val REQUEST_CODE_SCAN_QR_USER_ID = 3 + // PrepareCryptonitOtherApiWithdrawalFragment + const val REQUEST_CODE_SCAN_QR_KEY = "REQUEST_CODE_SCAN_QR_KEY" + const val REQUEST_CODE_SCAN_QR_SECRET = "REQUEST_CODE_SCAN_QR_SECRET" + const val REQUEST_CODE_SCAN_QR_USER_ID = "REQUEST_CODE_SCAN_QR_USER_ID" } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/data/fingerprint/ConfirmWithFingerprintTask.java b/app/src/main/java/com/tangem/data/fingerprint/ConfirmWithFingerprintTask.java index e9d02d158a..ebcf22e73f 100644 --- a/app/src/main/java/com/tangem/data/fingerprint/ConfirmWithFingerprintTask.java +++ b/app/src/main/java/com/tangem/data/fingerprint/ConfirmWithFingerprintTask.java @@ -3,7 +3,7 @@ package com.tangem.data.fingerprint; import android.os.AsyncTask; import android.widget.Toast; -import com.tangem.ui.activity.PinSaveActivity; +import com.tangem.ui.fragment.pin.PinSaveFragment; import com.tangem.wallet.R; import java.lang.ref.WeakReference; @@ -11,9 +11,9 @@ import java.lang.ref.WeakReference; import javax.crypto.Cipher; public class ConfirmWithFingerprintTask extends AsyncTask { - private WeakReference reference; + private WeakReference reference; - public ConfirmWithFingerprintTask(PinSaveActivity context) { + public ConfirmWithFingerprintTask(PinSaveFragment context) { reference = new WeakReference<>(context); reference.get().setFingerprintHelper(new FingerprintHelper(reference.get())); @@ -21,40 +21,40 @@ public class ConfirmWithFingerprintTask extends AsyncTask { @Override protected Boolean doInBackground(Void... params) { - PinSaveActivity pinSaveActivity = reference.get(); + PinSaveFragment pinSaveFragment = reference.get(); - if (!pinSaveActivity.getKeyStore()) + if (!pinSaveFragment.getKeyStore()) return false; - if (!pinSaveActivity.createNewKey(false)) + if (!pinSaveFragment.createNewKey(false)) return false; - if (!pinSaveActivity.getCipher()) + if (!pinSaveFragment.getCipher()) return false; - return pinSaveActivity.initCipher(Cipher.ENCRYPT_MODE) && pinSaveActivity.initCryptObject(); + return pinSaveFragment.initCipher(Cipher.ENCRYPT_MODE) && pinSaveFragment.initCryptObject(); } @Override protected void onPostExecute(final Boolean success) { - PinSaveActivity pinSaveActivity = reference.get(); + PinSaveFragment pinSaveFragment = reference.get(); onCancelled(); if (!success) { - Toast.makeText(pinSaveActivity, R.string.pin_save_fail, Toast.LENGTH_LONG).show(); + Toast.makeText(pinSaveFragment.getContext(), R.string.pin_save_fail, Toast.LENGTH_LONG).show(); } else { - pinSaveActivity.getFingerprintHelper().startAuth(pinSaveActivity.getFingerprintManager(), pinSaveActivity.getCryptoObject()); + pinSaveFragment.getFingerprintHelper().startAuth(pinSaveFragment.getFingerprintManager(), pinSaveFragment.getCryptoObject()); } } @Override protected void onCancelled() { - PinSaveActivity pinSaveActivity = reference.get(); + PinSaveFragment pinSaveFragment = reference.get(); - if (pinSaveActivity.getDFingerPrintConfirmation() != null) { - pinSaveActivity.getDFingerPrintConfirmation().cancel(); + if (pinSaveFragment.getDFingerPrintConfirmation() != null) { + pinSaveFragment.getDFingerPrintConfirmation().cancel(); } } diff --git a/app/src/main/java/com/tangem/data/fingerprint/StartFingerprintReaderTask.java b/app/src/main/java/com/tangem/data/fingerprint/StartFingerprintReaderTask.java index a7be716ea6..e99dc30a23 100644 --- a/app/src/main/java/com/tangem/data/fingerprint/StartFingerprintReaderTask.java +++ b/app/src/main/java/com/tangem/data/fingerprint/StartFingerprintReaderTask.java @@ -10,7 +10,7 @@ import android.security.keystore.KeyProperties; import com.tangem.Constant; import com.tangem.card_android.android.data.PINStorage; -import com.tangem.ui.activity.PinRequestActivity; +import com.tangem.ui.fragment.pin.PinRequestFragment; import com.tangem.util.LOG; import java.io.IOException; @@ -29,7 +29,7 @@ import javax.crypto.spec.IvParameterSpec; public class StartFingerprintReaderTask extends AsyncTask { public static final String TAG = StartFingerprintReaderTask.class.getSimpleName(); - private WeakReference reference; + private WeakReference reference; private KeyStore keyStore; private Cipher cipher; @@ -39,13 +39,13 @@ public class StartFingerprintReaderTask extends AsyncTask { FingerprintManager fingerprintManager; FingerprintHelper fingerprintHelper; - PinRequestActivity activity; + PinRequestFragment fragment; - public StartFingerprintReaderTask(PinRequestActivity activity, FingerprintManager fingerprintManager, FingerprintHelper fingerprintHelper) { - reference = new WeakReference<>(activity); + public StartFingerprintReaderTask(PinRequestFragment fragment, FingerprintManager fingerprintManager, FingerprintHelper fingerprintHelper) { + reference = new WeakReference<>(fragment); this.fingerprintManager = fingerprintManager; this.fingerprintHelper = fingerprintHelper; - this.activity = activity; + this.fragment = fragment; } @Override @@ -80,9 +80,9 @@ public class StartFingerprintReaderTask extends AsyncTask { @Override protected void onCancelled() { - PinRequestActivity pinRequestActivity = reference.get(); + PinRequestFragment fragment = reference.get(); - pinRequestActivity.setStartFingerprintReaderTask(null); + fragment.setStartFingerprintReaderTask(null); } private boolean getKeyStore() { @@ -143,7 +143,7 @@ public class StartFingerprintReaderTask extends AsyncTask { @TargetApi(Build.VERSION_CODES.M) private boolean initCipher(int mode) { - PinRequestActivity pinRequestActivity = reference.get(); + PinRequestFragment fragment = reference.get(); LOG.i(TAG, "Initializing cipher..."); try { @@ -154,9 +154,13 @@ public class StartFingerprintReaderTask extends AsyncTask { cipher.init(mode, keyspec); } else { byte[] iv = null; - if (pinRequestActivity.getMode() == PinRequestActivity.Mode.RequestPIN || activity.getMode() == PinRequestActivity.Mode.RequestNewPIN || activity.getMode() == PinRequestActivity.Mode.ConfirmNewPIN) { + if (fragment.getMode() == PinRequestFragment.Mode.RequestPIN || + fragment.getMode() == PinRequestFragment.Mode.RequestNewPIN || + fragment.getMode() == PinRequestFragment.Mode.ConfirmNewPIN) { iv = PINStorage.loadEncryptedIV(); - } else if (activity.getMode() == PinRequestActivity.Mode.RequestPIN2 || activity.getMode() == PinRequestActivity.Mode.RequestNewPIN2 || activity.getMode() == PinRequestActivity.Mode.ConfirmNewPIN2) { + } else if (fragment.getMode() == PinRequestFragment.Mode.RequestPIN2 || + fragment.getMode() == PinRequestFragment.Mode.RequestNewPIN2 || + fragment.getMode() == PinRequestFragment.Mode.ConfirmNewPIN2) { iv = PINStorage.loadEncryptedIV2(); } IvParameterSpec ivspec = new IvParameterSpec(iv); diff --git a/app/src/main/java/com/tangem/ui/activity/LoadedWalletActivity.kt b/app/src/main/java/com/tangem/ui/activity/LoadedWalletActivity.kt deleted file mode 100644 index 1106fe391c..0000000000 --- a/app/src/main/java/com/tangem/ui/activity/LoadedWalletActivity.kt +++ /dev/null @@ -1,50 +0,0 @@ -package com.tangem.ui.activity - -import android.content.Context -import android.content.Intent -import android.nfc.NfcAdapter -import android.nfc.Tag -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.tangem.App -import com.tangem.Constant -import com.tangem.di.Navigator -import com.tangem.di.ToastHelper -import com.tangem.wallet.TangemContext -import com.tangem.ui.fragment.LoadedWalletFragment -import com.tangem.wallet.R -import javax.inject.Inject - -class LoadedWalletActivity : AppCompatActivity() { - - @Inject - lateinit var navigator: Navigator - @Inject - internal lateinit var toastHelper: ToastHelper - - companion object { - fun callingIntent(context: Context, lastTag: Tag, ctx: TangemContext): Intent { - val intent = Intent(context, LoadedWalletActivity::class.java) - intent.putExtra(Constant.EXTRA_LAST_DISCOVERED_TAG, lastTag) - ctx.saveToIntent(intent) - return intent - } - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_loaded_wallet) - - App.navigatorComponent.inject(this) - App.toastHelperComponent.inject(this) - - if (intent.extras!!.containsKey(NfcAdapter.EXTRA_TAG)) { - val tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG) - if (tag != null) { - val fragment = supportFragmentManager.findFragmentById(R.id.loaded_wallet_fragment) as LoadedWalletFragment - fragment.onTagDiscovered(tag) - } - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/ui/activity/SettingsActivity.kt b/app/src/main/java/com/tangem/ui/activity/SettingsActivity.kt deleted file mode 100644 index 51c4aa2564..0000000000 --- a/app/src/main/java/com/tangem/ui/activity/SettingsActivity.kt +++ /dev/null @@ -1,30 +0,0 @@ -package com.tangem.ui.activity - -import android.content.Context -import android.content.Intent -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import androidx.appcompat.widget.Toolbar -import com.tangem.wallet.R - -class SettingsActivity : AppCompatActivity() { - companion object { - fun callingIntent(context: Context) = Intent(context, SettingsActivity::class.java) - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_settings) - - initToolbar() - } - - private fun initToolbar() { - val toolbar = findViewById(R.id.toolbar) - toolbar.setTitle(R.string.settings) - toolbar.setNavigationIcon(android.R.drawable.ic_menu_close_clear_cancel) - setSupportActionBar(toolbar) - toolbar.setNavigationOnClickListener { finish() } - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/ui/activity/VerifyCardActivity.kt b/app/src/main/java/com/tangem/ui/activity/VerifyCardActivity.kt deleted file mode 100644 index 394d7c41e0..0000000000 --- a/app/src/main/java/com/tangem/ui/activity/VerifyCardActivity.kt +++ /dev/null @@ -1,43 +0,0 @@ -package com.tangem.ui.activity - -import android.content.Context -import android.content.Intent -import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import com.tangem.App -import com.tangem.Constant -import com.tangem.di.Navigator -import com.tangem.wallet.TangemContext -import com.tangem.ui.fragment.VerifyCard -import com.tangem.wallet.R -import javax.inject.Inject - -class VerifyCardActivity : AppCompatActivity() { - - @Inject - lateinit var navigator: Navigator - - companion object { - fun callingIntent(context: Context, ctx: TangemContext): Intent { - val intent = Intent(context, VerifyCardActivity::class.java) - ctx.saveToIntent(intent) - return intent - } - } - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_verify_card) - - App.navigatorComponent.inject(this) - } - - override fun onBackPressed() { - super.onBackPressed() - val verifyCard = supportFragmentManager.findFragmentById(R.id.verify_card_fragment) as VerifyCard - val data = verifyCard.prepareResultIntent() - data.putExtra(Constant.EXTRA_MODIFICATION, Constant.EXTRA_MODIFICATION_UPDATE) - finish() - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/ui/dialog/WaitSecurityDelayDialog.java b/app/src/main/java/com/tangem/ui/dialog/WaitSecurityDelayDialog.java index 3186affc30..b9633c17ca 100644 --- a/app/src/main/java/com/tangem/ui/dialog/WaitSecurityDelayDialog.java +++ b/app/src/main/java/com/tangem/ui/dialog/WaitSecurityDelayDialog.java @@ -10,17 +10,17 @@ import android.view.View; import android.view.WindowManager; import android.widget.ProgressBar; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.FragmentActivity; + import com.tangem.card_common.util.Log; import com.tangem.wallet.R; import java.util.Timer; import java.util.TimerTask; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.appcompat.app.AppCompatActivity; -import androidx.fragment.app.DialogFragment; - /** * Created by dvol on 06.03.2018. */ @@ -78,7 +78,7 @@ public class WaitSecurityDelayDialog extends DialogFragment { super.onCancel(dialog); } - public static void onReadBeforeRequest(final AppCompatActivity activity, final int timeout) { + public static void onReadBeforeRequest(final FragmentActivity activity, final int timeout) { activity.runOnUiThread(() -> { if (timerToShowDelayDialog != null || timeout < delayBeforeShowDialog + minRemainingDelayToShowDialog) return; @@ -104,7 +104,7 @@ public class WaitSecurityDelayDialog extends DialogFragment { }); } - public static void onReadWait(final AppCompatActivity activity, final int msec) { + public static void onReadWait(final FragmentActivity activity, final int msec) { Log.e(TAG, "onReadWait callback(" + msec + ")"); activity.runOnUiThread(() -> { Log.e(TAG, "onReadWait on ui thread(" + msec + ")"); diff --git a/app/src/main/java/com/tangem/ui/activity/LogoActivity.kt b/app/src/main/java/com/tangem/ui/fragment/LogoFragment.kt similarity index 62% rename from app/src/main/java/com/tangem/ui/activity/LogoActivity.kt rename to app/src/main/java/com/tangem/ui/fragment/LogoFragment.kt index 841440d8f8..c893fcb397 100644 --- a/app/src/main/java/com/tangem/ui/activity/LogoActivity.kt +++ b/app/src/main/java/com/tangem/ui/fragment/LogoFragment.kt @@ -1,45 +1,32 @@ -package com.tangem.ui.activity +package com.tangem.ui.fragment import android.content.Context import android.content.Intent import android.os.Bundle import android.view.View -import androidx.appcompat.app.AppCompatActivity -import com.tangem.App import com.tangem.Constant -import com.tangem.di.Navigator -import com.tangem.wallet.TangemContext import com.tangem.wallet.BuildConfig import com.tangem.wallet.R -import kotlinx.android.synthetic.main.activity_logo.* -import javax.inject.Inject +import com.tangem.wallet.TangemContext +import kotlinx.android.synthetic.main.fragment_logo.* -class LogoActivity : AppCompatActivity() { +class LogoFragment : BaseFragment() { companion object { fun callingIntent(context: Context, autoHide: Boolean): Intent { - val intent = Intent(context, LogoActivity::class.java) + val intent = Intent(context, LogoFragment::class.java) intent.putExtra(Constant.EXTRA_AUTO_HIDE, autoHide) return intent } } - @Inject - internal lateinit var navigator: Navigator + override val layoutId = R.layout.fragment_logo private val hideRunnable = Runnable { this.hide() } - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_logo) - - App.navigatorComponent.inject(this) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) ivLogo.setOnClickListener { hide() } - } - - override fun onPostCreate(savedInstanceState: Bundle?) { - super.onPostCreate(savedInstanceState) - // set beta version name if (BuildConfig.DEBUG) tvAppVersion.text = String.format(getString(R.string.version_name_debug), BuildConfig.VERSION_NAME, BuildConfig.VERSION_CODE) @@ -57,21 +44,20 @@ class LogoActivity : AppCompatActivity() { } } - if (intent.getBooleanExtra(Constant.EXTRA_AUTO_HIDE, true)) + if (arguments?.getBoolean(Constant.EXTRA_AUTO_HIDE, true) != false) ivLogo.postDelayed(hideRunnable, Constant.MILLIS_AUTO_HIDE.toLong()) } private fun hide() { when (BuildConfig.FLAVOR) { Constant.FLAVOR_TANGEM_CARDANO -> { - navigator.showPrepareTransaction(this, TangemContext()) + navigateToDestination(R.id.action_logoFragment_to_prepareTransactionFragment, + Bundle().apply { TangemContext().saveToBundle(this) }) } else -> { - navigator.showMain(this) + navigateToDestination(R.id.action_logoFragment_to_main) } } - - finish() } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/ui/fragment/MainFragment.kt b/app/src/main/java/com/tangem/ui/fragment/MainFragment.kt index 0772abc5ab..d319f2df8c 100644 --- a/app/src/main/java/com/tangem/ui/fragment/MainFragment.kt +++ b/app/src/main/java/com/tangem/ui/fragment/MainFragment.kt @@ -1,7 +1,6 @@ package com.tangem.ui.fragment import android.app.Activity -import android.content.Intent import android.nfc.NfcAdapter import android.nfc.Tag import android.nfc.tech.IsoDep @@ -10,14 +9,12 @@ import android.view.* import android.widget.PopupMenu import android.widget.Toast import androidx.appcompat.app.AppCompatActivity -import androidx.fragment.app.Fragment +import androidx.core.os.bundleOf import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProviders import com.tangem.App import com.tangem.Constant import com.tangem.card_android.android.nfc.NfcDeviceAntennaLocation -import com.tangem.card_android.android.nfc.NfcLifecycleObserver -import com.tangem.card_android.android.reader.NfcManager import com.tangem.card_android.android.reader.NfcReader import com.tangem.card_android.data.EXTRA_TANGEM_CARD import com.tangem.card_android.data.EXTRA_TANGEM_CARD_UID @@ -28,11 +25,11 @@ import com.tangem.card_common.reader.CardProtocol import com.tangem.card_common.tasks.CustomReadCardTask import com.tangem.card_common.tasks.ReadCardInfoTask import com.tangem.data.Logger -import com.tangem.data.network.ServerApiCommon import com.tangem.ui.activity.MainActivity -import com.tangem.ui.activity.PinRequestActivity import com.tangem.ui.dialog.NoExtendedLengthSupportDialog import com.tangem.ui.dialog.WaitSecurityDelayDialog +import com.tangem.ui.fragment.pin.PinRequestFragment +import com.tangem.ui.navigation.NavigationResultListener import com.tangem.util.CommonUtil import com.tangem.util.LOG import com.tangem.util.UtilHelper @@ -45,30 +42,26 @@ import kotlinx.android.synthetic.main.main_fragment.* import java.io.File import java.util.* -class MainFragment : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notifications, androidx.appcompat.widget.PopupMenu.OnMenuItemClickListener, PopupMenu.OnMenuItemClickListener { +class MainFragment : BaseFragment(), NavigationResultListener, NfcAdapter.ReaderCallback, + CardProtocol.Notifications, androidx.appcompat.widget.PopupMenu.OnMenuItemClickListener, + PopupMenu.OnMenuItemClickListener { companion object { fun newInstance() = MainFragment() val TAG: String = MainFragment::class.java.simpleName } + override val layoutId = R.layout.main_fragment private lateinit var viewModel: MainViewModel private lateinit var nfcDeviceAntenna: NfcDeviceAntennaLocation private var unsuccessReadCount = 0 - private lateinit var nfcManager: NfcManager private var task: CustomReadCardTask? = null private var lastTag: Tag? = null private var zipFile: File? = null - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - nfcManager = NfcManager(activity!!, this) - lifecycle.addObserver(NfcLifecycleObserver(nfcManager)) - } - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { setHasOptionsMenu(true) - return inflater.inflate(R.layout.main_fragment, container, false) + return super.onCreateView(inflater, container, savedInstanceState) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -95,7 +88,7 @@ class MainFragment : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific // show snackbar about new version app viewModel.getVersionName().observe(this, Observer { text -> - (activity as MainActivity).toastHelper.showSnackbarUpdateVersion(context!!, cl, text) + (activity as MainActivity).toastHelper.showSnackbarUpdateVersion(requireContext(), cl, text) }) val intent = activity?.intent @@ -131,11 +124,12 @@ class MainFragment : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific lastTag = tag - task = ReadCardInfoTask(NfcReader(nfcManager, isoDep), App.localStorage, App.pinStorage, this) + task = ReadCardInfoTask(NfcReader((activity as MainActivity).nfcManager, isoDep), + App.localStorage, App.pinStorage, this) task?.start() } catch (e: Exception) { e.printStackTrace() - nfcManager.notifyReadResult(false) + (activity as MainActivity).nfcManager.notifyReadResult(false) } } @@ -151,7 +145,7 @@ class MainFragment : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific task = null if (cardProtocol != null) { if (cardProtocol.error == null) { - nfcManager.notifyReadResult(true) + (activity as MainActivity).nfcManager.notifyReadResult(true) rlProgressBar?.post { rlProgressBar?.visibility = View.GONE @@ -179,10 +173,18 @@ class MainFragment : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific // ctx.saveToBundle(bundle) // (activity as MainActivity).navController.navigate(R.id.loadedWallet, bundle) - (activity as MainActivity).navigator.showLoadedWallet(activity!!, it, ctx) + val bundle = Bundle() + bundle.putParcelable(Constant.EXTRA_LAST_DISCOVERED_TAG, lastTag) + ctx.saveToBundle(bundle) + navigateForResult(Constant.REQUEST_CODE_SHOW_CARD_ACTIVITY, + R.id.action_main_to_loadedWalletFragment, bundle) + } } - card.status == TangemCard.Status.Empty -> (activity as MainActivity).navigator.showEmptyWallet(activity!!, ctx) + card.status == TangemCard.Status.Empty -> { + val bundle = Bundle().apply { ctx.saveToBundle(this) } + navigateToDestination(R.id.action_main_to_emptyWalletFragment, bundle) + } card.status == TangemCard.Status.Purged -> Toast.makeText(context, R.string.erased_wallet, Toast.LENGTH_SHORT).show() card.status == TangemCard.Status.NotPersonalized -> Toast.makeText(context, R.string.not_personalized, Toast.LENGTH_SHORT).show() else -> { @@ -203,43 +205,33 @@ class MainFragment : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific Toast.makeText(context, R.string.try_to_scan_again, Toast.LENGTH_SHORT).show() unsuccessReadCount++ - if (cardProtocol.error is CardProtocol.TangemException_InvalidPIN) - (activity as MainActivity).navigator.showPinRequest(activity!!, PinRequestActivity.Mode.RequestPIN.toString()) - else { + if (cardProtocol.error is CardProtocol.TangemException_InvalidPIN) { + val data = Bundle().apply { putString(Constant.EXTRA_MODE, PinRequestFragment.Mode.RequestPIN.toString()) } + navigateForResult(Constant.REQUEST_CODE_ENTER_PIN_ACTIVITY, + R.id.action_main_to_pinRequestFragment, data) + } else { if (cardProtocol.error is CardProtocol.TangemException_ExtendedLengthNotSupported) if (!NoExtendedLengthSupportDialog.allReadyShowed) NoExtendedLengthSupportDialog().show(activity!!.supportFragmentManager, NoExtendedLengthSupportDialog.TAG) lastTag = null ReadCardInfoTask.resetLastReadInfo() - nfcManager.notifyReadResult(false) + (activity as MainActivity).nfcManager.notifyReadResult(false) } } } } - rlProgressBar.postDelayed({ - try { - rlProgressBar.visibility = View.GONE - } catch (e: Exception) { - e.printStackTrace() - } - }, 500) + rlProgressBar?.postDelayed({ rlProgressBar?.visibility = View.GONE }, 500) } override fun onReadCancel() { task = null ReadCardInfoTask.resetLastReadInfo() - rlProgressBar.postDelayed({ - try { - rlProgressBar.visibility = View.GONE - } catch (e: Exception) { - e.printStackTrace() - } - }, 500) + rlProgressBar?.postDelayed({ rlProgressBar?.visibility = View.GONE }, 500) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + override fun onNavigationResult(requestCode: String, resultCode: Int, data: Bundle?) { when (requestCode) { Constant.REQUEST_CODE_SEND_EMAIL -> { if (zipFile != null) { @@ -254,7 +246,6 @@ class MainFragment : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific ReadCardInfoTask.resetLastReadInfo() } } - super.onActivityResult(requestCode, resultCode, data) } override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { @@ -286,26 +277,25 @@ class MainFragment : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific return true } R.id.managePIN -> { - (activity as MainActivity).navigator.showPinSave(activity!!, false) -// (activity as MainActivity).navController.navigate(R.id.pinSaveActivity) + navigateToDestination(R.id.action_main_to_pinSaveFragment, + bundleOf(Constant.EXTRA_PIN2 to false)) return true } R.id.managePIN2 -> { - (activity as MainActivity).navigator.showPinSave(activity!!, true) -// (activity as MainActivity).navController.navigate(R.id.pinSaveActivity) + navigateToDestination(R.id.action_main_to_pinSaveFragment, + bundleOf(Constant.EXTRA_PIN2 to true)) return true } R.id.settings -> { - (activity as MainActivity).navigator.showSettings(activity!!) -// (activity as MainActivity).navController.navigate(R.id.settingsActivity) + navigateToDestination(R.id.action_main_to_settingsFragment) return true } R.id.about -> { - (activity as MainActivity).navigator.showLogo(activity!!, false) -// (activity as MainActivity).navController.navigate(R.id.logoActivity) + val bundle = Bundle().apply { putBoolean(Constant.EXTRA_AUTO_HIDE, false) } + navigateToDestination(R.id.action_main_to_logoFragment, bundle) return true } } diff --git a/app/src/main/java/com/tangem/ui/activity/PurgeActivity.kt b/app/src/main/java/com/tangem/ui/fragment/PurgeFragment.kt similarity index 70% rename from app/src/main/java/com/tangem/ui/activity/PurgeActivity.kt rename to app/src/main/java/com/tangem/ui/fragment/PurgeFragment.kt index c4eec4af3b..d56828abe5 100644 --- a/app/src/main/java/com/tangem/ui/activity/PurgeActivity.kt +++ b/app/src/main/java/com/tangem/ui/fragment/PurgeFragment.kt @@ -1,9 +1,8 @@ -package com.tangem.ui.activity +package com.tangem.ui.fragment import android.app.Activity import android.content.Context import android.content.Intent -import android.content.pm.ActivityInfo import android.content.res.ColorStateList import android.graphics.Color import android.nfc.NfcAdapter @@ -12,36 +11,33 @@ import android.nfc.tech.IsoDep import android.os.Bundle import android.view.View import android.widget.Toast -import androidx.appcompat.app.AppCompatActivity +import androidx.core.os.bundleOf import com.tangem.App import com.tangem.Constant -import com.tangem.wallet.TangemContext -import com.tangem.ui.dialog.NoExtendedLengthSupportDialog -import com.tangem.ui.dialog.WaitSecurityDelayDialog -import com.tangem.ui.dialog.WaitSecurityDelayDialogNew -import com.tangem.ui.event.DeletingWalletFinish import com.tangem.card_android.android.nfc.NfcDeviceAntennaLocation -import com.tangem.card_android.android.nfc.NfcLifecycleObserver -import com.tangem.card_android.android.reader.NfcManager import com.tangem.card_android.android.reader.NfcReader +import com.tangem.card_android.data.EXTRA_TANGEM_CARD +import com.tangem.card_android.data.EXTRA_TANGEM_CARD_UID import com.tangem.card_android.data.asBundle import com.tangem.card_common.reader.CardProtocol import com.tangem.card_common.tasks.PurgeTask import com.tangem.card_common.util.Util +import com.tangem.ui.activity.MainActivity +import com.tangem.ui.dialog.NoExtendedLengthSupportDialog +import com.tangem.ui.dialog.WaitSecurityDelayDialog +import com.tangem.ui.dialog.WaitSecurityDelayDialogNew import com.tangem.wallet.R -import kotlinx.android.synthetic.main.activity_purge.* +import com.tangem.wallet.TangemContext +import kotlinx.android.synthetic.main.fragment_purge.* import kotlinx.android.synthetic.main.layout_touch_card.* -import org.greenrobot.eventbus.EventBus import javax.inject.Inject -import com.tangem.card_android.data.EXTRA_TANGEM_CARD -import com.tangem.card_android.data.EXTRA_TANGEM_CARD_UID -class PurgeActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtocol.Notifications { +class PurgeFragment : BaseFragment(), NfcAdapter.ReaderCallback, CardProtocol.Notifications { companion object { - val TAG: String = PurgeActivity::class.java.simpleName + val TAG: String = PurgeFragment::class.java.simpleName fun callingIntent(context: Context, ctx: TangemContext): Intent { - val intent = Intent(context, PurgeActivity::class.java) + val intent = Intent(context, PurgeFragment::class.java) ctx.saveToIntent(intent) return intent } @@ -52,7 +48,8 @@ class PurgeActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoc @Inject internal lateinit var waitSecurityDelayDialogNew: WaitSecurityDelayDialogNew - private lateinit var nfcManager: NfcManager + override val layoutId = R.layout.fragment_purge + private lateinit var ctx: TangemContext private lateinit var nfcDeviceAntenna: NfcDeviceAntennaLocation @@ -61,19 +58,14 @@ class PurgeActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoc override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_purge) + ctx = TangemContext.loadFromBundle(context, arguments) + } - App.navigatorComponent.inject(this) - - requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT - - nfcManager = NfcManager(this, this) - lifecycle.addObserver(NfcLifecycleObserver(nfcManager)) - - ctx = TangemContext.loadFromBundle(this, intent.extras) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) // init NFC Antenna - nfcDeviceAntenna = NfcDeviceAntennaLocation(this, ivHandCardHorizontal, ivHandCardVertical, llHand, llNfc) + nfcDeviceAntenna = NfcDeviceAntennaLocation(context!!, ivHandCardHorizontal, ivHandCardVertical, llHand, llNfc) nfcDeviceAntenna.init() tvCardID.text = ctx.card.cidDescription @@ -81,7 +73,7 @@ class PurgeActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoc progressBar.visibility = View.INVISIBLE } - public override fun onStop() { + override fun onStop() { purgeTask?.cancel(true) super.onStop() } @@ -94,10 +86,11 @@ class PurgeActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoc val sUID = Util.byteArrayToHexString(uid) if (sUID == ctx.card.uid) { isoDep.timeout = ctx.card.pauseBeforePIN2 + 65000 - purgeTask = PurgeTask(ctx.card, NfcReader(nfcManager, isoDep), App.localStorage, App.pinStorage, this) + purgeTask = PurgeTask(ctx.card, NfcReader((activity as MainActivity).nfcManager, isoDep), + App.localStorage, App.pinStorage, this) purgeTask?.start() } else { - nfcManager.ignoreTag(isoDep.tag) + (activity as MainActivity).nfcManager.ignoreTag(isoDep.tag) } } catch (e: Exception) { e.printStackTrace() @@ -105,7 +98,7 @@ class PurgeActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoc } override fun onReadWait(msec: Int) { - WaitSecurityDelayDialog.onReadWait(this, msec) + WaitSecurityDelayDialog.onReadWait(activity, msec) // val readWait = ReadWait() // readWait.msec = msec @@ -113,7 +106,7 @@ class PurgeActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoc } override fun onReadBeforeRequest(timeout: Int) { - WaitSecurityDelayDialog.onReadBeforeRequest(this, timeout) + WaitSecurityDelayDialog.onReadBeforeRequest(activity, timeout) // if (!waitSecurityDelayDialogNew.isAdded) // waitSecurityDelayDialogNew.show(supportFragmentManager, WaitSecurityDelayDialogNew.TAG) @@ -125,7 +118,7 @@ class PurgeActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoc } override fun onReadAfterRequest() { - WaitSecurityDelayDialog.onReadAfterRequest(this) + WaitSecurityDelayDialog.onReadAfterRequest(activity) // val readAfterRequest = ReadAfterRequest() // EventBus.getDefault().post(readAfterRequest) @@ -145,20 +138,18 @@ class PurgeActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoc if (cardProtocol != null) { if (cardProtocol.error == null) { - rlProgressBar.post { rlProgressBar.visibility = View.GONE } + rlProgressBar?.post { rlProgressBar?.visibility = View.GONE } progressBar?.post { progressBar?.progress = 100 progressBar?.progressTintList = ColorStateList.valueOf(Color.GREEN) - val intent = Intent() - intent.putExtra(EXTRA_TANGEM_CARD_UID, cardProtocol.card.uid) - intent.putExtra(EXTRA_TANGEM_CARD, cardProtocol.card.asBundle) - setResult(Activity.RESULT_OK, intent) + val data = Bundle() + data.putString(EXTRA_TANGEM_CARD_UID, cardProtocol.card.uid) + data.putBundle(EXTRA_TANGEM_CARD, cardProtocol.card.asBundle) - EventBus.getDefault().post(DeletingWalletFinish()) - - finish() +// EventBus.getDefault().post(DeletingWalletFinish()) + navigateToDestination(R.id.action_purgeFragment_to_mainFragment) } } else { if (cardProtocol.error is CardProtocol.TangemException_InvalidPIN) { @@ -172,12 +163,13 @@ class PurgeActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoc progressBar?.progressTintList = ColorStateList.valueOf(Color.DKGRAY) progressBar?.visibility = View.INVISIBLE - val intent = Intent() - intent.putExtra(EXTRA_TANGEM_CARD_UID, cardProtocol.card.uid) - intent.putExtra(EXTRA_TANGEM_CARD, cardProtocol.card.asBundle) - intent.putExtra(Constant.EXTRA_MESSAGE, getString(R.string.cannot_erase_wallet)) - setResult(RESULT_INVALID_PIN, intent) - finish() + val data = bundleOf( + EXTRA_TANGEM_CARD_UID to cardProtocol.card.uid, + EXTRA_TANGEM_CARD to cardProtocol.card.asBundle, + Constant.EXTRA_MESSAGE to getString(R.string.cannot_erase_wallet) + ) + navigateBackWithResult(RESULT_INVALID_PIN, data) + return@postDelayed } catch (e: Exception) { e.printStackTrace() } @@ -186,9 +178,9 @@ class PurgeActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoc progressBar?.post { if (cardProtocol.error is CardProtocol.TangemException_ExtendedLengthNotSupported) { if (!NoExtendedLengthSupportDialog.allReadyShowed) - NoExtendedLengthSupportDialog().show(supportFragmentManager, NoExtendedLengthSupportDialog.TAG) + NoExtendedLengthSupportDialog().show(activity!!.supportFragmentManager, NoExtendedLengthSupportDialog.TAG) } else - Toast.makeText(baseContext, R.string.try_to_scan_again, Toast.LENGTH_LONG).show() + Toast.makeText(context, R.string.try_to_scan_again, Toast.LENGTH_LONG).show() progressBar?.progress = 100 progressBar?.progressTintList = ColorStateList.valueOf(Color.RED) @@ -199,7 +191,7 @@ class PurgeActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoc rlProgressBar?.postDelayed({ try { - rlProgressBar.visibility = View.GONE + rlProgressBar?.visibility = View.GONE } catch (e: Exception) { e.printStackTrace() } diff --git a/app/src/main/java/com/tangem/ui/activity/QrScanActivity.kt b/app/src/main/java/com/tangem/ui/fragment/QrScanFragment.kt similarity index 55% rename from app/src/main/java/com/tangem/ui/activity/QrScanActivity.kt rename to app/src/main/java/com/tangem/ui/fragment/QrScanFragment.kt index 82e542ed4c..90063ec96c 100644 --- a/app/src/main/java/com/tangem/ui/activity/QrScanActivity.kt +++ b/app/src/main/java/com/tangem/ui/fragment/QrScanFragment.kt @@ -1,4 +1,4 @@ -package com.tangem.ui.activity +package com.tangem.ui.fragment import android.Manifest import android.app.Activity @@ -6,36 +6,45 @@ import android.content.Context import android.content.Intent import android.content.pm.PackageManager import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup import androidx.core.app.ActivityCompat -import androidx.appcompat.app.AppCompatActivity import com.google.zxing.Result import com.tangem.Constant import me.dm7.barcodescanner.zxing.ZXingScannerView -class QrScanActivity : AppCompatActivity(), ZXingScannerView.ResultHandler { +class QrScanFragment : BaseFragment(), ZXingScannerView.ResultHandler { companion object { fun callingIntent(context: Context): Intent { - return Intent(context, QrScanActivity::class.java) + return Intent(context, QrScanFragment::class.java) } } + override val layoutId = 0 + private var scannerView: ZXingScannerView? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - if (ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) - ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.CAMERA), 1) - else - runScanner() + if (ActivityCompat.checkSelfPermission(context!!, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) + ActivityCompat.requestPermissions(activity!!, arrayOf(Manifest.permission.CAMERA), 1) + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + scannerView = ZXingScannerView(activity) + return scannerView } override fun onPause() { super.onPause() scannerView?.stopCamera() + } override fun onResume() { super.onResume() + scannerView?.setResultHandler(this) scannerView?.startCamera() } @@ -43,30 +52,19 @@ class QrScanActivity : AppCompatActivity(), ZXingScannerView.ResultHandler { when (requestCode) { 1 -> { if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) - runScanner() + else { - setResult(Activity.RESULT_CANCELED) - finish() + navigateBackWithResult(Activity.RESULT_CANCELED) } } } } override fun handleResult(result: Result) { - val data = Intent() - data.putExtra(Constant.EXTRA_QR_CODE, result.text) - setResult(Activity.RESULT_OK, data) - finish() - } + val data = Bundle() + data.putString(Constant.EXTRA_QR_CODE, result.text) - private fun runScanner() { - // programmatically initialize the scanner view - scannerView = ZXingScannerView(this) - setContentView(scannerView) - - // register ourselves as a handler for scan results. - scannerView?.setResultHandler(this) - scannerView?.startCamera() + navigateBackWithResult(Activity.RESULT_OK, data) } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/ui/activity/SendTransactionActivity.kt b/app/src/main/java/com/tangem/ui/fragment/SendTransactionFragment.kt similarity index 60% rename from app/src/main/java/com/tangem/ui/activity/SendTransactionActivity.kt rename to app/src/main/java/com/tangem/ui/fragment/SendTransactionFragment.kt index c5614cc845..c89140c2ff 100644 --- a/app/src/main/java/com/tangem/ui/activity/SendTransactionActivity.kt +++ b/app/src/main/java/com/tangem/ui/fragment/SendTransactionFragment.kt @@ -1,43 +1,37 @@ -package com.tangem.ui.activity +package com.tangem.ui.fragment -import android.content.Intent +import android.app.Activity import android.nfc.NfcAdapter import android.nfc.Tag import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity -import android.view.KeyEvent import android.widget.Toast +import androidx.activity.OnBackPressedCallback import com.tangem.App import com.tangem.Constant -import com.tangem.wallet.CoinEngine -import com.tangem.wallet.CoinEngineFactory -import com.tangem.wallet.TangemContext +import com.tangem.card_common.util.Util +import com.tangem.ui.activity.MainActivity import com.tangem.ui.event.TransactionFinishWithError import com.tangem.ui.event.TransactionFinishWithSuccess -import com.tangem.card_android.android.nfc.NfcLifecycleObserver -import com.tangem.card_android.android.reader.NfcManager -import com.tangem.card_common.util.Util import com.tangem.util.UtilHelper +import com.tangem.wallet.CoinEngine +import com.tangem.wallet.CoinEngineFactory import com.tangem.wallet.R +import com.tangem.wallet.TangemContext import org.greenrobot.eventbus.EventBus import java.io.IOException -class SendTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { +class SendTransactionFragment : BaseFragment(), NfcAdapter.ReaderCallback { + + override val layoutId = R.layout.fragment_send_transaction - private lateinit var nfcManager: NfcManager private lateinit var ctx: TangemContext private var tx: ByteArray? = null override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_send_transaction) - - nfcManager = NfcManager(this, this) - lifecycle.addObserver(NfcLifecycleObserver(nfcManager)) - - ctx = TangemContext.loadFromBundle(this, intent.extras) - tx = intent.getByteArrayExtra(Constant.EXTRA_TX) + ctx = TangemContext.loadFromBundle(context, arguments) + tx = arguments?.getByteArray(Constant.EXTRA_TX) val engine = CoinEngineFactory.create(ctx) @@ -55,26 +49,24 @@ class SendTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { } override fun allowAdvance(): Boolean { - return UtilHelper.isOnline(this@SendTransactionActivity) + return UtilHelper.isOnline(requireContext()) } }, tx ) - } - override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { - when (keyCode) { - KeyEvent.KEYCODE_BACK -> { - Toast.makeText(this, R.string.please_wait, Toast.LENGTH_LONG).show() - return true + val callback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + Toast.makeText(context, R.string.please_wait, Toast.LENGTH_LONG).show() } + } - return super.onKeyDown(keyCode, event) + requireActivity().onBackPressedDispatcher.addCallback(this, callback) } override fun onTagDiscovered(tag: Tag) { try { - nfcManager.ignoreTag(tag) + (activity as MainActivity).nfcManager.ignoreTag(tag) } catch (e: IOException) { e.printStackTrace() } @@ -85,10 +77,9 @@ class SendTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { transactionFinishWithSuccess.message = getString(R.string.transaction_has_been_successfully_signed) EventBus.getDefault().post(transactionFinishWithSuccess) - val intent = Intent() - intent.putExtra(Constant.EXTRA_MESSAGE, getString(R.string.transaction_has_been_successfully_signed)) - setResult(RESULT_OK, intent) - finish() + val data = Bundle() + data.putString(Constant.EXTRA_MESSAGE, getString(R.string.transaction_has_been_successfully_signed)) + navigateBackWithResult(Activity.RESULT_OK, data, R.id.loadedWalletFragment) } private fun finishWithError(message: String) { @@ -96,10 +87,9 @@ class SendTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { transactionFinishWithError.message = String.format(getString(R.string.try_again_failed_to_send_transaction), message) EventBus.getDefault().post(transactionFinishWithError) - val intent = Intent() - intent.putExtra(Constant.EXTRA_MESSAGE, String.format(getString(R.string.try_again_failed_to_send_transaction), message)) - setResult(RESULT_CANCELED, intent) - finish() + val data = Bundle() + data.putString(Constant.EXTRA_MESSAGE, String.format(getString(R.string.try_again_failed_to_send_transaction), message)) + navigateBackWithResult(Activity.RESULT_CANCELED, data, R.id.loadedWalletFragment) } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/ui/fragment/SettingsFragment.kt b/app/src/main/java/com/tangem/ui/fragment/SettingsFragment.kt index 95f604cba2..8f42341a40 100644 --- a/app/src/main/java/com/tangem/ui/fragment/SettingsFragment.kt +++ b/app/src/main/java/com/tangem/ui/fragment/SettingsFragment.kt @@ -1,12 +1,16 @@ package com.tangem.ui.fragment import android.os.Bundle +import android.view.View +import androidx.appcompat.app.AppCompatActivity +import androidx.navigation.fragment.NavHostFragment import androidx.preference.ListPreference import androidx.preference.Preference import androidx.preference.PreferenceCategory import androidx.preference.PreferenceFragmentCompat import com.tangem.wallet.BuildConfig import com.tangem.wallet.R +import kotlinx.android.synthetic.main.fragment_settings.* class SettingsFragment : PreferenceFragmentCompat() { override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { @@ -22,4 +26,23 @@ class SettingsFragment : PreferenceFragmentCompat() { } } + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + initToolbar() + } + + private fun initToolbar() { + toolbar?.setTitle(R.string.settings) + toolbar?.setNavigationIcon(android.R.drawable.ic_menu_close_clear_cancel) + (activity as AppCompatActivity).setSupportActionBar(toolbar) + toolbar?.setNavigationOnClickListener { + NavHostFragment.findNavController(this).popBackStack() + } + } + + override fun onDestroyView() { + (activity as AppCompatActivity).setSupportActionBar(toolbar) + super.onDestroyView() + } + } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/ui/fragment/VerifyCard.kt b/app/src/main/java/com/tangem/ui/fragment/VerifyCardFragment.kt similarity index 67% rename from app/src/main/java/com/tangem/ui/fragment/VerifyCard.kt rename to app/src/main/java/com/tangem/ui/fragment/VerifyCardFragment.kt index f11b61e502..b2f1c36e25 100644 --- a/app/src/main/java/com/tangem/ui/fragment/VerifyCard.kt +++ b/app/src/main/java/com/tangem/ui/fragment/VerifyCardFragment.kt @@ -8,43 +8,42 @@ import android.os.Build import android.os.Bundle import android.text.Html import android.text.format.DateUtils -import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup import android.widget.PopupMenu import android.widget.Toast +import androidx.activity.OnBackPressedCallback import androidx.core.content.ContextCompat import com.tangem.App import com.tangem.Constant import com.tangem.card_android.android.data.PINStorage -import com.tangem.card_android.android.nfc.NfcLifecycleObserver -import com.tangem.card_android.android.reader.NfcManager import com.tangem.card_android.data.EXTRA_TANGEM_CARD import com.tangem.card_android.data.EXTRA_TANGEM_CARD_UID import com.tangem.card_android.data.loadFromBundle import com.tangem.card_common.data.TangemCard import com.tangem.card_common.reader.CardProtocol import com.tangem.data.Blockchain -import com.tangem.wallet.CoinEngineFactory -import com.tangem.wallet.TangemContext -import com.tangem.ui.activity.PinRequestActivity -import com.tangem.ui.activity.VerifyCardActivity +import com.tangem.ui.activity.MainActivity import com.tangem.ui.dialog.PINSwapWarningDialog import com.tangem.ui.event.DeletingWalletFinish +import com.tangem.ui.fragment.pin.PinRequestFragment +import com.tangem.ui.navigation.NavigationResultListener import com.tangem.wallet.BuildConfig +import com.tangem.wallet.CoinEngineFactory import com.tangem.wallet.R +import com.tangem.wallet.TangemContext import kotlinx.android.synthetic.main.fr_verify_card.* import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import java.io.IOException import java.util.* -class VerifyCard : androidx.fragment.app.Fragment(), NfcAdapter.ReaderCallback { +class VerifyCardFragment : BaseFragment(), NavigationResultListener, NfcAdapter.ReaderCallback { companion object { - val TAG: String = VerifyCard::class.java.simpleName + val TAG: String = VerifyCardFragment::class.java.simpleName } - private lateinit var nfcManager: NfcManager + override val layoutId = R.layout.fr_verify_card + private lateinit var ctx: TangemContext private var requestPIN2Count = 0 @@ -54,14 +53,16 @@ class VerifyCard : androidx.fragment.app.Fragment(), NfcAdapter.ReaderCallback { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - ctx = TangemContext.loadFromBundle(activity, activity?.intent?.extras) + ctx = TangemContext.loadFromBundle(context, arguments) - nfcManager = NfcManager(activity!!, this) - lifecycle.addObserver(NfcLifecycleObserver(nfcManager)) - } - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fr_verify_card, container, false) + val callback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + val data = prepareResultIntent() + data.putExtra(Constant.EXTRA_MODIFICATION, getString(R.string.update)) + navigateUp() + } + } + requireActivity().onBackPressedDispatcher.addCallback(this, callback) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -76,7 +77,7 @@ class VerifyCard : androidx.fragment.app.Fragment(), NfcAdapter.ReaderCallback { btnOk.setOnClickListener { val data = prepareResultIntent() data.putExtra(Constant.EXTRA_MODIFICATION, getString(R.string.update)) - activity?.finish() + navigateUp() } } @@ -96,39 +97,44 @@ class VerifyCard : androidx.fragment.app.Fragment(), NfcAdapter.ReaderCallback { activity?.finish() } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) + override fun onNavigationResult(requestCode: String, resultCode: Int, data: Bundle?) { when (requestCode) { Constant.REQUEST_CODE_ENTER_NEW_PIN -> if (resultCode == Activity.RESULT_OK) { if (data != null) { - if (data.extras!!.containsKey(Constant.EXTRA_CONFIRM_PIN)) { - val intent = Intent(context, PinRequestActivity::class.java) - intent.putExtra(Constant.EXTRA_MODE, PinRequestActivity.Mode.RequestPIN2.toString()) - ctx.saveToIntent(intent) - newPIN = data.getStringExtra(Constant.EXTRA_NEW_PIN) - startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) + if (data.containsKey(Constant.EXTRA_CONFIRM_PIN)) { + val bundle = Bundle() + bundle.putString(Constant.EXTRA_MODE, PinRequestFragment.Mode.RequestPIN2.toString()) + ctx.saveToBundle(bundle) + newPIN = data.getString(Constant.EXTRA_NEW_PIN) + navigateForResult(Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN, + R.id.action_verifyCard_to_pinRequestFragment, bundle) } else { - val intent = Intent(context, PinRequestActivity::class.java) - intent.putExtra(Constant.EXTRA_NEW_PIN, data.getStringExtra(Constant.EXTRA_NEW_PIN)) - intent.putExtra(Constant.EXTRA_MODE, PinRequestActivity.Mode.ConfirmNewPIN.toString()) - startActivityForResult(intent, Constant.REQUEST_CODE_ENTER_NEW_PIN) + val bundle = Bundle() + bundle.putString(Constant.EXTRA_NEW_PIN, data.getString(Constant.EXTRA_NEW_PIN)) + bundle.putString(Constant.EXTRA_MODE, PinRequestFragment.Mode.ConfirmNewPIN.toString()) + navigateForResult(Constant.REQUEST_CODE_ENTER_NEW_PIN, + R.id.action_verifyCard_to_pinRequestFragment, bundle) + } } } Constant.REQUEST_CODE_ENTER_NEW_PIN2 -> if (resultCode == Activity.RESULT_OK) { if (data != null) { - if (data.extras!!.containsKey(Constant.EXTRA_CONFIRM_PIN_2)) { - val intent = Intent(context, PinRequestActivity::class.java) - intent.putExtra(Constant.EXTRA_MODE, PinRequestActivity.Mode.RequestPIN2.toString()) - ctx.saveToIntent(intent) - newPIN2 = data.getStringExtra(Constant.EXTRA_NEW_PIN_2) - startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) + if (data.containsKey(Constant.EXTRA_CONFIRM_PIN_2)) { + val bundle = Bundle() + bundle.putString(Constant.EXTRA_MODE, PinRequestFragment.Mode.RequestPIN2.toString()) + ctx.saveToBundle(bundle) + newPIN2 = data.getString(Constant.EXTRA_NEW_PIN_2) + navigateForResult(Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN, + R.id.action_verifyCard_to_pinRequestFragment, bundle) + } else { - val intent = Intent(context, PinRequestActivity::class.java) - intent.putExtra(Constant.EXTRA_NEW_PIN_2, data.getStringExtra(Constant.EXTRA_NEW_PIN_2)) - intent.putExtra(Constant.EXTRA_MODE, PinRequestActivity.Mode.ConfirmNewPIN2.toString()) - startActivityForResult(intent, Constant.REQUEST_CODE_ENTER_NEW_PIN2) + val bundle = Bundle() + bundle.putString(Constant.EXTRA_NEW_PIN_2, data.getString(Constant.EXTRA_NEW_PIN_2)) + bundle.putString(Constant.EXTRA_MODE, PinRequestFragment.Mode.ConfirmNewPIN2.toString()) + navigateForResult(Constant.REQUEST_CODE_ENTER_NEW_PIN2, + R.id.action_verifyCard_to_pinRequestFragment, bundle) } } } @@ -139,7 +145,13 @@ class VerifyCard : androidx.fragment.app.Fragment(), NfcAdapter.ReaderCallback { if (newPIN2 == "") newPIN2 = App.pinStorage.piN2 val pinSwapWarningDialog = PINSwapWarningDialog() - pinSwapWarningDialog.setOnRefreshPage { (activity as VerifyCardActivity).navigator.showPinSwap(context as Activity, newPIN, newPIN2) } + pinSwapWarningDialog.setOnRefreshPage { + val bundle = Bundle() + bundle.putString(Constant.EXTRA_NEW_PIN, newPIN) + bundle.putString(Constant.EXTRA_NEW_PIN_2, newPIN2) + navigateForResult(Constant.REQUEST_CODE_SWAP_PIN, + R.id.action_verifyCard_to_pinSwapFragment, bundle) + } val bundle = Bundle() if (!CardProtocol.isDefaultPIN(newPIN) || !CardProtocol.isDefaultPIN2(newPIN2)) bundle.putString(Constant.EXTRA_MESSAGE, getString(R.string.if_you_forget)) @@ -151,51 +163,56 @@ class VerifyCard : androidx.fragment.app.Fragment(), NfcAdapter.ReaderCallback { Constant.REQUEST_CODE_SWAP_PIN -> if (resultCode == Activity.RESULT_OK) { if (data == null) { - ctx.saveToIntent(data) - data?.putExtra(Constant.EXTRA_MODIFICATION, Constant.EXTRA_MODIFICATION_DELETE) - } else - data.putExtra(Constant.EXTRA_MODIFICATION, Constant.EXTRA_MODIFICATION_UPDATE) - activity?.setResult(Activity.RESULT_OK, data) - activity?.finish() + val newData = Bundle() + ctx.saveToBundle(newData) + newData.putString(Constant.EXTRA_MODIFICATION, Constant.EXTRA_MODIFICATION_DELETE) + navigateBackWithResult(Activity.RESULT_OK, newData) + } else { + data.putString(Constant.EXTRA_MODIFICATION, Constant.EXTRA_MODIFICATION_UPDATE) + navigateBackWithResult(Activity.RESULT_OK, data) + } } else { - if (data != null && data.extras!!.containsKey(EXTRA_TANGEM_CARD_UID) && data.extras!!.containsKey(EXTRA_TANGEM_CARD)) { - val updatedCard = TangemCard(data.getStringExtra(EXTRA_TANGEM_CARD_UID)) - updatedCard.loadFromBundle(data.getBundleExtra(EXTRA_TANGEM_CARD)) + if (data != null && data.containsKey(EXTRA_TANGEM_CARD_UID) && data.containsKey(EXTRA_TANGEM_CARD)) { + val updatedCard = TangemCard(data.getString(EXTRA_TANGEM_CARD_UID)) + updatedCard.loadFromBundle(data.getBundle(EXTRA_TANGEM_CARD)) ctx.card = updatedCard } if (resultCode == Constant.RESULT_INVALID_PIN && requestPIN2Count < 2) { requestPIN2Count++ - val intent = Intent(context, PinRequestActivity::class.java) - intent.putExtra(Constant.EXTRA_MODE, PinRequestActivity.Mode.RequestPIN2.toString()) - ctx.saveToIntent(intent) - startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) + val bundle = Bundle() + bundle.putString(Constant.EXTRA_MODE, PinRequestFragment.Mode.RequestPIN2.toString()) + ctx.saveToBundle(bundle) + navigateForResult(Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN, + R.id.action_verifyCard_to_pinRequestFragment, bundle) return } else { - if (data != null && data.extras!!.containsKey(Constant.EXTRA_MESSAGE)) { - ctx.error = data.getStringExtra(Constant.EXTRA_MESSAGE) + if (data != null && data.containsKey(Constant.EXTRA_MESSAGE)) { + ctx.error = data.getString(Constant.EXTRA_MESSAGE) } } } - Constant.REQUEST_CODE_REQUEST_PIN2_FOR_PURGE -> if (resultCode == Activity.RESULT_OK) - (activity as VerifyCardActivity).navigator.showPurge(context as Activity, ctx) - - else { - if (data != null && data.extras!!.containsKey(EXTRA_TANGEM_CARD_UID) && data.extras!!.containsKey(EXTRA_TANGEM_CARD)) { - val updatedCard = TangemCard(data.getStringExtra(EXTRA_TANGEM_CARD_UID)) - updatedCard.loadFromBundle(data.getBundleExtra(EXTRA_TANGEM_CARD)) + Constant.REQUEST_CODE_REQUEST_PIN2_FOR_PURGE -> if (resultCode == Activity.RESULT_OK) { + val bundle = Bundle().apply { ctx.saveToBundle(this) } + navigateForResult(Constant.REQUEST_CODE_PURGE, + R.id.action_verifyCard_to_purgeFragment, bundle) + } else { + if (data != null && data.containsKey(EXTRA_TANGEM_CARD_UID) && data.containsKey(EXTRA_TANGEM_CARD)) { + val updatedCard = TangemCard(data.getString(EXTRA_TANGEM_CARD_UID)) + updatedCard.loadFromBundle(data.getBundle(EXTRA_TANGEM_CARD)) ctx.card = updatedCard } if (resultCode == Constant.RESULT_INVALID_PIN && requestPIN2Count < 2) { requestPIN2Count++ - val intent = Intent(context, PinRequestActivity::class.java) - intent.putExtra(Constant.EXTRA_MODE, PinRequestActivity.Mode.RequestPIN2.toString()) - ctx.saveToIntent(intent) - startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2_FOR_PURGE) + val bundle = Bundle() + bundle.putString(Constant.EXTRA_MODE, PinRequestFragment.Mode.RequestPIN2.toString()) + ctx.saveToBundle(bundle) + navigateForResult(Constant.REQUEST_CODE_REQUEST_PIN2_FOR_PURGE, + R.id.action_verifyCard_to_pinRequestFragment, data) return } else { - if (data != null && data.extras!!.containsKey(Constant.EXTRA_MESSAGE)) { - ctx.error = data.getStringExtra(Constant.EXTRA_MESSAGE) + if (data != null && data.containsKey(Constant.EXTRA_MESSAGE)) { + ctx.error = data.getString(Constant.EXTRA_MESSAGE) } } updateViews() @@ -205,7 +222,7 @@ class VerifyCard : androidx.fragment.app.Fragment(), NfcAdapter.ReaderCallback { override fun onTagDiscovered(tag: Tag?) { try { - nfcManager.ignoreTag(tag!!) + (activity as MainActivity).nfcManager.ignoreTag(tag!!) } catch (e: IOException) { e.printStackTrace() } @@ -268,15 +285,15 @@ class VerifyCard : androidx.fragment.app.Fragment(), NfcAdapter.ReaderCallback { else tvReusable.setText(R.string.one_off_banknote) - var s="" - for(signingM in ctx.card!!.allowedSigningMethod) { - s += if(signingM==ctx.card!!.signingMethod) { + var s = "" + for (signingM in ctx.card!!.allowedSigningMethod) { + s += if (signingM == ctx.card!!.signingMethod) { ", ${signingM.description}" } else { ", ${signingM.description}" } } - s=s.substring(2,s.length) + s = s.substring(2, s.length) @Suppress("DEPRECATION") tvSigningMethod.text = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) Html.fromHtml(s, Html.FROM_HTML_MODE_LEGACY) @@ -392,50 +409,55 @@ class VerifyCard : androidx.fragment.app.Fragment(), NfcAdapter.ReaderCallback { private fun doSetPin() { requestPIN2Count = 0 - val intent = Intent(context, PinRequestActivity::class.java) - intent.putExtra(Constant.EXTRA_MODE, PinRequestActivity.Mode.RequestNewPIN.toString()) + val data = Bundle() + data.putString(Constant.EXTRA_MODE, PinRequestFragment.Mode.RequestNewPIN.toString()) newPIN = "" newPIN2 = "" - startActivityForResult(intent, Constant.REQUEST_CODE_ENTER_NEW_PIN) + navigateForResult(Constant.REQUEST_CODE_ENTER_NEW_PIN, + R.id.action_verifyCard_to_pinRequestFragment, data) } private fun doResetPin() { requestPIN2Count = 0 - val intent = Intent(context, PinRequestActivity::class.java) - intent.putExtra(Constant.EXTRA_MODE, PinRequestActivity.Mode.RequestPIN2.toString()) - ctx.saveToIntent(intent) + val data = Bundle() + data.putString(Constant.EXTRA_MODE, PinRequestFragment.Mode.RequestPIN2.toString()) + ctx.saveToBundle(data) newPIN = PINStorage.getDefaultPIN() newPIN2 = "" - startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) + navigateForResult(Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN, + R.id.action_verifyCard_to_pinRequestFragment, data) } private fun doResetPin2() { requestPIN2Count = 0 - val intent = Intent(context, PinRequestActivity::class.java) - intent.putExtra(Constant.EXTRA_MODE, PinRequestActivity.Mode.RequestPIN2.toString()) - ctx.saveToIntent(intent) + val data = Bundle() + data.putString(Constant.EXTRA_MODE, PinRequestFragment.Mode.RequestPIN2.toString()) + ctx.saveToBundle(data) newPIN = "" newPIN2 = PINStorage.getDefaultPIN2() - startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) + navigateForResult(Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN, + R.id.action_verifyCard_to_pinRequestFragment, data) } private fun doResetPins() { requestPIN2Count = 0 - val intent = Intent(context, PinRequestActivity::class.java) - intent.putExtra(Constant.EXTRA_MODE, PinRequestActivity.Mode.RequestPIN2.toString()) - ctx.saveToIntent(intent) + val data = Bundle() + data.putString(Constant.EXTRA_MODE, PinRequestFragment.Mode.RequestPIN2.toString()) + ctx.saveToBundle(data) newPIN = PINStorage.getDefaultPIN() newPIN2 = PINStorage.getDefaultPIN2() - startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) + navigateForResult(Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN, + R.id.action_verifyCard_to_pinRequestFragment, data) } private fun doSetPin2() { requestPIN2Count = 0 - val intent = Intent(context, PinRequestActivity::class.java) - intent.putExtra(Constant.EXTRA_MODE, PinRequestActivity.Mode.RequestNewPIN2.toString()) + val data = Bundle() + data.putString(Constant.EXTRA_MODE, PinRequestFragment.Mode.RequestNewPIN2.toString()) newPIN = "" newPIN2 = "" - startActivityForResult(intent, Constant.REQUEST_CODE_ENTER_NEW_PIN2) + navigateForResult(Constant.REQUEST_CODE_ENTER_NEW_PIN2, + R.id.action_verifyCard_to_pinRequestFragment, data) } private fun doPurge() { @@ -448,10 +470,11 @@ class VerifyCard : androidx.fragment.app.Fragment(), NfcAdapter.ReaderCallback { return } - val intent = Intent(context, PinRequestActivity::class.java) - intent.putExtra(Constant.EXTRA_MODE, PinRequestActivity.Mode.RequestPIN2.toString()) - ctx.saveToIntent(intent) - startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2_FOR_PURGE) + val data = Bundle() + data.putString(Constant.EXTRA_MODE, PinRequestFragment.Mode.RequestPIN2.toString()) + ctx.saveToBundle(data) + navigateForResult(Constant.REQUEST_CODE_REQUEST_PIN2_FOR_PURGE, + R.id.action_verifyCard_to_pinRequestFragment, data) } fun prepareResultIntent(): Intent { diff --git a/app/src/main/java/com/tangem/ui/activity/PrepareCryptonitOtherApiWithdrawalActivity.kt b/app/src/main/java/com/tangem/ui/fragment/additional/PrepareCryptonitOtherApiWithdrawalFragment.kt similarity index 58% rename from app/src/main/java/com/tangem/ui/activity/PrepareCryptonitOtherApiWithdrawalActivity.kt rename to app/src/main/java/com/tangem/ui/fragment/additional/PrepareCryptonitOtherApiWithdrawalFragment.kt index b7a279ea90..28eed1f53a 100644 --- a/app/src/main/java/com/tangem/ui/activity/PrepareCryptonitOtherApiWithdrawalActivity.kt +++ b/app/src/main/java/com/tangem/ui/fragment/additional/PrepareCryptonitOtherApiWithdrawalFragment.kt @@ -1,59 +1,40 @@ -package com.tangem.ui.activity +package com.tangem.ui.fragment.additional -import android.annotation.SuppressLint import android.app.Activity -import android.content.Intent import android.graphics.Color import android.nfc.NfcAdapter import android.nfc.Tag import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity import android.view.View -import com.tangem.App import com.tangem.Constant import com.tangem.data.Blockchain import com.tangem.data.network.CryptonitOtherApi -import com.tangem.di.Navigator +import com.tangem.ui.activity.MainActivity +import com.tangem.ui.fragment.BaseFragment +import com.tangem.ui.navigation.NavigationResultListener import com.tangem.wallet.CoinEngineFactory -import com.tangem.wallet.TangemContext -import com.tangem.card_android.android.nfc.NfcLifecycleObserver -import com.tangem.card_android.android.reader.NfcManager import com.tangem.wallet.R -import kotlinx.android.synthetic.main.activity_prepare_cryptonit_other_api_withdrawal.* +import com.tangem.wallet.TangemContext +import kotlinx.android.synthetic.main.fragment_prepare_cryptonit_other_api_withdrawal.* import java.io.IOException -import javax.inject.Inject -class PrepareCryptonitOtherApiWithdrawalActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { +class PrepareCryptonitOtherApiWithdrawalFragment : BaseFragment(), NavigationResultListener, + NfcAdapter.ReaderCallback { companion object { - val TAG: String = PrepareCryptonitOtherApiWithdrawalActivity::class.java.simpleName + val TAG: String = PrepareCryptonitOtherApiWithdrawalFragment::class.java.simpleName } - private lateinit var nfcManager: NfcManager - private lateinit var ctx: TangemContext + override val layoutId = R.layout.fragment_prepare_cryptonit_other_api_withdrawal - private var cryptonit: CryptonitOtherApi? = null + private val ctx: TangemContext by lazy { TangemContext.loadFromBundle(context, arguments) } + private val cryptonit: CryptonitOtherApi by lazy { CryptonitOtherApi(context) } - @Inject - internal lateinit var navigator: Navigator - - @SuppressLint("SetTextI18n") - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_prepare_cryptonit_other_api_withdrawal) - - App.navigatorComponent.inject(this) - - nfcManager = NfcManager(this, this) - lifecycle.addObserver(NfcLifecycleObserver(nfcManager)) - - ctx = TangemContext.loadFromBundle(this, intent.extras) - - cryptonit = CryptonitOtherApi(this) - - tvKey.text = cryptonit!!.key - tvUserID.text = cryptonit!!.userId - tvSecret.text = cryptonit!!.secretDescription + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + tvKey.text = cryptonit.key + tvUserID.text = cryptonit.userId + tvSecret.text = cryptonit.secretDescription tvCardID.text = ctx.card!!.cidDescription tvWallet.text = ctx.coinData!!.wallet @@ -75,7 +56,7 @@ class PrepareCryptonitOtherApiWithdrawalActivity : AppCompatActivity(), NfcAdapt rlProgressBar.visibility = View.VISIBLE tvProgressDescription.text = getString(R.string.cryptonit_request_withdrawal) - cryptonit!!.requestCryptoWithdrawal(ctx.blockchain.currency, dblAmount.toString(), ctx.coinData!!.wallet) + cryptonit.requestCryptoWithdrawal(ctx.blockchain.currency, dblAmount.toString(), ctx.coinData!!.wallet) } catch (e: Exception) { etAmount.error = getString(R.string.unknown_amount_format) } @@ -88,15 +69,27 @@ class PrepareCryptonitOtherApiWithdrawalActivity : AppCompatActivity(), NfcAdapt // } } - ivCameraKey.setOnClickListener { navigator.showQrScanActivity(this, Constant.REQUEST_CODE_SCAN_QR_KEY) } + ivCameraKey.setOnClickListener { + navigateForResult( + Constant.REQUEST_CODE_SCAN_QR_KEY, + R.id.action_prepareCryptonitOtherApiWithdrawalFragment_to_qrScanFragment) + } - ivCameraSecret.setOnClickListener { navigator.showQrScanActivity(this, Constant.REQUEST_CODE_SCAN_QR_SECRET) } + ivCameraSecret.setOnClickListener { + navigateForResult( + Constant.REQUEST_CODE_SCAN_QR_SECRET, + R.id.action_prepareCryptonitOtherApiWithdrawalFragment_to_qrScanFragment) + } - ivCameraUserId.setOnClickListener { navigator.showQrScanActivity(this, Constant.REQUEST_CODE_SCAN_QR_USER_ID) } + ivCameraUserId.setOnClickListener { + navigateForResult( + Constant.REQUEST_CODE_SCAN_QR_USER_ID, + R.id.action_prepareCryptonitOtherApiWithdrawalFragment_to_qrScanFragment) + } ivRefreshBalance.setOnClickListener { doRequestBalance() } - cryptonit!!.setBalanceListener { response -> + cryptonit.setBalanceListener { response -> when (ctx.blockchain) { Blockchain.Ethereum, Blockchain.EthereumTestNet -> { tvBalance.text = response.eth_available @@ -113,16 +106,17 @@ class PrepareCryptonitOtherApiWithdrawalActivity : AppCompatActivity(), NfcAdapt rlProgressBar.visibility = View.INVISIBLE btnLoad.isActivated = true } - cryptonit!!.setErrorListener { throwable -> + cryptonit.setErrorListener { throwable -> throwable.printStackTrace() rlProgressBar.visibility = View.INVISIBLE tvError.visibility = View.VISIBLE tvError.text = throwable.message } - cryptonit!!.setWithdrawalListener { response -> + cryptonit.setWithdrawalListener { response -> rlProgressBar.visibility = View.INVISIBLE - if (response.success != null && response.success!!) finish() - else { + if (response.success != null && response.success!!) { + navigateUp() + } else { tvError.visibility = View.VISIBLE tvError.text = response.reason!!.toString() } @@ -131,42 +125,41 @@ class PrepareCryptonitOtherApiWithdrawalActivity : AppCompatActivity(), NfcAdapt doRequestBalance() } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK && data != null && data.extras!!.containsKey("QRCode")) { + override fun onNavigationResult(requestCode: String, resultCode: Int, data: Bundle?) { + if (resultCode == Activity.RESULT_OK && data != null && data.containsKey("QRCode")) { when (requestCode) { Constant.REQUEST_CODE_SCAN_QR_KEY -> { - cryptonit!!.key = data.getStringExtra("QRCode") - tvKey!!.text = cryptonit!!.key + cryptonit.key = data.getString("QRCode") + tvKey?.text = cryptonit.key } Constant.REQUEST_CODE_SCAN_QR_SECRET -> { - cryptonit!!.secret = data.getStringExtra("QRCode") - tvSecret!!.text = cryptonit!!.secretDescription + cryptonit.secret = data.getString("QRCode") + tvSecret?.text = cryptonit.secretDescription } Constant.REQUEST_CODE_SCAN_QR_USER_ID -> { - cryptonit!!.userId = data.getStringExtra("QRCode") - tvUserID!!.text = cryptonit!!.userId + cryptonit.userId = data.getString("QRCode") + tvUserID?.text = cryptonit.userId } } - cryptonit!!.saveAccountInfo() + cryptonit.saveAccountInfo() doRequestBalance() } } override fun onTagDiscovered(tag: Tag) { try { - nfcManager.ignoreTag(tag) + (activity as MainActivity).nfcManager.ignoreTag(tag) } catch (e: IOException) { e.printStackTrace() } } private fun doRequestBalance() { - if (cryptonit!!.havaAccountInfo()) { + if (cryptonit.havaAccountInfo()) { rlProgressBar.visibility = View.VISIBLE tvProgressDescription.text = getString(R.string.cryptonit_request_balance) tvError.visibility = View.INVISIBLE - cryptonit!!.requestBalance(ctx.blockchain.currency, "USD") + cryptonit.requestBalance(ctx.blockchain.currency, "USD") } else { tvError.visibility = View.VISIBLE tvError.text = getString(R.string.cryptonit_not_enough_account_data) diff --git a/app/src/main/java/com/tangem/ui/activity/PrepareCryptonitWithdrawalActivity.kt b/app/src/main/java/com/tangem/ui/fragment/additional/PrepareCryptonitWithdrawalFragment.kt similarity index 69% rename from app/src/main/java/com/tangem/ui/activity/PrepareCryptonitWithdrawalActivity.kt rename to app/src/main/java/com/tangem/ui/fragment/additional/PrepareCryptonitWithdrawalFragment.kt index 798d1eff9a..e8febb42e1 100644 --- a/app/src/main/java/com/tangem/ui/activity/PrepareCryptonitWithdrawalActivity.kt +++ b/app/src/main/java/com/tangem/ui/fragment/additional/PrepareCryptonitWithdrawalFragment.kt @@ -1,54 +1,43 @@ -package com.tangem.ui.activity +package com.tangem.ui.fragment.additional -import android.annotation.SuppressLint import android.content.Context import android.graphics.Color import android.nfc.NfcAdapter import android.nfc.Tag import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity import android.text.InputFilter import android.view.View import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputMethodManager import android.widget.Toast -import com.tangem.data.network.Cryptonit -import com.tangem.card_android.android.reader.NfcManager import com.tangem.data.Blockchain -import com.tangem.wallet.CoinEngineFactory -import com.tangem.wallet.TangemContext -import com.tangem.card_android.android.nfc.NfcLifecycleObserver +import com.tangem.data.network.Cryptonit +import com.tangem.ui.activity.MainActivity +import com.tangem.ui.fragment.BaseFragment import com.tangem.util.DecimalDigitsInputFilter +import com.tangem.wallet.CoinEngineFactory import com.tangem.wallet.R -import kotlinx.android.synthetic.main.activity_prepare_cryptonit_withdrawal.* +import com.tangem.wallet.TangemContext +import kotlinx.android.synthetic.main.fragment_prepare_cryptonit_withdrawal.* import java.io.IOException -class PrepareCryptonitWithdrawalActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { +class PrepareCryptonitWithdrawalFragment : BaseFragment(), NfcAdapter.ReaderCallback { companion object { - val TAG: String = PrepareCryptonitWithdrawalActivity::class.java.simpleName + val TAG: String = PrepareCryptonitWithdrawalFragment::class.java.simpleName } - private lateinit var ctx: TangemContext - private lateinit var nfcManager: NfcManager + override val layoutId = R.layout.fragment_prepare_cryptonit_withdrawal - private var cryptonit: Cryptonit? = null + private val ctx: TangemContext by lazy { TangemContext.loadFromBundle(context, arguments) } + private val cryptonit: Cryptonit by lazy { Cryptonit(context) } - @SuppressLint("SetTextI18n") - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_prepare_cryptonit_withdrawal) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) - ctx = TangemContext.loadFromBundle(this, intent.extras) - - nfcManager = NfcManager(this, this) - lifecycle.addObserver(NfcLifecycleObserver(nfcManager)) - - cryptonit = Cryptonit(this) - - etUsername.setText(cryptonit!!.username) - etPassword.setText(cryptonit!!.password) - etFee.setText(cryptonit!!.fee) + etUsername.setText(cryptonit.username) + etPassword.setText(cryptonit.password) + etFee.setText(cryptonit.fee) tvCardID.text = ctx.card!!.cidDescription tvWallet.text = ctx.coinData!!.wallet @@ -92,42 +81,42 @@ class PrepareCryptonitWithdrawalActivity : AppCompatActivity(), NfcAdapter.Reade val strAmount: String = etAmount.text.toString().replace(",", ".") val strFee: String = etFee.text.toString().replace(",", ".") val dblAmount: Double = strAmount.toDouble() - cryptonit!!.fee = strFee + cryptonit.fee = strFee rlProgressBar.visibility = View.VISIBLE tvProgressDescription.text = getString(R.string.cryptonit_request_withdrawal) - cryptonit!!.requestWithdrawCoins(ctx.blockchain.currency, dblAmount, ctx.coinData!!.wallet) + cryptonit.requestWithdrawCoins(ctx.blockchain.currency, dblAmount, ctx.coinData!!.wallet) } catch (e: Exception) { etAmount.error = getString(R.string.unknown_amount_format) } } ivRefreshBalance.setOnClickListener { - cryptonit!!.username = etUsername.text.toString() - cryptonit!!.password = etPassword.text.toString() - cryptonit!!.saveAccountInfo() + cryptonit.username = etUsername.text.toString() + cryptonit.password = etPassword.text.toString() + cryptonit.saveAccountInfo() doRequestBalance() } - cryptonit!!.setBalanceListener { response -> + cryptonit.setBalanceListener { response -> tvBalance.text = response.results[0].balance.toString() tvBalanceCurrency.text = response.results[0].currency // card!!.blockchain.currency tvBalance.setTextColor(Color.BLACK) rlProgressBar.visibility = View.INVISIBLE btnLoad.visibility = View.VISIBLE } - cryptonit!!.setErrorListener { throwable -> + cryptonit.setErrorListener { throwable -> throwable.printStackTrace() rlProgressBar.visibility = View.INVISIBLE tvError.visibility = View.VISIBLE tvError.text = throwable.message } - cryptonit!!.setWithdrawalListener { response -> + cryptonit.setWithdrawalListener { response -> rlProgressBar.visibility = View.INVISIBLE if (response.success != null && response.success!!) { - Toast.makeText(this, R.string.withdrawal_successful, Toast.LENGTH_LONG).show(); - finish() + Toast.makeText(context, R.string.withdrawal_successful, Toast.LENGTH_LONG).show(); + navigateUp() } else { tvError.visibility = View.VISIBLE tvError.text = response.errors.toString() @@ -139,18 +128,18 @@ class PrepareCryptonitWithdrawalActivity : AppCompatActivity(), NfcAdapter.Reade override fun onTagDiscovered(tag: Tag) { try { - nfcManager.ignoreTag(tag) + (activity as MainActivity).nfcManager.ignoreTag(tag) } catch (e: IOException) { e.printStackTrace() } } private fun doRequestBalance() { - if (cryptonit!!.haveAccountInfo()) { + if (cryptonit.haveAccountInfo()) { rlProgressBar.visibility = View.VISIBLE tvProgressDescription.text = getString(R.string.cryptonit_request_balance) tvError.visibility = View.INVISIBLE - cryptonit!!.requestBalance(ctx.blockchain.currency) + cryptonit.requestBalance(ctx.blockchain.currency) } else { tvError.visibility = View.VISIBLE tvError.text = getString(R.string.cryptonit_not_enough_account_data) diff --git a/app/src/main/java/com/tangem/ui/activity/PrepareKrakenWithdrawalActivity.kt b/app/src/main/java/com/tangem/ui/fragment/additional/PrepareKrakenWithdrawalFragment.kt similarity index 72% rename from app/src/main/java/com/tangem/ui/activity/PrepareKrakenWithdrawalActivity.kt rename to app/src/main/java/com/tangem/ui/fragment/additional/PrepareKrakenWithdrawalFragment.kt index 3609aa8f8e..0dfde6f7ec 100644 --- a/app/src/main/java/com/tangem/ui/activity/PrepareKrakenWithdrawalActivity.kt +++ b/app/src/main/java/com/tangem/ui/fragment/additional/PrepareKrakenWithdrawalFragment.kt @@ -1,68 +1,51 @@ -package com.tangem.ui.activity +package com.tangem.ui.fragment.additional -import android.annotation.SuppressLint import android.app.Activity import android.app.AlertDialog import android.content.Context import android.content.DialogInterface -import android.content.Intent import android.graphics.Color import android.nfc.NfcAdapter import android.nfc.Tag import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity import android.view.View import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputMethodManager import android.widget.Toast -import com.tangem.App import com.tangem.Constant -import com.tangem.data.network.Kraken -import com.tangem.card_android.android.reader.NfcManager import com.tangem.data.Blockchain -import com.tangem.di.Navigator +import com.tangem.data.network.Kraken +import com.tangem.ui.activity.MainActivity +import com.tangem.ui.fragment.BaseFragment +import com.tangem.ui.navigation.NavigationResultListener import com.tangem.wallet.CoinEngineFactory -import com.tangem.wallet.TangemContext -import com.tangem.card_android.android.nfc.NfcLifecycleObserver import com.tangem.wallet.R -import kotlinx.android.synthetic.main.activity_prepare_kraken_withdrawal.* +import com.tangem.wallet.TangemContext +import kotlinx.android.synthetic.main.fragment_prepare_kraken_withdrawal.* import java.io.IOException import java.math.BigDecimal import java.net.URI import java.util.* -import javax.inject.Inject -class PrepareKrakenWithdrawalActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { +class PrepareKrakenWithdrawalFragment : BaseFragment(), NavigationResultListener, + NfcAdapter.ReaderCallback { companion object { - val TAG: String = PrepareKrakenWithdrawalActivity::class.java.simpleName + val TAG: String = PrepareKrakenWithdrawalFragment::class.java.simpleName } - private lateinit var ctx: TangemContext - private lateinit var nfcManager: NfcManager + override val layoutId = R.layout.fragment_prepare_kraken_withdrawal + + private val ctx: TangemContext by lazy { TangemContext.loadFromBundle(context, arguments) } + private val kraken: Kraken by lazy { Kraken(context) } - private var kraken: Kraken? = null private var fee: BigDecimal? = null - @Inject - internal lateinit var navigator: Navigator + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) - @SuppressLint("SetTextI18n") - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_prepare_kraken_withdrawal) - - App.navigatorComponent.inject(this) - - ctx = TangemContext.loadFromBundle(this, intent.extras) - - nfcManager = NfcManager(this, this) - lifecycle.addObserver(NfcLifecycleObserver(nfcManager)) - - kraken = Kraken(this) - - tvKey.text = kraken!!.key - tvSecret.text = kraken!!.secretDescription + tvKey.text = kraken.key + tvSecret.text = kraken.secretDescription tvCardID.text = ctx.card!!.cidDescription tvWallet.text = ctx.coinData!!.wallet @@ -93,18 +76,18 @@ class PrepareKrakenWithdrawalActivity : AppCompatActivity(), NfcAdapter.ReaderCa rlProgressBar.visibility = View.VISIBLE tvProgressDescription.text = getString(R.string.kraken_request_withdrawal) - kraken!!.requestWithdrawInfo(ctx.blockchain.currency, dblAmount.toString(), ctx.coinData!!.wallet) + kraken.requestWithdrawInfo(ctx.blockchain.currency, dblAmount.toString(), ctx.coinData!!.wallet) } catch (e: Exception) { etAmount.error = getString(R.string.unknown_amount_format) } } - ivCamera.setOnClickListener { navigator.showQrScanActivity(this, Constant.REQUEST_CODE_SCAN_QR) } +// ivCamera.setOnClickListener { navigator.showQrScanActivity(this, Constant.REQUEST_CODE_SCAN_QR) } ivRefreshBalance.setOnClickListener { doRequestBalance() } - kraken!!.setBalanceListener { response -> + kraken.setBalanceListener { response -> if (response.error != null && response.error.isNotEmpty()) { tvError.visibility = View.VISIBLE tvError.text = Arrays.toString(response.error) @@ -129,23 +112,23 @@ class PrepareKrakenWithdrawalActivity : AppCompatActivity(), NfcAdapter.ReaderCa } rlProgressBar.visibility = View.INVISIBLE } - kraken!!.setErrorListener { throwable -> + kraken.setErrorListener { throwable -> throwable.printStackTrace() rlProgressBar.visibility = View.INVISIBLE tvError.visibility = View.VISIBLE tvError.text = throwable.message } - kraken!!.setWithdrawalListener { response -> + kraken.setWithdrawalListener { response -> rlProgressBar.visibility = View.INVISIBLE if (response.error != null && response.error.isNotEmpty()) { tvError.visibility = View.VISIBLE tvError.text = Arrays.toString(response.error) } else { - Toast.makeText(this, "Withdrawal successful!", Toast.LENGTH_LONG).show() - finish() + Toast.makeText(context, "Withdrawal successful!", Toast.LENGTH_LONG).show() + navigateUp() } } - kraken!!.setWithdrawalInfoListener { response -> + kraken.setWithdrawalInfoListener { response -> rlProgressBar.visibility = View.INVISIBLE if (response.error != null && response.error.isNotEmpty()) { tvError.visibility = View.VISIBLE @@ -167,7 +150,7 @@ class PrepareKrakenWithdrawalActivity : AppCompatActivity(), NfcAdapter.ReaderCa // Initialize a new instance of alert dialog builder object - val builder = AlertDialog.Builder(this) + val builder = AlertDialog.Builder(context) // Set a title for alert dialog builder.setTitle(R.string.please_confirm_withdraw) @@ -189,13 +172,13 @@ class PrepareKrakenWithdrawalActivity : AppCompatActivity(), NfcAdapter.ReaderCa rlProgressBar.visibility = View.VISIBLE tvProgressDescription.text = getString(R.string.kraken_request_withdrawal) - kraken!!.requestWithdraw(ctx.blockchain.currency, dblAmount.toString(), ctx.coinData!!.wallet) + kraken.requestWithdraw(ctx.blockchain.currency, dblAmount.toString(), ctx.coinData!!.wallet) } catch (e: Exception) { etAmount.error = getString(R.string.unknown_amount_format) } } DialogInterface.BUTTON_NEGATIVE -> { - Toast.makeText(this, R.string.operation_canceled, Toast.LENGTH_LONG).show() + Toast.makeText(context, R.string.operation_canceled, Toast.LENGTH_LONG).show() } } } @@ -226,30 +209,29 @@ class PrepareKrakenWithdrawalActivity : AppCompatActivity(), NfcAdapter.ReaderCa } } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (resultCode == Activity.RESULT_OK && data != null && data.extras!!.containsKey("QRCode")) { + override fun onNavigationResult(requestCode: String, resultCode: Int, data: Bundle?) { + if (resultCode == Activity.RESULT_OK && data != null && data.containsKey("QRCode")) { when (requestCode) { Constant.REQUEST_CODE_SCAN_QR -> { - val uri = URI(data.getStringExtra("QRCode")) + val uri = URI(data.getString("QRCode")) val query = uri.query val params = query.split("&") for (param in params) { - if (param.startsWith("key=")) kraken!!.key = param.substring(4) - else if (param.startsWith("secret=")) kraken!!.secret = param.substring(7) + if (param.startsWith("key=")) kraken.key = param.substring(4) + else if (param.startsWith("secret=")) kraken.secret = param.substring(7) } - tvKey!!.text = kraken!!.key - tvSecret!!.text = kraken!!.secretDescription + tvKey!!.text = kraken.key + tvSecret!!.text = kraken.secretDescription } } - kraken!!.saveAccountInfo() + kraken.saveAccountInfo() doRequestBalance() } } override fun onTagDiscovered(tag: Tag) { try { - nfcManager.ignoreTag(tag) + (activity as MainActivity).nfcManager.ignoreTag(tag) } catch (e: IOException) { e.printStackTrace() } diff --git a/app/src/main/java/com/tangem/ui/activity/PinRequestActivity.kt b/app/src/main/java/com/tangem/ui/fragment/pin/PinRequestFragment.kt similarity index 63% rename from app/src/main/java/com/tangem/ui/activity/PinRequestActivity.kt rename to app/src/main/java/com/tangem/ui/fragment/pin/PinRequestFragment.kt index a881cc687d..f113e47551 100644 --- a/app/src/main/java/com/tangem/ui/activity/PinRequestActivity.kt +++ b/app/src/main/java/com/tangem/ui/fragment/pin/PinRequestFragment.kt @@ -1,4 +1,4 @@ -package com.tangem.ui.activity +package com.tangem.ui.fragment.pin import android.Manifest import android.annotation.SuppressLint @@ -6,87 +6,86 @@ import android.annotation.TargetApi import android.app.Activity import android.app.KeyguardManager import android.content.Context -import android.content.Intent import android.content.pm.PackageManager import android.hardware.fingerprint.FingerprintManager import android.nfc.NfcAdapter import android.nfc.Tag import android.os.Build import android.os.Bundle -import androidx.core.app.ActivityCompat -import androidx.appcompat.app.AppCompatActivity import android.text.TextUtils import android.util.Log import android.view.View import android.widget.Button +import androidx.core.app.ActivityCompat import com.tangem.Constant -import com.tangem.data.fingerprint.StartFingerprintReaderTask -import com.tangem.card_android.android.reader.NfcManager -import com.tangem.data.fingerprint.FingerprintHelper -import com.tangem.wallet.TangemContext import com.tangem.card_android.android.data.PINStorage -import com.tangem.card_android.android.nfc.NfcLifecycleObserver -import com.tangem.card_android.data.loadFromBundle import com.tangem.card_android.data.EXTRA_TANGEM_CARD import com.tangem.card_android.data.EXTRA_TANGEM_CARD_UID +import com.tangem.card_android.data.loadFromBundle import com.tangem.card_common.data.TangemCard +import com.tangem.data.fingerprint.FingerprintHelper +import com.tangem.data.fingerprint.StartFingerprintReaderTask +import com.tangem.ui.activity.MainActivity +import com.tangem.ui.fragment.BaseFragment import com.tangem.util.LOG import com.tangem.wallet.R -import kotlinx.android.synthetic.main.activity_pin_request.* +import com.tangem.wallet.TangemContext +import kotlinx.android.synthetic.main.fragment_pin_request.* import kotlinx.android.synthetic.main.layout_pin_buttons.* import java.io.IOException -class PinRequestActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, FingerprintHelper.FingerprintHelperListener { +class PinRequestFragment : BaseFragment(), NfcAdapter.ReaderCallback, FingerprintHelper.FingerprintHelperListener { companion object { - val TAG: String = PinRequestActivity::class.java.simpleName + val TAG: String = PinRequestFragment::class.java.simpleName - fun callingIntent(context: Activity, mode: String): Intent { - val intent = Intent(context, PinRequestActivity::class.java) - intent.putExtra(Constant.EXTRA_MODE, mode) - return intent + fun callingIntent(mode: String): Bundle { + val bundle = Bundle() + bundle.putString(Constant.EXTRA_MODE, mode) + return bundle } - fun callingIntentRequestPin(context: Activity, mode: String, ctx: TangemContext, newPIN: String): Intent { - val intent = Intent(context, PinRequestActivity::class.java) - intent.putExtra(Constant.EXTRA_MODE, mode) - intent.putExtra(Constant.EXTRA_NEW_PIN, newPIN) - ctx.saveToIntent(intent) - return intent + fun callingIntentRequestPin(mode: String, ctx: TangemContext, newPIN: String): Bundle { + val bundle = Bundle() + bundle.putString(Constant.EXTRA_MODE, mode) + bundle.putString(Constant.EXTRA_NEW_PIN, newPIN) + ctx.saveToBundle(bundle) + return bundle } - fun callingIntentRequestPin2(context: Activity, mode: String, ctx: TangemContext, newPIN2: String): Intent { - val intent = Intent(context, PinRequestActivity::class.java) - intent.putExtra(Constant.EXTRA_MODE, mode) - intent.putExtra(Constant.EXTRA_NEW_PIN_2, newPIN2) - ctx.saveToIntent(intent) - return intent + fun callingIntentRequestPin2(mode: String, ctx: TangemContext, newPIN2: String): Bundle { + val bundle = Bundle() + bundle.putString(Constant.EXTRA_MODE, mode) + bundle.putString(Constant.EXTRA_NEW_PIN_2, newPIN2) + ctx.saveToBundle(bundle) + return bundle } - fun callingIntentRequestPin2(context: Activity, mode: String, ctx: TangemContext): Intent { - val intent = Intent(context, PinRequestActivity::class.java) - intent.putExtra(Constant.EXTRA_MODE, mode) - ctx.saveToIntent(intent) - return intent + fun callingIntentRequestPin2(mode: String, ctx: TangemContext): Bundle { + val bundle = Bundle() + bundle.putString(Constant.EXTRA_MODE, mode) + ctx.saveToBundle(bundle) + return bundle } - fun callingIntentConfirmPin(context: Activity, mode: String, newPIN: String): Intent { - val intent = Intent(context, PinRequestActivity::class.java) - intent.putExtra(Constant.EXTRA_MODE, mode) - intent.putExtra(Constant.EXTRA_NEW_PIN, newPIN) - return intent + fun callingIntentConfirmPin(mode: String, newPIN: String): Bundle { + val bundle = Bundle() + bundle.putString(Constant.EXTRA_MODE, mode) + bundle.putString(Constant.EXTRA_NEW_PIN, newPIN) + return bundle } - fun callingIntentConfirmPin2(context: Activity, mode: String, newPIN2: String): Intent { - val intent = Intent(context, PinRequestActivity::class.java) - intent.putExtra(Constant.EXTRA_MODE, mode) - intent.putExtra(Constant.EXTRA_NEW_PIN_2, newPIN2) - return intent + fun callingIntentConfirmPin2(mode: String, newPIN2: String): Bundle { + val bundle = Bundle() + bundle.putString(Constant.EXTRA_MODE, mode) + bundle.putString(Constant.EXTRA_NEW_PIN_2, newPIN2) + return bundle } } - private lateinit var nfcManager: NfcManager + override val layoutId = R.layout.fragment_pin_request + + val mode: Mode by lazy { Mode.valueOf(arguments?.getString(Constant.EXTRA_MODE) ?: "") } - lateinit var mode: Mode private var allowFingerprint = false var startFingerprintReaderTask: StartFingerprintReaderTask? = null private var fingerprintManager: FingerprintManager? = null @@ -96,14 +95,8 @@ class PinRequestActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, Finge RequestPIN, RequestPIN2, RequestNewPIN, RequestNewPIN2, ConfirmNewPIN, ConfirmNewPIN2 } - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_pin_request) - - nfcManager = NfcManager(this, this) - lifecycle.addObserver(NfcLifecycleObserver(nfcManager)) - - mode = Mode.valueOf(intent.getStringExtra(Constant.EXTRA_MODE)) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) if (mode == Mode.RequestNewPIN) if (PINStorage.haveEncryptedPIN()) { @@ -128,15 +121,14 @@ class PinRequestActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, Finge else if (mode == Mode.ConfirmNewPIN2) tvPinPrompt.setText(R.string.confirm_new_pin_2) else if (mode == Mode.RequestPIN2) { - val uid = intent.getStringExtra(EXTRA_TANGEM_CARD_UID) + val uid = arguments?.getString(EXTRA_TANGEM_CARD_UID) val card = TangemCard(uid) - card.loadFromBundle(intent.getBundleExtra(EXTRA_TANGEM_CARD)) + card.loadFromBundle(arguments?.getBundle(EXTRA_TANGEM_CARD) ?: Bundle()) if (card.PIN2 == TangemCard.PIN2_Mode.DefaultPIN2 || card.PIN2 == TangemCard.PIN2_Mode.Unchecked) { // if we know PIN2 or not try default previously - use it PINStorage.setPIN2(PINStorage.getDefaultPIN2()) - setResult(Activity.RESULT_OK) - finish() + navigateBackWithResult(Activity.RESULT_OK) return } @@ -200,7 +192,7 @@ class PinRequestActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, Finge override fun onTagDiscovered(tag: Tag) { try { Log.w(javaClass.name, "Ignore discovered tag!") - nfcManager.ignoreTag(tag) + (activity as MainActivity).nfcManager.ignoreTag(tag) } catch (e: IOException) { e.printStackTrace() } @@ -216,28 +208,24 @@ class PinRequestActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, Finge val cipher = result.cryptoObject.cipher if (mode == Mode.RequestNewPIN || mode == Mode.ConfirmNewPIN) { - val resultData = Intent() + val resultData = Bundle() val pin = PINStorage.loadEncryptedPIN(cipher) - resultData.putExtra(Constant.EXTRA_NEW_PIN, pin) - resultData.putExtra(Constant.EXTRA_CONFIRM_PIN, pin) - setResult(Activity.RESULT_OK, resultData) - finish() + resultData.putString(Constant.EXTRA_NEW_PIN, pin) + resultData.putString(Constant.EXTRA_CONFIRM_PIN, pin) + navigateBackWithResult(Activity.RESULT_OK, resultData) } else if (mode == Mode.RequestNewPIN2 || mode == Mode.ConfirmNewPIN2) { - val resultData = Intent() + val resultData = Bundle() val pin = PINStorage.loadEncryptedPIN2(cipher) - resultData.putExtra(Constant.EXTRA_NEW_PIN_2, pin) - resultData.putExtra(Constant.EXTRA_CONFIRM_PIN_2, pin) - setResult(Activity.RESULT_OK, resultData) - finish() + resultData.putString(Constant.EXTRA_NEW_PIN_2, pin) + resultData.putString(Constant.EXTRA_CONFIRM_PIN_2, pin) + navigateBackWithResult(Activity.RESULT_OK, resultData) } else if (mode == Mode.RequestPIN) { PINStorage.loadEncryptedPIN(cipher) - setResult(Activity.RESULT_OK) + navigateBackWithResult(Activity.RESULT_OK) } else if (mode == Mode.RequestPIN2) { PINStorage.loadEncryptedPIN2(cipher) - setResult(Activity.RESULT_OK) + navigateBackWithResult(Activity.RESULT_OK) } - - finish() } private fun buttonClick(button: Button) { @@ -248,15 +236,15 @@ class PinRequestActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, Finge private fun testFingerPrintSettings(): Boolean { LOG.i(TAG, "Testing Fingerprint SettingsFragment") - val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager - fingerprintManager = getSystemService(Context.FINGERPRINT_SERVICE) as FingerprintManager + val keyguardManager = context?.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager + fingerprintManager = context?.getSystemService(Context.FINGERPRINT_SERVICE) as FingerprintManager if (!keyguardManager.isKeyguardSecure) { LOG.i(TAG, "User hasn't enabled Lock Screen") return false } - if (ActivityCompat.checkSelfPermission(this, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) { + if (ActivityCompat.checkSelfPermission(context!!, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) { LOG.i(TAG, "User hasn't granted permission to use Fingerprint") return false } @@ -278,8 +266,9 @@ class PinRequestActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, Finge if (!allowFingerprint) return - fingerprintHelper = FingerprintHelper(this@PinRequestActivity) - startFingerprintReaderTask = StartFingerprintReaderTask(this, fingerprintManager, fingerprintHelper) + fingerprintHelper = FingerprintHelper(this@PinRequestFragment) + startFingerprintReaderTask = StartFingerprintReaderTask( + this@PinRequestFragment, fingerprintManager, fingerprintHelper) startFingerprintReaderTask!!.execute(null as Void?) } @@ -297,13 +286,13 @@ class PinRequestActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, Finge var focusView: View? = null if (mode == Mode.ConfirmNewPIN) { - if (pin != intent.getStringExtra(Constant.EXTRA_NEW_PIN)) { + if (pin != arguments?.getString(Constant.EXTRA_NEW_PIN)) { tvPin!!.error = getString(R.string.error_pin_confirmation_failed) focusView = tvPin cancel = true } } else if (mode == Mode.ConfirmNewPIN2) { - if (pin != intent.getStringExtra(Constant.EXTRA_NEW_PIN_2)) { + if (pin != arguments?.getString(Constant.EXTRA_NEW_PIN_2)) { tvPin!!.error = getString(R.string.error_pin_confirmation_failed) focusView = tvPin cancel = true @@ -320,31 +309,28 @@ class PinRequestActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, Finge focusView!!.requestFocus() else { if (mode == Mode.RequestNewPIN || mode == Mode.ConfirmNewPIN) { - val resultData = Intent() - resultData.putExtra(Constant.EXTRA_NEW_PIN, pin) + val resultData = Bundle() + resultData.putString(Constant.EXTRA_NEW_PIN, pin) if (mode == Mode.ConfirmNewPIN) - resultData.putExtra(Constant.EXTRA_CONFIRM_PIN, pin) + resultData.putString(Constant.EXTRA_CONFIRM_PIN, pin) + + navigateBackWithResult(Activity.RESULT_OK, resultData) - setResult(Activity.RESULT_OK, resultData) - finish() } else if (mode == Mode.RequestNewPIN2 || mode == Mode.ConfirmNewPIN2) { - val resultData = Intent() - resultData.putExtra(Constant.EXTRA_NEW_PIN_2, pin) + val resultData = Bundle() + resultData.putString(Constant.EXTRA_NEW_PIN_2, pin) if (mode == Mode.ConfirmNewPIN2) - resultData.putExtra(Constant.EXTRA_CONFIRM_PIN_2, pin) + resultData.putString(Constant.EXTRA_CONFIRM_PIN_2, pin) + navigateBackWithResult(Activity.RESULT_OK, resultData) - setResult(Activity.RESULT_OK, resultData) - finish() } else if (mode == Mode.RequestPIN) { PINStorage.setUserPIN(pin) - setResult(Activity.RESULT_OK) - finish() + navigateBackWithResult(Activity.RESULT_OK) + } else if (mode == Mode.RequestPIN2) { PINStorage.setPIN2(pin) - setResult(Activity.RESULT_OK) - finish() + navigateBackWithResult(Activity.RESULT_OK) } } } - } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/ui/activity/PinSaveActivity.kt b/app/src/main/java/com/tangem/ui/fragment/pin/PinSaveFragment.kt similarity index 83% rename from app/src/main/java/com/tangem/ui/activity/PinSaveActivity.kt rename to app/src/main/java/com/tangem/ui/fragment/pin/PinSaveFragment.kt index 3b51be1a15..a64550385a 100644 --- a/app/src/main/java/com/tangem/ui/activity/PinSaveActivity.kt +++ b/app/src/main/java/com/tangem/ui/fragment/pin/PinSaveFragment.kt @@ -1,4 +1,4 @@ -package com.tangem.ui.activity +package com.tangem.ui.fragment.pin import android.Manifest import android.annotation.SuppressLint @@ -6,7 +6,6 @@ import android.annotation.TargetApi import android.app.Dialog import android.app.KeyguardManager import android.content.Context -import android.content.Intent import android.content.pm.PackageManager import android.hardware.fingerprint.FingerprintManager import android.os.Build @@ -14,18 +13,18 @@ import android.os.Bundle import android.security.keystore.KeyGenParameterSpec import android.security.keystore.KeyPermanentlyInvalidatedException import android.security.keystore.KeyProperties -import androidx.core.app.ActivityCompat -import androidx.appcompat.app.AppCompatActivity import android.text.TextUtils import android.view.View import android.widget.Button import android.widget.Toast +import androidx.core.app.ActivityCompat import com.tangem.Constant +import com.tangem.card_android.android.data.PINStorage import com.tangem.data.fingerprint.ConfirmWithFingerprintTask import com.tangem.data.fingerprint.FingerprintHelper -import com.tangem.card_android.android.data.PINStorage +import com.tangem.ui.fragment.BaseFragment import com.tangem.wallet.R -import kotlinx.android.synthetic.main.activity_pin_save.* +import kotlinx.android.synthetic.main.fragment_pin_save.* import kotlinx.android.synthetic.main.layout_pin_buttons.* import java.io.IOException import java.security.KeyStore @@ -38,17 +37,13 @@ import javax.crypto.NoSuchPaddingException import javax.crypto.SecretKey import javax.crypto.spec.IvParameterSpec -class PinSaveActivity : AppCompatActivity(), FingerprintHelper.FingerprintHelperListener { +class PinSaveFragment : BaseFragment(), FingerprintHelper.FingerprintHelperListener { companion object { - val TAG: String = PinSaveActivity::class.java.simpleName - - fun callingIntent(context: Context, hasPin2: Boolean): Intent { - val intent = Intent(context, PinSaveActivity::class.java) - intent.putExtra(Constant.EXTRA_PIN2, hasPin2) - return intent - } + val TAG: String = PinSaveFragment::class.java.simpleName } + override val layoutId = R.layout.fragment_pin_save + private var confirmWithFingerprintTask: ConfirmWithFingerprintTask? = null private var keyStore: KeyStore? = null private var cipher: Cipher? = null @@ -63,11 +58,10 @@ class PinSaveActivity : AppCompatActivity(), FingerprintHelper.FingerprintHelper Save, DeleteEncryptedAndSave, Delete } - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_pin_save) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) - usePIN2 = intent.getBooleanExtra(Constant.EXTRA_PIN2, false) + usePIN2 = arguments?.getBoolean(Constant.EXTRA_PIN2, false) ?: false if (usePIN2) tvPinPrompt.text = getString(R.string.enter_pin2_and_use_fingerprint_to_save_it) @@ -130,7 +124,7 @@ class PinSaveActivity : AppCompatActivity(), FingerprintHelper.FingerprintHelper cipher = result.cryptoObject.cipher when (onConfirmAction) { - PinSaveActivity.OnConfirmAction.Save -> { + OnConfirmAction.Save -> { val textToEncrypt = tvPin.text.toString() if (usePIN2) { PINStorage.saveEncryptedPIN2(cipher, textToEncrypt) @@ -139,7 +133,7 @@ class PinSaveActivity : AppCompatActivity(), FingerprintHelper.FingerprintHelper } } - PinSaveActivity.OnConfirmAction.Delete -> { + OnConfirmAction.Delete -> { if (usePIN2) { PINStorage.deleteEncryptedPIN2() } else { @@ -149,7 +143,7 @@ class PinSaveActivity : AppCompatActivity(), FingerprintHelper.FingerprintHelper tvPin.text = "" } - PinSaveActivity.OnConfirmAction.DeleteEncryptedAndSave -> if (usePIN2) { + OnConfirmAction.DeleteEncryptedAndSave -> if (usePIN2) { PINStorage.deleteEncryptedPIN2() PINStorage.saveEncryptedPIN2(cipher, tvPin.text.toString()) } else { @@ -159,7 +153,7 @@ class PinSaveActivity : AppCompatActivity(), FingerprintHelper.FingerprintHelper } dFingerPrintConfirmation!!.dismiss() - finish() + navigateUp() } fun getKeyStore(): Boolean { @@ -288,19 +282,19 @@ class PinSaveActivity : AppCompatActivity(), FingerprintHelper.FingerprintHelper } else { if (usePIN2) { if (!testFingerPrintSettings()) { - tvPin.postDelayed({ this.finish() }, 2000) + tvPin.postDelayed({ navigateUp() }, 2000) return } onConfirmAction = OnConfirmAction.Save - confirmWithFingerprintTask = ConfirmWithFingerprintTask(this@PinSaveActivity) + confirmWithFingerprintTask = ConfirmWithFingerprintTask(this@PinSaveFragment) confirmWithFingerprintTask!!.execute(null as Void?) } else { if (cbUseFingerprint.isChecked || PINStorage.haveEncryptedPIN()) { if (!testFingerPrintSettings()) { - tvPin.postDelayed({ this.finish() }, 2000) + tvPin.postDelayed({ navigateUp() }, 2000) return } @@ -311,11 +305,11 @@ class PinSaveActivity : AppCompatActivity(), FingerprintHelper.FingerprintHelper } // show a progress spinner, and kick off a background task to perform the user login attempt - confirmWithFingerprintTask = ConfirmWithFingerprintTask(this@PinSaveActivity) + confirmWithFingerprintTask = ConfirmWithFingerprintTask(this@PinSaveFragment) confirmWithFingerprintTask!!.execute(null as Void?) } else { PINStorage.savePIN(tvPin.text.toString()) - finish() + navigateUp() } } } @@ -325,50 +319,50 @@ class PinSaveActivity : AppCompatActivity(), FingerprintHelper.FingerprintHelper if (usePIN2) { if (PINStorage.haveEncryptedPIN2()) { if (!testFingerPrintSettings()) { - tvPin.postDelayed({ this.finish() }, 2000) + tvPin.postDelayed({ navigateUp() }, 2000) return } onConfirmAction = OnConfirmAction.Delete - confirmWithFingerprintTask = ConfirmWithFingerprintTask(this@PinSaveActivity) + confirmWithFingerprintTask = ConfirmWithFingerprintTask(this@PinSaveFragment) confirmWithFingerprintTask!!.execute(null as Void?) } else { tvPin.text = "" - finish() + navigateUp() } } else { if (cbUseFingerprint.isChecked || PINStorage.haveEncryptedPIN()) { if (!testFingerPrintSettings()) { - tvPin.postDelayed({ this.finish() }, 2000) + tvPin.postDelayed({ navigateUp() }, 2000) return } onConfirmAction = OnConfirmAction.Delete - confirmWithFingerprintTask = ConfirmWithFingerprintTask(this@PinSaveActivity) + confirmWithFingerprintTask = ConfirmWithFingerprintTask(this@PinSaveFragment) confirmWithFingerprintTask!!.execute(null as Void?) } else { tvPin.text = "" PINStorage.deletePIN() - finish() + navigateUp() } } } @SuppressLint("NewApi") private fun testFingerPrintSettings(): Boolean { - val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager - fingerprintManager = getSystemService(Context.FINGERPRINT_SERVICE) as FingerprintManager + val keyguardManager = activity?.getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager + fingerprintManager = activity?.getSystemService(Context.FINGERPRINT_SERVICE) as FingerprintManager if (!keyguardManager.isKeyguardSecure) { - Toast.makeText(baseContext, R.string.user_has_not_enabled_lock_screen, Toast.LENGTH_LONG).show() + Toast.makeText(context, R.string.user_has_not_enabled_lock_screen, Toast.LENGTH_LONG).show() return false } - if (ActivityCompat.checkSelfPermission(this, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) { - Toast.makeText(baseContext, R.string.user_has_not_granted_permission_to_use_fingerprint, Toast.LENGTH_LONG).show() + if (ActivityCompat.checkSelfPermission(context!!, Manifest.permission.USE_FINGERPRINT) != PackageManager.PERMISSION_GRANTED) { + Toast.makeText(context, R.string.user_has_not_granted_permission_to_use_fingerprint, Toast.LENGTH_LONG).show() return false } if (!fingerprintManager!!.hasEnrolledFingerprints()) { - Toast.makeText(baseContext, R.string.user_has_not_registered_any_fingerprints, Toast.LENGTH_LONG).show() + Toast.makeText(context, R.string.user_has_not_registered_any_fingerprints, Toast.LENGTH_LONG).show() return false } diff --git a/app/src/main/java/com/tangem/ui/activity/PinSwapActivity.kt b/app/src/main/java/com/tangem/ui/fragment/pin/PinSwapFragment.kt similarity index 65% rename from app/src/main/java/com/tangem/ui/activity/PinSwapActivity.kt rename to app/src/main/java/com/tangem/ui/fragment/pin/PinSwapFragment.kt index 813d237ea9..0067ea13c9 100644 --- a/app/src/main/java/com/tangem/ui/activity/PinSwapActivity.kt +++ b/app/src/main/java/com/tangem/ui/fragment/pin/PinSwapFragment.kt @@ -1,51 +1,48 @@ -package com.tangem.ui.activity +package com.tangem.ui.fragment.pin import android.app.Activity -import android.content.Context -import android.content.Intent import android.content.res.ColorStateList import android.graphics.Color import android.nfc.NfcAdapter import android.nfc.Tag import android.nfc.tech.IsoDep import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity import android.view.View import android.widget.ProgressBar import android.widget.Toast import com.tangem.App import com.tangem.Constant -import com.tangem.ui.dialog.NoExtendedLengthSupportDialog -import com.tangem.ui.dialog.WaitSecurityDelayDialog -import com.tangem.card_android.android.nfc.NfcLifecycleObserver -import com.tangem.card_android.android.reader.NfcManager import com.tangem.card_android.android.reader.NfcReader -import com.tangem.card_android.data.* +import com.tangem.card_android.data.EXTRA_TANGEM_CARD +import com.tangem.card_android.data.EXTRA_TANGEM_CARD_UID +import com.tangem.card_android.data.asBundle +import com.tangem.card_android.data.loadFromBundle import com.tangem.card_common.data.TangemCard import com.tangem.card_common.reader.CardProtocol import com.tangem.card_common.tasks.SwapPINTask import com.tangem.card_common.util.Util -import com.tangem.util.LOG +import com.tangem.ui.activity.MainActivity +import com.tangem.ui.dialog.NoExtendedLengthSupportDialog +import com.tangem.ui.dialog.WaitSecurityDelayDialog +import com.tangem.ui.fragment.BaseFragment import com.tangem.wallet.R -import kotlinx.android.synthetic.main.activity_pin_swap.* -import com.tangem.card_android.data.EXTRA_TANGEM_CARD -import com.tangem.card_android.data.EXTRA_TANGEM_CARD_UID +import kotlinx.android.synthetic.main.fragment_pin_swap.* -class PinSwapActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtocol.Notifications { +class PinSwapFragment : BaseFragment(), NfcAdapter.ReaderCallback, CardProtocol.Notifications { companion object { - val TAG: String = PinSwapActivity::class.java.simpleName + val TAG: String = PinSwapFragment::class.java.simpleName - fun callingIntent(context: Context, newPIN: String, newPIN2: String): Intent { - val intent = Intent(context, PinSwapActivity::class.java) - intent.putExtra(Constant.EXTRA_NEW_PIN, newPIN) - intent.putExtra(Constant.EXTRA_NEW_PIN_2, newPIN2) - return intent + fun callingIntent(newPIN: String, newPIN2: String): Bundle { + val bundle = Bundle() + bundle.putString(Constant.EXTRA_NEW_PIN, newPIN) + bundle.putString(Constant.EXTRA_NEW_PIN_2, newPIN2) + return bundle } const val RESULT_INVALID_PIN = Activity.RESULT_FIRST_USER } - private lateinit var nfcManager: NfcManager + override val layoutId = R.layout.fragment_pin_swap private lateinit var card: TangemCard; private var newPIN: String? = null @@ -55,23 +52,22 @@ class PinSwapActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProt private var swapPinTask: SwapPINTask? = null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_pin_swap) - nfcManager = NfcManager(this, this) - lifecycle.addObserver(NfcLifecycleObserver(nfcManager)) + card = TangemCard(arguments?.getString(EXTRA_TANGEM_CARD_UID)) + card.loadFromBundle(arguments?.getBundle(EXTRA_TANGEM_CARD) ?: Bundle()) - card = TangemCard(intent.getStringExtra(EXTRA_TANGEM_CARD_UID)) + newPIN = arguments?.getString(Constant.EXTRA_NEW_PIN) + newPIN2 = arguments?.getString(Constant.EXTRA_NEW_PIN_2) + } - card.loadFromBundle(intent.extras!!.getBundle(EXTRA_TANGEM_CARD)) - - newPIN = intent.getStringExtra(Constant.EXTRA_NEW_PIN) - newPIN2 = intent.getStringExtra(Constant.EXTRA_NEW_PIN_2) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) tvCardID.text = card.cidDescription - progressBar = findViewById(R.id.progressBar) progressBar?.progressTintList = ColorStateList.valueOf(Color.DKGRAY) progressBar?.visibility = View.INVISIBLE } @@ -84,10 +80,11 @@ class PinSwapActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProt val sUID = Util.byteArrayToHexString(uid) if (sUID == card.uid) { isoDep.timeout = card.pauseBeforePIN2 + 65000 - swapPinTask = SwapPINTask(card, NfcReader(nfcManager, isoDep), App.localStorage, App.pinStorage, this, newPIN, newPIN2) + swapPinTask = SwapPINTask(card, NfcReader((activity as MainActivity).nfcManager, isoDep), + App.localStorage, App.pinStorage, this, newPIN, newPIN2) swapPinTask?.start() } else { - nfcManager.ignoreTag(isoDep.tag) + (activity as MainActivity).nfcManager.ignoreTag(isoDep.tag) } } catch (e: Exception) { e.printStackTrace() @@ -119,11 +116,10 @@ class PinSwapActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProt cardProtocol.error == null -> progressBar!!.post { progressBar!!.progress = 100 progressBar!!.progressTintList = ColorStateList.valueOf(Color.GREEN) - val intent = Intent() - intent.putExtra(EXTRA_TANGEM_CARD_UID, cardProtocol.card.uid) - intent.putExtra(EXTRA_TANGEM_CARD, cardProtocol.card.asBundle) - setResult(Activity.RESULT_OK, intent) - finish() + val data = Bundle() + data.putString(EXTRA_TANGEM_CARD_UID, cardProtocol.card.uid) + data.putBundle(EXTRA_TANGEM_CARD, cardProtocol.card.asBundle) + navigateBackWithResult(Activity.RESULT_OK, data) } cardProtocol.error is CardProtocol.TangemException_InvalidPIN -> { progressBar!!.post { @@ -135,12 +131,11 @@ class PinSwapActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProt progressBar!!.progress = 0 progressBar!!.progressTintList = ColorStateList.valueOf(Color.DKGRAY) progressBar!!.visibility = View.INVISIBLE - val intent = Intent() - intent.putExtra(Constant.EXTRA_MESSAGE, "Cannot change PIN(s). Make sure you enter correct PIN2!") - intent.putExtra(EXTRA_TANGEM_CARD_UID, cardProtocol.card.uid) - intent.putExtra(EXTRA_TANGEM_CARD, cardProtocol.card.asBundle) - setResult(RESULT_INVALID_PIN, intent) - finish() + val data = Bundle() + data.putString(Constant.EXTRA_MESSAGE, "Cannot change PIN(s). Make sure you enter correct PIN2!") + data.putString(EXTRA_TANGEM_CARD_UID, cardProtocol.card.uid) + data.putBundle(EXTRA_TANGEM_CARD, cardProtocol.card.asBundle) + navigateBackWithResult(RESULT_INVALID_PIN, data) } catch (e: Exception) { e.printStackTrace() } @@ -149,10 +144,11 @@ class PinSwapActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProt else -> progressBar!!.post { if (cardProtocol.error is CardProtocol.TangemException_ExtendedLengthNotSupported) { if (!NoExtendedLengthSupportDialog.allReadyShowed) { - NoExtendedLengthSupportDialog().show(supportFragmentManager, NoExtendedLengthSupportDialog.TAG) + NoExtendedLengthSupportDialog().show(activity!!.supportFragmentManager, + NoExtendedLengthSupportDialog.TAG) } } else { - Toast.makeText(baseContext, R.string.try_to_scan_again, Toast.LENGTH_SHORT).show() + Toast.makeText(context, R.string.try_to_scan_again, Toast.LENGTH_SHORT).show() } progressBar!!.progress = 100 progressBar!!.progressTintList = ColorStateList.valueOf(Color.RED) @@ -190,15 +186,15 @@ class PinSwapActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProt } override fun onReadWait(msec: Int) { - WaitSecurityDelayDialog.onReadWait(this, msec) + WaitSecurityDelayDialog.onReadWait(activity, msec) } override fun onReadBeforeRequest(timeout: Int) { - WaitSecurityDelayDialog.onReadBeforeRequest(this, timeout) + WaitSecurityDelayDialog.onReadBeforeRequest(activity, timeout) } override fun onReadAfterRequest() { - WaitSecurityDelayDialog.onReadAfterRequest(this) + WaitSecurityDelayDialog.onReadAfterRequest(activity) } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/ui/activity/CreateNewWalletActivity.kt b/app/src/main/java/com/tangem/ui/fragment/wallet/CreateNewWalletFragment.kt similarity index 66% rename from app/src/main/java/com/tangem/ui/activity/CreateNewWalletActivity.kt rename to app/src/main/java/com/tangem/ui/fragment/wallet/CreateNewWalletFragment.kt index 1c78b0f103..063140edda 100644 --- a/app/src/main/java/com/tangem/ui/activity/CreateNewWalletActivity.kt +++ b/app/src/main/java/com/tangem/ui/fragment/wallet/CreateNewWalletFragment.kt @@ -1,8 +1,6 @@ -package com.tangem.ui.activity +package com.tangem.ui.fragment.wallet import android.app.Activity -import android.content.Context -import android.content.Intent import android.content.res.ColorStateList import android.graphics.Color import android.nfc.NfcAdapter @@ -11,57 +9,42 @@ import android.nfc.tech.IsoDep import android.os.Bundle import android.view.View import android.widget.Toast -import androidx.appcompat.app.AppCompatActivity import com.tangem.App import com.tangem.Constant -import com.tangem.wallet.TangemContext -import com.tangem.ui.dialog.NoExtendedLengthSupportDialog -import com.tangem.ui.dialog.WaitSecurityDelayDialog import com.tangem.card_android.android.nfc.NfcDeviceAntennaLocation -import com.tangem.card_android.android.nfc.NfcLifecycleObserver -import com.tangem.card_android.android.reader.NfcManager import com.tangem.card_android.android.reader.NfcReader +import com.tangem.card_android.data.EXTRA_TANGEM_CARD +import com.tangem.card_android.data.EXTRA_TANGEM_CARD_UID import com.tangem.card_android.data.asBundle import com.tangem.card_common.reader.CardProtocol import com.tangem.card_common.tasks.CreateNewWalletTask import com.tangem.card_common.util.Util +import com.tangem.ui.activity.MainActivity +import com.tangem.ui.dialog.NoExtendedLengthSupportDialog +import com.tangem.ui.dialog.WaitSecurityDelayDialog +import com.tangem.ui.fragment.BaseFragment import com.tangem.wallet.R -import kotlinx.android.synthetic.main.activity_create_new_wallet.* +import com.tangem.wallet.TangemContext +import kotlinx.android.synthetic.main.fragment_create_new_wallet.* import kotlinx.android.synthetic.main.layout_progress_horizontal.* import kotlinx.android.synthetic.main.layout_touch_card.* -import com.tangem.card_android.data.EXTRA_TANGEM_CARD -import com.tangem.card_android.data.EXTRA_TANGEM_CARD_UID -class CreateNewWalletActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtocol.Notifications { +class CreateNewWalletFragment : BaseFragment(), NfcAdapter.ReaderCallback, CardProtocol.Notifications { - companion object { - fun callingIntent(context: Context, ctx: TangemContext): Intent { - val intent = Intent(context, CreateNewWalletActivity::class.java) - intent.putExtra(EXTRA_TANGEM_CARD_UID, ctx.card!!.uid) - intent.putExtra(EXTRA_TANGEM_CARD, ctx.card!!.asBundle) - return intent - } - } + override val layoutId = R.layout.fragment_create_new_wallet - private lateinit var nfcManager: NfcManager - private lateinit var ctx: TangemContext + private val ctx: TangemContext by lazy { TangemContext.loadFromBundle(context, arguments) } private lateinit var nfcDeviceAntenna: NfcDeviceAntennaLocation private var createNewWalletTask: CreateNewWalletTask? = null private var lastReadSuccess = true - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_create_new_wallet) - - nfcManager = NfcManager(this, this) - lifecycle.addObserver(NfcLifecycleObserver(nfcManager)) - - ctx = TangemContext.loadFromBundle(this, intent.extras) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) // init NFC Antenna - nfcDeviceAntenna = NfcDeviceAntennaLocation(this, ivHandCardHorizontal, ivHandCardVertical, llHand, llNfc) + nfcDeviceAntenna = NfcDeviceAntennaLocation(requireContext(), ivHandCardHorizontal, ivHandCardVertical, llHand, llNfc) nfcDeviceAntenna.init() tvCardId.text = ctx.card!!.cidDescription @@ -81,13 +64,14 @@ class CreateNewWalletActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, else isoDep.timeout = ctx.card.pauseBeforePIN2 + 65000 - createNewWalletTask = CreateNewWalletTask(ctx.card, NfcReader(nfcManager, isoDep), App.localStorage, App.pinStorage, this) + createNewWalletTask = CreateNewWalletTask(ctx.card, NfcReader((activity as MainActivity).nfcManager, isoDep), + App.localStorage, App.pinStorage, this) createNewWalletTask?.start() } else - nfcManager.ignoreTag(isoDep.tag) + (activity as MainActivity).nfcManager.ignoreTag(isoDep.tag) } - public override fun onPause() { + override fun onPause() { createNewWalletTask?.cancel(true) super.onPause() } @@ -110,11 +94,11 @@ class CreateNewWalletActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, progressBar?.post { progressBar?.progress = 100 progressBar?.progressTintList = ColorStateList.valueOf(Color.GREEN) - val intent = Intent() - intent.putExtra(EXTRA_TANGEM_CARD_UID, cardProtocol.card.uid) - intent.putExtra(EXTRA_TANGEM_CARD, cardProtocol.card.asBundle) - setResult(Activity.RESULT_OK, intent) - finish() + val data = Bundle() + data.putString(EXTRA_TANGEM_CARD_UID, cardProtocol.card.uid) + data.putBundle(EXTRA_TANGEM_CARD, cardProtocol.card.asBundle) + navigateBackWithResult(Activity.RESULT_OK, data) + return@post } } else { lastReadSuccess = false @@ -128,12 +112,12 @@ class CreateNewWalletActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, progressBar?.progress = 0 progressBar?.progressTintList = ColorStateList.valueOf(Color.DKGRAY) progressBar?.visibility = View.INVISIBLE - val intent = Intent() - intent.putExtra(Constant.EXTRA_MESSAGE, getString(R.string.cannot_create_wallet)) - intent.putExtra(EXTRA_TANGEM_CARD_UID, cardProtocol.card.uid) - intent.putExtra(EXTRA_TANGEM_CARD, cardProtocol.card!!.asBundle) - setResult(Constant.RESULT_INVALID_PIN, intent) - finish() + val data = Bundle() + data.putString(Constant.EXTRA_MESSAGE, getString(R.string.cannot_create_wallet)) + data.putString(EXTRA_TANGEM_CARD_UID, cardProtocol.card.uid) + data.putBundle(EXTRA_TANGEM_CARD, cardProtocol.card!!.asBundle) + navigateBackWithResult(Constant.RESULT_INVALID_PIN, data) + return@postDelayed } catch (e: Exception) { e.printStackTrace() } @@ -142,10 +126,10 @@ class CreateNewWalletActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, progressBar?.post { if (cardProtocol.error is CardProtocol.TangemException_ExtendedLengthNotSupported) { if (!NoExtendedLengthSupportDialog.allReadyShowed) { - NoExtendedLengthSupportDialog().show(supportFragmentManager, NoExtendedLengthSupportDialog.TAG) + NoExtendedLengthSupportDialog().show(activity!!.supportFragmentManager, NoExtendedLengthSupportDialog.TAG) } } else - Toast.makeText(this, R.string.try_to_scan_again, Toast.LENGTH_SHORT).show() + Toast.makeText(context, R.string.try_to_scan_again, Toast.LENGTH_SHORT).show() progressBar?.progress = 100 progressBar?.progressTintList = ColorStateList.valueOf(Color.RED) @@ -178,15 +162,15 @@ class CreateNewWalletActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, } override fun onReadWait(msec: Int) { - WaitSecurityDelayDialog.onReadWait(this, msec) + WaitSecurityDelayDialog.onReadWait(activity, msec) } override fun onReadBeforeRequest(timeout: Int) { - WaitSecurityDelayDialog.onReadBeforeRequest(this, timeout) + WaitSecurityDelayDialog.onReadBeforeRequest(activity, timeout) } override fun onReadAfterRequest() { - WaitSecurityDelayDialog.onReadAfterRequest(this) + WaitSecurityDelayDialog.onReadAfterRequest(activity) } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/ui/activity/EmptyWalletActivity.kt b/app/src/main/java/com/tangem/ui/fragment/wallet/EmptyWalletFragment.kt similarity index 62% rename from app/src/main/java/com/tangem/ui/activity/EmptyWalletActivity.kt rename to app/src/main/java/com/tangem/ui/fragment/wallet/EmptyWalletFragment.kt index 0b6abbc166..9ea9ca608c 100644 --- a/app/src/main/java/com/tangem/ui/activity/EmptyWalletActivity.kt +++ b/app/src/main/java/com/tangem/ui/fragment/wallet/EmptyWalletFragment.kt @@ -1,4 +1,4 @@ -package com.tangem.ui.activity +package com.tangem.ui.fragment.wallet import android.app.Activity import android.content.Context @@ -10,51 +10,45 @@ import android.nfc.Tag import android.nfc.tech.IsoDep import android.os.Build import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity import android.text.Html import android.view.View import android.widget.Toast import com.tangem.App import com.tangem.Constant -import com.tangem.di.Navigator -import com.tangem.wallet.TangemContext -import com.tangem.ui.dialog.NoExtendedLengthSupportDialog -import com.tangem.ui.dialog.WaitSecurityDelayDialog -import com.tangem.card_android.android.nfc.NfcLifecycleObserver -import com.tangem.card_android.android.reader.NfcManager import com.tangem.card_android.android.reader.NfcReader +import com.tangem.card_android.data.EXTRA_TANGEM_CARD +import com.tangem.card_android.data.EXTRA_TANGEM_CARD_UID import com.tangem.card_android.data.asBundle import com.tangem.card_android.data.loadFromBundle import com.tangem.card_common.data.TangemCard import com.tangem.card_common.reader.CardProtocol import com.tangem.card_common.tasks.VerifyCardTask import com.tangem.card_common.util.Util -import com.tangem.util.UtilHelper +import com.tangem.ui.activity.MainActivity +import com.tangem.ui.dialog.NoExtendedLengthSupportDialog +import com.tangem.ui.dialog.WaitSecurityDelayDialog +import com.tangem.ui.fragment.BaseFragment +import com.tangem.ui.fragment.pin.PinRequestFragment +import com.tangem.ui.navigation.NavigationResultListener import com.tangem.wallet.R -import kotlinx.android.synthetic.main.activity_empty_wallet.* +import com.tangem.wallet.TangemContext +import kotlinx.android.synthetic.main.fragment_empty_wallet.* import kotlinx.android.synthetic.main.layout_tangem_card.* -import javax.inject.Inject -import com.tangem.card_android.data.EXTRA_TANGEM_CARD -import com.tangem.card_android.data.EXTRA_TANGEM_CARD_UID -import com.tangem.di.ToastHelper -class EmptyWalletActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtocol.Notifications { +class EmptyWalletFragment : BaseFragment(), NavigationResultListener, + NfcAdapter.ReaderCallback, CardProtocol.Notifications { companion object { - val TAG: String = EmptyWalletActivity::class.java.simpleName + val TAG: String = EmptyWalletFragment::class.java.simpleName fun callingIntent(context: Context, ctx: TangemContext): Intent { - val intent = Intent(context, EmptyWalletActivity::class.java) + val intent = Intent(context, EmptyWalletFragment::class.java) ctx.saveToIntent(intent) return intent } } - @Inject - internal lateinit var navigator: Navigator - @Inject - internal lateinit var toastHelper: ToastHelper + override val layoutId = R.layout.fragment_empty_wallet - private lateinit var nfcManager: NfcManager - private lateinit var ctx: TangemContext + private val ctx: TangemContext by lazy { TangemContext.loadFromBundle(context, arguments) } private var lastReadSuccess = true private var verifyCardTask: VerifyCardTask? = null @@ -62,17 +56,8 @@ class EmptyWalletActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, Card private var cardProtocol: CardProtocol? = null - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_empty_wallet) - - App.navigatorComponent.inject(this) - App.toastHelperComponent.inject(this) - - nfcManager = NfcManager(this, this) - lifecycle.addObserver(NfcLifecycleObserver(nfcManager)) - - ctx = TangemContext.loadFromBundle(this, intent.extras) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) tvIssuer.text = ctx.card!!.issuerDescription @@ -91,52 +76,63 @@ class EmptyWalletActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, Card // set listeners btnNewWallet.setOnClickListener { requestPIN2Count = 0 - val intent = Intent(baseContext, PinRequestActivity::class.java) - intent.putExtra(Constant.EXTRA_MODE, PinRequestActivity.Mode.RequestPIN2.toString()) - intent.putExtra(EXTRA_TANGEM_CARD_UID, ctx.card!!.uid) - intent.putExtra(EXTRA_TANGEM_CARD, ctx.card!!.asBundle) - startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2) + + val data = Bundle() + data.putString(Constant.EXTRA_MODE, PinRequestFragment.Mode.RequestPIN2.toString()) + data.putString(EXTRA_TANGEM_CARD_UID, ctx.card!!.uid) + data.putBundle(EXTRA_TANGEM_CARD, ctx.card!!.asBundle) + navigateForResult(Constant.REQUEST_CODE_REQUEST_PIN2, + R.id.action_emptyWalletFragment_to_pinRequestFragment, data) } btnDetails.setOnClickListener { - if (cardProtocol != null) - navigator.showVerifyCard(this, ctx) - else - toastHelper.showSingleToast(this, getString(R.string.need_attach_card_again)) + if (cardProtocol != null) { + val data = Bundle() + ctx.saveToBundle(data) + navigateForResult(Constant.REQUEST_CODE_VERIFY_CARD, + R.id.action_emptyWalletFragment_to_verifyCard, data) + } else { + (activity as MainActivity).toastHelper + .showSingleToast(context, getString(R.string.need_attach_card_again)) + } } } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) + override fun onNavigationResult(requestCode: String, resultCode: Int, data: Bundle?) { if (requestCode == Constant.REQUEST_CODE_CREATE_NEW_WALLET_ACTIVITY) { if (resultCode == Activity.RESULT_OK) { if (data != null) { - data.putExtra(Constant.EXTRA_MODIFICATION, "updateAndViewCard") - data.putExtra("updateDelay", 0) - setResult(Activity.RESULT_OK, data) + data.putString(Constant.EXTRA_MODIFICATION, "updateAndViewCard") + data.putInt("updateDelay", 0) + navigateBackWithResult(Activity.RESULT_OK, data) } - finish() + return } else { - if (data != null && data.extras!!.containsKey(EXTRA_TANGEM_CARD_UID) && data.extras!!.containsKey(EXTRA_TANGEM_CARD)) { - val updatedCard = TangemCard(data.getStringExtra(EXTRA_TANGEM_CARD_UID)) - updatedCard.loadFromBundle(data.getBundleExtra(EXTRA_TANGEM_CARD)) + if (data != null && data.containsKey(EXTRA_TANGEM_CARD_UID) && data.containsKey(EXTRA_TANGEM_CARD)) { + val updatedCard = TangemCard(data.getString(EXTRA_TANGEM_CARD_UID)) + updatedCard.loadFromBundle(data.getBundle(EXTRA_TANGEM_CARD)) ctx.card = updatedCard } if (resultCode == Constant.RESULT_INVALID_PIN && requestPIN2Count < 2) { requestPIN2Count++ - val intent = Intent(baseContext, PinRequestActivity::class.java) - intent.putExtra(Constant.EXTRA_MODE, PinRequestActivity.Mode.RequestPIN2.toString()) - intent.putExtra(EXTRA_TANGEM_CARD_UID, ctx.card!!.uid) - intent.putExtra(EXTRA_TANGEM_CARD, ctx.card!!.asBundle) - startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2) + val bundle = Bundle() + bundle.putString(Constant.EXTRA_MODE, PinRequestFragment.Mode.RequestPIN2.toString()) + bundle.putString(EXTRA_TANGEM_CARD_UID, ctx.card!!.uid) + bundle.putBundle(EXTRA_TANGEM_CARD, ctx.card!!.asBundle) + navigateForResult(Constant.REQUEST_CODE_REQUEST_PIN2, + R.id.action_emptyWalletFragment_to_pinRequestFragment, bundle) return } } - setResult(resultCode, data) - finish() + navigateBackWithResult(resultCode, data) + return } else if (requestCode == Constant.REQUEST_CODE_REQUEST_PIN2) { if (resultCode == Activity.RESULT_OK) { - navigator.showCreateNewWallet(this, ctx) + val bundle = Bundle() + bundle.putString(EXTRA_TANGEM_CARD_UID, ctx.card!!.uid) + bundle.putBundle(EXTRA_TANGEM_CARD, ctx.card!!.asBundle) + navigateForResult(Constant.REQUEST_CODE_CREATE_NEW_WALLET_ACTIVITY, + R.id.action_emptyWalletFragment_to_createNewWalletFragment, bundle) } } } @@ -147,7 +143,7 @@ class EmptyWalletActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, Card val uid = tag.id val sUID = Util.byteArrayToHexString(uid) if (ctx.card.uid != sUID) { - nfcManager.ignoreTag(isoDep.tag) + (activity as MainActivity).nfcManager.ignoreTag(isoDep.tag) return } @@ -156,7 +152,8 @@ class EmptyWalletActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, Card else isoDep.timeout = 65000 - verifyCardTask = VerifyCardTask(ctx.card, NfcReader(nfcManager, isoDep), App.localStorage, App.pinStorage, App.firmwaresStorage, this) + verifyCardTask = VerifyCardTask(ctx.card, NfcReader((activity as MainActivity).nfcManager, isoDep), + App.localStorage, App.pinStorage, App.firmwaresStorage, this) verifyCardTask?.start() } catch (e: Exception) { e.printStackTrace() @@ -189,9 +186,9 @@ class EmptyWalletActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, Card lastReadSuccess = false if (cardProtocol.error is CardProtocol.TangemException_ExtendedLengthNotSupported) { if (!NoExtendedLengthSupportDialog.allReadyShowed) - NoExtendedLengthSupportDialog().show(supportFragmentManager, NoExtendedLengthSupportDialog.TAG) + NoExtendedLengthSupportDialog().show(activity!!.supportFragmentManager, NoExtendedLengthSupportDialog.TAG) } else - Toast.makeText(this@EmptyWalletActivity, R.string.try_to_scan_again, Toast.LENGTH_LONG).show() + Toast.makeText(context, R.string.try_to_scan_again, Toast.LENGTH_LONG).show() progressBar?.progress = 100 progressBar?.progressTintList = ColorStateList.valueOf(Color.RED) @@ -219,7 +216,7 @@ class EmptyWalletActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, Card } override fun onReadProgress(protocol: CardProtocol, progress: Int) { - progressBar?.post { progressBar!!.progress = progress } + progressBar?.post { progressBar?.progress = progress } } override fun onReadCancel() { @@ -245,15 +242,15 @@ class EmptyWalletActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, Card } override fun onReadWait(msec: Int) { - WaitSecurityDelayDialog.onReadWait(this, msec) + WaitSecurityDelayDialog.onReadWait(activity, msec) } override fun onReadBeforeRequest(timeout: Int) { - WaitSecurityDelayDialog.onReadBeforeRequest(this, timeout) + WaitSecurityDelayDialog.onReadBeforeRequest(activity, timeout) } override fun onReadAfterRequest() { - WaitSecurityDelayDialog.onReadAfterRequest(this) + WaitSecurityDelayDialog.onReadAfterRequest(activity) } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/ui/fragment/LoadedWalletFragment.kt b/app/src/main/java/com/tangem/ui/fragment/wallet/LoadedWalletFragment.kt similarity index 76% rename from app/src/main/java/com/tangem/ui/fragment/LoadedWalletFragment.kt rename to app/src/main/java/com/tangem/ui/fragment/wallet/LoadedWalletFragment.kt index 40d2e51edb..1031bb6bec 100644 --- a/app/src/main/java/com/tangem/ui/fragment/LoadedWalletFragment.kt +++ b/app/src/main/java/com/tangem/ui/fragment/wallet/LoadedWalletFragment.kt @@ -1,4 +1,4 @@ -package com.tangem.ui.fragment +package com.tangem.ui.fragment.wallet import android.app.Activity import android.app.AlertDialog @@ -14,9 +14,7 @@ import android.os.Build import android.os.Bundle import android.text.Html import android.view.Gravity -import android.view.LayoutInflater import android.view.View -import android.view.ViewGroup import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat @@ -24,8 +22,6 @@ import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProviders 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.card_android.android.reader.NfcReader import com.tangem.card_android.data.EXTRA_TANGEM_CARD import com.tangem.card_android.data.EXTRA_TANGEM_CARD_UID @@ -39,10 +35,7 @@ import com.tangem.data.dp.PrefsManager import com.tangem.data.network.ServerApiCommon import com.tangem.server_android.ServerApiTangem import com.tangem.server_android.model.CardVerifyAndGetInfo -import com.tangem.ui.activity.LoadedWalletActivity -import com.tangem.ui.activity.PinRequestActivity -import com.tangem.ui.activity.PrepareCryptonitWithdrawalActivity -import com.tangem.ui.activity.PrepareKrakenWithdrawalActivity +import com.tangem.ui.activity.MainActivity import com.tangem.ui.dialog.NoExtendedLengthSupportDialog import com.tangem.ui.dialog.PINSwapWarningDialog import com.tangem.ui.dialog.ShowQRCodeDialog @@ -50,6 +43,10 @@ import com.tangem.ui.dialog.WaitSecurityDelayDialog import com.tangem.ui.event.DeletingWalletFinish import com.tangem.ui.event.TransactionFinishWithError import com.tangem.ui.event.TransactionFinishWithSuccess +import com.tangem.ui.fragment.BaseFragment +import com.tangem.ui.fragment.pin.PinRequestFragment +import com.tangem.ui.fragment.pin.PinSwapFragment +import com.tangem.ui.navigation.NavigationResultListener import com.tangem.util.LOG import com.tangem.util.UtilHelper import com.tangem.wallet.* @@ -62,14 +59,16 @@ import java.io.InputStream import java.util.* import kotlin.concurrent.timerTask -class LoadedWalletFragment : androidx.fragment.app.Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notifications, SharedPreferences.OnSharedPreferenceChangeListener { +class LoadedWalletFragment : BaseFragment(), NavigationResultListener, NfcAdapter.ReaderCallback, + CardProtocol.Notifications, SharedPreferences.OnSharedPreferenceChangeListener { companion object { val TAG: String = LoadedWalletFragment::class.java.simpleName } + override val layoutId = R.layout.fr_loaded_wallet + private lateinit var viewModel: LoadedWalletViewModel private lateinit var ctx: TangemContext - private lateinit var nfcManager: NfcManager private lateinit var mpSecondScanSound: MediaPlayer private var serverApiCommon: ServerApiCommon = ServerApiCommon() private var serverApiTangem: ServerApiTangem = ServerApiTangem() @@ -111,23 +110,21 @@ class LoadedWalletFragment : androidx.fragment.app.Fragment(), NfcAdapter.Reader override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - ctx = TangemContext.loadFromBundle(activity, activity?.intent?.extras) - - nfcManager = NfcManager(activity!!, this) - lifecycle.addObserver(NfcLifecycleObserver(nfcManager)) + ctx = TangemContext.loadFromBundle(context, arguments) lastTag = activity?.intent?.getParcelableExtra(Constant.EXTRA_LAST_DISCOVERED_TAG) - mpSecondScanSound = MediaPlayer.create(activity, R.raw.scan_card_sound) - } - - override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { - return inflater.inflate(R.layout.fr_loaded_wallet, container, false) + if (arguments?.containsKey(NfcAdapter.EXTRA_TAG) == true) { + val tag = arguments!!.getParcelable(NfcAdapter.EXTRA_TAG) + if (tag != null) onTagDiscovered(tag) + } } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) + mpSecondScanSound = MediaPlayer.create(activity, R.raw.scan_card_sound) + val engine = CoinEngineFactory.create(ctx) tvBalance.setSingleLine(!engine!!.needMultipleLinesForBalance()) @@ -160,7 +157,7 @@ class LoadedWalletFragment : androidx.fragment.app.Fragment(), NfcAdapter.Reader intent.addCategory(Intent.CATEGORY_DEFAULT) startActivity(intent) } catch (e: ActivityNotFoundException) { - (activity as LoadedWalletActivity).toastHelper.showSingleToast(context, getString(R.string.no_compatible_wallet)) + (activity as MainActivity).toastHelper.showSingleToast(context, getString(R.string.no_compatible_wallet)) } } @@ -173,15 +170,19 @@ class LoadedWalletFragment : androidx.fragment.app.Fragment(), NfcAdapter.Reader } getString(R.string.via_cryptonit) -> { - val intent = Intent(activity, PrepareCryptonitWithdrawalActivity::class.java) - ctx.saveToIntent(intent) - startActivityForResult(intent, Constant.REQUEST_CODE_RECEIVE_TRANSACTION) + navigateForResult( + Constant.REQUEST_CODE_RECEIVE_TRANSACTION, + R.id.action_loadedWalletFragment_to_prepareCryptonitWithdrawalFragment, + Bundle().apply { ctx.saveToBundle(this) } + ) } getString(R.string.via_kraken) -> { - val intent = Intent(activity, PrepareKrakenWithdrawalActivity::class.java) - ctx.saveToIntent(intent) - startActivityForResult(intent, Constant.REQUEST_CODE_RECEIVE_TRANSACTION) + navigateForResult( + Constant.REQUEST_CODE_RECEIVE_TRANSACTION, + R.id.action_loadedWalletFragment_to_prepareKrakenWithdrawalFragment, + Bundle().apply { ctx.saveToBundle(this) } + ) } else -> { } @@ -195,24 +196,34 @@ class LoadedWalletFragment : androidx.fragment.app.Fragment(), NfcAdapter.Reader btnExtract.setOnClickListener { if (UtilHelper.isOnline(context as Activity)) - if (!engine.isExtractPossible) - (activity as LoadedWalletActivity).toastHelper.showSingleToast(context, ctx.message) - else if (ctx.card!!.remainingSignatures == 0) - (activity as LoadedWalletActivity).toastHelper.showSingleToast(context, getString(R.string.card_has_no_remaining_signature)) - else - (activity as LoadedWalletActivity).navigator.showPrepareTransaction(context as Activity, ctx) + if (!engine.isExtractPossible) { + (activity as MainActivity).toastHelper.showSingleToast(context, ctx.message) + } else if (ctx.card!!.remainingSignatures == 0) { + (activity as MainActivity).toastHelper.showSingleToast(context, getString(R.string.card_has_no_remaining_signature)) + } else { + val bundle = Bundle().apply { ctx.saveToBundle(this) } + navigateForResult(Constant.REQUEST_CODE_SEND_TRANSACTION, + R.id.action_loadedWalletFragment_to_prepareTransactionFragment, bundle) + } else Toast.makeText(activity, getString(R.string.no_connection), Toast.LENGTH_SHORT).show() } btnDetails.setOnClickListener { - if (cardProtocol != null) - (activity as LoadedWalletActivity).navigator.showVerifyCard(context as Activity, ctx) - else - (activity as LoadedWalletActivity).toastHelper.showSingleToast(context, getString(R.string.need_attach_card_again)) + if (cardProtocol != null) { + val bundle = Bundle().apply { ctx.saveToBundle(this) } + navigateForResult(Constant.REQUEST_CODE_VERIFY_CARD, + R.id.action_loadedWalletFragment_to_verifyCard, bundle) + } else { + (activity as MainActivity).toastHelper + .showSingleToast(context, getString(R.string.need_attach_card_again)) + } } - btnNewScan.setOnClickListener { (activity as LoadedWalletActivity).navigator.showMain(context as Activity) } + btnNewScan.setOnClickListener { + // navigateToDestination(R.id.action_loadedWalletFragment_to_main) + navigateUp() + } // request card verify and get info listener val cardVerifyAndGetInfoListener: ServerApiTangem.CardVerifyAndGetInfoListener = object : ServerApiTangem.CardVerifyAndGetInfoListener { @@ -334,31 +345,52 @@ class LoadedWalletFragment : androidx.fragment.app.Fragment(), NfcAdapter.Reader @Subscribe fun onDeleteWalletFinish(deletingWalletFinish: DeletingWalletFinish) { - activity?.finish() + navigateUp() } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) + override fun onNavigationResult(requestCode: String, resultCode: Int, data: Bundle?) { when (requestCode) { Constant.REQUEST_CODE_VERIFY_CARD -> // action after erase wallet if (resultCode == Activity.RESULT_OK) - activity?.finish() + navigateUp() Constant.REQUEST_CODE_ENTER_NEW_PIN -> if (resultCode == Activity.RESULT_OK) if (data != null) - if (data.extras != null && data.extras!!.containsKey(Constant.EXTRA_CONFIRM_PIN)) - (activity as LoadedWalletActivity).navigator.showPinRequestRequestPin(context as Activity, PinRequestActivity.Mode.RequestPIN.toString(), ctx, data.getStringExtra(Constant.EXTRA_NEW_PIN)) - else - (activity as LoadedWalletActivity).navigator.showPinRequestConfirmNewPin(context as Activity, PinRequestActivity.Mode.ConfirmNewPIN.toString(), data.getStringExtra(Constant.EXTRA_NEW_PIN)) + if (data.containsKey(Constant.EXTRA_CONFIRM_PIN)) { + val bundle = PinRequestFragment.callingIntentRequestPin( + PinRequestFragment.Mode.RequestPIN.toString(), ctx, + data.getString(Constant.EXTRA_NEW_PIN) ?: "") + + navigateForResult(Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN, + R.id.action_loadedWalletFragment_to_pinRequestFragment, + bundle) + } else { + val bundle = PinRequestFragment.callingIntentConfirmPin( + PinRequestFragment.Mode.ConfirmNewPIN.toString(), + data.getString(Constant.EXTRA_NEW_PIN) ?: "") + + navigateForResult(Constant.REQUEST_CODE_ENTER_NEW_PIN, + R.id.action_loadedWalletFragment_to_pinRequestFragment, bundle) + } Constant.REQUEST_CODE_ENTER_NEW_PIN2 -> if (resultCode == Activity.RESULT_OK) if (data != null) - if (data.extras != null && data.extras!!.containsKey(Constant.EXTRA_CONFIRM_PIN_2)) - (activity as LoadedWalletActivity).navigator.showPinRequestRequestPin2(context as Activity, PinRequestActivity.Mode.RequestPIN2.toString(), ctx, data.getStringExtra(Constant.EXTRA_NEW_PIN_2)) - else - (activity as LoadedWalletActivity).navigator.showPinRequestConfirmNewPin2(context as Activity, PinRequestActivity.Mode.ConfirmNewPIN2.toString(), data.getStringExtra(Constant.EXTRA_NEW_PIN_2)) + if (data.containsKey(Constant.EXTRA_CONFIRM_PIN_2)) { + val bundle = PinRequestFragment.callingIntentRequestPin2( + PinRequestFragment.Mode.RequestPIN2.toString(), ctx, + data.getString(Constant.EXTRA_NEW_PIN_2)) + navigateForResult(Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN, + R.id.action_loadedWalletFragment_to_pinRequestFragment, bundle) + + } else { + val bundle = PinRequestFragment.callingIntentConfirmPin2( + PinRequestFragment.Mode.ConfirmNewPIN2.toString(), + data.getString(Constant.EXTRA_NEW_PIN_2)) + navigateForResult(Constant.REQUEST_CODE_ENTER_NEW_PIN2, + R.id.action_loadedWalletFragment_to_pinRequestFragment, bundle) + } Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN -> if (resultCode == Activity.RESULT_OK) { if (newPIN == "") @@ -368,7 +400,10 @@ class LoadedWalletFragment : androidx.fragment.app.Fragment(), NfcAdapter.Reader newPIN2 = App.pinStorage.piN2 val pinSwapWarningDialog = PINSwapWarningDialog() - pinSwapWarningDialog.setOnRefreshPage { (activity as LoadedWalletActivity).navigator.showPinSwap(context as Activity, newPIN, newPIN2) } + pinSwapWarningDialog.setOnRefreshPage { + val bundle = PinSwapFragment.callingIntent(newPIN, newPIN2) + navigateForResult(Constant.REQUEST_CODE_SWAP_PIN, R.id.pinSwapFragment, bundle) + } val bundle = Bundle() if (!CardProtocol.isDefaultPIN(newPIN) || !CardProtocol.isDefaultPIN2(newPIN2)) bundle.putString(Constant.EXTRA_MESSAGE, getString(R.string.if_you_forget)) @@ -380,59 +415,65 @@ class LoadedWalletFragment : androidx.fragment.app.Fragment(), NfcAdapter.Reader Constant.REQUEST_CODE_SWAP_PIN -> if (resultCode == Activity.RESULT_OK) { if (data == null) { - ctx.saveToIntent(data) - data?.putExtra(Constant.EXTRA_MODIFICATION, Constant.EXTRA_MODIFICATION_DELETE) - } else - data.putExtra(Constant.EXTRA_MODIFICATION, Constant.EXTRA_MODIFICATION_UPDATE) - - activity?.setResult(Activity.RESULT_OK, data) - activity?.finish() + val resultData = Bundle() + ctx.saveToBundle(resultData) + resultData.putString(Constant.EXTRA_MODIFICATION, Constant.EXTRA_MODIFICATION_DELETE) + navigateBackWithResult(Activity.RESULT_OK, resultData) + } else { + data.putString(Constant.EXTRA_MODIFICATION, Constant.EXTRA_MODIFICATION_UPDATE) + navigateBackWithResult(Activity.RESULT_OK, data) + } } else { - if (data != null && data.extras != null && data.extras!!.containsKey(EXTRA_TANGEM_CARD_UID) && data.extras!!.containsKey(EXTRA_TANGEM_CARD)) { - val updatedCard = TangemCard(data.getStringExtra(EXTRA_TANGEM_CARD_UID)) - updatedCard.loadFromBundle(data.getBundleExtra(EXTRA_TANGEM_CARD)) + if (data != null && data.containsKey(EXTRA_TANGEM_CARD_UID) && data.containsKey(EXTRA_TANGEM_CARD)) { + val updatedCard = TangemCard(data.getString(EXTRA_TANGEM_CARD_UID)) + updatedCard.loadFromBundle(data.getBundle(EXTRA_TANGEM_CARD)) ctx.card = updatedCard } if (resultCode == Constant.RESULT_INVALID_PIN && requestPIN2Count < 2) { requestPIN2Count++ - (activity as LoadedWalletActivity).navigator.showPinRequestRequestPin2(context as Activity, PinRequestActivity.Mode.RequestPIN2.toString(), ctx) + val bundle = PinRequestFragment.callingIntentRequestPin2( + PinRequestFragment.Mode.RequestPIN2.toString(), ctx) + navigateForResult(Constant.REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN, + R.id.action_loadedWalletFragment_to_pinRequestFragment, bundle) return } else { - if (data != null && data.extras!!.containsKey(Constant.EXTRA_MESSAGE)) { - ctx.error = data.getStringExtra(Constant.EXTRA_MESSAGE) + if (data != null && data.containsKey(Constant.EXTRA_MESSAGE)) { + ctx.error = data.getString(Constant.EXTRA_MESSAGE) } } } Constant.REQUEST_CODE_PURGE -> if (resultCode == Activity.RESULT_OK) { if (data == null) { - ctx.saveToIntent(data) - data?.putExtra(Constant.EXTRA_MODIFICATION, Constant.EXTRA_MODIFICATION_DELETE) - } else - data.putExtra(Constant.EXTRA_MODIFICATION, Constant.EXTRA_MODIFICATION_UPDATE) - - activity?.setResult(Activity.RESULT_OK, data) - activity?.finish() + val resultData = Bundle() + ctx.saveToBundle(resultData) + resultData.putString(Constant.EXTRA_MODIFICATION, Constant.EXTRA_MODIFICATION_DELETE) + navigateBackWithResult(Activity.RESULT_OK, resultData) + } else { + data.putString(Constant.EXTRA_MODIFICATION, Constant.EXTRA_MODIFICATION_UPDATE) + navigateBackWithResult(Activity.RESULT_OK, data) + } } else { - if (data != null && data.extras != null && data.extras!!.containsKey(EXTRA_TANGEM_CARD_UID) && data.extras!!.containsKey(EXTRA_TANGEM_CARD)) { - val updatedCard = TangemCard(data.getStringExtra(EXTRA_TANGEM_CARD_UID)) - updatedCard.loadFromBundle(data.getBundleExtra(EXTRA_TANGEM_CARD)) + if (data != null && data.containsKey(EXTRA_TANGEM_CARD_UID) && data.containsKey(EXTRA_TANGEM_CARD)) { + val updatedCard = TangemCard(data.getString(EXTRA_TANGEM_CARD_UID)) + updatedCard.loadFromBundle(data.getBundle(EXTRA_TANGEM_CARD)) ctx.card = updatedCard } if (resultCode == Constant.RESULT_INVALID_PIN && requestPIN2Count < 2) { requestPIN2Count++ - val intent = Intent(activity, PinRequestActivity::class.java) - intent.putExtra(Constant.EXTRA_MODE, PinRequestActivity.Mode.RequestPIN2.toString()) - ctx.saveToIntent(intent) - startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2_FOR_PURGE) + val bundle = Bundle() + bundle.putString(Constant.EXTRA_MODE, PinRequestFragment.Mode.RequestPIN2.toString()) + ctx.saveToBundle(bundle) + navigateForResult(Constant.REQUEST_CODE_REQUEST_PIN2_FOR_PURGE, + R.id.action_loadedWalletFragment_to_pinRequestFragment, bundle) return } else { - if (data != null && data.extras!!.containsKey(Constant.EXTRA_MESSAGE)) { - ctx.error = data.getStringExtra(Constant.EXTRA_MESSAGE) + if (data != null && data.containsKey(Constant.EXTRA_MESSAGE)) { + ctx.error = data.getString(Constant.EXTRA_MESSAGE) } } updateViews() @@ -446,10 +487,10 @@ class LoadedWalletFragment : androidx.fragment.app.Fragment(), NfcAdapter.Reader updateViews() } - if (data != null && data.extras != null) { - if (data.extras!!.containsKey(EXTRA_TANGEM_CARD_UID) && data.extras!!.containsKey(EXTRA_TANGEM_CARD)) { - val updatedCard = TangemCard(data.getStringExtra(EXTRA_TANGEM_CARD_UID)) - updatedCard.loadFromBundle(data.getBundleExtra(EXTRA_TANGEM_CARD)) + if (data != null) { + if (data.containsKey(EXTRA_TANGEM_CARD_UID) && data.containsKey(EXTRA_TANGEM_CARD)) { + val updatedCard = TangemCard(data.getString(EXTRA_TANGEM_CARD_UID)) + updatedCard.loadFromBundle(data.getBundle(EXTRA_TANGEM_CARD)) ctx.card = updatedCard } } @@ -745,7 +786,7 @@ class LoadedWalletFragment : androidx.fragment.app.Fragment(), NfcAdapter.Reader val uid = tag?.id val sUID = Util.byteArrayToHexString(uid) if (ctx.card.uid != sUID || cardProtocol != null) { - nfcManager.ignoreTag(isoDep.tag) + (activity as MainActivity).nfcManager.ignoreTag(isoDep.tag) return } @@ -754,7 +795,8 @@ class LoadedWalletFragment : androidx.fragment.app.Fragment(), NfcAdapter.Reader else isoDep.timeout = 65000 - verifyCardTask = VerifyCardTask(ctx.card, NfcReader(nfcManager, isoDep), App.localStorage, App.pinStorage, App.firmwaresStorage, this) + verifyCardTask = VerifyCardTask(ctx.card, NfcReader((activity as MainActivity).nfcManager, isoDep), + App.localStorage, App.pinStorage, App.firmwaresStorage, this) verifyCardTask?.start() } catch (e: Exception) { e.printStackTrace() diff --git a/app/src/main/java/com/tangem/ui/fragment/LoadedWalletViewModel.kt b/app/src/main/java/com/tangem/ui/fragment/wallet/LoadedWalletViewModel.kt similarity index 95% rename from app/src/main/java/com/tangem/ui/fragment/LoadedWalletViewModel.kt rename to app/src/main/java/com/tangem/ui/fragment/wallet/LoadedWalletViewModel.kt index 8d59f49b1a..fe020d4831 100644 --- a/app/src/main/java/com/tangem/ui/fragment/LoadedWalletViewModel.kt +++ b/app/src/main/java/com/tangem/ui/fragment/wallet/LoadedWalletViewModel.kt @@ -1,9 +1,8 @@ -package com.tangem.ui.fragment +package com.tangem.ui.fragment.wallet import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel -import com.tangem.data.Blockchain import com.tangem.data.network.ServerApiCommon import com.tangem.data.network.ServerApiCommon.RateInfoListener import com.tangem.data.network.model.RateInfoResponse diff --git a/app/src/main/res/layout/activity_loaded_wallet.xml b/app/src/main/res/layout/activity_loaded_wallet.xml deleted file mode 100644 index 0cc32cadbd..0000000000 --- a/app/src/main/res/layout/activity_loaded_wallet.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/activity_verify_card.xml b/app/src/main/res/layout/activity_verify_card.xml deleted file mode 100644 index 27002f6c7c..0000000000 --- a/app/src/main/res/layout/activity_verify_card.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - diff --git a/app/src/main/res/layout/fr_loaded_wallet.xml b/app/src/main/res/layout/fr_loaded_wallet.xml index af1a6b319f..22bd8bfbf2 100644 --- a/app/src/main/res/layout/fr_loaded_wallet.xml +++ b/app/src/main/res/layout/fr_loaded_wallet.xml @@ -7,9 +7,8 @@ android:background="@color/white" android:orientation="vertical" android:padding="0dp" - tools:context="com.tangem.ui.fragment.LoadedWalletFragment" - tools:ignore="contentDescription" - tools:showIn="@layout/activity_loaded_wallet"> + tools:context="com.tangem.ui.fragment.wallet.LoadedWalletFragment" + tools:ignore="contentDescription"> + tools:context="com.tangem.ui.fragment.VerifyCardFragment" + tools:ignore="contentDescription"> + android:layout_height="match_parent"> + android:orientation="vertical"> + android:orientation="vertical"> + android:layout_height="match_parent"> + android:layout_height="match_parent"> + android:layout_height="match_parent"> + android:layout_height="match_parent"> + android:layout_height="match_parent"> + android:layout_height="match_parent"> + android:layout_height="match_parent" + android:orientation="vertical"> - + android:layout_height="wrap_content" + android:id="@android:id/list_container"/> - \ No newline at end of file + \ No newline at end of file diff --git a/app/src/main/res/layout/layout_progress_horizontal.xml b/app/src/main/res/layout/layout_progress_horizontal.xml index 84d773dee8..9ab2331efe 100644 --- a/app/src/main/res/layout/layout_progress_horizontal.xml +++ b/app/src/main/res/layout/layout_progress_horizontal.xml @@ -9,4 +9,4 @@ android:layout_alignParentBottom="true" android:elevation="1dp" app:layout_constraintBottom_toBottomOf="parent" - tools:showIn="@layout/activity_pin_swap" /> \ No newline at end of file + tools:showIn="@layout/fragment_pin_swap" /> \ No newline at end of file diff --git a/app/src/main/res/navigation/main_graph.xml b/app/src/main/res/navigation/main_graph.xml index 5a8ad7b3a9..7901818df0 100644 --- a/app/src/main/res/navigation/main_graph.xml +++ b/app/src/main/res/navigation/main_graph.xml @@ -3,14 +3,188 @@ xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/main_graph" - app:startDestination="@id/main"> + app:startDestination="@id/logoFragment"> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml index 5e592ecc14..27f8e896b2 100644 --- a/app/src/main/res/values/styles.xml +++ b/app/src/main/res/values/styles.xml @@ -5,6 +5,7 @@ @color/colorPrimary @color/colorPrimaryDark @color/colorAccent + @style/AppPreferenceTheme + + + + diff --git a/app/src/tangemAccess/java/com/tangem/ui/ConfirmTransactionActivity.kt b/app/src/tangemAccess/java/com/tangem/ui/ConfirmTransactionFragment.kt similarity index 61% rename from app/src/tangemAccess/java/com/tangem/ui/ConfirmTransactionActivity.kt rename to app/src/tangemAccess/java/com/tangem/ui/ConfirmTransactionFragment.kt index 88b5d56871..08b28b62e5 100644 --- a/app/src/tangemAccess/java/com/tangem/ui/ConfirmTransactionActivity.kt +++ b/app/src/tangemAccess/java/com/tangem/ui/ConfirmTransactionFragment.kt @@ -1,7 +1,6 @@ package com.tangem.ui import android.app.Activity -import android.content.Intent import android.content.SharedPreferences import android.nfc.NfcAdapter import android.nfc.Tag @@ -11,41 +10,37 @@ import android.preference.PreferenceManager import android.text.Editable import android.text.Html import android.text.TextWatcher -import android.view.KeyEvent +import android.util.Log import android.view.View import android.widget.Toast -import androidx.appcompat.app.AppCompatActivity -import com.tangem.App +import androidx.activity.OnBackPressedCallback +import androidx.core.os.bundleOf 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.data.EXTRA_TANGEM_CARD import com.tangem.card_android.data.EXTRA_TANGEM_CARD_UID import com.tangem.card_android.data.loadFromBundle import com.tangem.card_common.data.TangemCard import com.tangem.data.Blockchain -import com.tangem.di.ToastHelper -import com.tangem.ui.activity.PinRequestActivity -import com.tangem.ui.activity.SignTransactionActivity +import com.tangem.ui.activity.MainActivity import com.tangem.ui.event.TransactionFinishWithError +import com.tangem.ui.fragment.BaseFragment +import com.tangem.ui.fragment.pin.PinRequestFragment +import com.tangem.ui.navigation.NavigationResultListener import com.tangem.util.UtilHelper import com.tangem.wallet.CoinEngine import com.tangem.wallet.CoinEngineFactory import com.tangem.wallet.R import com.tangem.wallet.TangemContext -import kotlinx.android.synthetic.tangemAccess.activity_confirm_transaction.* +import kotlinx.android.synthetic.tangemAccess.fragment_confirm_transaction.* import org.greenrobot.eventbus.EventBus import java.io.IOException import java.util.* -import javax.inject.Inject -class ConfirmTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { +class ConfirmTransactionFragment : BaseFragment(), NavigationResultListener, NfcAdapter.ReaderCallback { - @Inject - internal lateinit var toastHelper: ToastHelper + override val layoutId = R.layout.fragment_confirm_transaction private lateinit var sp: SharedPreferences - private lateinit var nfcManager: NfcManager private lateinit var ctx: TangemContext private lateinit var amount: CoinEngine.Amount @@ -54,18 +49,24 @@ class ConfirmTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac private var nodeCheck = true private var dtVerified: Date? = null + private var blockchainCallbacks: CoinEngine.BlockchainRequestsCallbacks? = null + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_confirm_transaction) - App.toastHelperComponent.inject(this) + sp = PreferenceManager.getDefaultSharedPreferences(context) + ctx = TangemContext.loadFromBundle(requireContext(), arguments) - sp = PreferenceManager.getDefaultSharedPreferences(this) + val callback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + navigateBackWithResult(Activity.RESULT_CANCELED) + } + } + requireActivity().onBackPressedDispatcher.addCallback(this, callback) + } - nfcManager = NfcManager(this, this) - lifecycle.addObserver(NfcLifecycleObserver(nfcManager)) - - ctx = TangemContext.loadFromBundle(this, intent.extras) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) val engine = CoinEngineFactory.create(ctx) @@ -75,14 +76,15 @@ class ConfirmTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac Html.fromHtml(engine!!.balanceHTML) tvBalance.text = html - isIncludeFee = intent.getBooleanExtra(Constant.EXTRA_FEE_INCLUDED, true) + isIncludeFee = arguments?.getBoolean(Constant.EXTRA_FEE_INCLUDED, true) ?: true if (isIncludeFee) tvIncFee.setText(R.string.including_fee) else tvIncFee.setText(R.string.not_including_fee) - amount = CoinEngine.Amount(intent.getStringExtra(Constant.EXTRA_AMOUNT), intent.getStringExtra(Constant.EXTRA_AMOUNT_CURRENCY)) + amount = CoinEngine.Amount(arguments?.getString(Constant.EXTRA_AMOUNT) ?: "0", + arguments?.getString(Constant.EXTRA_AMOUNT_CURRENCY) ?: "") if (engine.allowSelectFeeInclusion()) tvIncFee.visibility = View.VISIBLE @@ -100,7 +102,7 @@ class ConfirmTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac tvCurrency.text = engine.balanceCurrency tvCurrency2.text = engine.feeCurrency tvCardID.text = ctx.card.cidDescription - etWallet.setText(intent.getStringExtra(Constant.EXTRA_TARGET_ADDRESS)) + etWallet.setText(arguments?.getString(Constant.EXTRA_TARGET_ADDRESS)) btnSend.visibility = View.INVISIBLE @@ -130,7 +132,8 @@ class ConfirmTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac tvFeeEquivalent.error = null if (sp.getBoolean(getString(R.string.pref_manual_editing_fee), false)) - toastHelper.showSingleToast(this@ConfirmTransactionActivity, getString(R.string.risk_delaying)) + (activity as MainActivity).toastHelper + .showSingleToast(context, getString(R.string.risk_delaying)) } catch (e: Exception) { e.printStackTrace() @@ -143,7 +146,7 @@ class ConfirmTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac } }) btnSend.setOnClickListener { - if (UtilHelper.isOnline(this)) { + if (UtilHelper.isOnline(requireContext())) { val calendar = Calendar.getInstance() calendar.add(Calendar.MINUTE, -1) @@ -155,7 +158,7 @@ class ConfirmTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac val engineCoin = CoinEngineFactory.create(ctx) if (engineCoin!!.isNeedCheckNode && !nodeCheck) { - Toast.makeText(baseContext, getString(R.string.cannot_reach_current_active_blockchain_node_try_again), Toast.LENGTH_LONG).show() + Toast.makeText(context, getString(R.string.cannot_reach_current_active_blockchain_node_try_again), Toast.LENGTH_LONG).show() return@setOnClickListener } @@ -181,25 +184,28 @@ class ConfirmTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac } requestPIN2Count = 0 - val intent = Intent(baseContext, PinRequestActivity::class.java) - intent.putExtra(Constant.EXTRA_MODE, PinRequestActivity.Mode.RequestPIN2.toString()) - ctx.saveToIntent(intent) - intent.putExtra(Constant.EXTRA_FEE_INCLUDED, isIncludeFee) - startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2_) + val data = Bundle() + data.putString(Constant.EXTRA_MODE, PinRequestFragment.Mode.RequestPIN2.toString()) + ctx.saveToBundle(data) + data.putBoolean(Constant.EXTRA_FEE_INCLUDED, isIncludeFee) + navigateForResult(Constant.REQUEST_CODE_REQUEST_PIN2_, R.id.action_confirmTransactionFragment_to_pinRequestFragment, data) } else - Toast.makeText(this, getString(R.string.no_connection), Toast.LENGTH_SHORT).show() + Toast.makeText(context, getString(R.string.no_connection), Toast.LENGTH_SHORT).show() } - val coinEngine = CoinEngineFactory.create(ctx) - progressBar.visibility = View.VISIBLE + if (!navigatedBack) requestFee() + } + + private fun requestFee() { + val coinEngine = CoinEngineFactory.create(ctx) coinEngine!!.requestFee( object : CoinEngine.BlockchainRequestsCallbacks { override fun onComplete(success: Boolean) { if (success) { onProgress() - progressBar.visibility = View.INVISIBLE + progressBar?.visibility = View.INVISIBLE dtVerified = Date() } else { finishWithError(Activity.RESULT_CANCELED, ctx.error) @@ -207,71 +213,60 @@ class ConfirmTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac } override fun onProgress() { - doSetFee(rgFee.checkedRadioButtonId) + doSetFee(rgFee?.checkedRadioButtonId ?: R.id.rbNormalFee) } override fun allowAdvance(): Boolean { - return UtilHelper.isOnline(this@ConfirmTransactionActivity) + return UtilHelper.isOnline(requireContext()) } }, etWallet.text.toString(), amount) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) + override fun onNavigationResult(requestCode: String, resultCode: Int, data: Bundle?) { + Log.d("LIFECYCLE", "NavigationResult assessed ${this::class.java.simpleName}") if (requestCode == Constant.REQUEST_CODE_SIGN_TRANSACTION) { - if (data != null && data.extras != null) { - if (data.extras!!.containsKey(EXTRA_TANGEM_CARD_UID) && data.extras!!.containsKey(EXTRA_TANGEM_CARD)) { - val updatedCard = TangemCard(data.getStringExtra(EXTRA_TANGEM_CARD_UID)) - updatedCard.loadFromBundle(data.getBundleExtra(EXTRA_TANGEM_CARD)) + if (data != null) { + if (data.containsKey(EXTRA_TANGEM_CARD_UID) && data.containsKey(EXTRA_TANGEM_CARD)) { + val updatedCard = TangemCard(data.getString(EXTRA_TANGEM_CARD_UID)) + updatedCard.loadFromBundle(data.getBundle(EXTRA_TANGEM_CARD)) ctx.card = updatedCard } } if (resultCode == Constant.RESULT_INVALID_PIN_ && requestPIN2Count < 2) { requestPIN2Count++ - - val intent = Intent(baseContext, PinRequestActivity::class.java) - intent.putExtra(Constant.EXTRA_MODE, PinRequestActivity.Mode.RequestPIN2.toString()) - ctx.saveToIntent(intent) - intent.putExtra(Constant.EXTRA_FEE_INCLUDED, isIncludeFee) - startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2_) - + val bundle = Bundle() + bundle.putString(Constant.EXTRA_MODE, PinRequestFragment.Mode.RequestPIN2.toString()) + ctx.saveToBundle(bundle) + bundle.putBoolean(Constant.EXTRA_FEE_INCLUDED, isIncludeFee) + navigateForResult(Constant.REQUEST_CODE_REQUEST_PIN2_, + R.id.action_confirmTransactionFragment_to_pinRequestFragment, + bundle) return } - setResult(resultCode, data) - finish() + navigateBackWithResult(resultCode, data) } else if (requestCode == Constant.REQUEST_CODE_REQUEST_PIN2_) { if (resultCode == Activity.RESULT_OK) { - val intent = Intent(baseContext, SignTransactionActivity::class.java) - ctx.saveToIntent(intent) - intent.putExtra(Constant.EXTRA_TARGET_ADDRESS, etWallet!!.text.toString()) - intent.putExtra(Constant.EXTRA_AMOUNT, etAmount.text.toString()) - intent.putExtra(Constant.EXTRA_AMOUNT_CURRENCY, tvCurrency.text.toString()) - intent.putExtra(Constant.EXTRA_FEE, etFee.text.toString()) - intent.putExtra(Constant.EXTRA_FEE_CURRENCY, tvCurrency2.text.toString()) - intent.putExtra(Constant.EXTRA_FEE_INCLUDED, isIncludeFee) - startActivityForResult(intent, Constant.REQUEST_CODE_SIGN_TRANSACTION) + val bundle = Bundle() + ctx.saveToBundle(bundle) + bundle.putString(Constant.EXTRA_TARGET_ADDRESS, etWallet!!.text.toString()) + bundle.putString(Constant.EXTRA_AMOUNT, etAmount.text.toString()) + bundle.putString(Constant.EXTRA_AMOUNT_CURRENCY, tvCurrency.text.toString()) + bundle.putString(Constant.EXTRA_FEE, etFee.text.toString()) + bundle.putString(Constant.EXTRA_FEE_CURRENCY, tvCurrency2.text.toString()) + bundle.putBoolean(Constant.EXTRA_FEE_INCLUDED, isIncludeFee) + navigateForResult(Constant.REQUEST_CODE_SIGN_TRANSACTION, + R.id.action_confirmTransactionFragment_to_signTransactionFragment, + bundle) } else - Toast.makeText(baseContext, R.string.pin_2_is_required_to_sign_the_transaction, Toast.LENGTH_LONG).show() + Toast.makeText(context, R.string.pin_2_is_required_to_sign_the_transaction, Toast.LENGTH_LONG).show() } } - override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { - when (keyCode) { - KeyEvent.KEYCODE_BACK -> { - val intent = Intent() - setResult(Activity.RESULT_CANCELED, intent) - finish() - return true - } - } - return super.onKeyDown(keyCode, event) - } - override fun onTagDiscovered(tag: Tag) { try { - nfcManager.ignoreTag(tag) + (activity as MainActivity).nfcManager.ignoreTag(tag) } catch (e: IOException) { e.printStackTrace() } @@ -283,25 +278,25 @@ class ConfirmTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac R.id.rbMinimalFee -> if (ctx.coinData.minFee != null) { txtFee = ctx.coinData.minFee!!.toValueString() - btnSend.visibility = View.VISIBLE + btnSend?.visibility = View.VISIBLE } else - btnSend.visibility = View.INVISIBLE + btnSend?.visibility = View.INVISIBLE R.id.rbNormalFee -> if (ctx.coinData.normalFee != null) { txtFee = ctx.coinData.normalFee!!.toValueString() - btnSend.visibility = View.VISIBLE + btnSend?.visibility = View.VISIBLE } else - btnSend.visibility = View.INVISIBLE + btnSend?.visibility = View.INVISIBLE R.id.rbMaximumFee -> if (ctx.coinData.maxFee != null) { txtFee = ctx.coinData.maxFee!!.toValueString() - btnSend.visibility = View.VISIBLE + btnSend?.visibility = View.VISIBLE } else - btnSend.visibility = View.INVISIBLE + btnSend?.visibility = View.INVISIBLE } - etFee.setText(txtFee.replace(',', '.')) + etFee?.setText(txtFee.replace(',', '.')) } private fun finishWithError(errorCode: Int, message: String) { @@ -309,10 +304,6 @@ class ConfirmTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac transactionFinishWithError.message = message EventBus.getDefault().post(transactionFinishWithError) - val intent = Intent() - intent.putExtra(Constant.EXTRA_MESSAGE, message) - setResult(errorCode, intent) - finish() + navigateBackWithResult(errorCode, bundleOf(Constant.EXTRA_MESSAGE to message)) } - } \ No newline at end of file diff --git a/app/src/tangemAccess/java/com/tangem/ui/PrepareTransactionActivity.kt b/app/src/tangemAccess/java/com/tangem/ui/PrepareTransactionFragment.kt similarity index 68% rename from app/src/tangemAccess/java/com/tangem/ui/PrepareTransactionActivity.kt rename to app/src/tangemAccess/java/com/tangem/ui/PrepareTransactionFragment.kt index f363dd302c..c3208a1b81 100644 --- a/app/src/tangemAccess/java/com/tangem/ui/PrepareTransactionActivity.kt +++ b/app/src/tangemAccess/java/com/tangem/ui/PrepareTransactionFragment.kt @@ -2,7 +2,6 @@ package com.tangem.ui import android.app.Activity import android.content.Context -import android.content.Intent import android.nfc.NfcAdapter import android.nfc.Tag import android.os.Build @@ -12,47 +11,29 @@ import android.view.View import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputMethodManager import android.widget.Toast -import androidx.appcompat.app.AppCompatActivity -import com.tangem.App import com.tangem.Constant import com.tangem.data.Blockchain -import com.tangem.di.Navigator -import com.tangem.wallet.CoinEngineFactory -import com.tangem.wallet.TangemContext -import com.tangem.card_android.android.nfc.NfcLifecycleObserver -import com.tangem.card_android.android.reader.NfcManager +import com.tangem.ui.activity.MainActivity +import com.tangem.ui.fragment.BaseFragment +import com.tangem.ui.navigation.NavigationResultListener import com.tangem.util.UtilHelper +import com.tangem.wallet.CoinEngineFactory import com.tangem.wallet.R -import kotlinx.android.synthetic.tangemAccess.activity_prepare_transaction.* +import com.tangem.wallet.TangemContext +import kotlinx.android.synthetic.tangemAccess.fragment_prepare_transaction.* import java.io.IOException -import javax.inject.Inject -class PrepareTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { +class PrepareTransactionFragment : BaseFragment(), NavigationResultListener, NfcAdapter.ReaderCallback { companion object { - val TAG: String = PrepareTransactionActivity::class.java.simpleName - fun callingIntent(context: Context, ctx: TangemContext): Intent { - val intent = Intent(context, PrepareTransactionActivity::class.java) - ctx.saveToIntent(intent) - return intent - } + val TAG: String = PrepareTransactionFragment::class.java.simpleName } - @Inject - internal lateinit var navigator: Navigator + override val layoutId = R.layout.fragment_prepare_transaction - private lateinit var ctx: TangemContext - private lateinit var nfcManager: NfcManager + private val ctx: TangemContext by lazy { TangemContext.loadFromBundle(context, arguments) } - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_prepare_transaction) - - App.navigatorComponent.inject(this) - - nfcManager = NfcManager(this, this) - lifecycle.addObserver(NfcLifecycleObserver(nfcManager)) - - ctx = TangemContext.loadFromBundle(this, intent.extras) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) tvCardID.text = ctx.card?.cidDescription val engine = CoinEngineFactory.create(ctx) @@ -91,8 +72,8 @@ class PrepareTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac } btnVerify.setOnClickListener { - if (!UtilHelper.isOnline(this)) { - Toast.makeText(this, R.string.no_connection, Toast.LENGTH_LONG).show() + if (!UtilHelper.isOnline(context!!)) { + Toast.makeText(context, R.string.no_connection, Toast.LENGTH_LONG).show() return@setOnClickListener } @@ -125,22 +106,26 @@ class PrepareTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac return@setOnClickListener } - val intent = Intent(baseContext, ConfirmTransactionActivity::class.java) - ctx.saveToIntent(intent) - intent.putExtra(Constant.EXTRA_TARGET_ADDRESS, etWallet!!.text.toString()) - intent.putExtra(Constant.EXTRA_FEE_INCLUDED, (rgIncFee!!.checkedRadioButtonId == R.id.rbFeeIn)) - intent.putExtra(Constant.EXTRA_AMOUNT, strAmount) - intent.putExtra(Constant.EXTRA_AMOUNT_CURRENCY, tvCurrency.text.toString()) - startActivityForResult(intent, Constant.REQUEST_CODE_SEND_TRANSACTION__) + val data = Bundle() + ctx.saveToBundle(data) + data.putString(Constant.EXTRA_TARGET_ADDRESS, etWallet!!.text.toString()) + data.putBoolean(Constant.EXTRA_FEE_INCLUDED, (rgIncFee!!.checkedRadioButtonId == R.id.rbFeeIn)) + data.putString(Constant.EXTRA_AMOUNT, strAmount) + data.putString(Constant.EXTRA_AMOUNT_CURRENCY, tvCurrency.text.toString()) + navigateForResult( + Constant.REQUEST_CODE_SEND_TRANSACTION__, + R.id.action_prepareTransactionFragment_to_confirmTransactionFragment, + data) } - ivCamera.setOnClickListener { navigator.showQrScanActivity(this, Constant.REQUEST_CODE_SCAN_QR) } + ivCamera.setOnClickListener { + navigateForResult(Constant.REQUEST_CODE_SCAN_QR, R.id.action_prepareTransactionFragment_to_qrScanFragment) + } } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (requestCode == Constant.REQUEST_CODE_SCAN_QR && resultCode == Activity.RESULT_OK && data != null && data.extras!!.containsKey("QRCode")) { - var code = data.getStringExtra("QRCode") + override fun onNavigationResult(requestCode: String, resultCode: Int, data: Bundle?) { + if (requestCode == Constant.REQUEST_CODE_SCAN_QR && resultCode == Activity.RESULT_OK && data != null && data.containsKey("QRCode")) { + var code = data.getString("QRCode") when (ctx.blockchain) { Blockchain.Bitcoin -> { if (code.contains("bitcoin:")) { @@ -174,14 +159,13 @@ class PrepareTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac } etWallet?.setText(code) } else if (requestCode == Constant.REQUEST_CODE_SEND_TRANSACTION__) { - setResult(resultCode, data) - finish() + navigateBackWithResult(resultCode, data) } } override fun onTagDiscovered(tag: Tag) { try { - nfcManager.ignoreTag(tag) + (activity as MainActivity).nfcManager.ignoreTag(tag) } catch (e: IOException) { e.printStackTrace() } diff --git a/app/src/tangemAccess/java/com/tangem/ui/SignTransactionActivity.kt b/app/src/tangemAccess/java/com/tangem/ui/SignTransactionFragment.kt similarity index 64% rename from app/src/tangemAccess/java/com/tangem/ui/SignTransactionActivity.kt rename to app/src/tangemAccess/java/com/tangem/ui/SignTransactionFragment.kt index 3fb5f915ff..4a29ebe7c4 100644 --- a/app/src/tangemAccess/java/com/tangem/ui/SignTransactionActivity.kt +++ b/app/src/tangemAccess/java/com/tangem/ui/SignTransactionFragment.kt @@ -1,7 +1,6 @@ -package com.tangem.ui.activity +package com.tangem.ui import android.app.Activity -import android.content.Intent import android.content.res.ColorStateList import android.graphics.Color import android.media.MediaPlayer @@ -9,41 +8,43 @@ import android.nfc.NfcAdapter import android.nfc.Tag import android.nfc.tech.IsoDep import android.os.Bundle -import android.view.KeyEvent import android.view.View import android.widget.Toast -import androidx.appcompat.app.AppCompatActivity +import androidx.activity.OnBackPressedCallback import com.tangem.App import com.tangem.Constant import com.tangem.card_android.android.nfc.NfcDeviceAntennaLocation -import com.tangem.card_android.android.nfc.NfcLifecycleObserver -import com.tangem.card_android.android.reader.NfcManager import com.tangem.card_android.android.reader.NfcReader +import com.tangem.card_android.data.EXTRA_TANGEM_CARD +import com.tangem.card_android.data.EXTRA_TANGEM_CARD_UID +import com.tangem.card_android.data.asBundle import com.tangem.card_common.reader.CardProtocol import com.tangem.card_common.tasks.SignTask import com.tangem.card_common.util.Util -import com.tangem.wallet.CoinEngine -import com.tangem.wallet.CoinEngineFactory -import com.tangem.wallet.TangemContext +import com.tangem.ui.activity.MainActivity import com.tangem.ui.dialog.NoExtendedLengthSupportDialog import com.tangem.ui.dialog.WaitSecurityDelayDialog +import com.tangem.ui.fragment.BaseFragment +import com.tangem.ui.navigation.NavigationResultListener import com.tangem.util.LOG +import com.tangem.wallet.CoinEngine +import com.tangem.wallet.CoinEngineFactory import com.tangem.wallet.R +import com.tangem.wallet.TangemContext import kotlinx.android.synthetic.main.layout_progress_horizontal.* import kotlinx.android.synthetic.main.layout_touch_card.* -import com.tangem.card_android.data.asBundle -import com.tangem.card_android.data.EXTRA_TANGEM_CARD -import com.tangem.card_android.data.EXTRA_TANGEM_CARD_UID -import kotlinx.android.synthetic.tangemAccess.activity_prepare_transaction.* +import kotlinx.android.synthetic.tangemAccess.fragment_sign_transaction.* -class SignTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtocol.Notifications { +class SignTransactionFragment : BaseFragment(), NavigationResultListener, + NfcAdapter.ReaderCallback, CardProtocol.Notifications { companion object { - val TAG: String = SignTransactionActivity::class.java.simpleName + val TAG: String = SignTransactionFragment::class.java.simpleName } - private lateinit var nfcManager: NfcManager + override val layoutId = R.layout.fragment_sign_transaction + private lateinit var ctx: TangemContext private lateinit var mpFinishSignSound: MediaPlayer @@ -59,58 +60,49 @@ class SignTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_sign_transaction) + ctx = TangemContext.loadFromBundle(context, arguments) - nfcManager = NfcManager(this, this) - lifecycle.addObserver(NfcLifecycleObserver(nfcManager)) + val callback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + navigateBackWithResult(Activity.RESULT_CANCELED) + } + } + requireActivity().onBackPressedDispatcher.addCallback(this, callback) + } - ctx = TangemContext.loadFromBundle(this, intent.extras) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) - mpFinishSignSound = MediaPlayer.create(this, R.raw.scan_card_sound) + mpFinishSignSound = MediaPlayer.create(context, R.raw.scan_card_sound) // init NFC Antenna - nfcDeviceAntenna = NfcDeviceAntennaLocation(this, ivHandCardHorizontal, ivHandCardVertical, llHand, llNfc) + nfcDeviceAntenna = NfcDeviceAntennaLocation(context!!, ivHandCardHorizontal, ivHandCardVertical, llHand, llNfc) nfcDeviceAntenna.init() - amount = CoinEngine.Amount(intent.getStringExtra(Constant.EXTRA_AMOUNT), intent.getStringExtra(Constant.EXTRA_AMOUNT_CURRENCY)) - fee = CoinEngine.Amount(intent.getStringExtra(Constant.EXTRA_FEE), intent.getStringExtra(Constant.EXTRA_FEE_CURRENCY)) - isIncludeFee = intent.getBooleanExtra(Constant.EXTRA_FEE_INCLUDED, true) - outAddressStr = intent.getStringExtra(Constant.EXTRA_TARGET_ADDRESS) + amount = CoinEngine.Amount(arguments?.getString(Constant.EXTRA_AMOUNT), arguments?.getString(Constant.EXTRA_AMOUNT_CURRENCY)) + fee = CoinEngine.Amount(arguments?.getString(Constant.EXTRA_FEE), arguments?.getString(Constant.EXTRA_FEE_CURRENCY)) + isIncludeFee = arguments?.getBoolean(Constant.EXTRA_FEE_INCLUDED, true) ?: true + outAddressStr = arguments?.getString(Constant.EXTRA_TARGET_ADDRESS) tvCardID.text = ctx.card!!.cidDescription progressBar.progressTintList = ColorStateList.valueOf(Color.DKGRAY) progressBar.visibility = View.INVISIBLE } - public override fun onPause() { + override fun onPause() { signTransactionTask?.cancel(true) super.onPause() } - public override fun onStop() { + override fun onStop() { signTransactionTask?.cancel(true) super.onStop() } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + override fun onNavigationResult(requestCode: String, resultCode: Int, data: Bundle?) { if (requestCode == Constant.REQUEST_CODE_SEND_TRANSACTION_) { - setResult(resultCode, data) - finish() - return + navigateBackWithResult(resultCode, data) } - super.onActivityResult(requestCode, resultCode, data) - } - - override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { - when (keyCode) { - KeyEvent.KEYCODE_BACK -> { - val intent = Intent() - setResult(Activity.RESULT_CANCELED, intent) - finish() - return true - } - } - return super.onKeyDown(keyCode, event) } override fun onTagDiscovered(tag: Tag) { @@ -129,27 +121,30 @@ class SignTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, val coinEngine = CoinEngineFactory.create(ctx) coinEngine?.setOnNeedSendTransaction { tx -> if (tx != null) { - val intent = Intent(this, SendTransactionActivity::class.java) - ctx.saveToIntent(intent) - intent.putExtra(Constant.EXTRA_TX, tx) - startActivityForResult(intent, Constant.REQUEST_CODE_SEND_TRANSACTION_) + val data = Bundle() + ctx.saveToBundle(data) + data.putByteArray(Constant.EXTRA_TX, tx) + navigateForResult( + Constant.REQUEST_CODE_SEND_TRANSACTION_, + R.id.action_signTransactionFragment_to_sendTransactionFragment, + data) } } val transactionToSign = coinEngine?.constructTransaction(amount, fee, isIncludeFee, outAddressStr) - signTransactionTask = SignTask(ctx.card, NfcReader(nfcManager, isoDep), App.localStorage, App.pinStorage, this, transactionToSign) + signTransactionTask = SignTask(ctx.card, NfcReader((activity as MainActivity).nfcManager, isoDep), + App.localStorage, App.pinStorage, this, transactionToSign) signTransactionTask?.start() } else - nfcManager.ignoreTag(isoDep.tag) + (activity as MainActivity).nfcManager.ignoreTag(isoDep.tag) } catch (e: CardProtocol.TangemException_WrongAmount) { try { - val intent = Intent() - intent.putExtra(Constant.EXTRA_MESSAGE, getString(R.string.cannot_sign_transaction_wrong_amount)) - intent.putExtra(EXTRA_TANGEM_CARD_UID, ctx.card.uid) - intent.putExtra(EXTRA_TANGEM_CARD, ctx.card.asBundle) - setResult(Activity.RESULT_CANCELED, intent) - finish() + val data = Bundle() + data.putString(Constant.EXTRA_MESSAGE, getString(R.string.cannot_sign_transaction_wrong_amount)) + data.putString(EXTRA_TANGEM_CARD_UID, ctx.card.uid) + data.putBundle(EXTRA_TANGEM_CARD, ctx.card.asBundle) + navigateBackWithResult(Activity.RESULT_CANCELED, data) } catch (e: Exception) { e.printStackTrace() } @@ -168,14 +163,14 @@ class SignTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, } override fun onReadProgress(protocol: CardProtocol, progress: Int) { - progressBar?.post { progressBar!!.progress = progress } + progressBar?.post { progressBar?.progress = progress } } override fun onReadFinish(cardProtocol: CardProtocol?) { signTransactionTask = null if (cardProtocol != null) { if (cardProtocol.error == null) { - rlProgressBar.post { rlProgressBar.visibility = View.GONE } + rlProgressBar?.post { rlProgressBar?.visibility = View.GONE } progressBar?.post { progressBar?.progress = 100 @@ -195,12 +190,11 @@ class SignTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, progressBar?.progress = 0 progressBar?.progressTintList = ColorStateList.valueOf(Color.DKGRAY) progressBar?.visibility = View.INVISIBLE - val intent = Intent() - intent.putExtra(Constant.EXTRA_MESSAGE, getString(R.string.cannot_sign_transaction_make_sure_you_enter_correct_pin_2)) - intent.putExtra(EXTRA_TANGEM_CARD_UID, cardProtocol.card.uid) - intent.putExtra(EXTRA_TANGEM_CARD, cardProtocol.card.asBundle) - setResult(Constant.RESULT_INVALID_PIN_, intent) - finish() + val data = Bundle() + data.putString(Constant.EXTRA_MESSAGE, getString(R.string.cannot_sign_transaction_make_sure_you_enter_correct_pin_2)) + data.putString(EXTRA_TANGEM_CARD_UID, cardProtocol.card.uid) + data.putBundle(EXTRA_TANGEM_CARD, cardProtocol.card.asBundle) + navigateBackWithResult(Constant.RESULT_INVALID_PIN_, data) } catch (e: Exception) { e.printStackTrace() } @@ -208,12 +202,11 @@ class SignTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, } else { if (cardProtocol.error is CardProtocol.TangemException_WrongAmount) { try { - val intent = Intent() - intent.putExtra(Constant.EXTRA_MESSAGE, getString(R.string.cannot_sign_transaction_wrong_amount)) - intent.putExtra(EXTRA_TANGEM_CARD_UID, cardProtocol.card.uid) - intent.putExtra(EXTRA_TANGEM_CARD, cardProtocol.card.asBundle) - setResult(Activity.RESULT_CANCELED, intent) - finish() + val data = Bundle() + data.putString(Constant.EXTRA_MESSAGE, getString(R.string.cannot_sign_transaction_wrong_amount)) + data.putString(EXTRA_TANGEM_CARD_UID, cardProtocol.card.uid) + data.putBundle(EXTRA_TANGEM_CARD, cardProtocol.card.asBundle) + navigateBackWithResult(Activity.RESULT_CANCELED, data) } catch (e: Exception) { e.printStackTrace() } @@ -222,10 +215,10 @@ class SignTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, if (cardProtocol.error is CardProtocol.TangemException_ExtendedLengthNotSupported) { if (!NoExtendedLengthSupportDialog.allReadyShowed) { NoExtendedLengthSupportDialog.message = getText(R.string.the_nfc_adapter_length_apdu).toString() + "\n" + getText(R.string.the_nfc_adapter_length_apdu_advice).toString() - NoExtendedLengthSupportDialog().show(supportFragmentManager, NoExtendedLengthSupportDialog.TAG) + NoExtendedLengthSupportDialog().show(requireFragmentManager(), NoExtendedLengthSupportDialog.TAG) } } else { - Toast.makeText(baseContext, R.string.try_to_scan_again, Toast.LENGTH_LONG).show() + Toast.makeText(context, R.string.try_to_scan_again, Toast.LENGTH_LONG).show() } progressBar?.progress = 100 progressBar?.progressTintList = ColorStateList.valueOf(Color.RED) @@ -234,9 +227,9 @@ class SignTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, } } - rlProgressBar.postDelayed({ + rlProgressBar?.postDelayed({ try { - rlProgressBar.visibility = View.GONE + rlProgressBar?.visibility = View.GONE } catch (e: Exception) { e.printStackTrace() } @@ -271,7 +264,7 @@ class SignTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, override fun onReadBeforeRequest(timeout: Int) { LOG.i(TAG, "onReadBeforeRequest timeout $timeout") - WaitSecurityDelayDialog.onReadBeforeRequest(this, timeout) + WaitSecurityDelayDialog.onReadBeforeRequest(activity!!, timeout) // if (!waitSecurityDelayDialogNew.isAdded) // waitSecurityDelayDialogNew.show(supportFragmentManager, WaitSecurityDelayDialogNew.TAG) @@ -284,7 +277,7 @@ class SignTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, override fun onReadAfterRequest() { LOG.i(TAG, "onReadAfterRequest") - WaitSecurityDelayDialog.onReadAfterRequest(this) + WaitSecurityDelayDialog.onReadAfterRequest(activity!!) // val readAfterRequest = ReadAfterRequest() // EventBus.getDefault().post(readAfterRequest) @@ -292,7 +285,7 @@ class SignTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, override fun onReadWait(msec: Int) { LOG.i(TAG, "onReadWait msec $msec") - WaitSecurityDelayDialog.onReadWait(this, msec) + WaitSecurityDelayDialog.onReadWait(activity!!, msec) // val readWait = ReadWait() // readWait.msec = msec diff --git a/app/src/tangemAccess/res/layout/activity_confirm_transaction.xml b/app/src/tangemAccess/res/layout/fragment_confirm_transaction.xml similarity index 99% rename from app/src/tangemAccess/res/layout/activity_confirm_transaction.xml rename to app/src/tangemAccess/res/layout/fragment_confirm_transaction.xml index a3e049834c..212c8bddf5 100644 --- a/app/src/tangemAccess/res/layout/activity_confirm_transaction.xml +++ b/app/src/tangemAccess/res/layout/fragment_confirm_transaction.xml @@ -5,7 +5,7 @@ android:id="@+id/cl" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context="com.tangem.ui.ConfirmTransactionActivity" + tools:context="com.tangem.ui.ConfirmTransactionFragment" tools:ignore="Autofill"> + android:layout_height="match_parent"> = Build.VERSION_CODES.N) Html.fromHtml(engine!!.balanceHTML, Html.FROM_HTML_MODE_LEGACY) @@ -61,14 +69,15 @@ class ConfirmTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac Html.fromHtml(engine!!.balanceHTML) tvBalance.text = html - isIncludeFee = intent.getBooleanExtra(Constant.EXTRA_FEE_INCLUDED, true) + isIncludeFee = arguments?.getBoolean(Constant.EXTRA_FEE_INCLUDED, true) ?: true if (isIncludeFee) tvIncFee.setText(R.string.including_fee) else tvIncFee.setText(R.string.not_including_fee) - amount = CoinEngine.Amount(intent.getStringExtra(Constant.EXTRA_AMOUNT), intent.getStringExtra(Constant.EXTRA_AMOUNT_CURRENCY)) + amount = CoinEngine.Amount(arguments?.getString(Constant.EXTRA_AMOUNT) ?: "0", + arguments?.getString(Constant.EXTRA_AMOUNT_CURRENCY) ?: "") if (engine.allowSelectFeeInclusion()) tvIncFee.visibility = View.VISIBLE @@ -79,14 +88,14 @@ class ConfirmTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac // // for Blockchain.Token limit decimals // etAmount.setText(amount.toValueString(ctx.card.tokensDecimal)) // } else { - // for others - etAmount.setText(amount.toValueString()) + // for others + etAmount.setText(amount.toValueString()) // } tvCurrency.text = engine.balanceCurrency tvCurrency2.text = engine.feeCurrency // tvCardID.text = ctx.card.cidDescription - etWallet.setText(intent.getStringExtra(Constant.EXTRA_TARGET_ADDRESS)) + etWallet.setText(arguments?.getString(Constant.EXTRA_TARGET_ADDRESS)) btnSend.visibility = View.INVISIBLE @@ -124,7 +133,7 @@ class ConfirmTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac } }) btnSend.setOnClickListener { - if (UtilHelper.isOnline(this)) { + if (UtilHelper.isOnline(requireContext())) { val calendar = Calendar.getInstance() calendar.add(Calendar.MINUTE, -1) @@ -136,7 +145,7 @@ class ConfirmTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac val engineCoin = CoinEngineFactory.createCardano(ctx) if (engineCoin!!.isNeedCheckNode && !nodeCheck) { - Toast.makeText(baseContext, getString(R.string.cannot_reach_current_active_blockchain_node_try_again), Toast.LENGTH_LONG).show() + Toast.makeText(context, getString(R.string.cannot_reach_current_active_blockchain_node_try_again), Toast.LENGTH_LONG).show() return@setOnClickListener } @@ -170,23 +179,29 @@ class ConfirmTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac //TODO - PIN2 workaround PINStorage.setPIN2(PINStorage.getDefaultPIN2()) - val intent = Intent(baseContext, SignTransactionActivity::class.java) - ctx.saveToIntent(intent) - intent.putExtra(Constant.EXTRA_TARGET_ADDRESS, etWallet!!.text.toString()) - intent.putExtra(Constant.EXTRA_AMOUNT, etAmount.text.toString()) - intent.putExtra(Constant.EXTRA_AMOUNT_CURRENCY, tvCurrency.text.toString()) - intent.putExtra(Constant.EXTRA_FEE, etFee.text.toString()) - intent.putExtra(Constant.EXTRA_FEE_CURRENCY, tvCurrency2.text.toString()) - intent.putExtra(Constant.EXTRA_FEE_INCLUDED, isIncludeFee) - startActivityForResult(intent, Constant.REQUEST_CODE_SIGN_TRANSACTION) - + val data = Bundle() + ctx.saveToBundle(data) + data.putString(Constant.EXTRA_TARGET_ADDRESS, etWallet!!.text.toString()) + data.putString(Constant.EXTRA_AMOUNT, etAmount.text.toString()) + data.putString(Constant.EXTRA_AMOUNT_CURRENCY, tvCurrency.text.toString()) + data.putString(Constant.EXTRA_FEE, etFee.text.toString()) + data.putString(Constant.EXTRA_FEE_CURRENCY, tvCurrency2.text.toString()) + data.putBoolean(Constant.EXTRA_FEE_INCLUDED, isIncludeFee) + navigateForResult( + Constant.REQUEST_CODE_SIGN_TRANSACTION, + R.id.action_confirmTransactionFragment_to_signTransactionFragment, + data) } else - Toast.makeText(this, getString(R.string.no_connection), Toast.LENGTH_SHORT).show() + Toast.makeText(context, getString(R.string.no_connection), Toast.LENGTH_SHORT).show() } progressBar.visibility = View.VISIBLE - engine!!.requestFee( + if (!navigatedBack) requestFee(engine) + } + + private fun requestFee(engine: CoinEngine) { + engine.requestFee( object : CoinEngine.BlockchainRequestsCallbacks { override fun onComplete(success: Boolean) { if (success) { @@ -197,73 +212,61 @@ class ConfirmTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac finishWithError(Activity.RESULT_CANCELED, ctx.error) } } - override fun onProgress() { doSetFee(rgFee.checkedRadioButtonId) } - override fun allowAdvance(): Boolean { - return UtilHelper.isOnline(this@ConfirmTransactionActivity) + return UtilHelper.isOnline(requireContext()) } }, etWallet.text.toString(), amount) } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) + override fun onNavigationResult(requestCode: String, resultCode: Int, data: Bundle?) { if (requestCode == Constant.REQUEST_CODE_SIGN_TRANSACTION) { - if (data != null && data.extras != null) { - if (data.extras!!.containsKey(EXTRA_TANGEM_CARD_UID) && data.extras!!.containsKey(EXTRA_TANGEM_CARD)) { - val updatedCard = TangemCard(data.getStringExtra(EXTRA_TANGEM_CARD_UID)) - updatedCard.loadFromBundle(data.getBundleExtra(EXTRA_TANGEM_CARD)) + if (data != null) { + if (data.containsKey(EXTRA_TANGEM_CARD_UID) && data.containsKey(EXTRA_TANGEM_CARD)) { + val updatedCard = TangemCard(data.getString(EXTRA_TANGEM_CARD_UID)) + updatedCard.loadFromBundle(data.getBundle(EXTRA_TANGEM_CARD)!!) ctx.card = updatedCard } } if (resultCode == Constant.RESULT_INVALID_PIN_ && requestPIN2Count < 2) { requestPIN2Count++ - - val intent = Intent(baseContext, PinRequestActivity::class.java) - intent.putExtra(Constant.EXTRA_MODE, PinRequestActivity.Mode.RequestPIN2.toString()) - ctx.saveToIntent(intent) - intent.putExtra(Constant.EXTRA_FEE_INCLUDED, isIncludeFee) - startActivityForResult(intent, Constant.REQUEST_CODE_REQUEST_PIN2_) - + val bundle = Bundle() + bundle.putString(Constant.EXTRA_MODE, PinRequestFragment.Mode.RequestPIN2.toString()) + ctx.saveToBundle(bundle) + bundle.putBoolean(Constant.EXTRA_FEE_INCLUDED, isIncludeFee) + navigateForResult(Constant.REQUEST_CODE_REQUEST_PIN2_, + R.id.action_confirmTransactionFragment_to_pinRequestFragment, + bundle) return + } - setResult(resultCode, data) - finish() + navigateBackWithResult(resultCode, data) + } else if (requestCode == Constant.REQUEST_CODE_REQUEST_PIN2_) { if (resultCode == Activity.RESULT_OK) { - val intent = Intent(baseContext, SignTransactionActivity::class.java) - ctx.saveToIntent(intent) - intent.putExtra(Constant.EXTRA_TARGET_ADDRESS, etWallet!!.text.toString()) - intent.putExtra(Constant.EXTRA_AMOUNT, etAmount.text.toString()) - intent.putExtra(Constant.EXTRA_AMOUNT_CURRENCY, tvCurrency.text.toString()) - intent.putExtra(Constant.EXTRA_FEE, etFee.text.toString()) - intent.putExtra(Constant.EXTRA_FEE_CURRENCY, tvCurrency2.text.toString()) - intent.putExtra(Constant.EXTRA_FEE_INCLUDED, isIncludeFee) - startActivityForResult(intent, Constant.REQUEST_CODE_SIGN_TRANSACTION) + val bundle = Bundle() + ctx.saveToBundle(bundle) + bundle.putString(Constant.EXTRA_TARGET_ADDRESS, etWallet!!.text.toString()) + bundle.putString(Constant.EXTRA_AMOUNT, etAmount.text.toString()) + bundle.putString(Constant.EXTRA_AMOUNT_CURRENCY, tvCurrency.text.toString()) + bundle.putString(Constant.EXTRA_FEE, etFee.text.toString()) + bundle.putString(Constant.EXTRA_FEE_CURRENCY, tvCurrency2.text.toString()) + bundle.putBoolean(Constant.EXTRA_FEE_INCLUDED, isIncludeFee) + navigateForResult(Constant.REQUEST_CODE_SIGN_TRANSACTION, + R.id.action_confirmTransactionFragment_to_signTransactionFragment, + bundle) } else - Toast.makeText(baseContext, R.string.pin_2_is_required_to_sign_the_transaction, Toast.LENGTH_LONG).show() + Toast.makeText(context, R.string.pin_2_is_required_to_sign_the_transaction, Toast.LENGTH_LONG).show() } } - override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { - when (keyCode) { - KeyEvent.KEYCODE_BACK -> { - val intent = Intent() - setResult(Activity.RESULT_CANCELED, intent) - finish() - return true - } - } - return super.onKeyDown(keyCode, event) - } - override fun onTagDiscovered(tag: Tag) { try { - nfcManager.ignoreTag(tag) + (activity as MainActivity).nfcManager.ignoreTag(tag) } catch (e: IOException) { e.printStackTrace() } @@ -301,10 +304,7 @@ class ConfirmTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac transactionFinishWithError.message = message EventBus.getDefault().post(transactionFinishWithError) - val intent = Intent() - intent.putExtra(Constant.EXTRA_MESSAGE, message) - setResult(errorCode, intent) - finish() + navigateBackWithResult(errorCode, bundleOf(Constant.EXTRA_MESSAGE to message)) } } \ No newline at end of file diff --git a/app/src/tangemCardano/java/com/tangem/ui/PrepareTransactionActivity.kt b/app/src/tangemCardano/java/com/tangem/ui/PrepareTransactionFragment.kt similarity index 70% rename from app/src/tangemCardano/java/com/tangem/ui/PrepareTransactionActivity.kt rename to app/src/tangemCardano/java/com/tangem/ui/PrepareTransactionFragment.kt index 39c5307b4d..813c3a9175 100644 --- a/app/src/tangemCardano/java/com/tangem/ui/PrepareTransactionActivity.kt +++ b/app/src/tangemCardano/java/com/tangem/ui/PrepareTransactionFragment.kt @@ -2,65 +2,41 @@ package com.tangem.ui import android.app.Activity import android.content.Context -import android.content.Intent import android.nfc.NfcAdapter import android.nfc.Tag import android.os.Build import android.os.Bundle import android.text.Html +import android.view.LayoutInflater import android.view.MotionEvent import android.view.View import android.view.View.OnTouchListener +import android.view.ViewGroup import android.view.inputmethod.EditorInfo import android.view.inputmethod.InputMethodManager import android.widget.Toast -import androidx.appcompat.app.AppCompatActivity -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.data.dp.PrefsManager -import com.tangem.di.Navigator -import com.tangem.di.ToastHelper -import com.tangem.wallet.CoinEngineFactory -import com.tangem.wallet.TangemContext +import com.tangem.ui.activity.MainActivity import com.tangem.ui.event.TransactionFinishWithError import com.tangem.ui.event.TransactionFinishWithSuccess +import com.tangem.ui.fragment.BaseFragment +import com.tangem.ui.navigation.NavigationResultListener import com.tangem.util.UtilHelper +import com.tangem.wallet.CoinEngineFactory import com.tangem.wallet.R -import kotlinx.android.synthetic.tangemCardano.activity_prepare_transaction.* +import com.tangem.wallet.TangemContext +import kotlinx.android.synthetic.tangemCardano.fragment_prepare_transaction.* import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import java.io.IOException -import javax.inject.Inject -class PrepareTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { - companion object { - val TAG: String = PrepareTransactionActivity::class.java.simpleName - fun callingIntent(context: Context, ctx: TangemContext): Intent { - val intent = Intent(context, PrepareTransactionActivity::class.java) - ctx.saveToIntent(intent) - return intent - } - } +class PrepareTransactionFragment : BaseFragment(), NavigationResultListener, NfcAdapter.ReaderCallback { - @Inject - internal lateinit var navigator: Navigator - @Inject - internal lateinit var toastHelper: ToastHelper - - private lateinit var nfcManager: NfcManager - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.activity_prepare_transaction) - - App.navigatorComponent.inject(this) - App.toastHelperComponent.inject(this) - - nfcManager = NfcManager(this, this) - lifecycle.addObserver(NfcLifecycleObserver(nfcManager)) + override val layoutId = R.layout.fragment_prepare_transaction + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) val engine = CoinEngineFactory.createCardano(TangemContext()) @Suppress("DEPRECATION") val html = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) @@ -96,8 +72,8 @@ class PrepareTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac } btnVerify.setOnClickListener { - if (!UtilHelper.isOnline(this)) { - Toast.makeText(this, R.string.no_connection, Toast.LENGTH_LONG).show() + if (!UtilHelper.isOnline(requireContext())) { + Toast.makeText(context, R.string.no_connection, Toast.LENGTH_LONG).show() return@setOnClickListener } @@ -137,19 +113,22 @@ class PrepareTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac return@setOnClickListener } - val intent = Intent(baseContext, ConfirmTransactionActivity::class.java) - intent.putExtra(Constant.EXTRA_TARGET_ADDRESS, etWallet!!.text.toString()) - intent.putExtra(Constant.EXTRA_FEE_INCLUDED, (rgIncFee!!.checkedRadioButtonId == R.id.rbFeeIn)) - intent.putExtra(Constant.EXTRA_AMOUNT, strAmount) - intent.putExtra(Constant.EXTRA_AMOUNT_CURRENCY, tvCurrency.text.toString()) - startActivityForResult(intent, Constant.REQUEST_CODE_SEND_TRANSACTION__) - PrefsManager.getInstance().saveLastWalletAddress(etWallet.text.toString()) + + val data = Bundle() + data.putString(Constant.EXTRA_TARGET_ADDRESS, etWallet!!.text.toString()) + data.putBoolean(Constant.EXTRA_FEE_INCLUDED, (rgIncFee!!.checkedRadioButtonId == R.id.rbFeeIn)) + data.putString(Constant.EXTRA_AMOUNT, strAmount) + data.putString(Constant.EXTRA_AMOUNT_CURRENCY, tvCurrency.text.toString()) + navigateForResult( + Constant.REQUEST_CODE_SEND_TRANSACTION__, + R.id.action_prepareTransactionFragment_to_confirmTransactionFragment, + data) } ivCamera.setOnClickListener { - navigator.showQrScanActivity(this, Constant.REQUEST_CODE_SCAN_QR) etWallet.text.clear() + navigateForResult(Constant.REQUEST_CODE_SCAN_QR, R.id.action_prepareTransactionFragment_to_qrScanFragment) } etWallet.setOnTouchListener(OnTouchListener { _, event -> @@ -176,18 +155,21 @@ class PrepareTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac @Subscribe fun onTransactionFinishWithSuccess(transactionFinishWithSuccess: TransactionFinishWithSuccess) { - transactionFinishWithSuccess.message?.let { toastHelper.showSnackbarSuccess(this, cl, it) } + transactionFinishWithSuccess.message?.let { message -> + (activity as MainActivity).toastHelper.showSnackbarSuccess(requireContext(), cl, message) + } } @Subscribe fun onTransactionFinishWithError(transactionFinishWithError: TransactionFinishWithError) { - transactionFinishWithError.message?.let { toastHelper.showSnackbarError(this, cl, it) } + transactionFinishWithError.message?.let { message -> + (activity as MainActivity).toastHelper.showSnackbarError(requireContext(), cl, message) + } } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - super.onActivityResult(requestCode, resultCode, data) - if (requestCode == Constant.REQUEST_CODE_SCAN_QR && resultCode == Activity.RESULT_OK && data != null && data.extras!!.containsKey("QRCode")) { - var code = data.getStringExtra("QRCode") + override fun onNavigationResult(requestCode: String, resultCode: Int, data: Bundle?) { + if (requestCode == Constant.REQUEST_CODE_SCAN_QR && resultCode == Activity.RESULT_OK && data != null && data.containsKey("QRCode")) { + val code = data.getString("QRCode") // when (ctx.blockchain) { // Blockchain.Bitcoin -> { // if (code.contains("bitcoin:")) { @@ -216,7 +198,7 @@ class PrepareTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac override fun onTagDiscovered(tag: Tag) { try { - nfcManager.ignoreTag(tag) + (activity as MainActivity).nfcManager.ignoreTag(tag) } catch (e: IOException) { e.printStackTrace() } diff --git a/app/src/tangemCardano/java/com/tangem/ui/SignTransactionActivity.kt b/app/src/tangemCardano/java/com/tangem/ui/SignTransactionFragment.kt similarity index 73% rename from app/src/tangemCardano/java/com/tangem/ui/SignTransactionActivity.kt rename to app/src/tangemCardano/java/com/tangem/ui/SignTransactionFragment.kt index a7961c738e..574af23ab6 100644 --- a/app/src/tangemCardano/java/com/tangem/ui/SignTransactionActivity.kt +++ b/app/src/tangemCardano/java/com/tangem/ui/SignTransactionFragment.kt @@ -10,13 +10,14 @@ import android.nfc.Tag import android.nfc.tech.IsoDep import android.os.Bundle import android.view.KeyEvent +import android.view.LayoutInflater import android.view.View +import android.view.ViewGroup import android.widget.Toast -import androidx.appcompat.app.AppCompatActivity +import androidx.activity.OnBackPressedCallback import com.tangem.App import com.tangem.Constant import com.tangem.card_android.android.nfc.NfcDeviceAntennaLocation -import com.tangem.card_android.android.nfc.NfcLifecycleObserver import com.tangem.card_android.android.reader.NfcManager import com.tangem.card_android.android.reader.NfcReader import com.tangem.card_android.data.EXTRA_TANGEM_CARD @@ -33,9 +34,10 @@ import com.tangem.wallet.CoinEngine import com.tangem.wallet.CoinEngineFactory import com.tangem.wallet.TangemContext import com.tangem.ui.activity.MainActivity -import com.tangem.ui.activity.SendTransactionActivity import com.tangem.ui.dialog.NoExtendedLengthSupportDialog import com.tangem.ui.dialog.WaitSecurityDelayDialog +import com.tangem.ui.fragment.BaseFragment +import com.tangem.ui.navigation.NavigationResultListener import com.tangem.util.LOG import com.tangem.wallet.R import kotlinx.android.synthetic.main.layout_progress_horizontal.* @@ -44,13 +46,15 @@ import kotlinx.coroutines.runBlocking import kotlin.coroutines.resume import kotlin.coroutines.suspendCoroutine -class SignTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtocol.Notifications { +class SignTransactionFragment : BaseFragment(), NavigationResultListener, + NfcAdapter.ReaderCallback, CardProtocol.Notifications { companion object { - val TAG: String = SignTransactionActivity::class.java.simpleName + val TAG: String = SignTransactionFragment::class.java.simpleName } - private lateinit var nfcManager: NfcManager + override val layoutId = R.layout.fragment_sign_transaction + private lateinit var ctx: TangemContext private lateinit var mpFinishSignSound: MediaPlayer @@ -66,58 +70,49 @@ class SignTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) - setContentView(R.layout.activity_sign_transaction) + ctx = TangemContext.loadFromBundle(context, arguments) - nfcManager = NfcManager(this, this) - lifecycle.addObserver(NfcLifecycleObserver(nfcManager)) + val callback = object : OnBackPressedCallback(true) { + override fun handleOnBackPressed() { + navigateBackWithResult(Activity.RESULT_CANCELED) + } + } + requireActivity().onBackPressedDispatcher.addCallback(this, callback) + } - ctx = TangemContext.loadFromBundle(this, intent.extras) + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) - mpFinishSignSound = MediaPlayer.create(this, R.raw.scan_card_sound) + mpFinishSignSound = MediaPlayer.create(context, R.raw.scan_card_sound) // init NFC Antenna - nfcDeviceAntenna = NfcDeviceAntennaLocation(this, ivHandCardHorizontal, ivHandCardVertical, llHand, llNfc) + nfcDeviceAntenna = NfcDeviceAntennaLocation(requireContext(), ivHandCardHorizontal, ivHandCardVertical, llHand, llNfc) nfcDeviceAntenna.init() - amount = CoinEngine.Amount(intent.getStringExtra(Constant.EXTRA_AMOUNT), intent.getStringExtra(Constant.EXTRA_AMOUNT_CURRENCY)) - fee = CoinEngine.Amount(intent.getStringExtra(Constant.EXTRA_FEE), intent.getStringExtra(Constant.EXTRA_FEE_CURRENCY)) - isIncludeFee = intent.getBooleanExtra(Constant.EXTRA_FEE_INCLUDED, true) - outAddressStr = intent.getStringExtra(Constant.EXTRA_TARGET_ADDRESS) + amount = CoinEngine.Amount(arguments?.getString(Constant.EXTRA_AMOUNT), arguments?.getString(Constant.EXTRA_AMOUNT_CURRENCY)) + fee = CoinEngine.Amount(arguments?.getString(Constant.EXTRA_FEE), arguments?.getString(Constant.EXTRA_FEE_CURRENCY)) + isIncludeFee = arguments?.getBoolean(Constant.EXTRA_FEE_INCLUDED, true) ?: true + outAddressStr = arguments?.getString(Constant.EXTRA_TARGET_ADDRESS) // tvCardID.text = ctx.card!!.cidDescription progressBar.progressTintList = ColorStateList.valueOf(Color.DKGRAY) progressBar.visibility = View.INVISIBLE } - public override fun onPause() { + override fun onPause() { task?.cancel(true) super.onPause() } - public override fun onStop() { + override fun onStop() { task?.cancel(true) super.onStop() } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + override fun onNavigationResult(requestCode: String, resultCode: Int, data: Bundle?) { if (requestCode == Constant.REQUEST_CODE_SEND_TRANSACTION_) { - setResult(resultCode, data) - finish() - return + navigateBackWithResult(resultCode, data) } - super.onActivityResult(requestCode, resultCode, data) - } - - override fun onKeyDown(keyCode: Int, event: KeyEvent): Boolean { - when (keyCode) { - KeyEvent.KEYCODE_BACK -> { - val intent = Intent() - setResult(Activity.RESULT_CANCELED, intent) - finish() - return true - } - } - return super.onKeyDown(keyCode, event) } override fun onTagDiscovered(tag: Tag) { @@ -127,13 +122,16 @@ class SignTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, isoDep.timeout = 65000 - val coinEngine = CoinEngineFactory.createCardano(ctx!!)!! - coinEngine.setOnNeedSendTransaction { tx -> + val coinEngine = CoinEngineFactory.createCardano(ctx) + coinEngine?.setOnNeedSendTransaction { tx -> if (tx != null) { - val intent = Intent(this, SendTransactionActivity::class.java) - ctx.saveToIntent(intent) - intent.putExtra(Constant.EXTRA_TX, tx) - startActivityForResult(intent, Constant.REQUEST_CODE_SEND_TRANSACTION_) + val data = Bundle() + ctx.saveToBundle(data) + data.putByteArray(Constant.EXTRA_TX, tx) + navigateForResult( + Constant.REQUEST_CODE_SEND_TRANSACTION_, + R.id.action_signTransactionFragment_to_sendTransactionFragment, + data) } } @@ -162,7 +160,7 @@ class SignTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, ctx.coinData = CoinEngineFactory.createCardanoData() } if (ctx.coinData.wallet.isNullOrEmpty()) { - coinEngine.defineWallet() + coinEngine?.defineWallet() runBlocking { requestBalanceAndUnspentTransactions() } Log.e(MainActivity.TAG, "requestBalanceAndUnspentTransactions completed") } @@ -220,17 +218,17 @@ class SignTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, } } - task = OneTouchSignTask(NfcReader(nfcManager, isoDep), App.localStorage, App.pinStorage, this, tx) + task = OneTouchSignTask(NfcReader((activity as MainActivity).nfcManager, isoDep), + App.localStorage, App.pinStorage, this, tx) task!!.start() } catch (e: CardProtocol.TangemException_WrongAmount) { try { - val intent = Intent() - intent.putExtra(Constant.EXTRA_MESSAGE, getString(R.string.cannot_sign_transaction_wrong_amount)) - intent.putExtra(EXTRA_TANGEM_CARD_UID, ctx.card.uid) - intent.putExtra(EXTRA_TANGEM_CARD, ctx.card.asBundle) - setResult(Activity.RESULT_CANCELED, intent) - finish() + val data = Bundle() + data.putString(Constant.EXTRA_MESSAGE, getString(R.string.cannot_sign_transaction_wrong_amount)) + data.putString(EXTRA_TANGEM_CARD_UID, ctx.card.uid) + data.putBundle(EXTRA_TANGEM_CARD, ctx.card.asBundle) + navigateBackWithResult(Activity.RESULT_CANCELED, data) } catch (e: Exception) { e.printStackTrace() } @@ -276,12 +274,11 @@ class SignTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, progressBar?.progress = 0 progressBar?.progressTintList = ColorStateList.valueOf(Color.DKGRAY) progressBar?.visibility = View.INVISIBLE - val intent = Intent() - intent.putExtra(Constant.EXTRA_MESSAGE, getString(R.string.cannot_sign_transaction_make_sure_you_enter_correct_pin_2)) - intent.putExtra(EXTRA_TANGEM_CARD_UID, cardProtocol.card.uid) - intent.putExtra(EXTRA_TANGEM_CARD, cardProtocol.card.asBundle) - setResult(Constant.RESULT_INVALID_PIN_, intent) - finish() + val data = Bundle() + data.putString(Constant.EXTRA_MESSAGE, getString(R.string.cannot_sign_transaction_make_sure_you_enter_correct_pin_2)) + data.putString(EXTRA_TANGEM_CARD_UID, cardProtocol.card.uid) + data.putBundle(EXTRA_TANGEM_CARD, cardProtocol.card.asBundle) + navigateBackWithResult(Constant.RESULT_INVALID_PIN_, data) } catch (e: Exception) { e.printStackTrace() } @@ -289,12 +286,11 @@ class SignTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, } else { if (cardProtocol.error is CardProtocol.TangemException_WrongAmount) { try { - val intent = Intent() - intent.putExtra(Constant.EXTRA_MESSAGE, getString(R.string.cannot_sign_transaction_wrong_amount)) - intent.putExtra(EXTRA_TANGEM_CARD_UID, cardProtocol.card.uid) - intent.putExtra(EXTRA_TANGEM_CARD, cardProtocol.card.asBundle) - setResult(Activity.RESULT_CANCELED, intent) - finish() + val data = Bundle() + data.putString(Constant.EXTRA_MESSAGE, getString(R.string.cannot_sign_transaction_wrong_amount)) + data.putString(EXTRA_TANGEM_CARD_UID, cardProtocol.card.uid) + data.putBundle(EXTRA_TANGEM_CARD, cardProtocol.card.asBundle) + navigateBackWithResult(Activity.RESULT_CANCELED, data) } catch (e: Exception) { e.printStackTrace() } @@ -303,10 +299,10 @@ class SignTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, if (cardProtocol.error is CardProtocol.TangemException_ExtendedLengthNotSupported) { if (!NoExtendedLengthSupportDialog.allReadyShowed) { NoExtendedLengthSupportDialog.message = getText(R.string.the_nfc_adapter_length_apdu).toString() + "\n" + getText(R.string.the_nfc_adapter_length_apdu_advice).toString() - NoExtendedLengthSupportDialog().show(supportFragmentManager, NoExtendedLengthSupportDialog.TAG) + NoExtendedLengthSupportDialog().show(requireFragmentManager(), NoExtendedLengthSupportDialog.TAG) } } else { - Toast.makeText(baseContext, R.string.try_to_scan_again, Toast.LENGTH_LONG).show() + Toast.makeText(context, R.string.try_to_scan_again, Toast.LENGTH_LONG).show() } progressBar?.progress = 100 progressBar?.progressTintList = ColorStateList.valueOf(Color.RED) @@ -350,17 +346,17 @@ class SignTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, override fun onReadBeforeRequest(timeout: Int) { LOG.i(TAG, "onReadBeforeRequest timeout $timeout") - WaitSecurityDelayDialog.onReadBeforeRequest(this, timeout) + WaitSecurityDelayDialog.onReadBeforeRequest(activity, timeout) } override fun onReadAfterRequest() { LOG.i(TAG, "onReadAfterRequest") - WaitSecurityDelayDialog.onReadAfterRequest(this) + WaitSecurityDelayDialog.onReadAfterRequest(activity) } override fun onReadWait(msec: Int) { LOG.i(TAG, "onReadWait msec $msec") - WaitSecurityDelayDialog.onReadWait(this, msec) + WaitSecurityDelayDialog.onReadWait(activity, msec) } } \ No newline at end of file diff --git a/app/src/tangemCardano/res/layout/activity_confirm_transaction.xml b/app/src/tangemCardano/res/layout/fragment_confirm_transaction.xml similarity index 99% rename from app/src/tangemCardano/res/layout/activity_confirm_transaction.xml rename to app/src/tangemCardano/res/layout/fragment_confirm_transaction.xml index 4edfa963c3..b594c9b8b2 100644 --- a/app/src/tangemCardano/res/layout/activity_confirm_transaction.xml +++ b/app/src/tangemCardano/res/layout/fragment_confirm_transaction.xml @@ -4,7 +4,6 @@ xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" - tools:context="com.tangem.ui.ConfirmTransactionActivity" tools:ignore="Autofill"> + android:layout_height="match_parent">