From 2ef5cbbdb0322f808041169d1755132c92ed8a24 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 18 Apr 2019 14:29:48 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .idea/navEditor.xml | 31 ++ app/build.gradle | 6 +- .../com/tangem/ui/activity/MainActivity.kt | 345 ++--------------- .../com/tangem/ui/fragment/MainFragment.kt | 357 ++++++++++++++++++ .../com/tangem/ui/fragment/MainViewModel.kt | 7 + .../java/com/tangem/wallet/TangemContext.java | 17 +- app/src/main/res/layout/activity_main.xml | 75 +--- app/src/main/res/layout/main_fragment.xml | 58 +++ app/src/main/res/navigation/main_graph.xml | 16 + card-android/build.gradle | 2 +- server-android/build.gradle | 2 +- 11 files changed, 532 insertions(+), 384 deletions(-) create mode 100644 .idea/navEditor.xml create mode 100644 app/src/main/java/com/tangem/ui/fragment/MainFragment.kt create mode 100644 app/src/main/java/com/tangem/ui/fragment/MainViewModel.kt create mode 100644 app/src/main/res/layout/main_fragment.xml create mode 100644 app/src/main/res/navigation/main_graph.xml diff --git a/.idea/navEditor.xml b/.idea/navEditor.xml new file mode 100644 index 0000000000..6b2f2e8d08 --- /dev/null +++ b/.idea/navEditor.xml @@ -0,0 +1,31 @@ + + + + + + \ No newline at end of file diff --git a/app/build.gradle b/app/build.gradle index d70d548ee7..0ce6715df5 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -67,6 +67,8 @@ dependencies { // implementation 'com.github.TangemCash:card-common:0.1.2' // implementation 'com.github.TangemCash:card-android:0.1.3' // implementation 'com.github.TangemCash:server-android:0.1.4' + implementation 'android.arch.navigation:navigation-fragment:1.0.0' + implementation 'android.arch.navigation:navigation-ui-ktx:1.0.0' implementation 'androidx.appcompat:appcompat:1.1.0-alpha04' implementation "androidx.preference:preference:1.1.0-alpha04" implementation 'androidx.constraintlayout:constraintlayout:1.1.3' @@ -75,6 +77,8 @@ dependencies { implementation 'co.nstant.in:cbor:0.8' implementation 'com.google.android.material:material:1.1.0-alpha05' implementation 'com.google.dagger:dagger:2.21' + implementation 'androidx.legacy:legacy-support-v4:1.0.0' + implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.0.0' kapt 'com.google.dagger:dagger-compiler:2.21' annotationProcessor 'com.google.dagger:dagger-compiler:2.21' implementation 'com.google.zxing:core:3.3.3' @@ -108,4 +112,4 @@ dependencies { //noinspection DuplicatePlatformClasses implementation 'org.json:json:20180813' implementation 'com.fasterxml.jackson.core:jackson-databind:2.9.8' -} \ No newline at end of file +} diff --git a/app/src/main/java/com/tangem/ui/activity/MainActivity.kt b/app/src/main/java/com/tangem/ui/activity/MainActivity.kt index 184cc0d391..075ff25409 100644 --- a/app/src/main/java/com/tangem/ui/activity/MainActivity.kt +++ b/app/src/main/java/com/tangem/ui/activity/MainActivity.kt @@ -3,151 +3,79 @@ package com.tangem.ui.activity import android.Manifest -import android.app.Activity import android.content.Context import android.content.Intent import android.content.pm.ActivityInfo import android.content.pm.PackageManager import android.nfc.NfcAdapter import android.nfc.Tag -import android.nfc.tech.IsoDep import android.os.Bundle -import android.view.Menu -import android.view.MenuItem -import android.view.View -import android.widget.Toast import androidx.appcompat.app.AppCompatActivity -import androidx.appcompat.widget.PopupMenu import androidx.core.app.ActivityCompat import androidx.core.content.ContextCompat +import androidx.navigation.NavController +import androidx.navigation.Navigation import com.scottyab.rootbeer.RootBeer 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.loadFromBundle -import com.tangem.card_android.data.saveToBundle -import com.tangem.card_common.data.TangemCard -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.di.Navigator import com.tangem.di.ToastHelper -import com.tangem.wallet.CoinEngineFactory -import com.tangem.wallet.TangemContext -import com.tangem.ui.dialog.NoExtendedLengthSupportDialog import com.tangem.ui.dialog.RootFoundDialog -import com.tangem.ui.dialog.WaitSecurityDelayDialog -import com.tangem.util.CommonUtil -import com.tangem.util.LOG -import com.tangem.util.UtilHelper import com.tangem.wallet.BuildConfig import com.tangem.wallet.R -import kotlinx.android.synthetic.main.activity_main.* -import kotlinx.android.synthetic.main.layout_touch_card.* -import java.io.File -import java.util.* import javax.inject.Inject -class MainActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtocol.Notifications, PopupMenu.OnMenuItemClickListener { +class MainActivity : AppCompatActivity() { 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 - private lateinit var nfcManager: NfcManager +// private var onNfcReaderCallback: NfcAdapter.ReaderCallback? = null - private var zipFile: File? = null - private lateinit var nfcDeviceAntenna: NfcDeviceAntennaLocation - private var unsuccessReadCount = 0 - private var lastTag: Tag? = null - private var task: CustomReadCardTask? = null - private var onNfcReaderCallback: NfcAdapter.ReaderCallback? = null - - override fun onNewIntent(intent: Intent?) { - super.onNewIntent(intent) - if (intent != null && (NfcAdapter.ACTION_TECH_DISCOVERED == intent.action || NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action)) { - val tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG) - if (tag != null && onNfcReaderCallback != null) - onNfcReaderCallback!!.onTagDiscovered(tag) - } - } +// override fun onNewIntent(intent: Intent?) { +// super.onNewIntent(intent) +// if (intent != null && (NfcAdapter.ACTION_TECH_DISCOVERED == intent.action || NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action)) { +// val tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG) +// if (tag != null && onNfcReaderCallback != null) +// onNfcReaderCallback?.onTagDiscovered(tag) +// } +// } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) + navController = Navigation.findNavController(this, R.id.nav_host_fragment) + App.navigatorComponent.inject(this) App.toastHelperComponent.inject(this) requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_PORTRAIT - nfcManager = NfcManager(this, this) - lifecycle.addObserver(NfcLifecycleObserver(nfcManager)) - verifyPermissions() - requestedOrientation = ActivityInfo.SCREEN_ORIENTATION_NOSENSOR - - setNfcAdapterReaderCallback(this) - - rippleBackgroundNfc.startRippleAnimation() - - // init NFC Antenna - nfcDeviceAntenna = NfcDeviceAntennaLocation(this, ivHandCardHorizontal, ivHandCardVertical, llHand, llNfc) - nfcDeviceAntenna.init() - - // set phone name - if (nfcDeviceAntenna.fullName != "") - tvNFCHint.text = String.format(getString(R.string.scan_banknote), nfcDeviceAntenna.fullName) - else - tvNFCHint.text = String.format(getString(R.string.scan_banknote), getString(R.string.phone)) - - // NFC - val intent = intent - if (intent != null && (NfcAdapter.ACTION_TECH_DISCOVERED == intent.action || NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action)) { - val tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG) - if (tag != null && onNfcReaderCallback != null) { - onNfcReaderCallback?.onTagDiscovered(tag) - } - } +// // NFC +// val intent = intent +// if (intent != null && (NfcAdapter.ACTION_TECH_DISCOVERED == intent.action || NfcAdapter.ACTION_NDEF_DISCOVERED == intent.action)) { +// val tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG) +// if (tag != null && onNfcReaderCallback != null) { +// onNfcReaderCallback?.onTagDiscovered(tag) +// } +// } // check if root device val rootBeer = RootBeer(this) if (rootBeer.isRootedWithoutBusyBoxCheck && !BuildConfig.DEBUG) RootFoundDialog().show(supportFragmentManager, RootFoundDialog.TAG) - - // set listeners - fab.setOnClickListener { showMenu(it) } - - val apiHelper = ServerApiCommon() - apiHelper.setLastVersionListener { response -> - try { - if (response.isNullOrEmpty()) - return@setLastVersionListener - val responseVersionName = response.trim(' ', '\n', '\r', '\t') - val responseBuildVersion = responseVersionName.split('.').last() - val appBuildVersion = BuildConfig.VERSION_NAME.split('.').last() - if (responseBuildVersion.toInt() > appBuildVersion.toInt()) - if (BuildConfig.FLAVOR.equals(Constant.FLAVOR_TANGEM_ACCESS)) - toastHelper.showSnackbarUpdateVersion(this, cl, responseVersionName) - } catch (E: Exception) { - E.printStackTrace() - } - } - apiHelper.requestLastVersion() } private fun verifyPermissions() { @@ -157,231 +85,4 @@ class MainActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, CardProtoco } } - override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { - when (requestCode) { - Constant.REQUEST_CODE_SEND_EMAIL -> { - if (zipFile != null) { - zipFile!!.delete() - zipFile = null - } - } - Constant.REQUEST_CODE_ENTER_PIN_ACTIVITY -> { - if (resultCode == Activity.RESULT_OK && lastTag != null) - onTagDiscovered(lastTag!!) - else - ReadCardInfoTask.resetLastReadInfo() - } - } - super.onActivityResult(requestCode, resultCode, data) - } - - override fun onMenuItemClick(item: MenuItem): Boolean { - return onOptionsItemSelected(item) - } - - override fun onCreateOptionsMenu(menu: Menu): Boolean { - menuInflater.inflate(R.menu.menu_main, menu) - if (BuildConfig.DEBUG) { - for (i in 0 until menu.size()) menu.getItem(i).isVisible = true - } - return true - } - - override fun onOptionsItemSelected(item: MenuItem): Boolean { - val id = item.itemId - when (id) { - R.id.sendLogs -> { - var f: File? = null - try { - f = Logger.collectLogs(this) - if (f != null) { - LOG.e(TAG, String.format("Collect %d log bytes", f.length())) - CommonUtil.sendEmail(this, zipFile, TAG, "Logs", UtilHelper.getDeviceInfo(), arrayOf(f)) - } else { - LOG.e(TAG, "Can't create temporarily log file") - } - } catch (e: Exception) { - e.printStackTrace() - } finally { - if (f != null && f.exists()) - f.delete() - } - return true - } - R.id.managePIN -> { - navigator.showPinSave(this, false) - return true - } - - R.id.managePIN2 -> { - navigator.showPinSave(this, true) - return true - } - - R.id.settings -> { - navigator.showSettings(this) - return true - } - - R.id.about -> { - navigator.showLogo(this, false) - return true - } - } - return super.onOptionsItemSelected(item) - } - - override fun onTagDiscovered(tag: Tag) { - try { - // get IsoDep handle and run cardReader thread - val isoDep = IsoDep.get(tag) - if (unsuccessReadCount < 2) - isoDep.timeout = 2000 + 5000 * unsuccessReadCount - else - isoDep.timeout = 90000 - - lastTag = tag - - task = ReadCardInfoTask(NfcReader(nfcManager, isoDep), App.localStorage, App.pinStorage, this) - task?.start() - } catch (e: Exception) { - e.printStackTrace() - nfcManager.notifyReadResult(false) - } - } - - public override fun onResume() { - super.onResume() - nfcDeviceAntenna.animate() - ReadCardInfoTask.resetLastReadInfo() - } - - public override fun onPause() { - task?.cancel(true) - super.onPause() - } - - public override fun onStop() { - task?.cancel(true) - super.onStop() - } - - override fun onReadStart(cardProtocol: CardProtocol) { - rlProgressBar.post { rlProgressBar.visibility = View.VISIBLE } - } - - override fun onReadProgress(protocol: CardProtocol, progress: Int) { - - } - - override fun onReadFinish(cardProtocol: CardProtocol?) { - task = null - if (cardProtocol != null) { - if (cardProtocol.error == null) { - nfcManager.notifyReadResult(true) - rlProgressBar.post { - rlProgressBar.visibility = View.GONE - - // TODO - ??? remove save and load??? - val cardInfo = Bundle() - val bCard = Bundle() - - cardInfo.putString(EXTRA_TANGEM_CARD_UID, cardProtocol.card.uid) - cardInfo.putBundle(EXTRA_TANGEM_CARD, bCard) - cardProtocol.card.saveToBundle(bCard) - - val uid = cardInfo.getString(EXTRA_TANGEM_CARD_UID) - val card = TangemCard(uid) - cardInfo.getBundle(EXTRA_TANGEM_CARD)?.let { card.loadFromBundle(it) } - - val ctx = TangemContext(card) - when { - card.status == TangemCard.Status.Loaded -> lastTag?.let { - val engineCoin = CoinEngineFactory.create(ctx) - if (engineCoin != null) { - engineCoin.defineWallet() - navigator.showLoadedWallet(this, it, ctx) - } - } - card.status == TangemCard.Status.Empty -> navigator.showEmptyWallet(this, ctx) - card.status == TangemCard.Status.Purged -> Toast.makeText(this, R.string.erased_wallet, Toast.LENGTH_SHORT).show() - card.status == TangemCard.Status.NotPersonalized -> Toast.makeText(this, R.string.not_personalized, Toast.LENGTH_SHORT).show() - else -> lastTag?.let { navigator.showLoadedWallet(this, it, ctx) } - } - } - - } else { - // remove last UIDs because of error and no card read - rlProgressBar.post { - Toast.makeText(this, R.string.try_to_scan_again, Toast.LENGTH_SHORT).show() - unsuccessReadCount++ - - if (cardProtocol.error is CardProtocol.TangemException_InvalidPIN) - navigator.showPinRequest(this, PinRequestActivity.Mode.RequestPIN.toString()) - else { - if (cardProtocol.error is CardProtocol.TangemException_ExtendedLengthNotSupported) - if (!NoExtendedLengthSupportDialog.allReadyShowed) - NoExtendedLengthSupportDialog().show(supportFragmentManager, NoExtendedLengthSupportDialog.TAG) - - lastTag = null - ReadCardInfoTask.resetLastReadInfo() - nfcManager.notifyReadResult(false) - } - } - } - } - - rlProgressBar.postDelayed({ - try { - rlProgressBar.visibility = View.GONE - } catch (e: Exception) { - e.printStackTrace() - } - }, 500) - } - - override fun onReadCancel() { - task = null - ReadCardInfoTask.resetLastReadInfo() - rlProgressBar.postDelayed({ - try { - rlProgressBar.visibility = View.GONE - } catch (e: Exception) { - e.printStackTrace() - } - }, 500) - } - - override fun onReadWait(msec: Int) { - WaitSecurityDelayDialog.onReadWait(Objects.requireNonNull(this), msec) - } - - override fun onReadBeforeRequest(timeout: Int) { - WaitSecurityDelayDialog.onReadBeforeRequest(Objects.requireNonNull(this), timeout) - } - - override fun onReadAfterRequest() { - WaitSecurityDelayDialog.onReadAfterRequest(Objects.requireNonNull(this)) - } - - private fun setNfcAdapterReaderCallback(callback: NfcAdapter.ReaderCallback) { - onNfcReaderCallback = callback - } - - private fun showMenu(v: View) { - val popup = PopupMenu(this, v) - val inflater = popup.menuInflater - inflater.inflate(R.menu.menu_main, popup.menu) - - if (BuildConfig.DEBUG) { - popup.menu.findItem(R.id.managePIN).isEnabled = true - popup.menu.findItem(R.id.managePIN2).isEnabled = true - popup.menu.findItem(R.id.sendLogs).isVisible = true - popup.menu.findItem(R.id.settings).isVisible = true - } - - popup.setOnMenuItemClickListener(this) - popup.show() - } - } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/ui/fragment/MainFragment.kt b/app/src/main/java/com/tangem/ui/fragment/MainFragment.kt new file mode 100644 index 0000000000..35755666d3 --- /dev/null +++ b/app/src/main/java/com/tangem/ui/fragment/MainFragment.kt @@ -0,0 +1,357 @@ +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 +import androidx.lifecycle.ViewModelProviders +import android.os.Bundle +import android.view.* +import android.widget.PopupMenu +import androidx.fragment.app.Fragment +import android.widget.Toast +import androidx.appcompat.app.AppCompatActivity +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.loadFromBundle +import com.tangem.card_android.data.saveToBundle +import com.tangem.card_common.data.TangemCard +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.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.wallet.BuildConfig +import com.tangem.wallet.CoinEngineFactory +import com.tangem.wallet.R +import com.tangem.wallet.TangemContext +import kotlinx.android.synthetic.main.main_fragment.* +import kotlinx.android.synthetic.main.layout_touch_card.* +import java.util.* + +class MainFragment : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notifications, androidx.appcompat.widget.PopupMenu.OnMenuItemClickListener, PopupMenu.OnMenuItemClickListener { + + companion object { + fun newInstance() = MainFragment() + } + + 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 + + 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) + } + + override fun onActivityCreated(savedInstanceState: Bundle?) { + super.onActivityCreated(savedInstanceState) + viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java) + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + + rippleBackgroundNfc.startRippleAnimation() + + // init NFC Antenna + nfcDeviceAntenna = NfcDeviceAntennaLocation(context!!, ivHandCardHorizontal, ivHandCardVertical, llHand, llNfc) + nfcDeviceAntenna.init() + + // set phone name + if (nfcDeviceAntenna.fullName != "") + tvNFCHint.text = String.format(getString(R.string.scan_banknote), nfcDeviceAntenna.fullName) + else + tvNFCHint.text = String.format(getString(R.string.scan_banknote), getString(R.string.phone)) + + val apiHelper = ServerApiCommon() + apiHelper.setLastVersionListener { response -> + try { + if (response.isNullOrEmpty()) + return@setLastVersionListener + val responseVersionName = response.trim(' ', '\n', '\r', '\t') + val responseBuildVersion = responseVersionName.split('.').last() + val appBuildVersion = BuildConfig.VERSION_NAME.split('.').last() + if (responseBuildVersion.toInt() > appBuildVersion.toInt()) + if (BuildConfig.FLAVOR.equals(Constant.FLAVOR_TANGEM_ACCESS)) + (activity as MainActivity).toastHelper.showSnackbarUpdateVersion(context!!, cl, responseVersionName) + } catch (E: Exception) { + E.printStackTrace() + } + } + apiHelper.requestLastVersion() + + // set listeners + fab.setOnClickListener { showMenu(it) } + } + + override fun onResume() { + super.onResume() + nfcDeviceAntenna.animate() + } + + override fun onPause() { + task?.cancel(true) + super.onPause() + } + + override fun onStop() { + task?.cancel(true) + super.onStop() + } + + + + override fun onTagDiscovered(tag: Tag) { + try { + // get IsoDep handle and run cardReader thread + val isoDep = IsoDep.get(tag) + if (unsuccessReadCount < 2) + isoDep.timeout = 2000 + 5000 * unsuccessReadCount + else + isoDep.timeout = 90000 + + lastTag = tag + + task = ReadCardInfoTask(NfcReader(nfcManager, isoDep), App.localStorage, App.pinStorage, this) + task?.start() + } catch (e: Exception) { + e.printStackTrace() + nfcManager.notifyReadResult(false) + } + } + + override fun onReadStart(cardProtocol: CardProtocol) { + rlProgressBar?.post { rlProgressBar?.visibility = View.VISIBLE } + } + + override fun onReadProgress(protocol: CardProtocol, progress: Int) { + + } + + override fun onReadFinish(cardProtocol: CardProtocol?) { + task = null + if (cardProtocol != null) { + if (cardProtocol.error == null) { + nfcManager.notifyReadResult(true) + rlProgressBar?.post { + rlProgressBar?.visibility = View.GONE + + // TODO - ??? remove save and load??? + val cardInfo = Bundle() + val bCard = Bundle() + + cardInfo.putString(EXTRA_TANGEM_CARD_UID, cardProtocol.card.uid) + cardInfo.putBundle(EXTRA_TANGEM_CARD, bCard) + cardProtocol.card.saveToBundle(bCard) + + val uid = cardInfo.getString(EXTRA_TANGEM_CARD_UID) + val card = TangemCard(uid) + cardInfo.getBundle(EXTRA_TANGEM_CARD)?.let { card.loadFromBundle(it) } + + val ctx = TangemContext(card) + when { + card.status == TangemCard.Status.Loaded -> lastTag?.let { + val engineCoin = CoinEngineFactory.create(ctx) + if (engineCoin != null) { + engineCoin.defineWallet() + + +// val bundle = Bundle() +// bundle.putParcelable(Constant.EXTRA_LAST_DISCOVERED_TAG, lastTag) +// ctx.saveToBundle(bundle) +// (activity as MainActivity).navController.navigate(R.id.loadedWallet, bundle) + + (activity as MainActivity).navigator.showLoadedWallet(activity!!, it, ctx) + } + } + card.status == TangemCard.Status.Empty -> (activity as MainActivity).navigator.showEmptyWallet(activity!!, ctx) + 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 -> { + +// val bundle = Bundle() +// bundle.putParcelable(Constant.EXTRA_LAST_DISCOVERED_TAG, lastTag) +// ctx.saveToBundle(bundle) +// navController.navigate(R.id.loadedWallet, bundle) + +// lastTag?.let { navigator.showLoadedWallet(this, it, ctx) } + } + } + } + + } else { + // remove last UIDs because of error and no card read + rlProgressBar.post { + 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_ExtendedLengthNotSupported) + if (!NoExtendedLengthSupportDialog.allReadyShowed) + NoExtendedLengthSupportDialog().show(activity!!.supportFragmentManager, NoExtendedLengthSupportDialog.TAG) + + lastTag = null + ReadCardInfoTask.resetLastReadInfo() + nfcManager.notifyReadResult(false) + } + } + } + } + + rlProgressBar.postDelayed({ + try { + rlProgressBar.visibility = View.GONE + } catch (e: Exception) { + e.printStackTrace() + } + }, 500) + } + + override fun onReadCancel() { + task = null + ReadCardInfoTask.resetLastReadInfo() + rlProgressBar.postDelayed({ + try { + rlProgressBar.visibility = View.GONE + } catch (e: Exception) { + e.printStackTrace() + } + }, 500) + } + + override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { + when (requestCode) { +// Constant.REQUEST_CODE_SEND_EMAIL -> { +// if (zipFile != null) { +// zipFile!!.delete() +// zipFile = null +// } +// } + Constant.REQUEST_CODE_ENTER_PIN_ACTIVITY -> { + if (resultCode == Activity.RESULT_OK && lastTag != null) + onTagDiscovered(lastTag!!) + else + ReadCardInfoTask.resetLastReadInfo() + } + } + super.onActivityResult(requestCode, resultCode, data) + } + + override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) { + inflater.inflate(R.menu.menu_main, menu) + if (BuildConfig.DEBUG) { + for (i in 0 until menu.size()) menu.getItem(i).isVisible = true + } + super.onCreateOptionsMenu(menu, inflater) + } + + override fun onOptionsItemSelected(item: MenuItem): Boolean { + when (item.itemId) { + R.id.sendLogs -> { +// var f: File? = null +// try { +// f = Logger.collectLogs(this) +// if (f != null) { +// LOG.e(TAG, String.format("Collect %d log bytes", f.length())) +// CommonUtil.sendEmail(this, zipFile, TAG, "Logs", UtilHelper.getDeviceInfo(), arrayOf(f)) +// } else { +// LOG.e(TAG, "Can't create temporarily log file") +// } +// } catch (e: Exception) { +// e.printStackTrace() +// } finally { +// if (f != null && f.exists()) +// f.delete() +// } +// return true + } + R.id.managePIN -> { + (activity as MainActivity).navigator.showPinSave(activity!!, false) +// (activity as MainActivity).navController.navigate(R.id.pinSaveActivity) + return true + } + + R.id.managePIN2 -> { + (activity as MainActivity).navigator.showPinSave(activity!!, true) +// (activity as MainActivity).navController.navigate(R.id.pinSaveActivity) + return true + } + + R.id.settings -> { + (activity as MainActivity).navigator.showSettings(activity!!) +// (activity as MainActivity).navController.navigate(R.id.settingsActivity) + return true + } + + R.id.about -> { + (activity as MainActivity).navigator.showLogo(activity!!, false) +// (activity as MainActivity).navController.navigate(R.id.logoActivity) + return true + } + } + return super.onOptionsItemSelected(item) + } + + override fun onReadWait(msec: Int) { + WaitSecurityDelayDialog.onReadWait(Objects.requireNonNull(activity) as AppCompatActivity?, msec) + } + + override fun onReadBeforeRequest(timeout: Int) { + WaitSecurityDelayDialog.onReadBeforeRequest(Objects.requireNonNull(activity) as AppCompatActivity?, timeout) + } + + override fun onReadAfterRequest() { + WaitSecurityDelayDialog.onReadAfterRequest(Objects.requireNonNull(activity)) + } + + override fun onMenuItemClick(item: MenuItem?): Boolean { + return onOptionsItemSelected(item!!) + } + + private fun showMenu(v: View) { + val popup = PopupMenu(context, v) + val inflater = popup.menuInflater + inflater.inflate(R.menu.menu_main, popup.menu) + + if (BuildConfig.DEBUG) { + popup.menu.findItem(R.id.managePIN).isEnabled = true + popup.menu.findItem(R.id.managePIN2).isEnabled = true + popup.menu.findItem(R.id.sendLogs).isVisible = true + popup.menu.findItem(R.id.settings).isVisible = true + } + + popup.setOnMenuItemClickListener(this) + popup.show() + } + +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/ui/fragment/MainViewModel.kt b/app/src/main/java/com/tangem/ui/fragment/MainViewModel.kt new file mode 100644 index 0000000000..4af7018a2a --- /dev/null +++ b/app/src/main/java/com/tangem/ui/fragment/MainViewModel.kt @@ -0,0 +1,7 @@ +package com.tangem.ui.fragment + +import androidx.lifecycle.ViewModel + +class MainViewModel : ViewModel() { + // TODO: Implement the ViewModel +} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/wallet/TangemContext.java b/app/src/main/java/com/tangem/wallet/TangemContext.java index 3a0ee4e444..9c2d9bbfa2 100644 --- a/app/src/main/java/com/tangem/wallet/TangemContext.java +++ b/app/src/main/java/com/tangem/wallet/TangemContext.java @@ -22,6 +22,7 @@ public class TangemContext { } public TangemContext(TangemCard card) { + this.card = card; } @@ -135,6 +136,21 @@ public class TangemContext { return tangemContext; } + public void saveToBundle(Bundle intent) { + + if (card != null) { + intent.putString(TangemCardExtensionsKt.EXTRA_TANGEM_CARD_UID, card.getUID()); + intent.putBundle(TangemCardExtensionsKt.EXTRA_TANGEM_CARD, TangemCardExtensionsKt.getAsBundle(card)); + } + + if (coinData != null) { + intent.putBundle(Constant.EXTRA_BLOCKCHAIN_DATA, coinData.asBundle()); + } + + intent.putString("Error", error); + intent.putString("Message", message); + } + public void saveToIntent(Intent intent) { if (card != null) { @@ -148,7 +164,6 @@ public class TangemContext { intent.putExtra("Error", error); intent.putExtra("Message", message); - } public String getString(int stringId) { diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml index 48a209311f..713699fd71 100644 --- a/app/src/main/res/layout/activity_main.xml +++ b/app/src/main/res/layout/activity_main.xml @@ -1,58 +1,17 @@ - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/main_fragment.xml b/app/src/main/res/layout/main_fragment.xml new file mode 100644 index 0000000000..1d60d30faf --- /dev/null +++ b/app/src/main/res/layout/main_fragment.xml @@ -0,0 +1,58 @@ + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/main_graph.xml b/app/src/main/res/navigation/main_graph.xml new file mode 100644 index 0000000000..5a8ad7b3a9 --- /dev/null +++ b/app/src/main/res/navigation/main_graph.xml @@ -0,0 +1,16 @@ + + + + + + + + \ No newline at end of file diff --git a/card-android/build.gradle b/card-android/build.gradle index 6d22133a08..956d0c88fe 100644 --- a/card-android/build.gradle +++ b/card-android/build.gradle @@ -29,7 +29,7 @@ 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-alpha01' + implementation 'androidx.appcompat:appcompat:1.1.0-alpha04' implementation 'com.google.code.gson:gson:2.8.5' implementation 'com.scottyab:rootbeer-lib:0.0.7' testImplementation 'junit:junit:4.12' diff --git a/server-android/build.gradle b/server-android/build.gradle index f79ad5009e..7aaa4af308 100644 --- a/server-android/build.gradle +++ b/server-android/build.gradle @@ -29,7 +29,7 @@ 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-alpha03' + implementation 'androidx.appcompat:appcompat:1.1.0-alpha04' implementation 'com.google.code.gson:gson:2.8.5' implementation 'com.squareup.retrofit2:converter-gson:2.5.0' implementation 'com.squareup.retrofit2:retrofit:2.5.0'