From 325eadd99887d02b18cae1aabffabf586106142c Mon Sep 17 00:00:00 2001 From: Benjamin Schulte Date: Wed, 18 Aug 2021 18:23:47 +0200 Subject: [PATCH 1/7] Newer okhttp version to avoid StrictMode policy violation --- app/build.gradle | 4 ++++ gradle/verification-metadata.xml | 11 ++++++++--- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 11152166f..9d212c79c 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -119,6 +119,10 @@ dependencies { implementation('com.journeyapps:zxing-android-embedded:4.2.0') + // newer okhttp version than pulled from dependencies to avoid StrictMode policy violation + implementation("com.squareup.okhttp3:okhttp:3.12.13") + implementation("com.squareup.okhttp3:okhttp-urlconnection:3.12.13") + testImplementation 'junit:junit:4.13.2' androidTestImplementation 'androidx.test.ext:junit:1.1.2' androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' diff --git a/gradle/verification-metadata.xml b/gradle/verification-metadata.xml index c4da4f5ad..88fcb3427 100644 --- a/gradle/verification-metadata.xml +++ b/gradle/verification-metadata.xml @@ -868,9 +868,14 @@ - - - + + + + + + + + From cf35ea4573aa62b529448fb2209a8862080b6a3f Mon Sep 17 00:00:00 2001 From: Benjamin Schulte Date: Wed, 18 Aug 2021 19:35:13 +0200 Subject: [PATCH 2/7] Better accuracy for token amount, relates #6 --- .../android/transactions/SendFundsFragmentDialog.kt | 7 ++----- app/src/main/java/org/ergoplatform/android/ui/UiUtils.kt | 8 ++++++++ 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/org/ergoplatform/android/transactions/SendFundsFragmentDialog.kt b/app/src/main/java/org/ergoplatform/android/transactions/SendFundsFragmentDialog.kt index 4d62498a6..adb2ab251 100644 --- a/app/src/main/java/org/ergoplatform/android/transactions/SendFundsFragmentDialog.kt +++ b/app/src/main/java/org/ergoplatform/android/transactions/SendFundsFragmentDialog.kt @@ -24,10 +24,7 @@ import com.google.zxing.integration.android.IntentIntegrator import org.ergoplatform.android.* import org.ergoplatform.android.databinding.FragmentSendFundsBinding import org.ergoplatform.android.databinding.FragmentSendFundsTokenItemBinding -import org.ergoplatform.android.ui.FullScreenFragmentDialog -import org.ergoplatform.android.ui.PasswordDialogCallback -import org.ergoplatform.android.ui.hideForcedSoftKeyboard -import org.ergoplatform.android.ui.inputTextToFloat +import org.ergoplatform.android.ui.* import org.ergoplatform.android.wallet.WalletTokenDbEntity import kotlin.math.pow @@ -360,7 +357,7 @@ class SendFundsFragmentDialog : FullScreenFragmentDialog(), PasswordDialogCallba override fun afterTextChanged(s: Editable?) { viewModel.setTokenAmount( token.tokenId!!, - (inputTextToFloat(s?.toString()) * 10f.pow(token.decimals!!)).toLong() + (inputTextToDouble(s?.toString()) * 10.0.pow(token.decimals!!)).toLong() ) binding.labelTokenAmountError.visibility = View.GONE } diff --git a/app/src/main/java/org/ergoplatform/android/ui/UiUtils.kt b/app/src/main/java/org/ergoplatform/android/ui/UiUtils.kt index 6b36bda6c..7165b5b4d 100644 --- a/app/src/main/java/org/ergoplatform/android/ui/UiUtils.kt +++ b/app/src/main/java/org/ergoplatform/android/ui/UiUtils.kt @@ -34,6 +34,14 @@ fun inputTextToFloat(amountStr: String?): Float { } } +fun inputTextToDouble(amountStr: String?): Double { + try { + return if (amountStr == null || amountStr.isEmpty()) 0.0 else amountStr.toDouble() + } catch (t: Throwable) { + return 0.0 + } +} + /** * prevents crashes when a button is tapped twice, see * https://stackoverflow.com/questions/51060762/illegalargumentexception-navigation-destination-xxx-is-unknown-to-this-navcontr From f7b2a09ec45bab25a59252345d416afe79009bb2 Mon Sep 17 00:00:00 2001 From: Benjamin Schulte Date: Wed, 18 Aug 2021 23:42:29 +0200 Subject: [PATCH 3/7] Send funds from deep links, closes #23 --- app/src/main/AndroidManifest.xml | 2 +- .../org/ergoplatform/android/MainActivity.kt | 6 + .../java/org/ergoplatform/android/QRUtils.kt | 70 ++++++------ .../ChooseSpendingWalletFragmentDialog.kt | 93 +++++++++++++++ .../transactions/SendFundsFragmentDialog.kt | 2 +- .../transactions/SendFundsViewModel.kt | 16 ++- .../org/ergoplatform/android/ui/UiUtils.kt | 6 +- .../fragment_send_funds_wallet_chooser.xml | 107 ++++++++++++++++++ ...ragment_send_funds_wallet_chooser_item.xml | 34 ++++++ .../main/res/navigation/mobile_navigation.xml | 36 ++++-- app/src/main/res/values/strings.xml | 2 + 11 files changed, 327 insertions(+), 47 deletions(-) create mode 100644 app/src/main/java/org/ergoplatform/android/transactions/ChooseSpendingWalletFragmentDialog.kt create mode 100644 app/src/main/res/layout/fragment_send_funds_wallet_chooser.xml create mode 100644 app/src/main/res/layout/fragment_send_funds_wallet_chooser_item.xml diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 292e0a4db..36c2ce703 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -23,9 +23,9 @@ android:windowSoftInputMode="adjustResize"> - + = HashMap() + return parseContentFromQuery(uriWithoutPrefix) - uriWithoutPrefix.split('&').forEach { - if (it.startsWith(RECIPIENT_PARAM_PREFIX)) { - address = - URLDecoder.decode(it.substring(RECIPIENT_PARAM_PREFIX.length), URI_ENCODING) - } else if (it.startsWith(AMOUNT_PARAM_PREFIX)) { - amount = URLDecoder.decode(it.substring(AMOUNT_PARAM_PREFIX.length), URI_ENCODING) - .toFloatOrNull() ?: 0f - } else if (it.startsWith(DESCRIPTION_PARAM_PREFIX)) { - description = - URLDecoder.decode(it.substring(DESCRIPTION_PARAM_PREFIX.length), URI_ENCODING) - } else if (it.contains('=')) { - // this could be a token - val keyVal = it.split("=") - try { - val tokenId = keyVal.get(0) - val tokenAmount = keyVal.get(1).toDouble() - tokenMap.put(tokenId, tokenAmount) - } catch (t: Throwable) { - // in this case, we haven't found a token :) - } - } - } + } else if (isValidErgoAddress(qrCode)) { + return QrCodeContent(qrCode) + } else { + return null + } +} + +fun parseContentFromQuery(query: String): QrCodeContent? { + var address: String? = null + var amount = 0f + var description = "" + val tokenMap: HashMap = HashMap() - if (address != null) { - return QrCodeContent(address!!, amount, description, tokenMap) - } else { - // no recipient, no sense - return null + query.split('&').forEach { + if (it.startsWith(RECIPIENT_PARAM_PREFIX)) { + address = + URLDecoder.decode(it.substring(RECIPIENT_PARAM_PREFIX.length), URI_ENCODING) + } else if (it.startsWith(AMOUNT_PARAM_PREFIX)) { + amount = URLDecoder.decode(it.substring(AMOUNT_PARAM_PREFIX.length), URI_ENCODING) + .toFloatOrNull() ?: 0f + } else if (it.startsWith(DESCRIPTION_PARAM_PREFIX)) { + description = + URLDecoder.decode(it.substring(DESCRIPTION_PARAM_PREFIX.length), URI_ENCODING) + } else if (it.contains('=')) { + // this could be a token + val keyVal = it.split('=') + try { + val tokenId = keyVal.get(0) + val tokenAmount = keyVal.get(1).toDouble() + tokenMap.put(tokenId, tokenAmount) + } catch (t: Throwable) { + // in this case, we haven't found a token :) + } } + } - } else if (isValidErgoAddress(qrCode)) { - return QrCodeContent(qrCode) + if (address != null) { + return QrCodeContent(address!!, amount, description, tokenMap) } else { + // no recipient, no sense return null } } diff --git a/app/src/main/java/org/ergoplatform/android/transactions/ChooseSpendingWalletFragmentDialog.kt b/app/src/main/java/org/ergoplatform/android/transactions/ChooseSpendingWalletFragmentDialog.kt new file mode 100644 index 000000000..3af1bcba0 --- /dev/null +++ b/app/src/main/java/org/ergoplatform/android/transactions/ChooseSpendingWalletFragmentDialog.kt @@ -0,0 +1,93 @@ +package org.ergoplatform.android.transactions + +import android.os.Bundle +import android.view.LayoutInflater +import android.view.View +import android.view.ViewGroup +import androidx.navigation.NavOptions +import androidx.navigation.fragment.NavHostFragment +import org.ergoplatform.android.AppDatabase +import org.ergoplatform.android.R +import org.ergoplatform.android.databinding.FragmentSendFundsWalletChooserBinding +import org.ergoplatform.android.databinding.FragmentSendFundsWalletChooserItemBinding +import org.ergoplatform.android.nanoErgsToErgs +import org.ergoplatform.android.parseContentFromQuery +import org.ergoplatform.android.ui.FullScreenFragmentDialog +import org.ergoplatform.android.ui.navigateSafe + + +/** + * Deep link to send funds: Choose wallet to spend from + */ +class ChooseSpendingWalletFragmentDialog : FullScreenFragmentDialog() { + + private var _binding: FragmentSendFundsWalletChooserBinding? = null + + // This property is only valid between onCreateDialog and + // onDestroyView. + private val binding get() = _binding!! + + override fun onCreateView( + inflater: LayoutInflater, container: ViewGroup?, + savedInstanceState: Bundle? + ): View { + _binding = FragmentSendFundsWalletChooserBinding.inflate(inflater, container, false) + // Inflate the layout for this fragment + return binding.root + } + + override fun onViewCreated(view: View, savedInstanceState: Bundle?) { + super.onViewCreated(view, savedInstanceState) + val query = requireActivity().intent.data?.encodedQuery + + if (query == null) { + dismiss() + return + } + + val content = parseContentFromQuery(query) + binding.receiverAddress.text = content?.address + binding.grossAmount.amount = content?.amount ?: 0f + + AppDatabase.getInstance(requireContext()).walletDao().getWalletsWithStates() + .observe(viewLifecycleOwner, { + binding.listWallets.removeAllViews() + + if (it.size == 1) { + // immediately switch to send funds screen + navigateToSendFundsScreen(it.first().walletConfig.id, true) + } + it.forEach { wallet -> + val itemBinding = FragmentSendFundsWalletChooserItemBinding.inflate( + layoutInflater, binding.listWallets, true + ) + + itemBinding.walletBalance.amount = + nanoErgsToErgs(wallet.state.map { it.balance ?: 0 }.sum()) + itemBinding.walletName.text = wallet.walletConfig.displayName + + itemBinding.root.setOnClickListener { + navigateToSendFundsScreen(wallet.walletConfig.id, false) + } + } + }) + } + + private fun navigateToSendFundsScreen(walletId: Int, popThis: Boolean) { + val navBuilder = NavOptions.Builder() + val navOptions = + navBuilder.setPopUpTo(R.id.chooseSpendingWalletFragmentDialog, popThis).build() + + NavHostFragment.findNavController(requireParentFragment()) + .navigateSafe( + ChooseSpendingWalletFragmentDialogDirections.actionChooseSpendingWalletFragmentDialogToSendFundsFragment( + requireActivity().intent.data?.encodedQuery!!, walletId + ), navOptions + ) + } + + override fun onDestroyView() { + super.onDestroyView() + _binding = null + } +} \ No newline at end of file diff --git a/app/src/main/java/org/ergoplatform/android/transactions/SendFundsFragmentDialog.kt b/app/src/main/java/org/ergoplatform/android/transactions/SendFundsFragmentDialog.kt index adb2ab251..0364cb61b 100644 --- a/app/src/main/java/org/ergoplatform/android/transactions/SendFundsFragmentDialog.kt +++ b/app/src/main/java/org/ergoplatform/android/transactions/SendFundsFragmentDialog.kt @@ -52,7 +52,7 @@ class SendFundsFragmentDialog : FullScreenFragmentDialog(), PasswordDialogCallba override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - viewModel.initWallet(requireContext(), args.walletId) + viewModel.initWallet(requireContext(), args.walletId, args.paymentRequest) // Add observers viewModel.walletName.observe(viewLifecycleOwner, { diff --git a/app/src/main/java/org/ergoplatform/android/transactions/SendFundsViewModel.kt b/app/src/main/java/org/ergoplatform/android/transactions/SendFundsViewModel.kt index 7ff3f3798..d944b0dd5 100644 --- a/app/src/main/java/org/ergoplatform/android/transactions/SendFundsViewModel.kt +++ b/app/src/main/java/org/ergoplatform/android/transactions/SendFundsViewModel.kt @@ -65,7 +65,20 @@ class SendFundsViewModel : ViewModel() { private val _tokensChosenLiveData = MutableLiveData>() val tokensChosenLiveData: LiveData> = _tokensChosenLiveData - fun initWallet(ctx: Context, walletId: Int) { + fun initWallet(ctx: Context, walletId: Int, paymentRequest: String?) { + val firstInit = wallet == null + + // on first init, we read an send payment request. Don't do it again on device rotation + // to not mess with user inputs + val content: QrCodeContent? + if (firstInit) { + content = paymentRequest?.let { parseContentFromQuery(paymentRequest) } + content?.let { + receiverAddress = content.address + amountToSend = content.amount + } + } else content = null + viewModelScope.launch { val walletWithState = AppDatabase.getInstance(ctx).walletDao().loadWalletWithStateById(walletId) @@ -78,6 +91,7 @@ class SendFundsViewModel : ViewModel() { ?.let { _walletBalance.postValue(nanoErgsToErgs(it)) } tokensAvail.clear() walletWithState?.tokens?.let { tokensAvail.addAll(it) } + content?.let { addTokensFromQr(content.tokens) } notifyTokensChosenChanged() } calcGrossAmount() diff --git a/app/src/main/java/org/ergoplatform/android/ui/UiUtils.kt b/app/src/main/java/org/ergoplatform/android/ui/UiUtils.kt index 7165b5b4d..13790a9ea 100644 --- a/app/src/main/java/org/ergoplatform/android/ui/UiUtils.kt +++ b/app/src/main/java/org/ergoplatform/android/ui/UiUtils.kt @@ -23,7 +23,7 @@ fun hideForcedSoftKeyboard(context: Context, editText: EditText) { ContextCompat.getSystemService( context, InputMethodManager::class.java - )?.hideSoftInputFromWindow(editText.getWindowToken(), 0); + )?.hideSoftInputFromWindow(editText.getWindowToken(), 0) } fun inputTextToFloat(amountStr: String?): Float { @@ -60,6 +60,6 @@ fun NavController.navigateSafe( } } -fun NavController.navigateSafe(directions: NavDirections) { - navigateSafe(directions.actionId, directions.arguments) +fun NavController.navigateSafe(directions: NavDirections, navOptions: NavOptions? = null) { + navigateSafe(directions.actionId, directions.arguments, navOptions) } diff --git a/app/src/main/res/layout/fragment_send_funds_wallet_chooser.xml b/app/src/main/res/layout/fragment_send_funds_wallet_chooser.xml new file mode 100644 index 000000000..683a69b36 --- /dev/null +++ b/app/src/main/res/layout/fragment_send_funds_wallet_chooser.xml @@ -0,0 +1,107 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_send_funds_wallet_chooser_item.xml b/app/src/main/res/layout/fragment_send_funds_wallet_chooser_item.xml new file mode 100644 index 000000000..eaafbcc98 --- /dev/null +++ b/app/src/main/res/layout/fragment_send_funds_wallet_chooser_item.xml @@ -0,0 +1,34 @@ + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/navigation/mobile_navigation.xml b/app/src/main/res/navigation/mobile_navigation.xml index 3f40afed8..649f373f0 100644 --- a/app/src/main/res/navigation/mobile_navigation.xml +++ b/app/src/main/res/navigation/mobile_navigation.xml @@ -9,7 +9,7 @@ android:id="@+id/navigation_wallet" android:name="org.ergoplatform.android.wallet.WalletFragment" android:label="@string/title_wallet" - tools:layout="@layout/fragment_wallet" > + tools:layout="@layout/fragment_wallet"> @@ -74,7 +74,7 @@ android:id="@+id/restoreWalletFragmentDialog" android:name="org.ergoplatform.android.wallet.RestoreWalletFragmentDialog" android:label="fragment_restore_wallet" - tools:layout="@layout/fragment_restore_wallet" > + tools:layout="@layout/fragment_restore_wallet"> @@ -83,7 +83,7 @@ android:id="@+id/saveWalletFragmentDialog" android:name="org.ergoplatform.android.wallet.SaveWalletFragmentDialog" android:label="fragment_save_wallet_dialog" - tools:layout="@layout/fragment_save_wallet_dialog" > + tools:layout="@layout/fragment_save_wallet_dialog"> + tools:layout="@layout/fragment_receive_to_wallet"> @@ -106,15 +106,20 @@ android:id="@+id/sendFundsFragment" android:name="org.ergoplatform.android.transactions.SendFundsFragmentDialog" android:label="@string/button_send" - tools:layout="@layout/fragment_send_funds" > + tools:layout="@layout/fragment_send_funds"> + + android:label="AddReadOnlyWalletFragmentDialog"> @@ -123,7 +128,7 @@ android:id="@+id/walletConfigFragment" android:name="org.ergoplatform.android.wallet.WalletConfigFragment" android:label="fragment_wallet_config" - tools:layout="@layout/fragment_wallet_config" > + tools:layout="@layout/fragment_wallet_config"> @@ -132,7 +137,7 @@ android:id="@+id/confirmCreateWalletFragment" android:name="org.ergoplatform.android.wallet.ConfirmCreateWalletFragment" android:label="fragment_confirm_create_wallet" - tools:layout="@layout/fragment_confirm_create_wallet" > + tools:layout="@layout/fragment_confirm_create_wallet"> @@ -140,4 +145,19 @@ android:name="mnemonic" app:argType="string" /> + + + + + + \ 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 29e75bf73..d17c4ba17 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -95,6 +95,8 @@ Display mnemonic + Please choose the wallet to send from: + to Enter the receiver address and amount to send, or scan a QR code. From: %1s Balance: %1s ERG From 0a9d673f35dffa84d511afa1d153b414cdc6a0c6 Mon Sep 17 00:00:00 2001 From: Benjamin Schulte Date: Fri, 20 Aug 2021 14:20:16 +0200 Subject: [PATCH 4/7] Send funds from deep link: don't show read only wallets, catch NaN amounts from Ergo Explorer --- app/src/main/java/org/ergoplatform/android/QRUtils.kt | 3 +++ .../transactions/ChooseSpendingWalletFragmentDialog.kt | 10 +++++++--- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/org/ergoplatform/android/QRUtils.kt b/app/src/main/java/org/ergoplatform/android/QRUtils.kt index 740aeae11..17a5e47fc 100644 --- a/app/src/main/java/org/ergoplatform/android/QRUtils.kt +++ b/app/src/main/java/org/ergoplatform/android/QRUtils.kt @@ -69,6 +69,9 @@ fun parseContentFromQuery(query: String): QrCodeContent? { } else if (it.startsWith(AMOUNT_PARAM_PREFIX)) { amount = URLDecoder.decode(it.substring(AMOUNT_PARAM_PREFIX.length), URI_ENCODING) .toFloatOrNull() ?: 0f + if (amount.isNaN()) { + amount = 0f + } } else if (it.startsWith(DESCRIPTION_PARAM_PREFIX)) { description = URLDecoder.decode(it.substring(DESCRIPTION_PARAM_PREFIX.length), URI_ENCODING) diff --git a/app/src/main/java/org/ergoplatform/android/transactions/ChooseSpendingWalletFragmentDialog.kt b/app/src/main/java/org/ergoplatform/android/transactions/ChooseSpendingWalletFragmentDialog.kt index 3af1bcba0..98f759ca1 100644 --- a/app/src/main/java/org/ergoplatform/android/transactions/ChooseSpendingWalletFragmentDialog.kt +++ b/app/src/main/java/org/ergoplatform/android/transactions/ChooseSpendingWalletFragmentDialog.kt @@ -47,17 +47,21 @@ class ChooseSpendingWalletFragmentDialog : FullScreenFragmentDialog() { val content = parseContentFromQuery(query) binding.receiverAddress.text = content?.address - binding.grossAmount.amount = content?.amount ?: 0f + val amount = content?.amount ?: 0f + binding.grossAmount.amount = amount + binding.grossAmount.visibility = if (amount > 0f) View.VISIBLE else View.GONE AppDatabase.getInstance(requireContext()).walletDao().getWalletsWithStates() .observe(viewLifecycleOwner, { binding.listWallets.removeAllViews() - if (it.size == 1) { + val walletsWithoutReadonly = it.filter { it.walletConfig.secretStorage != null } + + if (walletsWithoutReadonly.size == 1) { // immediately switch to send funds screen navigateToSendFundsScreen(it.first().walletConfig.id, true) } - it.forEach { wallet -> + walletsWithoutReadonly.forEach { wallet -> val itemBinding = FragmentSendFundsWalletChooserItemBinding.inflate( layoutInflater, binding.listWallets, true ) From 8dddd610de2dc48acc188646f82b705f248e5eb9 Mon Sep 17 00:00:00 2001 From: Benjamin Schulte Date: Mon, 23 Aug 2021 20:30:42 +0200 Subject: [PATCH 5/7] Send funds from deep links: Fix problem when there are read-only wallets and only a single signing wallet Co-authored-by: Alexander Slesarenko --- .../android/transactions/ChooseSpendingWalletFragmentDialog.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/ergoplatform/android/transactions/ChooseSpendingWalletFragmentDialog.kt b/app/src/main/java/org/ergoplatform/android/transactions/ChooseSpendingWalletFragmentDialog.kt index 98f759ca1..356b91e43 100644 --- a/app/src/main/java/org/ergoplatform/android/transactions/ChooseSpendingWalletFragmentDialog.kt +++ b/app/src/main/java/org/ergoplatform/android/transactions/ChooseSpendingWalletFragmentDialog.kt @@ -59,7 +59,7 @@ class ChooseSpendingWalletFragmentDialog : FullScreenFragmentDialog() { if (walletsWithoutReadonly.size == 1) { // immediately switch to send funds screen - navigateToSendFundsScreen(it.first().walletConfig.id, true) + navigateToSendFundsScreen(walletsWithoutReadonly.first().walletConfig.id, true) } walletsWithoutReadonly.forEach { wallet -> val itemBinding = FragmentSendFundsWalletChooserItemBinding.inflate( From f1c892b1d4c351d2792d9af0df374bb09fd9791f Mon Sep 17 00:00:00 2001 From: Benjamin Schulte Date: Mon, 23 Aug 2021 20:45:28 +0200 Subject: [PATCH 6/7] Use isNullOrEmpty for inputTextToDouble --- app/src/main/java/org/ergoplatform/android/ui/UiUtils.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/org/ergoplatform/android/ui/UiUtils.kt b/app/src/main/java/org/ergoplatform/android/ui/UiUtils.kt index 13790a9ea..ce72f793f 100644 --- a/app/src/main/java/org/ergoplatform/android/ui/UiUtils.kt +++ b/app/src/main/java/org/ergoplatform/android/ui/UiUtils.kt @@ -36,7 +36,7 @@ fun inputTextToFloat(amountStr: String?): Float { fun inputTextToDouble(amountStr: String?): Double { try { - return if (amountStr == null || amountStr.isEmpty()) 0.0 else amountStr.toDouble() + return if (amountStr.isNullOrEmpty()) 0.0 else amountStr.toDouble() } catch (t: Throwable) { return 0.0 } From fb82c525b89060b0f07c90441ae888e771282495 Mon Sep 17 00:00:00 2001 From: Benjamin Schulte Date: Mon, 23 Aug 2021 20:50:28 +0200 Subject: [PATCH 7/7] Bump version to 1.2.2113 --- app/build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 9d212c79c..96a663fef 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -13,8 +13,8 @@ android { applicationId "org.ergoplatform.android" minSdkVersion 24 targetSdkVersion 30 - versionCode 2112 - versionName "1.2.2112" + versionCode 2113 + versionName "1.2.2113" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" }