Updated on 2026-08-14

This commit is contained in:
Tangem 2019-08-30 14:26:03 +00:00
commit 0e892648c6
82 changed files with 2034 additions and 1846 deletions

395
.idea/navEditor.xml generated
View file

@ -8,15 +8,406 @@
<LayoutPositions>
<option name="myPositions">
<map>
<entry key="confirmTransactionFragment">
<value>
<LayoutPositions>
<option name="myPosition">
<Point>
<option name="x" value="516" />
<option name="y" value="408" />
</Point>
</option>
<option name="myPositions">
<map>
<entry key="action_confirmTransactionFragment_to_pinRequestFragment">
<value>
<LayoutPositions />
</value>
</entry>
<entry key="action_confirmTransactionFragment_to_signTransactionFragment">
<value>
<LayoutPositions />
</value>
</entry>
</map>
</option>
</LayoutPositions>
</value>
</entry>
<entry key="createNewWalletFragment">
<value>
<LayoutPositions>
<option name="myPosition">
<Point>
<option name="x" value="324" />
<option name="y" value="-682" />
</Point>
</option>
</LayoutPositions>
</value>
</entry>
<entry key="emptyWalletFragment">
<value>
<LayoutPositions>
<option name="myPosition">
<Point>
<option name="x" value="56" />
<option name="y" value="-379" />
</Point>
</option>
<option name="myPositions">
<map>
<entry key="action_emptyWalletFragment_to_createNewWalletFragment">
<value>
<LayoutPositions />
</value>
</entry>
<entry key="action_emptyWalletFragment_to_pinRequestFragment">
<value>
<LayoutPositions />
</value>
</entry>
<entry key="action_emptyWalletFragment_to_verifyCard">
<value>
<LayoutPositions />
</value>
</entry>
</map>
</option>
</LayoutPositions>
</value>
</entry>
<entry key="loadedWalletFragment">
<value>
<LayoutPositions>
<option name="myPosition">
<Point>
<option name="x" value="-91" />
<option name="y" value="411" />
</Point>
</option>
<option name="myPositions">
<map>
<entry key="action_loadedWalletFragment_to_pinRequestFragment">
<value>
<LayoutPositions />
</value>
</entry>
<entry key="action_loadedWalletFragment_to_pinSwapFragment">
<value>
<LayoutPositions />
</value>
</entry>
<entry key="action_loadedWalletFragment_to_prepareCryptonitWithdrawalFragment">
<value>
<LayoutPositions />
</value>
</entry>
<entry key="action_loadedWalletFragment_to_prepareKrakenWithdrawalFragment">
<value>
<LayoutPositions />
</value>
</entry>
<entry key="action_loadedWalletFragment_to_prepareTransactionFragment">
<value>
<LayoutPositions />
</value>
</entry>
<entry key="action_loadedWalletFragment_to_verifyCard">
<value>
<LayoutPositions />
</value>
</entry>
</map>
</option>
</LayoutPositions>
</value>
</entry>
<entry key="logoFragment">
<value>
<LayoutPositions>
<option name="myPosition">
<Point>
<option name="x" value="-642" />
<option name="y" value="5" />
</Point>
</option>
<option name="myPositions">
<map>
<entry key="action_logoFragment_to_main">
<value>
<LayoutPositions />
</value>
</entry>
<entry key="action_logoFragment_to_prepareTransactionFragment">
<value>
<LayoutPositions />
</value>
</entry>
</map>
</option>
</LayoutPositions>
</value>
</entry>
<entry key="main">
<value>
<LayoutPositions>
<option name="myPosition">
<Point>
<option name="x" value="-203" />
<option name="y" value="-292" />
<option name="x" value="-425" />
<option name="y" value="250" />
</Point>
</option>
<option name="myPositions">
<map>
<entry key="action_main_to_emptyWalletFragment">
<value>
<LayoutPositions />
</value>
</entry>
<entry key="action_main_to_loadedWalletFragment">
<value>
<LayoutPositions />
</value>
</entry>
<entry key="action_main_to_logoFragment">
<value>
<LayoutPositions />
</value>
</entry>
<entry key="action_main_to_pinRequestFragment">
<value>
<LayoutPositions />
</value>
</entry>
<entry key="action_main_to_pinSaveFragment">
<value>
<LayoutPositions />
</value>
</entry>
<entry key="action_main_to_settingsFragment">
<value>
<LayoutPositions />
</value>
</entry>
</map>
</option>
</LayoutPositions>
</value>
</entry>
<entry key="pinRequestFragment">
<value>
<LayoutPositions>
<option name="myPosition">
<Point>
<option name="x" value="416" />
<option name="y" value="-239" />
</Point>
</option>
</LayoutPositions>
</value>
</entry>
<entry key="pinSaveFragment">
<value>
<LayoutPositions>
<option name="myPosition">
<Point>
<option name="x" value="-274" />
<option name="y" value="-387" />
</Point>
</option>
</LayoutPositions>
</value>
</entry>
<entry key="pinSwapFragment">
<value>
<LayoutPositions>
<option name="myPosition">
<Point>
<option name="x" value="76" />
<option name="y" value="811" />
</Point>
</option>
</LayoutPositions>
</value>
</entry>
<entry key="prepareCryptonitOtherApiWithdrawalFragment">
<value>
<LayoutPositions>
<option name="myPosition">
<Point>
<option name="x" value="280" />
<option name="y" value="1172" />
</Point>
</option>
<option name="myPositions">
<map>
<entry key="action_prepareCryptonitOtherApiWithdrawalFragment_to_qrScanFragment">
<value>
<LayoutPositions />
</value>
</entry>
</map>
</option>
</LayoutPositions>
</value>
</entry>
<entry key="prepareCryptonitWithdrawalFragment">
<value>
<LayoutPositions>
<option name="myPosition">
<Point>
<option name="x" value="9" />
<option name="y" value="1151" />
</Point>
</option>
</LayoutPositions>
</value>
</entry>
<entry key="prepareKrakenWithdrawalFragment">
<value>
<LayoutPositions>
<option name="myPosition">
<Point>
<option name="x" value="-214" />
<option name="y" value="1097" />
</Point>
</option>
</LayoutPositions>
</value>
</entry>
<entry key="prepareTransactionFragment">
<value>
<LayoutPositions>
<option name="myPosition">
<Point>
<option name="x" value="256" />
<option name="y" value="411" />
</Point>
</option>
<option name="myPositions">
<map>
<entry key="action_prepareTransactionFragment_to_confirmTransactionFragment">
<value>
<LayoutPositions />
</value>
</entry>
<entry key="action_prepareTransactionFragment_to_qrScanFragment">
<value>
<LayoutPositions />
</value>
</entry>
</map>
</option>
</LayoutPositions>
</value>
</entry>
<entry key="purgeFragment">
<value>
<LayoutPositions>
<option name="myPosition">
<Point>
<option name="x" value="941" />
<option name="y" value="15" />
</Point>
</option>
<option name="myPositions">
<map>
<entry key="action_purgeFragment_to_loadedWalletFragment">
<value>
<LayoutPositions />
</value>
</entry>
</map>
</option>
</LayoutPositions>
</value>
</entry>
<entry key="qrScanFragment">
<value>
<LayoutPositions>
<option name="myPosition">
<Point>
<option name="x" value="328" />
<option name="y" value="807" />
</Point>
</option>
</LayoutPositions>
</value>
</entry>
<entry key="sendTransactionFragment">
<value>
<LayoutPositions>
<option name="myPosition">
<Point>
<option name="x" value="1011" />
<option name="y" value="412" />
</Point>
</option>
</LayoutPositions>
</value>
</entry>
<entry key="settingsFragment">
<value>
<LayoutPositions>
<option name="myPosition">
<Point>
<option name="x" value="-496" />
<option name="y" value="-375" />
</Point>
</option>
</LayoutPositions>
</value>
</entry>
<entry key="signTransactionFragment">
<value>
<LayoutPositions>
<option name="myPosition">
<Point>
<option name="x" value="760" />
<option name="y" value="412" />
</Point>
</option>
<option name="myPositions">
<map>
<entry key="action_signTransactionFragment_to_sendTransactionFragment">
<value>
<LayoutPositions />
</value>
</entry>
</map>
</option>
</LayoutPositions>
</value>
</entry>
<entry key="verifyCard">
<value>
<LayoutPositions>
<option name="myPosition">
<Point>
<option name="x" value="78" />
<option name="y" value="32" />
</Point>
</option>
<option name="myPositions">
<map>
<entry key="action_verifyCard_to_pinRequestFragment">
<value>
<LayoutPositions />
</value>
</entry>
<entry key="action_verifyCard_to_pinSwapFragment">
<value>
<LayoutPositions />
</value>
</entry>
<entry key="action_verifyCard_to_purgeFragment">
<value>
<LayoutPositions />
</value>
</entry>
</map>
</option>
</LayoutPositions>
</value>
</entry>

View file

@ -45,7 +45,8 @@ android {
versionNameSuffix "-beta"
applicationIdSuffix ".debug_beta"
buildConfigField 'boolean', 'CRASHLYTICS', 'Boolean.parseBoolean("true")'
manifestPlaceholders = [fabric_api_key: properties.getProperty('fabric_api_key')]
manifestPlaceholders = [fabric_api_key: properties.hasProperty('fabric_api_key')
? project.property('fabric_api_key') : 000]
}
}
flavorDimensions ""
@ -98,11 +99,15 @@ dependencies {
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.0.0'
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
implementation 'androidx.appcompat:appcompat:1.1.0-alpha04'
implementation "androidx.lifecycle:lifecycle-runtime:2.0.0"
implementation "androidx.lifecycle:lifecycle-common-java8:2.0.0"
implementation 'androidx.appcompat:appcompat:1.1.0-rc01'
implementation 'androidx.fragment:fragment:1.1.0-rc04'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation "androidx.preference:preference:1.1.0-alpha04"
implementation "androidx.preference:preference:1.1.0-rc01"
implementation 'androidx.biometric:biometric:1.0.0-alpha04'
implementation 'com.google.android.material:material:1.1.0-alpha05'
implementation 'com.google.android.material:material:1.1.0-alpha09'
implementation 'androidx.core:core-ktx:1.0.2'
implementation 'com.google.dagger:dagger:2.21'
kapt 'com.google.dagger:dagger-compiler:2.21'
annotationProcessor 'com.google.dagger:dagger-compiler:2.21'
@ -122,8 +127,8 @@ dependencies {
implementation "com.orhanobut:hawk:2.0.1"
implementation 'co.nstant.in:cbor:0.8'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.0.0'
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.0.0"
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.2.2'
implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.2.2"
// implementation 'org.bitcoinj:bitcoinj-parent:0.14.7' //TODO: is this needed?
implementation 'org.bitcoinj:bitcoinj-core:0.15.2'
implementation 'org.greenrobot:eventbus:3.1.1'

View file

@ -38,7 +38,8 @@
<!--android:grantUriPermissions="true" />-->
<activity
android:name="com.tangem.ui.activity.LogoActivity"
android:name="com.tangem.ui.activity.MainActivity"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
@ -46,13 +47,6 @@
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name="com.tangem.ui.activity.MainActivity"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.nfc.action.NDEF_DISCOVERED" />
<category android:name="android.intent.category.DEFAULT" />
@ -77,92 +71,6 @@
android:name="android.nfc.action.TECH_DISCOVERED"
android:resource="@xml/nfc_tech_filter" />
</activity>
<activity
android:name="com.tangem.ui.activity.SettingsActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name="com.tangem.ui.activity.PinRequestActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name="com.tangem.ui.activity.EmptyWalletActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name="com.tangem.ui.activity.PinSaveActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name="com.tangem.ui.activity.LoadedWalletActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name="com.tangem.ui.activity.VerifyCardActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name="com.tangem.ui.activity.CreateNewWalletActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name="com.tangem.ui.PrepareTransactionActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name="com.tangem.ui.ConfirmTransactionActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name="com.tangem.ui.activity.SignTransactionActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name="com.tangem.ui.activity.PurgeActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name="com.tangem.ui.activity.PinSwapActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name="com.tangem.ui.activity.QrScanActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name="com.tangem.ui.activity.SendTransactionActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name="com.tangem.ui.activity.PrepareCryptonitWithdrawalActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name="com.tangem.ui.activity.PrepareCryptonitOtherApiWithdrawalActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name="com.tangem.ui.activity.PrepareKrakenWithdrawalActivity"
android:screenOrientation="portrait"
android:theme="@style/AppTheme.NoActionBar" />
</application>
</manifest>

View file

@ -10,7 +10,10 @@ import com.tangem.card_android.android.data.PINStorage
import com.tangem.card_common.data.Issuer
import com.tangem.data.dp.PrefsManager
import com.tangem.data.local.PendingTransactionsStorage
import com.tangem.di.*
import com.tangem.di.DaggerNetworkComponent
import com.tangem.di.DaggerToastHelperComponent
import com.tangem.di.NetworkComponent
import com.tangem.di.ToastHelperComponent
import com.tangem.server_android.data.LocalStorage
import com.tangem.wallet.BuildConfig
import io.fabric.sdk.android.Fabric
@ -28,7 +31,6 @@ class App : Application() {
}
lateinit var networkComponent: NetworkComponent
lateinit var navigatorComponent: NavigatorComponent
lateinit var toastHelperComponent: ToastHelperComponent
lateinit var firmwaresStorage: Firmwares
@ -43,7 +45,6 @@ class App : Application() {
instance = this
networkComponent = DaggerNetworkComponent.create()
navigatorComponent = buildNavigatorComponent()
toastHelperComponent = buildToastHelperComponent()
PrefsManager.getInstance().init(this)
@ -79,11 +80,6 @@ class App : Application() {
}
}
private fun buildNavigatorComponent(): NavigatorComponent {
return DaggerNavigatorComponent.builder()
.build()
}
private fun buildToastHelperComponent(): ToastHelperComponent {
return DaggerToastHelperComponent.builder()
.build()

View file

@ -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"
}

View file

@ -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<Void, Void, Boolean> {
private WeakReference<PinSaveActivity> reference;
private WeakReference<PinSaveFragment> 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<Void, Void, Boolean> {
@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();
}
}

View file

@ -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<Void, Void, Boolean> {
public static final String TAG = StartFingerprintReaderTask.class.getSimpleName();
private WeakReference<PinRequestActivity> reference;
private WeakReference<PinRequestFragment> reference;
private KeyStore keyStore;
private Cipher cipher;
@ -39,13 +39,13 @@ public class StartFingerprintReaderTask extends AsyncTask<Void, Void, Boolean> {
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<Void, Void, Boolean> {
@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<Void, Void, Boolean> {
@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<Void, Void, Boolean> {
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);

View file

@ -3,8 +3,6 @@ package com.tangem.data.network;
import com.tangem.data.network.model.BlockchainInfoAddress;
import com.tangem.data.network.model.BlockchainInfoUnspents;
import io.reactivex.Observable;
import io.reactivex.Single;
import okhttp3.ResponseBody;
import retrofit2.http.Field;

View file

@ -9,8 +9,6 @@ import com.tangem.data.network.model.BlockchainInfoUnspents;
import java.util.ArrayList;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.Single;
import io.reactivex.SingleObserver;
import io.reactivex.android.schedulers.AndroidSchedulers;

View file

@ -2,6 +2,8 @@ package com.tangem.data.network;
import android.util.Log;
import androidx.annotation.NonNull;
import com.tangem.App;
import com.tangem.data.Blockchain;
import com.tangem.data.network.model.BlockcypherBody;
@ -11,7 +13,6 @@ import com.tangem.data.network.model.BlockcypherTx;
import java.util.Random;
import androidx.annotation.NonNull;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

View file

@ -7,11 +7,9 @@ import com.tangem.wallet.eos.EosPushTransactionRequest;
import io.jafka.jeos.EosApi;
import io.jafka.jeos.EosApiFactory;
import io.jafka.jeos.core.request.chain.transaction.PushTransactionRequest;
import io.jafka.jeos.core.response.chain.account.Account;
import io.jafka.jeos.core.response.chain.transaction.PushedTransaction;
import io.jafka.jeos.impl.EosApiServiceGenerator;
import io.jafka.jeos.impl.EosChainApiService;
import io.reactivex.Observable;
import io.reactivex.Observer;
import io.reactivex.android.schedulers.AndroidSchedulers;

View file

@ -2,12 +2,13 @@ package com.tangem.data.network;
import android.util.Log;
import androidx.annotation.NonNull;
import com.tangem.data.network.model.RippleBody;
import com.tangem.data.network.model.RippleResponse;
import java.util.HashMap;
import androidx.annotation.NonNull;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;

View file

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

View file

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

View file

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

View file

@ -1,14 +1,11 @@
package com.tangem.di
import com.tangem.data.network.Server
import java.net.Socket
import javax.inject.Named
import javax.inject.Singleton
import dagger.Component
import retrofit2.Retrofit
import java.net.Socket
import javax.inject.Named
import javax.inject.Singleton
@Singleton
@Component(modules = [NetworkModule::class])

View file

@ -3,15 +3,6 @@ package com.tangem.di
import com.jakewharton.retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import com.tangem.data.network.Server
import com.tangem.wallet.BuildConfig
import java.io.IOException
import java.net.InetSocketAddress
import java.net.Socket
import java.net.SocketException
import javax.inject.Named
import javax.inject.Singleton
import dagger.Module
import dagger.Provides
import okhttp3.OkHttpClient
@ -19,6 +10,12 @@ import okhttp3.logging.HttpLoggingInterceptor
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import retrofit2.converter.scalars.ScalarsConverterFactory
import java.io.IOException
import java.net.InetSocketAddress
import java.net.Socket
import java.net.SocketException
import javax.inject.Named
import javax.inject.Singleton
@Module
internal class NetworkModule {

View file

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

View file

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

View file

@ -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<Tag>(NfcAdapter.EXTRA_TAG)
if (tag != null) {
val fragment = supportFragmentManager.findFragmentById(R.id.loaded_wallet_fragment) as LoadedWalletFragment
fragment.onTagDiscovered(tag)
}
}
}
}

View file

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

View file

@ -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<Toolbar>(R.id.toolbar)
toolbar.setTitle(R.string.settings)
toolbar.setNavigationIcon(android.R.drawable.ic_menu_close_clear_cancel)
setSupportActionBar(toolbar)
toolbar.setNavigationOnClickListener { finish() }
}
}

View file

@ -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()
}
}

View file

@ -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 + ")");

View file

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

View file

@ -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.BuildConfig
import com.tangem.wallet.R
import com.tangem.wallet.TangemContext
import kotlinx.android.synthetic.main.activity_logo.*
import javax.inject.Inject
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)
clLogoContainer.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()
}
}

View file

@ -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
}
}

View file

@ -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()
}

View file

@ -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)
}
}

View file

@ -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)
}
}

View file

@ -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()
}
}

View file

@ -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) {
", <b>${signingM.description}</b>"
} else {
", <small>${signingM.description}</small>"
}
}
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 {

View file

@ -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)

View file

@ -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)

View file

@ -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()
}

View file

@ -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)
}
}
}
}

View file

@ -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
}

View file

@ -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)
}
}

View file

@ -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)
}
}

View file

@ -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)
}
}
}
@ -146,8 +142,8 @@ class EmptyWalletActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, Card
val isoDep = IsoDep.get(tag)
val uid = tag.id
val sUID = Util.byteArrayToHexString(uid)
if (ctx.card.uid != sUID) {
nfcManager.ignoreTag(isoDep.tag)
if (ctx.card.uid != sUID || cardProtocol != null) {
(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)
}
}

View file

@ -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<Tag>(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()

View file

@ -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

View file

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

View file

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

View file

@ -15,7 +15,6 @@ import com.tangem.data.network.Server;
import com.tangem.data.network.ServerApiBlockchainInfo;
import com.tangem.data.network.ServerApiBlockcypher;
import com.tangem.data.network.ServerApiCommon;
import com.tangem.data.network.ServerApiSoChain;
import com.tangem.data.network.model.BlockchainInfoAddress;
import com.tangem.data.network.model.BlockchainInfoAddressAndUnspents;
import com.tangem.data.network.model.BlockchainInfoTransaction;
@ -25,7 +24,6 @@ import com.tangem.data.network.model.BlockcypherFee;
import com.tangem.data.network.model.BlockcypherResponse;
import com.tangem.data.network.model.BlockcypherTx;
import com.tangem.data.network.model.BlockcypherTxref;
import com.tangem.data.network.model.SoChain;
import com.tangem.util.CryptoUtil;
import com.tangem.util.DecimalDigitsInputFilter;
import com.tangem.util.DerEncodingUtil;
@ -51,9 +49,7 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import io.reactivex.Observer;
import io.reactivex.SingleObserver;
import io.reactivex.observers.DefaultObserver;
import io.reactivex.observers.DisposableSingleObserver;
import okhttp3.ResponseBody;

View file

@ -5,6 +5,10 @@ import android.text.InputFilter;
import android.util.Log;
import com.tangem.App;
import com.tangem.card_common.data.TangemCard;
import com.tangem.card_common.reader.CardProtocol;
import com.tangem.card_common.tasks.SignTask;
import com.tangem.card_common.util.Util;
import com.tangem.data.local.PendingTransactionsStorage;
import com.tangem.data.network.Server;
import com.tangem.data.network.ServerApiBlockcypher;
@ -14,23 +18,19 @@ import com.tangem.data.network.model.BlockcypherResponse;
import com.tangem.data.network.model.BlockcypherTx;
import com.tangem.data.network.model.BlockcypherTxref;
import com.tangem.data.network.model.SoChain;
import com.tangem.util.CryptoUtil;
import com.tangem.util.DecimalDigitsInputFilter;
import com.tangem.util.DerEncodingUtil;
import com.tangem.wallet.BTCUtils;
import com.tangem.wallet.BalanceValidator;
import com.tangem.wallet.Base58;
import com.tangem.wallet.CoinData;
import com.tangem.wallet.R;
import com.tangem.wallet.TangemContext;
import com.tangem.wallet.Transaction;
import com.tangem.wallet.UnspentOutputInfo;
import com.tangem.wallet.btc.BtcData;
import com.tangem.wallet.btc.BtcEngine;
import com.tangem.card_common.data.TangemCard;
import com.tangem.card_common.reader.CardProtocol;
import com.tangem.card_common.tasks.SignTask;
import com.tangem.card_common.util.Util;
import com.tangem.util.CryptoUtil;
import com.tangem.util.DecimalDigitsInputFilter;
import com.tangem.util.DerEncodingUtil;
import com.tangem.wallet.R;
import org.json.JSONException;

View file

@ -15,14 +15,14 @@ import com.tangem.card_common.tasks.SignTask;
import com.tangem.card_common.util.Util;
import com.tangem.data.network.ServerApiRipple;
import com.tangem.data.network.model.RippleResponse;
import com.tangem.util.CryptoUtil;
import com.tangem.util.DecimalDigitsInputFilter;
import com.tangem.wallet.BTCUtils;
import com.tangem.wallet.BalanceValidator;
import com.tangem.wallet.CoinData;
import com.tangem.wallet.CoinEngine;
import com.tangem.wallet.TangemContext;
import com.tangem.util.CryptoUtil;
import com.tangem.util.DecimalDigitsInputFilter;
import com.tangem.wallet.R;
import com.tangem.wallet.TangemContext;
import java.math.BigDecimal;
import java.math.BigInteger;

View file

@ -1,21 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.tangem.ui.activity.LoadedWalletActivity">
<fragment
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/loaded_wallet_fragment"
android:name="com.tangem.ui.fragment.LoadedWalletFragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:layout="@layout/fr_loaded_wallet"/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View file

@ -1,18 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.tangem.ui.activity.VerifyCardActivity">
<fragment
android:id="@+id/verify_card_fragment"
android:name="com.tangem.ui.fragment.VerifyCard"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:layout_behavior="@string/appbar_scrolling_view_behavior"
tools:layout="@layout/fr_verify_card"/>
</androidx.coordinatorlayout.widget.CoordinatorLayout>

View file

@ -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">
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/srl"

View file

@ -6,9 +6,8 @@
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical"
tools:context="com.tangem.ui.fragment.VerifyCard"
tools:ignore="contentDescription"
tools:showIn="@layout/activity_verify_card">
tools:context="com.tangem.ui.fragment.VerifyCardFragment"
tools:ignore="contentDescription">
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/srlVerifyCard"

View file

@ -3,8 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.tangem.ui.activity.CreateNewWalletActivity">
android:layout_height="match_parent">
<include
layout="@layout/layout_touch_card"

View file

@ -6,7 +6,6 @@
android:layout_height="match_parent"
android:background="@color/white"
android:orientation="vertical"
tools:context="com.tangem.ui.activity.EmptyWalletActivity"
tools:ignore="contentDescription">
<include

View file

@ -5,7 +5,6 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#FFFFFF"
tools:context="com.tangem.ui.activity.LogoActivity"
tools:ignore="contentDescription">
<TextView

View file

@ -3,8 +3,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
tools:context="com.tangem.ui.activity.PinRequestActivity">
android:orientation="vertical">
<TextView
android:id="@+id/tvPin"

View file

@ -3,8 +3,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_horizontal"
android:orientation="vertical"
tools:context="com.tangem.ui.activity.PinSaveActivity">
android:orientation="vertical">
<TextView
android:id="@+id/tvPin"

View file

@ -2,8 +2,7 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.tangem.ui.activity.PurgeActivity">
android:layout_height="match_parent">
<LinearLayout
android:layout_width="match_parent"

View file

@ -3,8 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.tangem.ui.activity.PrepareCryptonitOtherApiWithdrawalActivity">
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"

View file

@ -3,8 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.tangem.ui.activity.PrepareCryptonitWithdrawalActivity">
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"

View file

@ -3,8 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.tangem.ui.activity.PrepareKrakenWithdrawalActivity">
android:layout_height="match_parent">
<TextView
android:id="@+id/textView"

View file

@ -3,8 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.tangem.ui.activity.PurgeActivity">
android:layout_height="match_parent">
<include
layout="@layout/layout_touch_card"

View file

@ -1,9 +1,7 @@
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.tangem.ui.activity.SendTransactionActivity">
android:layout_height="match_parent">
<ProgressBar
android:id="@+id/progressBar"

View file

@ -1,8 +1,8 @@
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
android:layout_height="match_parent"
android:orientation="vertical">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/abl"
@ -18,12 +18,9 @@
</com.google.android.material.appbar.AppBarLayout>
<fragment
android:id="@+id/thanks_fragment"
android:name="com.tangem.ui.fragment.SettingsFragment"
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/abl"
tools:xml="@xml/pref_main" />
android:layout_height="wrap_content"
android:id="@android:id/list_container"/>
</RelativeLayout>
</LinearLayout>

View file

@ -9,4 +9,4 @@
android:layout_alignParentBottom="true"
android:elevation="1dp"
app:layout_constraintBottom_toBottomOf="parent"
tools:showIn="@layout/activity_pin_swap" />
tools:showIn="@layout/fragment_pin_swap" />

View file

@ -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">
<fragment
android:id="@+id/main"
android:name="com.tangem.ui.fragment.MainFragment"
android:label="fragment_main"
tools:layout="@layout/main_fragment">
<action
android:id="@+id/action_main_to_loadedWalletFragment"
app:destination="@id/loadedWalletFragment" />
<action
android:id="@+id/action_main_to_pinRequestFragment"
app:destination="@id/pinRequestFragment" />
<action
android:id="@+id/action_main_to_emptyWalletFragment"
app:destination="@id/emptyWalletFragment" />
<action
android:id="@+id/action_main_to_logoFragment"
app:destination="@id/logoFragment" />
<action
android:id="@+id/action_main_to_pinSaveFragment"
app:destination="@id/pinSaveFragment" />
<action
android:id="@+id/action_main_to_settingsFragment"
app:destination="@id/settingsFragment" />
</fragment>
<fragment
android:id="@+id/loadedWalletFragment"
android:name="com.tangem.ui.fragment.wallet.LoadedWalletFragment"
android:label="fr_loaded_wallet"
tools:layout="@layout/fr_loaded_wallet" >
<action
android:id="@+id/action_loadedWalletFragment_to_verifyCard"
app:destination="@id/verifyCard" />
<action
android:id="@+id/action_loadedWalletFragment_to_prepareTransactionFragment"
app:destination="@id/prepareTransactionFragment" />
<action
android:id="@+id/action_loadedWalletFragment_to_pinRequestFragment"
app:destination="@id/pinRequestFragment" />
<action
android:id="@+id/action_loadedWalletFragment_to_pinSwapFragment"
app:destination="@id/pinSwapFragment" />
<action
android:id="@+id/action_loadedWalletFragment_to_prepareCryptonitWithdrawalFragment"
app:destination="@id/prepareCryptonitWithdrawalFragment" />
<action
android:id="@+id/action_loadedWalletFragment_to_prepareKrakenWithdrawalFragment"
app:destination="@id/prepareKrakenWithdrawalFragment" />
</fragment>
<fragment
android:id="@+id/verifyCard"
android:name="com.tangem.ui.fragment.VerifyCardFragment"
android:label="fr_verify_card"
tools:layout="@layout/fr_verify_card" >
<action
android:id="@+id/action_verifyCard_to_pinRequestFragment"
app:destination="@id/pinRequestFragment" />
<action
android:id="@+id/action_verifyCard_to_pinSwapFragment"
app:destination="@id/pinSwapFragment" />
<action
android:id="@+id/action_verifyCard_to_purgeFragment"
app:destination="@id/purgeFragment" />
</fragment>
<fragment
android:id="@+id/confirmTransactionFragment"
android:name="com.tangem.ui.ConfirmTransactionFragment"
android:label="fragment_confirm_transaction"
tools:layout="@layout/fragment_confirm_transaction" >
<action
android:id="@+id/action_confirmTransactionFragment_to_signTransactionFragment"
app:destination="@id/signTransactionFragment" />
<action
android:id="@+id/action_confirmTransactionFragment_to_pinRequestFragment"
app:destination="@id/pinRequestFragment" />
</fragment>
<fragment
android:id="@+id/prepareTransactionFragment"
android:name="com.tangem.ui.PrepareTransactionFragment"
android:label="PrepareTransactionFragment" >
<action
android:id="@+id/action_prepareTransactionFragment_to_confirmTransactionFragment"
app:destination="@id/confirmTransactionFragment" />
<action
android:id="@+id/action_prepareTransactionFragment_to_qrScanFragment"
app:destination="@id/qrScanFragment" />
</fragment>
<fragment
android:id="@+id/signTransactionFragment"
android:name="com.tangem.ui.SignTransactionFragment"
android:label="SignTransactionFragment" >
<action
android:id="@+id/action_signTransactionFragment_to_sendTransactionFragment"
app:destination="@id/sendTransactionFragment" />
</fragment>
<fragment
android:id="@+id/sendTransactionFragment"
android:name="com.tangem.ui.fragment.SendTransactionFragment"
android:label="SendTransactionFragment" >
</fragment>
<fragment
android:id="@+id/pinRequestFragment"
android:name="com.tangem.ui.fragment.pin.PinRequestFragment"
android:label="PinRequestFragment" >
</fragment>
<fragment
android:id="@+id/qrScanFragment"
android:name="com.tangem.ui.fragment.QrScanFragment"
android:label="QrScanFragment" >
</fragment>
<fragment
android:id="@+id/pinSwapFragment"
android:name="com.tangem.ui.fragment.pin.PinSwapFragment"
android:label="PinSwapFragment" >
</fragment>
<fragment
android:id="@+id/emptyWalletFragment"
android:name="com.tangem.ui.fragment.wallet.EmptyWalletFragment"
android:label="EmptyWalletFragment" >
<action
android:id="@+id/action_emptyWalletFragment_to_pinRequestFragment"
app:destination="@id/pinRequestFragment" />
<action
android:id="@+id/action_emptyWalletFragment_to_verifyCard"
app:destination="@id/verifyCard" />
<action
android:id="@+id/action_emptyWalletFragment_to_createNewWalletFragment"
app:destination="@id/createNewWalletFragment" />
</fragment>
<fragment
android:id="@+id/createNewWalletFragment"
android:name="com.tangem.ui.fragment.wallet.CreateNewWalletFragment"
android:label="CreateNewWalletFragment" >
</fragment>
<fragment
android:id="@+id/logoFragment"
android:name="com.tangem.ui.fragment.LogoFragment"
android:label="LogoFragment" >
<action
android:id="@+id/action_logoFragment_to_main"
app:destination="@id/main"
app:popUpTo="@+id/main_graph" />
<action
android:id="@+id/action_logoFragment_to_prepareTransactionFragment"
app:destination="@id/prepareTransactionFragment"
app:popUpTo="@+id/prepareTransactionFragment" />
</fragment>
<fragment
android:id="@+id/purgeFragment"
android:name="com.tangem.ui.fragment.PurgeFragment"
android:label="PurgeFragment" >
<action
android:id="@+id/action_purgeFragment_to_mainFragment"
app:destination="@id/main"
app:popUpTo="@+id/main" />
</fragment>
<fragment
android:id="@+id/pinSaveFragment"
android:name="com.tangem.ui.fragment.pin.PinSaveFragment"
android:label="PinSaveFragment" />
<fragment
android:id="@+id/settingsFragment"
android:name="com.tangem.ui.fragment.SettingsFragment"
android:label="SettingsFragment" />
<fragment
android:id="@+id/prepareCryptonitOtherApiWithdrawalFragment"
android:name="com.tangem.ui.fragment.additional.PrepareCryptonitOtherApiWithdrawalFragment"
android:label="PrepareCryptonitOtherApiWithdrawalFragment" >
<action
android:id="@+id/action_prepareCryptonitOtherApiWithdrawalFragment_to_qrScanFragment"
app:destination="@id/qrScanFragment" />
</fragment>
<fragment
android:id="@+id/prepareCryptonitWithdrawalFragment"
android:name="com.tangem.ui.fragment.additional.PrepareCryptonitWithdrawalFragment"
android:label="PrepareCryptonitWithdrawalFragment" />
<fragment
android:id="@+id/prepareKrakenWithdrawalFragment"
android:name="com.tangem.ui.fragment.additional.PrepareKrakenWithdrawalFragment"
android:label="PrepareKrakenWithdrawalFragment" />
</navigation>

View file

@ -5,6 +5,7 @@
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="preferenceTheme">@style/AppPreferenceTheme</item>
</style>
<style name="spinner_item_actionbar" parent="Widget.AppCompat.Light.Spinner.DropDown.ActionBar">
@ -78,4 +79,16 @@
<item name="android:textAlignment">center</item>
</style>
<!-- Custom Preference Theme -->
<style name="AppPreferenceTheme"
parent="@style/PreferenceThemeOverlay.v14.Material">
<item name="preferenceFragmentCompatStyle">
@style/AppPreferenceFragmentCompatStyle
</item>
</style>
<!-- Custom Style for PreferenceFragmentCompat -->
<style name="AppPreferenceFragmentCompatStyle"
parent="@style/PreferenceFragment.Material">
<item name="android:layout">@layout/fragment_settings</item>
</style>
</resources>

View file

@ -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))
}
}

View file

@ -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()
}

View file

@ -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

View file

@ -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">
<TextView

View file

@ -4,7 +4,7 @@
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.tangem.ui.PrepareTransactionActivity"
tools:context="com.tangem.ui.PrepareTransactionFragment"
tools:ignore="contentDescription">
<TextView

View file

@ -3,8 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.tangem.ui.SignTransactionActivity">
android:layout_height="match_parent">
<include
layout="@layout/layout_touch_card"

View file

@ -1,42 +1,45 @@
package com.tangem.ui
import android.app.Activity
import android.content.Intent
import android.nfc.NfcAdapter
import android.nfc.Tag
import android.os.Build
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import android.text.Editable
import android.text.Html
import android.text.TextWatcher
import android.view.KeyEvent
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.Toast
import androidx.activity.OnBackPressedCallback
import androidx.core.os.bundleOf
import com.tangem.Constant
import com.tangem.card_android.android.data.PINStorage
import com.tangem.wallet.CoinEngine
import com.tangem.wallet.CoinEngineFactory
import com.tangem.wallet.TangemContext
import com.tangem.ui.event.TransactionFinishWithError
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.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.tangemCardano.fragment_confirm_transaction.*
import org.greenrobot.eventbus.EventBus
import java.io.IOException
import java.util.*
import com.tangem.card_android.data.EXTRA_TANGEM_CARD
import com.tangem.card_android.data.EXTRA_TANGEM_CARD_UID
import com.tangem.ui.activity.PinRequestActivity
import kotlinx.android.synthetic.tangemCardano.activity_confirm_transaction.*
class ConfirmTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback {
class ConfirmTransactionFragment : BaseFragment(), NavigationResultListener, NfcAdapter.ReaderCallback {
private lateinit var nfcManager: NfcManager
private lateinit var ctx: TangemContext
override val layoutId = R.layout.fragment_confirm_transaction
private val ctx: TangemContext by lazy { TangemContext() }
private lateinit var amount: CoinEngine.Amount
private var isIncludeFee: Boolean = true
@ -46,14 +49,19 @@ class ConfirmTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_confirm_transaction)
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)
val engine = CoinEngineFactory.createCardano(ctx) //create(ctx)
val engine = CoinEngineFactory.createCardano(ctx)
@Suppress("DEPRECATION") val html = if (Build.VERSION.SDK_INT >= 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))
}
}

View file

@ -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()
}

View file

@ -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)
}
}

View file

@ -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">
<TextView

View file

@ -5,7 +5,6 @@
android:id="@+id/cl"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.tangem.ui.PrepareTransactionActivity"
tools:ignore="contentDescription">
<TextView

View file

@ -3,8 +3,7 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.tangem.ui.SignTransactionActivity">
android:layout_height="match_parent">
<include
layout="@layout/layout_touch_card"

View file

@ -1,5 +1,5 @@
buildscript {
ext.kotlin_version = '1.3.30'
ext.kotlin_version = '1.3.41'
repositories {
google()
jcenter()

View file

@ -26,6 +26,13 @@ android {
}
}
buildToolsVersion '28.0.3'
compileOptions {
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
kotlinOptions {
jvmTarget = '1.8'
}
}
@ -33,7 +40,12 @@ dependencies {
implementation project(':card-common')
// implementation 'com.github.TangemCash.card_android-common:card_android-android:0.1.0'
implementation 'androidx.appcompat:appcompat:1.1.0-alpha04'
implementation 'androidx.appcompat:appcompat:1.1.0-rc01'
implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.0.0'
implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0'
implementation "androidx.lifecycle:lifecycle-runtime:2.0.0"
implementation "androidx.lifecycle:lifecycle-common-java8:2.0.0"
implementation 'androidx.appcompat:appcompat:1.1.0-rc01'
implementation 'com.google.code.gson:gson:2.8.5'
implementation 'com.scottyab:rootbeer-lib:0.0.7'
testImplementation 'junit:junit:4.12'

View file

@ -1,8 +1,7 @@
package com.tangem.card_android.android.nfc
import androidx.lifecycle.Lifecycle
import androidx.lifecycle.LifecycleObserver
import androidx.lifecycle.OnLifecycleEvent
import androidx.lifecycle.DefaultLifecycleObserver
import androidx.lifecycle.LifecycleOwner
import com.tangem.card_android.android.reader.NfcManager
/**
@ -10,15 +9,15 @@ import com.tangem.card_android.android.reader.NfcManager
*
* @see NfcManager
*/
class NfcLifecycleObserver(private var nfcManager: NfcManager) : LifecycleObserver {
class NfcLifecycleObserver(private var nfcManager: NfcManager) : DefaultLifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun onResume() {
override fun onResume(owner: LifecycleOwner) {
super.onResume(owner)
nfcManager.onResume()
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun onPause() {
override fun onPause(owner: LifecycleOwner) {
super.onPause(owner)
nfcManager.onPause()
nfcManager.onStop()
}

View file

@ -1,4 +1,4 @@
#Wed Aug 21 11:57:23 MSK 2019
#Thu Aug 22 12:21:00 MSK 2019
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME