From 5fb5773a7d85ed89ef5a9348d8662c0687147db6 Mon Sep 17 00:00:00 2001 From: Carter Jernigan Date: Wed, 2 Nov 2022 12:39:48 -0400 Subject: [PATCH] [#756] Improve funding testnet demo --- .../z/ecc/android/sdk/demoapp/MainActivity.kt | 20 +++++ .../demos/getaddress/GetAddressFragment.kt | 28 +++---- .../demos/getbalance/GetBalanceFragment.kt | 53 +++++++++---- .../main/res/layout/fragment_get_address.xml | 71 +++++++++++++---- .../main/res/layout/fragment_get_balance.xml | 77 +++++++++++++------ demo-app/src/main/res/menu/main.xml | 5 ++ demo-app/src/main/res/values/strings.xml | 4 + 7 files changed, 192 insertions(+), 66 deletions(-) diff --git a/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/MainActivity.kt b/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/MainActivity.kt index 5f7a9882..9eb5c017 100644 --- a/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/MainActivity.kt +++ b/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/MainActivity.kt @@ -2,6 +2,8 @@ package cash.z.ecc.android.sdk.demoapp import android.content.ClipboardManager import android.content.Context +import android.content.Intent +import android.net.Uri import android.os.Bundle import android.view.Menu import android.view.MenuItem @@ -83,6 +85,10 @@ class MainActivity : override fun onCreateOptionsMenu(menu: Menu): Boolean { // Inflate the menu; this adds items to the action bar if it is present. menuInflater.inflate(R.menu.main, menu) + + if (ZcashNetwork.Mainnet == ZcashNetwork.fromResources(applicationContext)) { + menu.findItem(R.id.action_faucet).isVisible = false + } return true } @@ -91,6 +97,11 @@ class MainActivity : val navController = findNavController(R.id.nav_host_fragment) navController.navigate(R.id.nav_home) true + } else if (item.itemId == R.id.action_faucet) { + runCatching { + startActivity(newBrowserIntent("https://faucet.zecpages.com/")) + } + true } else { super.onOptionsItemSelected(item) } @@ -157,3 +168,12 @@ class MainActivity : hideKeyboard() } } + +private fun newBrowserIntent(url: String): Intent { + val uri = Uri.parse(url) + val intent = Intent(Intent.ACTION_VIEW, uri).apply { + addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) + } + + return intent +} diff --git a/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getaddress/GetAddressFragment.kt b/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getaddress/GetAddressFragment.kt index 9813de7d..a83a879b 100644 --- a/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getaddress/GetAddressFragment.kt +++ b/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getaddress/GetAddressFragment.kt @@ -60,19 +60,21 @@ class GetAddressFragment : BaseDemoFragment() { private fun displayAddress() { viewLifecycleOwner.lifecycleScope.launchWhenStarted { - val uaddress = synchronizer.getCurrentAddress() - val sapling = synchronizer.getLegacySaplingAddress() - val transparent = synchronizer.getLegacyTransparentAddress() - binding.textInfo.text = """ - Unified Address: - $uaddress - - Legacy Sapling: - $sapling - - Legacy transparent: - $transparent - """.trimIndent() + binding.unifiedAddress.apply { + val uaddress = synchronizer.getCurrentAddress() + text = uaddress + setOnClickListener { copyToClipboard(uaddress) } + } + binding.saplingAddress.apply { + val sapling = synchronizer.getLegacySaplingAddress() + text = sapling + setOnClickListener { copyToClipboard(sapling) } + } + binding.transparentAddress.apply { + val transparent = synchronizer.getLegacyTransparentAddress() + text = transparent + setOnClickListener { copyToClipboard(transparent) } + } } } diff --git a/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getbalance/GetBalanceFragment.kt b/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getbalance/GetBalanceFragment.kt index 088be400..3131cc40 100644 --- a/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getbalance/GetBalanceFragment.kt +++ b/demo-app/src/main/java/cash/z/ecc/android/sdk/demoapp/demos/getbalance/GetBalanceFragment.kt @@ -17,12 +17,12 @@ import cash.z.ecc.android.sdk.model.LightWalletEndpoint import cash.z.ecc.android.sdk.model.WalletBalance import cash.z.ecc.android.sdk.model.ZcashNetwork import cash.z.ecc.android.sdk.model.defaultForNetwork -import kotlinx.coroutines.flow.filterNotNull /** * Displays the available balance && total balance associated with the seed defined by the default config. * comments. */ +@Suppress("TooManyFunctions") class GetBalanceFragment : BaseDemoFragment() { private lateinit var synchronizer: Synchronizer @@ -64,25 +64,40 @@ class GetBalanceFragment : BaseDemoFragment() { synchronizer.status.collectWith(lifecycleScope, ::onStatus) synchronizer.progress.collectWith(lifecycleScope, ::onProgress) synchronizer.processorInfo.collectWith(lifecycleScope, ::onProcessorInfoUpdated) - synchronizer.saplingBalances.filterNotNull().collectWith(lifecycleScope, ::onBalance) + synchronizer.orchardBalances.collectWith(lifecycleScope, ::onOrchardBalance) + synchronizer.saplingBalances.collectWith(lifecycleScope, ::onSaplingBalance) + synchronizer.transparentBalances.collectWith(lifecycleScope, ::onTransparentBalance) } - @Suppress("MagicNumber") - private fun onBalance(balance: WalletBalance) { - binding.textBalance.text = """ - Available balance: ${balance.available.convertZatoshiToZecString(12)} - Total balance: ${balance.total.convertZatoshiToZecString(12)} - """.trimIndent() + private fun onOrchardBalance( + orchardBalance: WalletBalance? + ) { + binding.orchardBalance.apply { + text = orchardBalance.humanString() + } + } + + private fun onSaplingBalance( + saplingBalance: WalletBalance? + ) { + binding.saplingBalance.apply { + text = saplingBalance.humanString() + } + } + + private fun onTransparentBalance( + transparentBalance: WalletBalance? + ) { + binding.transparentBalance.apply { + text = transparentBalance.humanString() + } } private fun onStatus(status: Synchronizer.Status) { binding.textStatus.text = "Status: $status" - val balance: WalletBalance? = synchronizer.saplingBalances.value - if (null == balance) { - binding.textBalance.text = "Calculating balance..." - } else { - onBalance(balance) - } + onOrchardBalance(synchronizer.orchardBalances.value) + onSaplingBalance(synchronizer.saplingBalances.value) + onTransparentBalance(synchronizer.transparentBalances.value) } @Suppress("MagicNumber") @@ -96,3 +111,13 @@ class GetBalanceFragment : BaseDemoFragment() { if (info.isScanning) binding.textStatus.text = "Scanning blocks...${info.scanProgress}%" } } + +@Suppress("MagicNumber") +private fun WalletBalance?.humanString() = if (null == this) { + "Calculating balance" +} else { + """ + Available balance: ${available.convertZatoshiToZecString(12)} + Total balance: ${total.convertZatoshiToZecString(12)} + """.trimIndent() +} diff --git a/demo-app/src/main/res/layout/fragment_get_address.xml b/demo-app/src/main/res/layout/fragment_get_address.xml index 53ae43b3..291e0748 100644 --- a/demo-app/src/main/res/layout/fragment_get_address.xml +++ b/demo-app/src/main/res/layout/fragment_get_address.xml @@ -1,21 +1,62 @@ - - + android:orientation="vertical"> - + + + + + + + + + + + + + + diff --git a/demo-app/src/main/res/layout/fragment_get_balance.xml b/demo-app/src/main/res/layout/fragment_get_balance.xml index 2a7d8e17..32430237 100644 --- a/demo-app/src/main/res/layout/fragment_get_balance.xml +++ b/demo-app/src/main/res/layout/fragment_get_balance.xml @@ -1,31 +1,60 @@ - + android:layout_height="match_parent" + android:orientation="vertical"> - + android:orientation="vertical"> - + - \ No newline at end of file + + + + + + + + + + + + + + diff --git a/demo-app/src/main/res/menu/main.xml b/demo-app/src/main/res/menu/main.xml index ef4d01c6..2b067540 100644 --- a/demo-app/src/main/res/menu/main.xml +++ b/demo-app/src/main/res/menu/main.xml @@ -7,4 +7,9 @@ android:orderInCategory="100" android:title="@string/action_settings" app:showAsAction="never" /> + diff --git a/demo-app/src/main/res/values/strings.xml b/demo-app/src/main/res/values/strings.xml index 9a0104e9..20848c7e 100644 --- a/demo-app/src/main/res/values/strings.xml +++ b/demo-app/src/main/res/values/strings.xml @@ -5,6 +5,7 @@ v1.1.0 Navigation header Change Seed Phrase + Testnet Faucet Home @@ -25,4 +26,7 @@ Load Apply ⌛ Loading + Unified address + Sapling address + Transparent address