From 4b1033dcb5698f562b5f366af2d8c6494fe1209a Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 24 Jul 2018 14:25:51 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../presentation/fragment/VerifyCard.java | 627 ---------- .../presentation/fragment/VerifyCard.kt | 547 +++++++++ app/src/main/res/layout/fr_verify_card.xml | 1019 +++++++++-------- 3 files changed, 1060 insertions(+), 1133 deletions(-) delete mode 100644 app/src/main/java/com/tangem/presentation/fragment/VerifyCard.java create mode 100644 app/src/main/java/com/tangem/presentation/fragment/VerifyCard.kt diff --git a/app/src/main/java/com/tangem/presentation/fragment/VerifyCard.java b/app/src/main/java/com/tangem/presentation/fragment/VerifyCard.java deleted file mode 100644 index 555a123e02..0000000000 --- a/app/src/main/java/com/tangem/presentation/fragment/VerifyCard.java +++ /dev/null @@ -1,627 +0,0 @@ -package com.tangem.presentation.fragment; - -import android.app.Activity; -import android.content.Intent; -import android.nfc.NfcAdapter; -import android.nfc.Tag; -import android.os.Bundle; -import android.support.annotation.NonNull; -import android.support.annotation.Nullable; -import android.support.design.widget.FloatingActionButton; -import android.support.v4.app.Fragment; -import android.support.v4.content.ContextCompat; -import android.support.v4.widget.SwipeRefreshLayout; -import android.view.LayoutInflater; -import android.view.MenuInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.Button; -import android.widget.ImageView; -import android.widget.PopupMenu; -import android.widget.TextView; -import android.widget.Toast; - -import com.tangem.domain.cardReader.NfcManager; -import com.tangem.domain.wallet.CoinEngine; -import com.tangem.domain.wallet.CoinEngineFactory; -import com.tangem.domain.wallet.PINStorage; -import com.tangem.domain.wallet.TangemCard; -import com.tangem.presentation.activity.CreateNewWalletActivity; -import com.tangem.presentation.activity.PurgeActivity; -import com.tangem.presentation.activity.RequestPINActivity; -import com.tangem.presentation.activity.SwapPINActivity; -import com.tangem.presentation.dialog.PINSwapWarningDialog; -import com.tangem.wallet.BuildConfig; -import com.tangem.wallet.R; - -import java.io.IOException; -import java.util.Objects; -import java.util.Timer; -import java.util.TimerTask; - -public class VerifyCard extends Fragment implements NfcAdapter.ReaderCallback { - public static final String TAG = VerifyCard.class.getSimpleName(); - - private static final int REQUEST_CODE_SEND_PAYMENT = 1; - private static final int REQUEST_CODE_PURGE = 2; - private static final int REQUEST_CODE_REQUEST_PIN2_FOR_PURGE = 3; - private static final int REQUEST_CODE_VERIFY_CARD = 4; - private static final int REQUEST_CODE_ENTER_NEW_PIN = 5; - private static final int REQUEST_CODE_ENTER_NEW_PIN2 = 6; - private static final int REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN = 7; - private static final int REQUEST_CODE_SWAP_PIN = 8; - - private NfcManager mNfcManager; - private TangemCard mCard; - - private SwipeRefreshLayout mSwipeRefreshLayout; - private TextView tvCardID, tvManufacturer, tvRegistrationDate, tvCardIdentity, tvLastSigned, tvRemainingSignatures, tvReusable, tvError, tvMessage, tvIssuer, tvIssuerData, tvFeatures, tvBlockchain, tvSignedTx, tvSigningMethod, tvFirmware, tvWalletIdentity, tvWallet; - private ImageView ivBlockchain, ivPIN, ivPIN2orSecurityDelay, ivDeveloperVersion; - - private int requestPIN2Count = 0; - private Timer timerHideErrorAndMessage = null; - private String newPIN = "", newPIN2 = ""; - - public VerifyCard() { - - } - - @Override - public void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - mNfcManager = new NfcManager(getActivity(), this); - - mCard = new TangemCard(Objects.requireNonNull(getActivity()).getIntent().getStringExtra("UID")); - mCard.LoadFromBundle(Objects.requireNonNull(getActivity().getIntent().getExtras()).getBundle("Card")); - } - - @Override - public View onCreateView(@NonNull final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - - View v = inflater.inflate(R.layout.fr_verify_card, container, false); - - mSwipeRefreshLayout = v.findViewById(R.id.swipe_container); - tvCardID = v.findViewById(R.id.tvCardID); - tvLastSigned = v.findViewById(R.id.tvLastSigned); - tvRemainingSignatures = v.findViewById(R.id.tvRemainingSignatures); - tvReusable = v.findViewById(R.id.tvReusable); - tvManufacturer = v.findViewById(R.id.tvManufacturerInfo); - tvCardIdentity = v.findViewById(R.id.tvCardIdentity); - tvRegistrationDate = v.findViewById(R.id.tvCardRegistredDate); - ivBlockchain = v.findViewById(R.id.ivBlockchain); - ivPIN = v.findViewById(R.id.imgPIN); - ivPIN2orSecurityDelay = v.findViewById(R.id.imgPIN2orSecurityDelay); - ivDeveloperVersion = v.findViewById(R.id.imgDeveloperVersion); - tvError = v.findViewById(R.id.tvError); - tvMessage = v.findViewById(R.id.tvMessage); - tvIssuer = v.findViewById(R.id.tvIssuer); - tvIssuerData = v.findViewById(R.id.tvIssuerData); - tvFirmware = v.findViewById(R.id.tvFirmware); - tvFeatures = v.findViewById(R.id.tvFeatures); - tvBlockchain = v.findViewById(R.id.tvBlockchain); - tvSignedTx = v.findViewById(R.id.tvSignedTx); - tvSigningMethod = v.findViewById(R.id.tvSigningMethod); - Button btnOk = v.findViewById(R.id.btnOk); - FloatingActionButton fabMenu = v.findViewById(R.id.fabMenu); - tvWallet = v.findViewById(R.id.tvWallet); - tvWalletIdentity = v.findViewById(R.id.tvWalletIdentity); - - updateViews(); - - btnOk.setOnClickListener(v1 -> { - Intent data = prepareResultIntent(); - data.putExtra("modification", "update"); - if (getActivity() != null) - getActivity().finish(); - }); - - mSwipeRefreshLayout.setOnRefreshListener(() -> mSwipeRefreshLayout.setRefreshing(false)); - - fabMenu.setOnClickListener(v16 -> showMenu(fabMenu)); - - return v; - } - - @Override - public void onResume() { - super.onResume(); - mNfcManager.onResume(); - } - - @Override - public void onPause() { - super.onPause(); - mNfcManager.onPause(); - } - - @Override - public void onStop() { - super.onStop(); - mNfcManager.onStop(); - } - - @Override - public void onActivityResult(int requestCode, int resultCode, Intent data) { - super.onActivityResult(requestCode, resultCode, data); - switch (requestCode) { - case REQUEST_CODE_ENTER_NEW_PIN: - if (resultCode == Activity.RESULT_OK) { - if (data != null) { - if (Objects.requireNonNull(data.getExtras()).containsKey("confirmPIN")) { - Intent intent = new Intent(getContext(), RequestPINActivity.class); - intent.putExtra("mode", RequestPINActivity.Mode.RequestPIN2.toString()); - intent.putExtra("UID", mCard.getUID()); - intent.putExtra("Card", mCard.getAsBundle()); - newPIN = data.getStringExtra("newPIN"); - startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN); - } else { - Intent intent = new Intent(getContext(), RequestPINActivity.class); - intent.putExtra("newPIN", data.getStringExtra("newPIN")); - intent.putExtra("mode", RequestPINActivity.Mode.ConfirmNewPIN.toString()); - startActivityForResult(intent, REQUEST_CODE_ENTER_NEW_PIN); - } - } - } - break; - case REQUEST_CODE_ENTER_NEW_PIN2: - if (resultCode == Activity.RESULT_OK) { - if (data != null) { - if (Objects.requireNonNull(data.getExtras()).containsKey("confirmPIN2")) { - Intent intent = new Intent(getContext(), RequestPINActivity.class); - intent.putExtra("mode", RequestPINActivity.Mode.RequestPIN2.toString()); - intent.putExtra("UID", mCard.getUID()); - intent.putExtra("Card", mCard.getAsBundle()); - newPIN2 = data.getStringExtra("newPIN2"); - startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN); - } else { - Intent intent = new Intent(getContext(), RequestPINActivity.class); - intent.putExtra("newPIN2", data.getStringExtra("newPIN2")); - intent.putExtra("mode", RequestPINActivity.Mode.ConfirmNewPIN2.toString()); - startActivityForResult(intent, REQUEST_CODE_ENTER_NEW_PIN2); - } - } - } - break; - case REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN: - if (resultCode == Activity.RESULT_OK) { - if (newPIN.equals("")) newPIN = mCard.getPIN(); - - if (newPIN2.equals("")) newPIN2 = PINStorage.getPIN2(); - - PINSwapWarningDialog pinSwapWarningDialog = new PINSwapWarningDialog(); - pinSwapWarningDialog.setOnRefreshPage(this::startSwapPINActivity); - Bundle bundle = new Bundle(); - if (!PINStorage.isDefaultPIN(newPIN) || !PINStorage.isDefaultPIN2(newPIN2)) - bundle.putString(PINSwapWarningDialog.EXTRA_MESSAGE, getString(R.string.if_you_forget)); - else - bundle.putString(PINSwapWarningDialog.EXTRA_MESSAGE, getString(R.string.if_you_use_default)); - pinSwapWarningDialog.setArguments(bundle); - pinSwapWarningDialog.show(Objects.requireNonNull(getActivity()).getFragmentManager(), PINSwapWarningDialog.TAG); - } - break; - - case REQUEST_CODE_SWAP_PIN: - if (resultCode == Activity.RESULT_OK) { - if (data == null) { - data = new Intent(); - - data.putExtra("UID", mCard.getUID()); - data.putExtra("Card", mCard.getAsBundle()); - data.putExtra("modification", "delete"); - } else { - data.putExtra("modification", "update"); - } - Objects.requireNonNull(getActivity()).setResult(Activity.RESULT_OK, data); - getActivity().finish(); - } else { - if (data != null && data.getExtras().containsKey("UID") && data.getExtras().containsKey("Card")) { - TangemCard updatedCard = new TangemCard(data.getStringExtra("UID")); - updatedCard.LoadFromBundle(data.getBundleExtra("Card")); - mCard = updatedCard; - } - if (resultCode == CreateNewWalletActivity.RESULT_INVALID_PIN && requestPIN2Count < 2) { - requestPIN2Count++; - Intent intent = new Intent(getContext(), RequestPINActivity.class); - intent.putExtra("mode", RequestPINActivity.Mode.RequestPIN2.toString()); - intent.putExtra("UID", mCard.getUID()); - intent.putExtra("Card", mCard.getAsBundle()); - startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN); - return; - } else { - if (data != null && data.getExtras().containsKey("message")) { - mCard.setError(data.getStringExtra("message")); - } - } - } - break; - case REQUEST_CODE_REQUEST_PIN2_FOR_PURGE: - if (resultCode == Activity.RESULT_OK) { - Intent intent = new Intent(getContext(), PurgeActivity.class); - intent.putExtra("UID", mCard.getUID()); - intent.putExtra("Card", mCard.getAsBundle()); - startActivityForResult(intent, REQUEST_CODE_PURGE); - } - break; - case REQUEST_CODE_PURGE: - if (resultCode == Activity.RESULT_OK) { - if (data == null) { - data = new Intent(); - - data.putExtra("UID", mCard.getUID()); - data.putExtra("Card", mCard.getAsBundle()); - data.putExtra("modification", "delete"); - } else { - data.putExtra("modification", "update"); - } - Objects.requireNonNull(getActivity()).setResult(Activity.RESULT_OK, data); - getActivity().finish(); - } else { - if (data != null && data.getExtras().containsKey("UID") && data.getExtras().containsKey("Card")) { - TangemCard updatedCard = new TangemCard(data.getStringExtra("UID")); - updatedCard.LoadFromBundle(data.getBundleExtra("Card")); - mCard = updatedCard; - } - if (resultCode == CreateNewWalletActivity.RESULT_INVALID_PIN && requestPIN2Count < 2) { - requestPIN2Count++; - Intent intent = new Intent(getContext(), RequestPINActivity.class); - intent.putExtra("mode", RequestPINActivity.Mode.RequestPIN2.toString()); - intent.putExtra("UID", mCard.getUID()); - intent.putExtra("Card", mCard.getAsBundle()); - startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_PURGE); - return; - } else { - if (data != null && data.getExtras().containsKey("message")) { - mCard.setError(data.getStringExtra("message")); - } - } - updateViews(); - } - break; - case REQUEST_CODE_SEND_PAYMENT: - if (resultCode == Activity.RESULT_OK) { -// mSwipeRefreshLayout.postDelayed(this::onRefresh, 10000); - mSwipeRefreshLayout.setRefreshing(true); - mCard.clearInfo(); - updateViews(); - } - - if (data != null) { - if (data.getExtras().containsKey("UID") && data.getExtras().containsKey("Card")) { - TangemCard updatedCard = new TangemCard(data.getStringExtra("UID")); - updatedCard.LoadFromBundle(data.getBundleExtra("Card")); - mCard = updatedCard; - } - if (data.getExtras().containsKey("message")) { - if (resultCode == Activity.RESULT_OK) { - mCard.setMessage(data.getStringExtra("message")); - } else { - mCard.setError(data.getStringExtra("message")); - } - } - updateViews(); - } - - break; - } - } - - @Override - public void onTagDiscovered(Tag tag) { - try { -// Log.w(getClass().getName(), "Ignore discovered tag!"); - mNfcManager.ignoreTag(tag); - } catch (IOException e) { - e.printStackTrace(); - } - } - - private void updateViews() { - try { - if (timerHideErrorAndMessage != null) { - timerHideErrorAndMessage.cancel(); - timerHideErrorAndMessage = null; - } - tvCardID.setText(mCard.getCIDDescription()); - - if (mCard.getError() == null || mCard.getError().isEmpty()) { - tvError.setVisibility(View.GONE); - tvError.setText(""); - } else { - tvError.setVisibility(View.VISIBLE); - tvError.setText(mCard.getError()); - } - if (mCard.getMessage() == null || mCard.getMessage().isEmpty()) { - tvMessage.setVisibility(View.GONE); - tvMessage.setText(""); - } else { - tvMessage.setVisibility(View.VISIBLE); - tvMessage.setText(mCard.getMessage()); - } - - tvManufacturer.setText(mCard.getManufacturer().getOfficialName()); - - if (mCard.isManufacturerConfirmed() && mCard.isCardPublicKeyValid()) { - tvCardIdentity.setText(R.string.attested); - tvCardIdentity.setTextColor(ContextCompat.getColor(Objects.requireNonNull(getContext()), R.color.confirmed)); - - } else { - tvCardIdentity.setText(R.string.not_confirmed); - tvCardIdentity.setTextColor(ContextCompat.getColor(Objects.requireNonNull(getContext()), R.color.not_confirmed)); - } - - tvIssuer.setText(mCard.getIssuerDescription()); - tvIssuerData.setText(mCard.getIssuerDataDescription()); - - tvRegistrationDate.setText(mCard.getPersonalizationDateTimeDescription()); - - tvBlockchain.setText(mCard.getBlockchainName()); - - ivBlockchain.setImageResource(mCard.getBlockchain().getLogoImageResource(mCard.getBlockchainID(), mCard.getTokenSymbol())); - - if (mCard.isReusable()) - tvReusable.setText(R.string.reusable); - else - tvReusable.setText(R.string.one_off_banknote); - - tvSigningMethod.setText(mCard.getSigningMethod().getDescription()); - - if (mCard.getStatus() == TangemCard.Status.Loaded || mCard.getStatus() == TangemCard.Status.Purged) { - - tvLastSigned.setText(mCard.getLastSignedDescription()); - if (mCard.getRemainingSignatures() == 0) { - tvRemainingSignatures.setTextColor(ContextCompat.getColor(Objects.requireNonNull(getContext()), R.color.not_confirmed)); - tvRemainingSignatures.setText(R.string.none); - } else if (mCard.getRemainingSignatures() == 1) { - tvRemainingSignatures.setTextColor(ContextCompat.getColor(Objects.requireNonNull(getContext()), R.color.not_confirmed)); - tvRemainingSignatures.setText(R.string.last_one); - } else if (mCard.getRemainingSignatures() > 1000) { - tvRemainingSignatures.setTextColor(ContextCompat.getColor(Objects.requireNonNull(getContext()), R.color.confirmed)); - tvRemainingSignatures.setText(R.string.unlimited); - } else { - tvRemainingSignatures.setTextColor(ContextCompat.getColor(Objects.requireNonNull(getContext()), R.color.confirmed)); - tvRemainingSignatures.setText(String.valueOf(mCard.getRemainingSignatures())); - } - tvSignedTx.setText(String.valueOf(mCard.getMaxSignatures() - mCard.getRemainingSignatures())); - } else { - tvLastSigned.setText(""); - tvRemainingSignatures.setText(""); - tvSignedTx.setText(""); - } - - tvFirmware.setText(mCard.getFirmwareVersion()); - - String features = ""; - - if (mCard.allowSwapPIN() && mCard.allowSwapPIN2()) { - features += "Allows change PIN1 and PIN2\n"; - } else if (mCard.allowSwapPIN()) { - features += "Allows change PIN1\n"; - } else if (mCard.allowSwapPIN2()) { - features += "Allows change PIN2\n"; - } else { - features += "Fixed PIN1 and PIN2\n"; - } - - if (mCard.needCVC()) { - features += "Requires CVC\n"; - } - - if (mCard.supportDynamicNDEF()) { - features += "Dynamic NDEF for iOS\n"; - } else if (mCard.supportNDEF()) { - features += "NDEF\n"; - } - - if (mCard.supportBlock()) { - features += "Blockable\n"; - } - - if (mCard.supportOnlyOneCommandAtTime()) { - features += "Atomic command mode"; - } - - if (features.endsWith("\n")) { - features = features.substring(0, features.length() - 1); - } - tvFeatures.setText(features); - - if (mCard.useDefaultPIN1()) { - ivPIN.setImageResource(R.drawable.unlock_pin1); - ivPIN.setOnClickListener(v -> Toast.makeText(getContext(), R.string.this_banknote_protected_default_PIN1_code, Toast.LENGTH_LONG).show()); - } else { - ivPIN.setImageResource(R.drawable.lock_pin1); - ivPIN.setOnClickListener(v -> Toast.makeText(getContext(), R.string.this_banknote_protected_user_PIN1_code, Toast.LENGTH_LONG).show()); - } - - - if (mCard.getPauseBeforePIN2() > 0 && (mCard.useDefaultPIN2() || !mCard.useSmartSecurityDelay())) { - ivPIN2orSecurityDelay.setImageResource(R.drawable.timer); - ivPIN2orSecurityDelay.setOnClickListener(v -> Toast.makeText(getContext(), String.format(getString(R.string.this_banknote_will_enforce), mCard.getPauseBeforePIN2() / 1000.0), Toast.LENGTH_LONG).show()); - } else if (mCard.useDefaultPIN2()) { - ivPIN2orSecurityDelay.setImageResource(R.drawable.unlock_pin2); - ivPIN2orSecurityDelay.setOnClickListener(v -> Toast.makeText(getContext(), R.string.this_banknote_protected_default_PIN2_code, Toast.LENGTH_LONG).show()); - } else { - ivPIN2orSecurityDelay.setImageResource(R.drawable.lock_pin2); - ivPIN2orSecurityDelay.setOnClickListener(v -> Toast.makeText(getContext(), R.string.this_banknote_protected_user_PIN2_code, Toast.LENGTH_LONG).show()); - } - - if (mCard.useDevelopersFirmware()) { - ivDeveloperVersion.setImageResource(R.drawable.ic_developer_version); - ivDeveloperVersion.setVisibility(View.VISIBLE); - ivDeveloperVersion.setOnClickListener(v -> Toast.makeText(getContext(), R.string.unlocked_banknote_only_development_use, Toast.LENGTH_LONG).show()); - } else { - ivDeveloperVersion.setVisibility(View.INVISIBLE); - } - - if (mCard.getStatus() == TangemCard.Status.Loaded) { - tvWallet.setText(mCard.getShortWalletString()); - if (mCard.isWalletPublicKeyValid()) { - tvWalletIdentity.setText(R.string.possession_proved); - tvWalletIdentity.setTextColor(ContextCompat.getColor(Objects.requireNonNull(getContext()), R.color.confirmed)); - } else { - tvWalletIdentity.setText(R.string.possession_not_proved); - tvWalletIdentity.setTextColor(ContextCompat.getColor(Objects.requireNonNull(getContext()), R.color.not_confirmed)); - } - } else { - tvWallet.setText(R.string.not_available); - tvWalletIdentity.setText(R.string.no_data_string); - } - - timerHideErrorAndMessage = new Timer(); - timerHideErrorAndMessage.schedule(new TimerTask() { - @Override - public void run() { - tvError.post(() -> { - tvMessage.setVisibility(View.GONE); - tvError.setVisibility(View.GONE); - mCard.setError(null); - mCard.setMessage(null); - }); - } - }, 5000); - - - } catch (Exception e) { - e.printStackTrace(); - } - } - - private void doSetPin() { - requestPIN2Count = 0; - Intent intent = new Intent(getContext(), RequestPINActivity.class); - intent.putExtra("mode", RequestPINActivity.Mode.RequestNewPIN.toString()); - newPIN = ""; - newPIN2 = ""; - startActivityForResult(intent, REQUEST_CODE_ENTER_NEW_PIN); - } - - private void doResetPin() { - requestPIN2Count = 0; - Intent intent = new Intent(getContext(), RequestPINActivity.class); - intent.putExtra("mode", RequestPINActivity.Mode.RequestPIN2.toString()); - intent.putExtra("UID", mCard.getUID()); - intent.putExtra("Card", mCard.getAsBundle()); - newPIN = PINStorage.getDefaultPIN(); - newPIN2 = ""; - startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN); - } - - private void doResetPin2() { - requestPIN2Count = 0; - Intent intent = new Intent(getContext(), RequestPINActivity.class); - intent.putExtra("mode", RequestPINActivity.Mode.RequestPIN2.toString()); - intent.putExtra("UID", mCard.getUID()); - intent.putExtra("Card", mCard.getAsBundle()); - newPIN = ""; - newPIN2 = PINStorage.getDefaultPIN2(); - startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN); - } - - private void doResetPins() { - requestPIN2Count = 0; - Intent intent = new Intent(getContext(), RequestPINActivity.class); - intent.putExtra("mode", RequestPINActivity.Mode.RequestPIN2.toString()); - intent.putExtra("UID", mCard.getUID()); - intent.putExtra("Card", mCard.getAsBundle()); - newPIN = PINStorage.getDefaultPIN(); - newPIN2 = PINStorage.getDefaultPIN2(); - startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN); - } - - private void doSetPin2() { - requestPIN2Count = 0; - Intent intent = new Intent(getContext(), RequestPINActivity.class); - intent.putExtra("mode", RequestPINActivity.Mode.RequestNewPIN2.toString()); - newPIN = ""; - newPIN2 = ""; - startActivityForResult(intent, REQUEST_CODE_ENTER_NEW_PIN2); - } - - private void doPurge() { - requestPIN2Count = 0; - final CoinEngine engine = CoinEngineFactory.Create(mCard.getBlockchain()); - if (!mCard.hasBalanceInfo()) { - return; - } else if (engine != null && engine.IsBalanceNotZero(mCard)) { - Toast.makeText(getContext(), R.string.cannot_erase_wallet_with_non_zero_balance, Toast.LENGTH_LONG).show(); - return; - } - - Intent intent = new Intent(getContext(), RequestPINActivity.class); - intent.putExtra("mode", RequestPINActivity.Mode.RequestPIN2.toString()); - intent.putExtra("UID", mCard.getUID()); - intent.putExtra("Card", mCard.getAsBundle()); - startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_PURGE); - } - - private void startSwapPINActivity() { - Intent intent = new Intent(getContext(), SwapPINActivity.class); - intent.putExtra("UID", mCard.getUID()); - intent.putExtra("Card", mCard.getAsBundle()); - intent.putExtra("newPIN", newPIN); - intent.putExtra("newPIN2", newPIN2); - startActivityForResult(intent, REQUEST_CODE_SWAP_PIN); - } - - public Intent prepareResultIntent() { - Intent data = new Intent(); - data.putExtra("UID", mCard.getUID()); - data.putExtra("Card", mCard.getAsBundle()); - return data; - } - - private void showMenu(View v) { - final PopupMenu popup = new PopupMenu(getActivity(), v); - MenuInflater inflater = popup.getMenuInflater(); - inflater.inflate(R.menu.menu_loaded_wallet, popup.getMenu()); - - popup.getMenu().findItem(R.id.action_set_PIN1).setVisible(mCard.allowSwapPIN()); - popup.getMenu().findItem(R.id.action_reset_PIN1).setVisible(mCard.allowSwapPIN() && !mCard.useDefaultPIN1()); - popup.getMenu().findItem(R.id.action_set_PIN2).setVisible(mCard.allowSwapPIN2()); - popup.getMenu().findItem(R.id.action_reset_PIN2).setVisible(mCard.allowSwapPIN2() && !mCard.useDefaultPIN2()); - popup.getMenu().findItem(R.id.action_reset_PINs).setVisible(mCard.allowSwapPIN() && mCard.allowSwapPIN2() && !mCard.useDefaultPIN1() && !mCard.useDefaultPIN2()); - if (!mCard.isReusable() || mCard.getStatus() != TangemCard.Status.Loaded) - popup.getMenu().findItem(R.id.action_purge).setVisible(false); - - popup.setOnMenuItemClickListener(item -> { - - int id = item.getItemId(); - switch (id) { - case R.id.action_set_PIN1: - doSetPin(); - return true; - - case R.id.action_reset_PIN1: - doResetPin(); - return true; - - case R.id.action_set_PIN2: - doSetPin2(); - return true; - - case R.id.action_reset_PIN2: - doResetPin2(); - return true; - - case R.id.action_reset_PINs: - doResetPins(); - return true; - - case R.id.action_purge: - doPurge(); - return true; - - default: - return false; - } - }); - - if (BuildConfig.DEBUG) { - popup.getMenu().findItem(R.id.action_set_PIN2).setEnabled(true); - popup.getMenu().findItem(R.id.action_reset_PIN2).setEnabled(true); - } - - popup.show(); - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/presentation/fragment/VerifyCard.kt b/app/src/main/java/com/tangem/presentation/fragment/VerifyCard.kt new file mode 100644 index 0000000000..9d2111af72 --- /dev/null +++ b/app/src/main/java/com/tangem/presentation/fragment/VerifyCard.kt @@ -0,0 +1,547 @@ +package com.tangem.presentation.fragment + +import android.app.Activity +import android.content.Intent +import android.nfc.NfcAdapter +import android.nfc.Tag +import android.os.Bundle +import android.support.v4.app.Fragment +import android.support.v4.content.ContextCompat +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import android.widget.PopupMenu +import android.widget.Toast +import com.tangem.domain.cardReader.NfcManager +import com.tangem.domain.wallet.CoinEngineFactory +import com.tangem.domain.wallet.PINStorage +import com.tangem.domain.wallet.TangemCard +import com.tangem.presentation.activity.CreateNewWalletActivity +import com.tangem.presentation.activity.PurgeActivity +import com.tangem.presentation.activity.RequestPINActivity +import com.tangem.presentation.activity.SwapPINActivity +import com.tangem.presentation.dialog.PINSwapWarningDialog +import com.tangem.wallet.BuildConfig +import com.tangem.wallet.R +import kotlinx.android.synthetic.main.fr_verify_card.* +import java.io.IOException +import java.util.* + +class VerifyCard : Fragment(), NfcAdapter.ReaderCallback { + + companion object { + val TAG: String = VerifyCard::class.java.simpleName + + private const val REQUEST_CODE_SEND_PAYMENT = 1 + private const val REQUEST_CODE_PURGE = 2 + private const val REQUEST_CODE_REQUEST_PIN2_FOR_PURGE = 3 + private const val REQUEST_CODE_VERIFY_CARD = 4 + private const val REQUEST_CODE_ENTER_NEW_PIN = 5 + private const val REQUEST_CODE_ENTER_NEW_PIN2 = 6 + private const val REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN = 7 + private const val REQUEST_CODE_SWAP_PIN = 8 + } + + private var mNfcManager: NfcManager? = null + private var mCard: TangemCard? = null + + private var requestPIN2Count = 0 + private var timerHideErrorAndMessage: Timer? = null + private var newPIN = "" + private var newPIN2 = "" + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + mNfcManager = NfcManager(activity, this) + + mCard = TangemCard(activity!!.intent.getStringExtra("UID")) + mCard!!.LoadFromBundle(activity!!.intent.extras!!.getBundle("Card")) + } + + override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? { + return inflater.inflate(R.layout.fr_verify_card, container, false) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + updateViews() + + swipe_container.setOnRefreshListener { swipe_container.isRefreshing = false } + + fabMenu.setOnClickListener { showMenu(fabMenu) } + + btnOk.setOnClickListener { + val data = prepareResultIntent() + data.putExtra("modification", "update") + if (activity != null) + activity!!.finish() + } + } + + override fun onResume() { + super.onResume() + mNfcManager!!.onResume() + } + + override fun onPause() { + super.onPause() + mNfcManager!!.onPause() + } + + override fun onStop() { + super.onStop() + mNfcManager!!.onStop() + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + var data = data + super.onActivityResult(requestCode, resultCode, data) + when (requestCode) { + REQUEST_CODE_ENTER_NEW_PIN -> if (resultCode == Activity.RESULT_OK) { + if (data != null) { + if (data.extras!!.containsKey("confirmPIN")) { + val intent = Intent(context, RequestPINActivity::class.java) + intent.putExtra("mode", RequestPINActivity.Mode.RequestPIN2.toString()) + intent.putExtra("UID", mCard!!.uid) + intent.putExtra("Card", mCard!!.asBundle) + newPIN = data.getStringExtra("newPIN") + startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) + } else { + val intent = Intent(context, RequestPINActivity::class.java) + intent.putExtra("newPIN", data.getStringExtra("newPIN")) + intent.putExtra("mode", RequestPINActivity.Mode.ConfirmNewPIN.toString()) + startActivityForResult(intent, REQUEST_CODE_ENTER_NEW_PIN) + } + } + } + REQUEST_CODE_ENTER_NEW_PIN2 -> if (resultCode == Activity.RESULT_OK) { + if (data != null) { + if (data.extras!!.containsKey("confirmPIN2")) { + val intent = Intent(context, RequestPINActivity::class.java) + intent.putExtra("mode", RequestPINActivity.Mode.RequestPIN2.toString()) + intent.putExtra("UID", mCard!!.uid) + intent.putExtra("Card", mCard!!.asBundle) + newPIN2 = data.getStringExtra("newPIN2") + startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) + } else { + val intent = Intent(context, RequestPINActivity::class.java) + intent.putExtra("newPIN2", data.getStringExtra("newPIN2")) + intent.putExtra("mode", RequestPINActivity.Mode.ConfirmNewPIN2.toString()) + startActivityForResult(intent, REQUEST_CODE_ENTER_NEW_PIN2) + } + } + } + REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN -> if (resultCode == Activity.RESULT_OK) { + if (newPIN == "") newPIN = mCard!!.pin + + if (newPIN2 == "") newPIN2 = PINStorage.getPIN2() + + val pinSwapWarningDialog = PINSwapWarningDialog() + pinSwapWarningDialog.setOnRefreshPage { startSwapPINActivity() } + val bundle = Bundle() + if (!PINStorage.isDefaultPIN(newPIN) || !PINStorage.isDefaultPIN2(newPIN2)) + bundle.putString(PINSwapWarningDialog.EXTRA_MESSAGE, getString(R.string.if_you_forget)) + else + bundle.putString(PINSwapWarningDialog.EXTRA_MESSAGE, getString(R.string.if_you_use_default)) + pinSwapWarningDialog.arguments = bundle + pinSwapWarningDialog.show(activity!!.fragmentManager, PINSwapWarningDialog.TAG) + } + + REQUEST_CODE_SWAP_PIN -> if (resultCode == Activity.RESULT_OK) { + if (data == null) { + data = Intent() + + data.putExtra("UID", mCard!!.uid) + data.putExtra("Card", mCard!!.asBundle) + data.putExtra("modification", "delete") + } else { + data.putExtra("modification", "update") + } + activity!!.setResult(Activity.RESULT_OK, data) + activity!!.finish() + } else { + if (data != null && data.extras!!.containsKey("UID") && data.extras!!.containsKey("Card")) { + val updatedCard = TangemCard(data.getStringExtra("UID")) + updatedCard.LoadFromBundle(data.getBundleExtra("Card")) + mCard = updatedCard + } + if (resultCode == CreateNewWalletActivity.RESULT_INVALID_PIN && requestPIN2Count < 2) { + requestPIN2Count++ + val intent = Intent(context, RequestPINActivity::class.java) + intent.putExtra("mode", RequestPINActivity.Mode.RequestPIN2.toString()) + intent.putExtra("UID", mCard!!.uid) + intent.putExtra("Card", mCard!!.asBundle) + startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) + return + } else { + if (data != null && data.extras!!.containsKey("message")) { + mCard!!.error = data.getStringExtra("message") + } + } + } + REQUEST_CODE_REQUEST_PIN2_FOR_PURGE -> if (resultCode == Activity.RESULT_OK) { + val intent = Intent(context, PurgeActivity::class.java) + intent.putExtra("UID", mCard!!.uid) + intent.putExtra("Card", mCard!!.asBundle) + startActivityForResult(intent, REQUEST_CODE_PURGE) + } + REQUEST_CODE_PURGE -> if (resultCode == Activity.RESULT_OK) { + if (data == null) { + data = Intent() + + data.putExtra("UID", mCard!!.uid) + data.putExtra("Card", mCard!!.asBundle) + data.putExtra("modification", "delete") + } else { + data.putExtra("modification", "update") + } + activity!!.setResult(Activity.RESULT_OK, data) + activity!!.finish() + } else { + if (data != null && data.extras!!.containsKey("UID") && data.extras!!.containsKey("Card")) { + val updatedCard = TangemCard(data.getStringExtra("UID")) + updatedCard.LoadFromBundle(data.getBundleExtra("Card")) + mCard = updatedCard + } + if (resultCode == CreateNewWalletActivity.RESULT_INVALID_PIN && requestPIN2Count < 2) { + requestPIN2Count++ + val intent = Intent(context, RequestPINActivity::class.java) + intent.putExtra("mode", RequestPINActivity.Mode.RequestPIN2.toString()) + intent.putExtra("UID", mCard!!.uid) + intent.putExtra("Card", mCard!!.asBundle) + startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_PURGE) + return + } else { + if (data != null && data.extras!!.containsKey("message")) { + mCard!!.error = data.getStringExtra("message") + } + } + updateViews() + } + REQUEST_CODE_SEND_PAYMENT -> { + if (resultCode == Activity.RESULT_OK) { + swipe_container.isRefreshing = true + mCard!!.clearInfo() + updateViews() + } + + if (data != null) { + if (data.extras!!.containsKey("UID") && data.extras!!.containsKey("Card")) { + val updatedCard = TangemCard(data.getStringExtra("UID")) + updatedCard.LoadFromBundle(data.getBundleExtra("Card")) + mCard = updatedCard + } + if (data.extras!!.containsKey("message")) { + if (resultCode == Activity.RESULT_OK) { + mCard!!.message = data.getStringExtra("message") + } else { + mCard!!.error = data.getStringExtra("message") + } + } + updateViews() + } + } + } + } + + override fun onTagDiscovered(tag: Tag) { + try { +// Log.w(getClass().getName(), "Ignore discovered tag!"); + mNfcManager!!.ignoreTag(tag) + } catch (e: IOException) { + e.printStackTrace() + } + + } + + private fun updateViews() { + try { + if (timerHideErrorAndMessage != null) { + timerHideErrorAndMessage!!.cancel() + timerHideErrorAndMessage = null + } + tvCardID.text = mCard!!.cidDescription + + if (mCard!!.error == null || mCard!!.error.isEmpty()) { + tvError.visibility = View.GONE + tvError.text = "" + } else { + tvError.visibility = View.VISIBLE + tvError.text = mCard!!.error + } + if (mCard!!.message == null || mCard!!.message.isEmpty()) { + tvMessage.visibility = View.GONE + tvMessage.text = "" + } else { + tvMessage.visibility = View.VISIBLE + tvMessage.text = mCard!!.message + } + + tvManufacturerInfo.text = mCard!!.manufacturer.officialName + + if (mCard!!.isManufacturerConfirmed && mCard!!.isCardPublicKeyValid) { + tvCardIdentity.setText(R.string.attested) + tvCardIdentity.setTextColor(ContextCompat.getColor(context!!, R.color.confirmed)) + + } else { + tvCardIdentity.setText(R.string.not_confirmed) + tvCardIdentity.setTextColor(ContextCompat.getColor(context!!, R.color.not_confirmed)) + } + + tvIssuer.text = mCard!!.issuerDescription + tvIssuerData.text = mCard!!.issuerDataDescription + + tvCardRegistredDate.text = mCard!!.personalizationDateTimeDescription + + tvBlockchain.text = mCard!!.blockchainName + + ivBlockchain.setImageResource(mCard!!.blockchain.getLogoImageResource(mCard!!.blockchainID, mCard!!.tokenSymbol)) + + if (mCard!!.isReusable!!) + tvReusable.setText(R.string.reusable) + else + tvReusable.setText(R.string.one_off_banknote) + + tvSigningMethod.text = mCard!!.signingMethod.description + + if (mCard!!.status == TangemCard.Status.Loaded || mCard!!.status == TangemCard.Status.Purged) { + + tvLastSigned.text = mCard!!.lastSignedDescription + when { + mCard!!.remainingSignatures == 0 -> { + tvRemainingSignatures.setTextColor(ContextCompat.getColor(context!!, R.color.not_confirmed)) + tvRemainingSignatures.setText(R.string.none) + } + mCard!!.remainingSignatures == 1 -> { + tvRemainingSignatures.setTextColor(ContextCompat.getColor(context!!, R.color.not_confirmed)) + tvRemainingSignatures.setText(R.string.last_one) + } + mCard!!.remainingSignatures > 1000 -> { + tvRemainingSignatures.setTextColor(ContextCompat.getColor(context!!, R.color.confirmed)) + tvRemainingSignatures.setText(R.string.unlimited) + } + else -> { + tvRemainingSignatures.setTextColor(ContextCompat.getColor(context!!, R.color.confirmed)) + tvRemainingSignatures.text = mCard!!.remainingSignatures.toString() + } + } + tvSignedTx.text = (mCard!!.maxSignatures - mCard!!.remainingSignatures).toString() + } else { + tvLastSigned.text = "" + tvRemainingSignatures.text = "" + tvSignedTx.text = "" + } + + tvFirmware.text = mCard!!.firmwareVersion + + var features = "" + + features += if (mCard!!.allowSwapPIN()!! && mCard!!.allowSwapPIN2()!!) { + "Allows change PIN1 and PIN2\n" + } else if (mCard!!.allowSwapPIN()!!) { + "Allows change PIN1\n" + } else if (mCard!!.allowSwapPIN2()!!) { + "Allows change PIN2\n" + } else { + "Fixed PIN1 and PIN2\n" + } + + if (mCard!!.needCVC()!!) + features += "Requires CVC\n" + + + if (mCard!!.supportDynamicNDEF()!!) { + features += "Dynamic NDEF for iOS\n" + } else if (mCard!!.supportNDEF()!!) + features += "NDEF\n" + + if (mCard!!.supportBlock()!!) + features += "Blockable\n" + + + if (mCard!!.supportOnlyOneCommandAtTime()!!) + features += "Atomic command mode" + + if (features.endsWith("\n")) + features = features.substring(0, features.length - 1) + + tvFeatures.text = features + + if (mCard!!.useDefaultPIN1()!!) { + imgPIN.setImageResource(R.drawable.unlock_pin1) + imgPIN.setOnClickListener { Toast.makeText(context, R.string.this_banknote_protected_default_PIN1_code, Toast.LENGTH_LONG).show() } + } else { + imgPIN.setImageResource(R.drawable.lock_pin1) + imgPIN.setOnClickListener { Toast.makeText(context, R.string.this_banknote_protected_user_PIN1_code, Toast.LENGTH_LONG).show() } + } + + if (mCard!!.pauseBeforePIN2 > 0 && (mCard!!.useDefaultPIN2()!! || !mCard!!.useSmartSecurityDelay())) { + imgPIN2orSecurityDelay.setImageResource(R.drawable.timer) + imgPIN2orSecurityDelay.setOnClickListener { Toast.makeText(context, String.format(getString(R.string.this_banknote_will_enforce), mCard!!.pauseBeforePIN2 / 1000.0), Toast.LENGTH_LONG).show() } + } else if (mCard!!.useDefaultPIN2()!!) { + imgPIN2orSecurityDelay.setImageResource(R.drawable.unlock_pin2) + imgPIN2orSecurityDelay.setOnClickListener { Toast.makeText(context, R.string.this_banknote_protected_default_PIN2_code, Toast.LENGTH_LONG).show() } + } else { + imgPIN2orSecurityDelay.setImageResource(R.drawable.lock_pin2) + imgPIN2orSecurityDelay.setOnClickListener { Toast.makeText(context, R.string.this_banknote_protected_user_PIN2_code, Toast.LENGTH_LONG).show() } + } + + if (mCard!!.useDevelopersFirmware()!!) { + imgDeveloperVersion.setImageResource(R.drawable.ic_developer_version) + imgDeveloperVersion.visibility = View.VISIBLE + imgDeveloperVersion.setOnClickListener { v -> Toast.makeText(context, R.string.unlocked_banknote_only_development_use, Toast.LENGTH_LONG).show() } + } else + imgDeveloperVersion.visibility = View.INVISIBLE + + if (mCard!!.status == TangemCard.Status.Loaded) { + tvWallet.text = mCard!!.shortWalletString + if (mCard!!.isWalletPublicKeyValid) { + tvWalletIdentity.setText(R.string.possession_proved) + tvWalletIdentity.setTextColor(ContextCompat.getColor(context!!, R.color.confirmed)) + } else { + tvWalletIdentity.setText(R.string.possession_not_proved) + tvWalletIdentity.setTextColor(ContextCompat.getColor(context!!, R.color.not_confirmed)) + } + } else { + tvWallet!!.setText(R.string.not_available) + tvWalletIdentity.setText(R.string.no_data_string) + } + +// timerHideErrorAndMessage = Timer() +// timerHideErrorAndMessage!!.schedule(object : TimerTask() { +// override fun run() { +// tvError.post { +// tvMessage!!.visibility = View.GONE +// tvError!!.visibility = View.GONE +// mCard!!.error = null +// mCard!!.message = null +// } +// } +// }, 5000) + + + } catch (e: Exception) { + e.printStackTrace() + } + } + + private fun doSetPin() { + requestPIN2Count = 0 + val intent = Intent(context, RequestPINActivity::class.java) + intent.putExtra("mode", RequestPINActivity.Mode.RequestNewPIN.toString()) + newPIN = "" + newPIN2 = "" + startActivityForResult(intent, REQUEST_CODE_ENTER_NEW_PIN) + } + + private fun doResetPin() { + requestPIN2Count = 0 + val intent = Intent(context, RequestPINActivity::class.java) + intent.putExtra("mode", RequestPINActivity.Mode.RequestPIN2.toString()) + intent.putExtra("UID", mCard!!.uid) + intent.putExtra("Card", mCard!!.asBundle) + newPIN = PINStorage.getDefaultPIN() + newPIN2 = "" + startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) + } + + private fun doResetPin2() { + requestPIN2Count = 0 + val intent = Intent(context, RequestPINActivity::class.java) + intent.putExtra("mode", RequestPINActivity.Mode.RequestPIN2.toString()) + intent.putExtra("UID", mCard!!.uid) + intent.putExtra("Card", mCard!!.asBundle) + newPIN = "" + newPIN2 = PINStorage.getDefaultPIN2() + startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) + } + + private fun doResetPins() { + requestPIN2Count = 0 + val intent = Intent(context, RequestPINActivity::class.java) + intent.putExtra("mode", RequestPINActivity.Mode.RequestPIN2.toString()) + intent.putExtra("UID", mCard!!.uid) + intent.putExtra("Card", mCard!!.asBundle) + newPIN = PINStorage.getDefaultPIN() + newPIN2 = PINStorage.getDefaultPIN2() + startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_SWAP_PIN) + } + + private fun doSetPin2() { + requestPIN2Count = 0 + val intent = Intent(context, RequestPINActivity::class.java) + intent.putExtra("mode", RequestPINActivity.Mode.RequestNewPIN2.toString()) + newPIN = "" + newPIN2 = "" + startActivityForResult(intent, REQUEST_CODE_ENTER_NEW_PIN2) + } + + private fun doPurge() { + requestPIN2Count = 0 + val engine = CoinEngineFactory.Create(mCard!!.blockchain) + if (!mCard!!.hasBalanceInfo()) { + return + } else if (engine != null && engine.IsBalanceNotZero(mCard)) { + Toast.makeText(context, R.string.cannot_erase_wallet_with_non_zero_balance, Toast.LENGTH_LONG).show() + return + } + + val intent = Intent(context, RequestPINActivity::class.java) + intent.putExtra("mode", RequestPINActivity.Mode.RequestPIN2.toString()) + intent.putExtra("UID", mCard!!.uid) + intent.putExtra("Card", mCard!!.asBundle) + startActivityForResult(intent, REQUEST_CODE_REQUEST_PIN2_FOR_PURGE) + } + + private fun startSwapPINActivity() { + val intent = Intent(context, SwapPINActivity::class.java) + intent.putExtra("UID", mCard!!.uid) + intent.putExtra("Card", mCard!!.asBundle) + intent.putExtra("newPIN", newPIN) + intent.putExtra("newPIN2", newPIN2) + startActivityForResult(intent, REQUEST_CODE_SWAP_PIN) + } + + fun prepareResultIntent(): Intent { + val data = Intent() + data.putExtra("UID", mCard!!.uid) + data.putExtra("Card", mCard!!.asBundle) + return data + } + + private fun showMenu(v: View) { + val popup = PopupMenu(activity, v) + val inflater = popup.menuInflater + inflater.inflate(R.menu.menu_loaded_wallet, popup.menu) + + popup.menu.findItem(R.id.action_set_PIN1).isVisible = mCard!!.allowSwapPIN()!! + popup.menu.findItem(R.id.action_reset_PIN1).isVisible = mCard!!.allowSwapPIN()!! && !mCard!!.useDefaultPIN1() + popup.menu.findItem(R.id.action_set_PIN2).isVisible = mCard!!.allowSwapPIN2()!! + popup.menu.findItem(R.id.action_reset_PIN2).isVisible = mCard!!.allowSwapPIN2()!! && !mCard!!.useDefaultPIN2() + popup.menu.findItem(R.id.action_reset_PINs).isVisible = mCard!!.allowSwapPIN()!! && mCard!!.allowSwapPIN2()!! && !mCard!!.useDefaultPIN1() && !mCard!!.useDefaultPIN2() + if (!mCard!!.isReusable || mCard!!.status != TangemCard.Status.Loaded) + popup.menu.findItem(R.id.action_purge).isVisible = false + + popup.setOnMenuItemClickListener { item -> + val id = item.itemId + when (id) { + R.id.action_set_PIN1 -> doSetPin() + R.id.action_reset_PIN1 -> doResetPin() + R.id.action_set_PIN2 -> doSetPin2() + R.id.action_reset_PIN2 -> doResetPin2() + R.id.action_reset_PINs -> doResetPins() + R.id.action_purge -> doPurge() + } + false + } + + if (BuildConfig.DEBUG) { + popup.menu.findItem(R.id.action_set_PIN2).isEnabled = true + popup.menu.findItem(R.id.action_reset_PIN2).isEnabled = true + } + + popup.show() + } + +} \ No newline at end of file diff --git a/app/src/main/res/layout/fr_verify_card.xml b/app/src/main/res/layout/fr_verify_card.xml index 91cd15999c..b4e56c7212 100644 --- a/app/src/main/res/layout/fr_verify_card.xml +++ b/app/src/main/res/layout/fr_verify_card.xml @@ -24,531 +24,538 @@ app:layout_constraintTop_toTopOf="parent" app:layout_constraintVertical_bias="0.0"> - + android:layout_height="wrap_content"> - + android:layout_height="match_parent"> - + android:layout_height="wrap_content" + android:layout_alignParentStart="true" + android:layout_alignParentTop="true" + android:background="@color/white" + android:orientation="vertical" + android:padding="8dp"> - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + android:textColor="@color/white" + android:textStyle="bold"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + +