From 0cef74d1a00a49a0754dbee140a341f33a41e5fc Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 18 Apr 2019 12:24:12 +0300 Subject: [PATCH 01/11] Updated on 2026-08-14 --- .idea/codeStyles/Project.xml | 29 ------------------------ build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 3 files changed, 3 insertions(+), 32 deletions(-) delete mode 100644 .idea/codeStyles/Project.xml diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml deleted file mode 100644 index 30aa626c23..0000000000 --- a/.idea/codeStyles/Project.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - \ No newline at end of file diff --git a/build.gradle b/build.gradle index 07821a2684..a07f7985d1 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.3.2' + classpath 'com.android.tools.build:gradle:3.4.0' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1' } diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 6fea634781..662c6f9706 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Jan 18 12:06:47 MSK 2019 +#Thu Apr 18 12:21:12 MSK 2019 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.10.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-5.1.1-all.zip From 2ef5cbbdb0322f808041169d1755132c92ed8a24 Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 18 Apr 2019 14:29:48 +0300 Subject: [PATCH 02/11] 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' From ca44d86a5ef6a16d1b0648194af7ac4eab244f7d Mon Sep 17 00:00:00 2001 From: Tangem Date: Thu, 18 Apr 2019 16:20:30 +0300 Subject: [PATCH 03/11] Updated on 2026-08-14 --- app/build.gradle | 1 - .../com/tangem/ui/fragment/MainFragment.kt | 29 +++++++++---------- .../com/tangem/ui/fragment/MainViewModel.kt | 9 +++++- 3 files changed, 21 insertions(+), 18 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 0ce6715df5..31a27c4e74 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -30,7 +30,6 @@ android { debuggable true minifyEnabled false applicationIdSuffix ".debug" - versionNameSuffix '-DEBUG' signingConfig signingConfigs.debug } } diff --git a/app/src/main/java/com/tangem/ui/fragment/MainFragment.kt b/app/src/main/java/com/tangem/ui/fragment/MainFragment.kt index 35755666d3..1c756225c2 100644 --- a/app/src/main/java/com/tangem/ui/fragment/MainFragment.kt +++ b/app/src/main/java/com/tangem/ui/fragment/MainFragment.kt @@ -7,11 +7,13 @@ import android.nfc.Tag import android.nfc.tech.IsoDep import androidx.lifecycle.ViewModelProviders import android.os.Bundle +import android.util.Log import android.view.* import android.widget.PopupMenu import androidx.fragment.app.Fragment import android.widget.Toast import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.Observer import com.tangem.App import com.tangem.Constant import com.tangem.card_android.android.nfc.NfcDeviceAntennaLocation @@ -46,22 +48,14 @@ class MainFragment : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific } 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)) } @@ -71,14 +65,8 @@ class MainFragment : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific 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 @@ -112,6 +100,17 @@ class MainFragment : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific fab.setOnClickListener { showMenu(it) } } + override fun onActivityCreated(savedInstanceState: Bundle?) { + super.onActivityCreated(savedInstanceState) + viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java) + +// viewModel.getVersionName().observe(this, Observer { text -> +// Log.d("", text) +// if (BuildConfig.FLAVOR.equals(Constant.FLAVOR_TANGEM_ACCESS)) +// (activity as MainActivity).toastHelper.showSnackbarUpdateVersion(context!!, cl, text) +// }) + } + override fun onResume() { super.onResume() nfcDeviceAntenna.animate() @@ -127,8 +126,6 @@ class MainFragment : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific super.onStop() } - - override fun onTagDiscovered(tag: Tag) { try { // get IsoDep handle and run cardReader thread diff --git a/app/src/main/java/com/tangem/ui/fragment/MainViewModel.kt b/app/src/main/java/com/tangem/ui/fragment/MainViewModel.kt index 4af7018a2a..de2cfe937f 100644 --- a/app/src/main/java/com/tangem/ui/fragment/MainViewModel.kt +++ b/app/src/main/java/com/tangem/ui/fragment/MainViewModel.kt @@ -1,7 +1,14 @@ package com.tangem.ui.fragment +import androidx.lifecycle.LiveData +import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel class MainViewModel : ViewModel() { - // TODO: Implement the ViewModel + private val responseVersionName = MutableLiveData() + + fun getVersionName(): LiveData { + + return responseVersionName + } } \ No newline at end of file From f686ddd1e19f810228d8f23ad160e57805a5347a Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 19 Apr 2019 11:46:57 +0300 Subject: [PATCH 04/11] Updated on 2026-08-14 --- .../layout/activity_confirm_transaction.xml | 21 ++++++++++--------- .../layout/activity_prepare_transaction.xml | 1 + .../layout/activity_confirm_transaction.xml | 21 ++++++++++--------- 3 files changed, 23 insertions(+), 20 deletions(-) diff --git a/app/src/tangemAccess/res/layout/activity_confirm_transaction.xml b/app/src/tangemAccess/res/layout/activity_confirm_transaction.xml index 8e8c0c19e0..f41865d204 100644 --- a/app/src/tangemAccess/res/layout/activity_confirm_transaction.xml +++ b/app/src/tangemAccess/res/layout/activity_confirm_transaction.xml @@ -148,35 +148,36 @@ + android:layout_height="match_parent"> + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintWidth_min="150dp" + tools:text="1.34343434343443434343434" /> + android:layout_height="match_parent"> + app:layout_constraintTop_toTopOf="parent" + app:layout_constraintWidth_min="150dp" + tools:text="1.34343434343443434343434" /> Date: Fri, 19 Apr 2019 12:42:29 +0300 Subject: [PATCH 05/11] Updated on 2026-08-14 --- .idea/encodings.xml | 4 ++ .idea/navEditor.xml | 4 +- .../tangem/ui/activity/PinRequestActivity.kt | 2 +- .../com/tangem/ui/fragment/MainFragment.kt | 1 - .../java/com/tangem/ui/fragment/Settings.kt | 12 ----- .../tangem/ui/fragment/SettingsFragment.kt | 25 ++++++++++ app/src/main/res/layout/activity_settings.xml | 2 +- app/src/main/res/menu/menu_main.xml | 47 +++++++++---------- app/src/main/res/values/strings.xml | 2 + .../res/values/strings_untranslatable.xml | 5 ++ app/src/main/res/xml/pref_main.xml | 15 ++++-- 11 files changed, 73 insertions(+), 46 deletions(-) create mode 100644 .idea/encodings.xml delete mode 100644 app/src/main/java/com/tangem/ui/fragment/Settings.kt create mode 100644 app/src/main/java/com/tangem/ui/fragment/SettingsFragment.kt diff --git a/.idea/encodings.xml b/.idea/encodings.xml new file mode 100644 index 0000000000..15a15b218a --- /dev/null +++ b/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/navEditor.xml b/.idea/navEditor.xml index 6b2f2e8d08..5227e32389 100644 --- a/.idea/navEditor.xml +++ b/.idea/navEditor.xml @@ -13,8 +13,8 @@ diff --git a/app/src/main/java/com/tangem/ui/activity/PinRequestActivity.kt b/app/src/main/java/com/tangem/ui/activity/PinRequestActivity.kt index c5570a6285..a881cc687d 100644 --- a/app/src/main/java/com/tangem/ui/activity/PinRequestActivity.kt +++ b/app/src/main/java/com/tangem/ui/activity/PinRequestActivity.kt @@ -246,7 +246,7 @@ class PinRequestActivity : AppCompatActivity(), NfcAdapter.ReaderCallback, Finge @SuppressLint("NewApi") private fun testFingerPrintSettings(): Boolean { - LOG.i(TAG, "Testing Fingerprint Settings") + LOG.i(TAG, "Testing Fingerprint SettingsFragment") val keyguardManager = getSystemService(Context.KEYGUARD_SERVICE) as KeyguardManager fingerprintManager = getSystemService(Context.FINGERPRINT_SERVICE) as FingerprintManager diff --git a/app/src/main/java/com/tangem/ui/fragment/MainFragment.kt b/app/src/main/java/com/tangem/ui/fragment/MainFragment.kt index 1c756225c2..ca3f8d64c6 100644 --- a/app/src/main/java/com/tangem/ui/fragment/MainFragment.kt +++ b/app/src/main/java/com/tangem/ui/fragment/MainFragment.kt @@ -344,7 +344,6 @@ class MainFragment : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific 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) diff --git a/app/src/main/java/com/tangem/ui/fragment/Settings.kt b/app/src/main/java/com/tangem/ui/fragment/Settings.kt deleted file mode 100644 index a2a54a60e4..0000000000 --- a/app/src/main/java/com/tangem/ui/fragment/Settings.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.tangem.ui.fragment - -import android.os.Bundle -import androidx.preference.PreferenceFragmentCompat -import com.tangem.wallet.R - -class Settings : PreferenceFragmentCompat() { - override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { - addPreferencesFromResource(R.xml.pref_main) - } - -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/ui/fragment/SettingsFragment.kt b/app/src/main/java/com/tangem/ui/fragment/SettingsFragment.kt new file mode 100644 index 0000000000..95f604cba2 --- /dev/null +++ b/app/src/main/java/com/tangem/ui/fragment/SettingsFragment.kt @@ -0,0 +1,25 @@ +package com.tangem.ui.fragment + +import android.os.Bundle +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 + +class SettingsFragment : PreferenceFragmentCompat() { + override fun onCreatePreferences(savedInstanceState: Bundle?, rootKey: String?) { + addPreferencesFromResource(R.xml.pref_main) + + val categoryCommon = findPreference(getString(R.string.pref_category_common)) + val selectNodes = findPreference(getString(R.string.pref_select_nodes)) + val encryptionModes = findPreference(getString(R.string.pref_encryption_modes)) + + if (!BuildConfig.DEBUG) { + categoryCommon?.removePreference(selectNodes) + categoryCommon?.removePreference(encryptionModes) + } + } + +} \ No newline at end of file diff --git a/app/src/main/res/layout/activity_settings.xml b/app/src/main/res/layout/activity_settings.xml index 0ba5ab7527..68269087e1 100644 --- a/app/src/main/res/layout/activity_settings.xml +++ b/app/src/main/res/layout/activity_settings.xml @@ -20,7 +20,7 @@ - - - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index dceb1d6cdd..002f70699b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -58,6 +58,8 @@ Cardano + Common + Manual editing Fee Settings Encryption modes diff --git a/app/src/main/res/values/strings_untranslatable.xml b/app/src/main/res/values/strings_untranslatable.xml index 13279d3f9c..7783a7ef97 100644 --- a/app/src/main/res/values/strings_untranslatable.xml +++ b/app/src/main/res/values/strings_untranslatable.xml @@ -23,4 +23,9 @@ com.tangem.data.LogFileProvider Can\'t create CoinEngine! + category_common + manual_editing_fee + select_nodes + encryption_modes + diff --git a/app/src/main/res/xml/pref_main.xml b/app/src/main/res/xml/pref_main.xml index ff16adfc67..9227025a9c 100644 --- a/app/src/main/res/xml/pref_main.xml +++ b/app/src/main/res/xml/pref_main.xml @@ -1,20 +1,25 @@ - + + + - \ No newline at end of file From 718b5f093d344036614fd94fcbc423b1135227f9 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 19 Apr 2019 14:04:29 +0300 Subject: [PATCH 06/11] Updated on 2026-08-14 --- .../main/java/com/tangem/di/ToastHelper.kt | 7 ++++ .../com/tangem/di/ToastHelperComponent.kt | 3 ++ app/src/main/res/values/strings.xml | 1 + .../tangem/ui/ConfirmTransactionActivity.kt | 40 ++++++++++++++----- .../layout/activity_confirm_transaction.xml | 2 +- 5 files changed, 41 insertions(+), 12 deletions(-) diff --git a/app/src/main/java/com/tangem/di/ToastHelper.kt b/app/src/main/java/com/tangem/di/ToastHelper.kt index c19cfe6cf9..664a83d479 100644 --- a/app/src/main/java/com/tangem/di/ToastHelper.kt +++ b/app/src/main/java/com/tangem/di/ToastHelper.kt @@ -45,6 +45,13 @@ class ToastHelper { snackbar.show() } + fun showSnackbarWarning(context: Context, vg: ViewGroup, message: String) { + val snackbar = Snackbar.make(vg, message, Snackbar.LENGTH_LONG) + val snackView = snackbar.view + snackView.setBackgroundColor(context.resources.getColor(R.color.msg_err)) + snackbar.show() + } + private var singleToast: Toast? = null private var showTime: Date = Date() diff --git a/app/src/main/java/com/tangem/di/ToastHelperComponent.kt b/app/src/main/java/com/tangem/di/ToastHelperComponent.kt index 1957d59a6a..24d5165c5e 100644 --- a/app/src/main/java/com/tangem/di/ToastHelperComponent.kt +++ b/app/src/main/java/com/tangem/di/ToastHelperComponent.kt @@ -1,5 +1,6 @@ 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 @@ -15,6 +16,8 @@ interface ToastHelperComponent { fun inject(activity: LoadedWalletActivity) + fun inject(activity: ConfirmTransactionActivity) + fun inject(activity: PrepareTransactionActivity) fun inject(activity: EmptyWalletActivity) diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 002f70699b..080eb72bcf 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -219,6 +219,7 @@ PIN2 is required to sign the payment Not enough funds Service unavailable + You have a risk of delaying transaction Wallet hasn\'t been yet created diff --git a/app/src/tangemAccess/java/com/tangem/ui/ConfirmTransactionActivity.kt b/app/src/tangemAccess/java/com/tangem/ui/ConfirmTransactionActivity.kt index 60921bcef7..88b5d56871 100644 --- a/app/src/tangemAccess/java/com/tangem/ui/ConfirmTransactionActivity.kt +++ b/app/src/tangemAccess/java/com/tangem/ui/ConfirmTransactionActivity.kt @@ -2,40 +2,49 @@ package com.tangem.ui import android.app.Activity import android.content.Intent +import android.content.SharedPreferences import android.nfc.NfcAdapter import android.nfc.Tag import android.os.Build import android.os.Bundle -import androidx.appcompat.app.AppCompatActivity +import android.preference.PreferenceManager import android.text.Editable import android.text.Html import android.text.TextWatcher import android.view.KeyEvent import android.view.View 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.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.data.Blockchain +import com.tangem.di.ToastHelper +import com.tangem.ui.activity.PinRequestActivity +import com.tangem.ui.activity.SignTransactionActivity +import com.tangem.ui.event.TransactionFinishWithError 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 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 com.tangem.ui.activity.SignTransactionActivity -import kotlinx.android.synthetic.tangemAccess.activity_confirm_transaction.* +import javax.inject.Inject class ConfirmTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallback { + @Inject + internal lateinit var toastHelper: ToastHelper + + private lateinit var sp: SharedPreferences private lateinit var nfcManager: NfcManager private lateinit var ctx: TangemContext private lateinit var amount: CoinEngine.Amount @@ -49,6 +58,10 @@ class ConfirmTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac super.onCreate(savedInstanceState) setContentView(R.layout.activity_confirm_transaction) + App.toastHelperComponent.inject(this) + + sp = PreferenceManager.getDefaultSharedPreferences(this) + nfcManager = NfcManager(this, this) lifecycle.addObserver(NfcLifecycleObserver(nfcManager)) @@ -95,6 +108,8 @@ class ConfirmTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac rgFee.visibility = View.INVISIBLE } + etFee.isEnabled = sp.getBoolean(getString(R.string.pref_manual_editing_fee), false) + // set listeners rgFee.setOnCheckedChangeListener { _, checkedId -> doSetFee(checkedId) } etFee.addTextChangedListener(object : TextWatcher { @@ -114,6 +129,9 @@ class ConfirmTransactionActivity : AppCompatActivity(), NfcAdapter.ReaderCallbac } else tvFeeEquivalent.error = null + if (sp.getBoolean(getString(R.string.pref_manual_editing_fee), false)) + toastHelper.showSingleToast(this@ConfirmTransactionActivity, getString(R.string.risk_delaying)) + } catch (e: Exception) { e.printStackTrace() tvFeeEquivalent.text = "" diff --git a/app/src/tangemAccess/res/layout/activity_confirm_transaction.xml b/app/src/tangemAccess/res/layout/activity_confirm_transaction.xml index f41865d204..a3e049834c 100644 --- a/app/src/tangemAccess/res/layout/activity_confirm_transaction.xml +++ b/app/src/tangemAccess/res/layout/activity_confirm_transaction.xml @@ -2,6 +2,7 @@ Date: Tue, 23 Apr 2019 11:43:05 +0300 Subject: [PATCH 07/11] Updated on 2026-08-14 --- app/build.gradle | 4 ++-- app/src/debug/res/values/strings.xml | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 31a27c4e74..81c3c0bc05 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -36,8 +36,8 @@ android { flavorDimensions "" productFlavors { tangemAccess { - versionCode 107 - versionName "0.904.1." + generateVersionName() + versionCode 108 + versionName "0.904.2." + generateVersionName() applicationId "com.tangem.wallet" signingConfig signingConfigs.debug } diff --git a/app/src/debug/res/values/strings.xml b/app/src/debug/res/values/strings.xml index ec5cc446df..9ef8838437 100644 --- a/app/src/debug/res/values/strings.xml +++ b/app/src/debug/res/values/strings.xml @@ -1,6 +1,6 @@ - + DEBUG \ No newline at end of file From ec99dfa367668c2bf2c454bcb1d5d1d6158982dd Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 23 Apr 2019 12:39:57 +0300 Subject: [PATCH 08/11] Updated on 2026-08-14 --- app/src/main/AndroidManifest.xml | 13 ++-- .../com/tangem/ui/fragment/MainFragment.kt | 59 ++++++++++--------- 2 files changed, 39 insertions(+), 33 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 07226da19f..c62a9f553b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -29,12 +29,13 @@ android:supportsRtl="true" android:theme="@style/AppTheme" tools:ignore="GoogleAppIndexingWarning"> - - - - - - + + { -// if (zipFile != null) { -// zipFile!!.delete() -// zipFile = null -// } -// } + 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!!) @@ -275,22 +280,22 @@ class MainFragment : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific 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 + var f: File? = null + try { + f = Logger.collectLogs(activity) + if (f != null) { + LOG.e(TAG, String.format("Collect %d log bytes", f.length())) + CommonUtil.sendEmail(activity, 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) From 78ef89d2cff6000da1cdf8943cfd3fb5a6db04cf Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 23 Apr 2019 13:20:23 +0300 Subject: [PATCH 09/11] Updated on 2026-08-14 --- .../com/tangem/ui/fragment/MainFragment.kt | 28 ++++--------------- .../com/tangem/ui/fragment/MainViewModel.kt | 27 ++++++++++++++++-- 2 files changed, 30 insertions(+), 25 deletions(-) diff --git a/app/src/main/java/com/tangem/ui/fragment/MainFragment.kt b/app/src/main/java/com/tangem/ui/fragment/MainFragment.kt index 131fa2509b..7f331b7aad 100644 --- a/app/src/main/java/com/tangem/ui/fragment/MainFragment.kt +++ b/app/src/main/java/com/tangem/ui/fragment/MainFragment.kt @@ -11,6 +11,7 @@ import android.widget.PopupMenu import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.fragment.app.Fragment +import androidx.lifecycle.Observer import androidx.lifecycle.ViewModelProviders import com.tangem.App import com.tangem.Constant @@ -84,23 +85,6 @@ class MainFragment : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific 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) } } @@ -109,11 +93,10 @@ class MainFragment : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific super.onActivityCreated(savedInstanceState) viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java) -// viewModel.getVersionName().observe(this, Observer { text -> -// Log.d("", text) -// if (BuildConfig.FLAVOR.equals(Constant.FLAVOR_TANGEM_ACCESS)) -// (activity as MainActivity).toastHelper.showSnackbarUpdateVersion(context!!, cl, text) -// }) + // show snackbar about new version app + viewModel.getVersionName().observe(this, Observer { text -> + (activity as MainActivity).toastHelper.showSnackbarUpdateVersion(context!!, cl, text) + }) } override fun onResume() { @@ -185,7 +168,6 @@ class MainFragment : Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notific if (engineCoin != null) { engineCoin.defineWallet() - // val bundle = Bundle() // bundle.putParcelable(Constant.EXTRA_LAST_DISCOVERED_TAG, lastTag) // ctx.saveToBundle(bundle) diff --git a/app/src/main/java/com/tangem/ui/fragment/MainViewModel.kt b/app/src/main/java/com/tangem/ui/fragment/MainViewModel.kt index de2cfe937f..c5131432a9 100644 --- a/app/src/main/java/com/tangem/ui/fragment/MainViewModel.kt +++ b/app/src/main/java/com/tangem/ui/fragment/MainViewModel.kt @@ -3,12 +3,35 @@ package com.tangem.ui.fragment import androidx.lifecycle.LiveData import androidx.lifecycle.MutableLiveData import androidx.lifecycle.ViewModel +import com.tangem.Constant +import com.tangem.data.network.ServerApiCommon +import com.tangem.wallet.BuildConfig class MainViewModel : ViewModel() { - private val responseVersionName = MutableLiveData() + private var versionName = MutableLiveData() fun getVersionName(): LiveData { + versionName = MutableLiveData() + requestVersionName() + return versionName + } - return responseVersionName + private fun requestVersionName() { + 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)) + versionName.value = responseVersionName + } catch (E: Exception) { + E.printStackTrace() + } + } + apiHelper.requestLastVersion() } } \ No newline at end of file From bbed187fab42d299d8425cf13af500a69c5cc565 Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 24 Apr 2019 13:33:47 +0300 Subject: [PATCH 10/11] Updated on 2026-08-14 --- app/build.gradle | 16 +-- app/src/main/java/com/tangem/Constant.kt | 2 +- .../ui/activity/LoadedWalletActivity.kt | 4 +- ...oadedWallet.kt => LoadedWalletFragment.kt} | 103 +++++++++++------- .../ui/fragment/LoadedWalletViewModel.kt | 65 +++++++++++ .../com/tangem/ui/fragment/MainViewModel.kt | 7 +- .../res/layout/activity_loaded_wallet.xml | 40 +++---- app/src/main/res/layout/fr_loaded_wallet.xml | 2 +- app/src/main/res/values/strings.xml | 2 +- 9 files changed, 168 insertions(+), 73 deletions(-) rename app/src/main/java/com/tangem/ui/fragment/{LoadedWallet.kt => LoadedWalletFragment.kt} (92%) create mode 100644 app/src/main/java/com/tangem/ui/fragment/LoadedWalletViewModel.kt diff --git a/app/build.gradle b/app/build.gradle index 81c3c0bc05..aec6b186e9 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -68,16 +68,15 @@ dependencies { // 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' - implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0' - implementation 'androidx.biometric:biometric:1.0.0-alpha04' - 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' + implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0' + implementation 'androidx.appcompat:appcompat:1.1.0-alpha04' + implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation "androidx.preference:preference:1.1.0-alpha04" + implementation 'androidx.biometric:biometric:1.0.0-alpha04' + implementation 'com.google.android.material:material:1.1.0-alpha05' + implementation 'com.google.dagger:dagger:2.21' kapt 'com.google.dagger:dagger-compiler:2.21' annotationProcessor 'com.google.dagger:dagger-compiler:2.21' implementation 'com.google.zxing:core:3.3.3' @@ -92,6 +91,7 @@ dependencies { implementation 'com.skyfishjy.ripplebackground:library:1.0.1' implementation 'com.jakewharton.retrofit:retrofit2-rxjava2-adapter:1.0.0' 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" diff --git a/app/src/main/java/com/tangem/Constant.kt b/app/src/main/java/com/tangem/Constant.kt index c04a892b40..2346fa8fd4 100644 --- a/app/src/main/java/com/tangem/Constant.kt +++ b/app/src/main/java/com/tangem/Constant.kt @@ -26,7 +26,7 @@ object Constant { const val INTENT_TYPE_TEXT_PLAIN = "text/plain" - // LoadedWallet, VerifyCard + // LoadedWalletFragment, VerifyCard const val REQUEST_CODE_SEND_TRANSACTION = 1 const val REQUEST_CODE_PURGE = 2 const val REQUEST_CODE_REQUEST_PIN2_FOR_PURGE = 3 diff --git a/app/src/main/java/com/tangem/ui/activity/LoadedWalletActivity.kt b/app/src/main/java/com/tangem/ui/activity/LoadedWalletActivity.kt index 2afa58290b..1106fe391c 100644 --- a/app/src/main/java/com/tangem/ui/activity/LoadedWalletActivity.kt +++ b/app/src/main/java/com/tangem/ui/activity/LoadedWalletActivity.kt @@ -11,7 +11,7 @@ import com.tangem.Constant import com.tangem.di.Navigator import com.tangem.di.ToastHelper import com.tangem.wallet.TangemContext -import com.tangem.ui.fragment.LoadedWallet +import com.tangem.ui.fragment.LoadedWalletFragment import com.tangem.wallet.R import javax.inject.Inject @@ -41,7 +41,7 @@ class LoadedWalletActivity : AppCompatActivity() { if (intent.extras!!.containsKey(NfcAdapter.EXTRA_TAG)) { val tag = intent.getParcelableExtra(NfcAdapter.EXTRA_TAG) if (tag != null) { - val fragment = supportFragmentManager.findFragmentById(R.id.loaded_wallet_fragment) as LoadedWallet + val fragment = supportFragmentManager.findFragmentById(R.id.loaded_wallet_fragment) as LoadedWalletFragment fragment.onTagDiscovered(tag) } } diff --git a/app/src/main/java/com/tangem/ui/fragment/LoadedWallet.kt b/app/src/main/java/com/tangem/ui/fragment/LoadedWalletFragment.kt similarity index 92% rename from app/src/main/java/com/tangem/ui/fragment/LoadedWallet.kt rename to app/src/main/java/com/tangem/ui/fragment/LoadedWalletFragment.kt index f694614e47..aa7ebcd8ad 100644 --- a/app/src/main/java/com/tangem/ui/fragment/LoadedWallet.kt +++ b/app/src/main/java/com/tangem/ui/fragment/LoadedWalletFragment.kt @@ -13,6 +13,7 @@ import android.nfc.tech.IsoDep import android.os.Build import android.os.Bundle import android.text.Html +import android.util.Log import android.view.Gravity import android.view.LayoutInflater import android.view.View @@ -20,6 +21,8 @@ import android.view.ViewGroup import android.widget.Toast import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat +import androidx.lifecycle.Observer +import androidx.lifecycle.ViewModelProviders import com.tangem.App import com.tangem.Constant import com.tangem.data.Blockchain @@ -63,11 +66,12 @@ import java.io.InputStream import java.util.* import kotlin.concurrent.timerTask -class LoadedWallet : androidx.fragment.app.Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notifications, SharedPreferences.OnSharedPreferenceChangeListener { +class LoadedWalletFragment : androidx.fragment.app.Fragment(), NfcAdapter.ReaderCallback, CardProtocol.Notifications, SharedPreferences.OnSharedPreferenceChangeListener { companion object { - val TAG: String = LoadedWallet::class.java.simpleName + val TAG: String = LoadedWalletFragment::class.java.simpleName } + private lateinit var viewModel: LoadedWalletViewModel private lateinit var ctx: TangemContext private lateinit var nfcManager: NfcManager private lateinit var mpSecondScanSound: MediaPlayer @@ -275,18 +279,40 @@ class LoadedWallet : androidx.fragment.app.Fragment(), NfcAdapter.ReaderCallback serverApiTangem.setArtworkListener(artworkListener) // request rate info listener - serverApiCommon.setRateInfoListener { - if (activity == null || !UtilHelper.isOnline(activity!!)) return@setRateInfoListener - val rate = it.priceUsd.toFloat() - ctx.coinData!!.rate = rate - ctx.coinData!!.rateAlter = rate - } +// serverApiCommon.setRateInfoListener { +// if (activity == null || !UtilHelper.isOnline(activity!!)) return@setRateInfoListener +// val rate = it.priceUsd.toFloat() +// ctx.coinData!!.rate = rate +// ctx.coinData!!.rateAlter = rate +// +// Log.i(TAG, "scscscsc222 " + rate) +// } refresh() startVerify(lastTag) } + override fun onActivityCreated(savedInstanceState: Bundle?) { + super.onActivityCreated(savedInstanceState) + viewModel = ViewModelProviders.of(this).get(LoadedWalletViewModel::class.java) + + // set rate info to CoinData +// viewModel.getRateInfo(ctx).observe(this, Observer { rate -> +// Log.i(TAG, "scscscsc111 " + rate) +// +// ctx.coinData.rate = rate +// ctx.coinData.rateAlter = rate +// }) + + viewModel.getRateInfo(ctx).observeForever { rate -> + Log.i(TAG, "scscscsc111 $rate") + + ctx.coinData.rate = rate + ctx.coinData.rateAlter = rate + } + } + override fun onPause() { super.onPause() if (timerHideErrorAndMessage != null) { @@ -647,7 +673,11 @@ class LoadedWallet : androidx.fragment.app.Fragment(), NfcAdapter.ReaderCallback requestBalanceAndUnspentTransactions() - requestRateInfo() +// requestRateInfo() + if (::viewModel.isInitialized) { + viewModel.getRateInfo(ctx) + Log.i(TAG, "isInitialized") + } if (requestCounter == 0) { // if no connection and no requests posted @@ -709,34 +739,33 @@ class LoadedWallet : androidx.fragment.app.Fragment(), NfcAdapter.ReaderCallback } } - private fun requestRateInfo() { - if (UtilHelper.isOnline(context as Activity)) { - LOG.i(TAG, "requestRateInfo") - - // TODO - move requestRateInfo to CoinEngine - val cryptoId: String = when (ctx.blockchain) { - Blockchain.Bitcoin -> "bitcoin" - Blockchain.BitcoinTestNet -> "bitcoin" - Blockchain.Ethereum -> "ethereum" - Blockchain.EthereumTestNet -> "ethereum" - Blockchain.Token -> "ethereum" - Blockchain.NftToken -> "ethereum" - Blockchain.BitcoinCash -> "bitcoin-cash" - Blockchain.Litecoin -> "litecoin" - Blockchain.Rootstock -> "bitcoin" - Blockchain.RootstockToken -> "bitcoin" - Blockchain.Cardano -> "cardano" - Blockchain.Ripple -> "ripple" - else -> { - throw Exception("Can''t get rate for blockchain " + ctx.blockchainName) - } - } - serverApiCommon.requestRateInfo(cryptoId) - } else { - ctx.error = getString(R.string.no_connection) - updateViews() - } - } +// private fun requestRateInfo() { +// if (UtilHelper.isOnline(context as Activity)) { +// LOG.i(TAG, "requestRateInfo") +// +// val cryptoId: String = when (ctx.blockchain) { +// Blockchain.Bitcoin -> "bitcoin" +// Blockchain.BitcoinTestNet -> "bitcoin" +// Blockchain.Ethereum -> "ethereum" +// Blockchain.EthereumTestNet -> "ethereum" +// Blockchain.Token -> "ethereum" +// Blockchain.NftToken -> "ethereum" +// Blockchain.BitcoinCash -> "bitcoin-cash" +// Blockchain.Litecoin -> "litecoin" +// Blockchain.Rootstock -> "bitcoin" +// Blockchain.RootstockToken -> "bitcoin" +// Blockchain.Cardano -> "cardano" +// Blockchain.Ripple -> "ripple" +// else -> { +// throw Exception("Can''t get rate for blockchain " + ctx.blockchainName) +// } +// } +// serverApiCommon.requestRateInfo(cryptoId) +// } else { +// ctx.error = getString(R.string.no_connection) +// updateViews() +// } +// } private fun startVerify(tag: Tag?) { try { diff --git a/app/src/main/java/com/tangem/ui/fragment/LoadedWalletViewModel.kt b/app/src/main/java/com/tangem/ui/fragment/LoadedWalletViewModel.kt new file mode 100644 index 0000000000..4385a19100 --- /dev/null +++ b/app/src/main/java/com/tangem/ui/fragment/LoadedWalletViewModel.kt @@ -0,0 +1,65 @@ +package com.tangem.ui.fragment + +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.wallet.TangemContext + +class LoadedWalletViewModel : ViewModel() { + private var serverApiCommon: ServerApiCommon = ServerApiCommon() + + private lateinit var ctx: TangemContext + +// private var rate = MutableLiveData() +// +// fun getRateInfo(ctx: TangemContext): LiveData { +// this.ctx = ctx +// rate = MutableLiveData() +// requestRateInfo() +// return rate +// } + + private val rate: MutableLiveData by lazy { + MutableLiveData().also { + requestRateInfo() + } + } + + fun getRateInfo(ctx: TangemContext): LiveData { + this.ctx = ctx + return rate + } + + private fun requestRateInfo() { + serverApiCommon.setRateInfoListener { + val rate = it.priceUsd.toFloat() + this.rate.value = rate + } + // TODO - move requestRateInfo to CoinEngine + val cryptoId: String = when (ctx.blockchain) { + Blockchain.Bitcoin -> "bitcoin" + Blockchain.BitcoinTestNet -> "bitcoin" + Blockchain.Ethereum -> "ethereum" + Blockchain.EthereumTestNet -> "ethereum" + Blockchain.Token -> "ethereum" + Blockchain.NftToken -> "ethereum" + Blockchain.BitcoinCash -> "bitcoin-cash" + Blockchain.Litecoin -> "litecoin" + Blockchain.Rootstock -> "bitcoin" + Blockchain.RootstockToken -> "bitcoin" + Blockchain.Cardano -> "cardano" + Blockchain.Ripple -> "ripple" + else -> { + throw Exception("Can''t get rate for blockchain " + ctx.blockchainName) + } + } + serverApiCommon.requestRateInfo(cryptoId) + } + + override fun onCleared() { + super.onCleared() +// getRateInfo(ctx).removeObservers() + } +} \ 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 index c5131432a9..d9b47667c1 100644 --- a/app/src/main/java/com/tangem/ui/fragment/MainViewModel.kt +++ b/app/src/main/java/com/tangem/ui/fragment/MainViewModel.kt @@ -8,6 +8,8 @@ import com.tangem.data.network.ServerApiCommon import com.tangem.wallet.BuildConfig class MainViewModel : ViewModel() { + private var serverApiCommon: ServerApiCommon = ServerApiCommon() + private var versionName = MutableLiveData() fun getVersionName(): LiveData { @@ -17,8 +19,7 @@ class MainViewModel : ViewModel() { } private fun requestVersionName() { - val apiHelper = ServerApiCommon() - apiHelper.setLastVersionListener { response -> + serverApiCommon.setLastVersionListener { response -> try { if (response.isNullOrEmpty()) return@setLastVersionListener @@ -32,6 +33,6 @@ class MainViewModel : ViewModel() { E.printStackTrace() } } - apiHelper.requestLastVersion() + serverApiCommon.requestLastVersion() } } \ No newline at end of file diff --git a/app/src/main/res/layout/activity_loaded_wallet.xml b/app/src/main/res/layout/activity_loaded_wallet.xml index 1e35662d46..0cc32cadbd 100644 --- a/app/src/main/res/layout/activity_loaded_wallet.xml +++ b/app/src/main/res/layout/activity_loaded_wallet.xml @@ -1,21 +1,21 @@ - - - - - + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fr_loaded_wallet.xml b/app/src/main/res/layout/fr_loaded_wallet.xml index 19bbdc0db2..af1a6b319f 100644 --- a/app/src/main/res/layout/fr_loaded_wallet.xml +++ b/app/src/main/res/layout/fr_loaded_wallet.xml @@ -7,7 +7,7 @@ android:background="@color/white" android:orientation="vertical" android:padding="0dp" - tools:context="com.tangem.ui.fragment.LoadedWallet" + tools:context="com.tangem.ui.fragment.LoadedWalletFragment" tools:ignore="contentDescription" tools:showIn="@layout/activity_loaded_wallet"> diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 080eb72bcf..35a6a77e84 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -117,7 +117,7 @@ There is a new application version: %1$s Update - + The wallet is empty No compatible wallets installed Please wait while previous transaction is confirmed in blockchain From d70ec8b246573cdf45c981de407cc84ff73a910b Mon Sep 17 00:00:00 2001 From: Tangem Date: Wed, 24 Apr 2019 14:14:15 +0300 Subject: [PATCH 11/11] Updated on 2026-08-14 --- .../ui/fragment/LoadedWalletFragment.kt | 59 ++----------------- .../ui/fragment/LoadedWalletViewModel.kt | 33 ++++------- 2 files changed, 15 insertions(+), 77 deletions(-) diff --git a/app/src/main/java/com/tangem/ui/fragment/LoadedWalletFragment.kt b/app/src/main/java/com/tangem/ui/fragment/LoadedWalletFragment.kt index aa7ebcd8ad..b908c578a2 100644 --- a/app/src/main/java/com/tangem/ui/fragment/LoadedWalletFragment.kt +++ b/app/src/main/java/com/tangem/ui/fragment/LoadedWalletFragment.kt @@ -278,16 +278,6 @@ class LoadedWalletFragment : androidx.fragment.app.Fragment(), NfcAdapter.Reader } serverApiTangem.setArtworkListener(artworkListener) - // request rate info listener -// serverApiCommon.setRateInfoListener { -// if (activity == null || !UtilHelper.isOnline(activity!!)) return@setRateInfoListener -// val rate = it.priceUsd.toFloat() -// ctx.coinData!!.rate = rate -// ctx.coinData!!.rateAlter = rate -// -// Log.i(TAG, "scscscsc222 " + rate) -// } - refresh() startVerify(lastTag) @@ -298,19 +288,11 @@ class LoadedWalletFragment : androidx.fragment.app.Fragment(), NfcAdapter.Reader viewModel = ViewModelProviders.of(this).get(LoadedWalletViewModel::class.java) // set rate info to CoinData -// viewModel.getRateInfo(ctx).observe(this, Observer { rate -> -// Log.i(TAG, "scscscsc111 " + rate) -// -// ctx.coinData.rate = rate -// ctx.coinData.rateAlter = rate -// }) - - viewModel.getRateInfo(ctx).observeForever { rate -> - Log.i(TAG, "scscscsc111 $rate") - + viewModel.getRateInfo().observe(this, Observer { rate -> ctx.coinData.rate = rate ctx.coinData.rateAlter = rate - } + }) + viewModel.requestRateInfo(ctx) } override fun onPause() { @@ -673,11 +655,8 @@ class LoadedWalletFragment : androidx.fragment.app.Fragment(), NfcAdapter.Reader requestBalanceAndUnspentTransactions() -// requestRateInfo() - if (::viewModel.isInitialized) { - viewModel.getRateInfo(ctx) - Log.i(TAG, "isInitialized") - } + if (::viewModel.isInitialized) + viewModel.requestRateInfo(ctx) if (requestCounter == 0) { // if no connection and no requests posted @@ -739,34 +718,6 @@ class LoadedWalletFragment : androidx.fragment.app.Fragment(), NfcAdapter.Reader } } -// private fun requestRateInfo() { -// if (UtilHelper.isOnline(context as Activity)) { -// LOG.i(TAG, "requestRateInfo") -// -// val cryptoId: String = when (ctx.blockchain) { -// Blockchain.Bitcoin -> "bitcoin" -// Blockchain.BitcoinTestNet -> "bitcoin" -// Blockchain.Ethereum -> "ethereum" -// Blockchain.EthereumTestNet -> "ethereum" -// Blockchain.Token -> "ethereum" -// Blockchain.NftToken -> "ethereum" -// Blockchain.BitcoinCash -> "bitcoin-cash" -// Blockchain.Litecoin -> "litecoin" -// Blockchain.Rootstock -> "bitcoin" -// Blockchain.RootstockToken -> "bitcoin" -// Blockchain.Cardano -> "cardano" -// Blockchain.Ripple -> "ripple" -// else -> { -// throw Exception("Can''t get rate for blockchain " + ctx.blockchainName) -// } -// } -// serverApiCommon.requestRateInfo(cryptoId) -// } else { -// ctx.error = getString(R.string.no_connection) -// updateViews() -// } -// } - private fun startVerify(tag: Tag?) { try { val isoDep = IsoDep.get(tag) diff --git a/app/src/main/java/com/tangem/ui/fragment/LoadedWalletViewModel.kt b/app/src/main/java/com/tangem/ui/fragment/LoadedWalletViewModel.kt index 4385a19100..0894729b9d 100644 --- a/app/src/main/java/com/tangem/ui/fragment/LoadedWalletViewModel.kt +++ b/app/src/main/java/com/tangem/ui/fragment/LoadedWalletViewModel.kt @@ -9,35 +9,20 @@ import com.tangem.wallet.TangemContext class LoadedWalletViewModel : ViewModel() { private var serverApiCommon: ServerApiCommon = ServerApiCommon() - private lateinit var ctx: TangemContext - -// private var rate = MutableLiveData() -// -// fun getRateInfo(ctx: TangemContext): LiveData { -// this.ctx = ctx -// rate = MutableLiveData() -// requestRateInfo() -// return rate -// } - private val rate: MutableLiveData by lazy { MutableLiveData().also { - requestRateInfo() + loadRateInfo() } } - fun getRateInfo(ctx: TangemContext): LiveData { - this.ctx = ctx + fun getRateInfo(): LiveData { return rate } - private fun requestRateInfo() { - serverApiCommon.setRateInfoListener { - val rate = it.priceUsd.toFloat() - this.rate.value = rate - } - // TODO - move requestRateInfo to CoinEngine + fun requestRateInfo(ctx: TangemContext) { + this.ctx = ctx + // TODO - move loadRateInfo to CoinEngine val cryptoId: String = when (ctx.blockchain) { Blockchain.Bitcoin -> "bitcoin" Blockchain.BitcoinTestNet -> "bitcoin" @@ -58,8 +43,10 @@ class LoadedWalletViewModel : ViewModel() { serverApiCommon.requestRateInfo(cryptoId) } - override fun onCleared() { - super.onCleared() -// getRateInfo(ctx).removeObservers() + private fun loadRateInfo() { + serverApiCommon.setRateInfoListener { + val rate = it.priceUsd.toFloat() + this.rate.value = rate + } } } \ No newline at end of file