package cash.z.ecc.android.sdk.demoapp.demos.getblockrange import android.os.Bundle import android.view.LayoutInflater import android.view.View import cash.z.ecc.android.sdk.demoapp.BaseDemoFragment import cash.z.ecc.android.sdk.demoapp.R import cash.z.ecc.android.sdk.demoapp.databinding.FragmentGetBlockRangeBinding import cash.z.ecc.android.sdk.demoapp.ext.requireApplicationContext import cash.z.ecc.android.sdk.demoapp.util.fromResources import cash.z.ecc.android.sdk.demoapp.util.mainActivity import cash.z.ecc.android.sdk.model.ZcashNetwork import kotlin.math.max /** * Retrieves a range of compact block from the lightwalletd server and displays basic information * about them. This demonstrates the basic ability to connect to the server, request a range of * compact block and parse the response. This could be augmented to display metadata about certain * block ranges for instance, to find the block with the most shielded transactions in a range. */ class GetBlockRangeFragment : BaseDemoFragment() { // TODO [#973]: Eliminate old UI demo-app // TODO [#973]: https://github.com/zcash/zcash-android-wallet-sdk/issues/973 @Suppress("MaxLineLength", "MagicNumber", "UNUSED_PARAMETER") /* private fun setBlockRange(blockRange: ClosedRange) { val start = System.currentTimeMillis() val range = BlockHeightUnsafe(blockRange.start.value)..BlockHeightUnsafe(blockRange.endInclusive.value) val response = lightWalletClient?.getBlockRange(range) val blocks = when (response) { is Response.Success -> { Twig.debug { "Get blocks: ${response.result} for range: $range succeeded." } response.result } else -> { Twig.debug { "Get blocks for range: $range failed with: $response." } null } } val fetchDelta = System.currentTimeMillis() - start // Note: This is a demo so we won't worry about iterating efficiently over these blocks // Note: Converting the blocks sequence to a list can consume a lot of memory and may // cause OOM. binding.textInfo.text = HtmlCompat.fromHtml( blocks?.toList()?.run { val count = size val processTime = System.currentTimeMillis() - start - fetchDelta var totalSaplingOutputCount: UInt = 0u var totalOrchardOutputCount: UInt = 0u forEach { totalSaplingOutputCount += it.saplingOutputsCount totalOrchardOutputCount += it.orchardOutputsCount } @Suppress("MaxLineLength", "MagicNumber") """ total blocks: ${count.withCommas()}
fetch time: ${if (fetchDelta > 1000) "%.2f sec".format(fetchDelta / 1000.0) else "%d ms".format(fetchDelta)}
process time: ${if (processTime > 1000) "%.2f sec".format(processTime / 1000.0) else "%d ms".format(processTime)}
block time range: ${first().time.toRelativeTime(requireApplicationContext())}
   to ${last().time.toRelativeTime(requireApplicationContext())}
total sapling outputs: $totalSaplingOutputCount
total orchard outputs: $totalOrchardOutputCount """.trimIndent() } ?: "No blocks found in that range.", HtmlCompat.FROM_HTML_MODE_LEGACY ) } */ private fun onApply(unused: View) { val network = ZcashNetwork.fromResources(requireApplicationContext()) val start = max( binding.textStartHeight.text.toString().toLongOrNull() ?: network.saplingActivationHeight.value, network.saplingActivationHeight.value ) val end = max( binding.textEndHeight.text.toString().toLongOrNull() ?: network.saplingActivationHeight.value, network.saplingActivationHeight.value ) if (start <= end) { @Suppress("TooGenericExceptionCaught") try { with(binding.buttonApply) { isEnabled = false setText(R.string.loading) binding.textInfo.setText(R.string.loading) post { // TODO [#973]: Eliminate old UI demo-app // TODO [#973]: https://github.com/zcash/zcash-android-wallet-sdk/issues/973 // setBlockRange( // BlockHeight.new(network, start)..BlockHeight.new( // network, // end // ) // ) isEnabled = true setText(R.string.apply) } } } catch (t: Throwable) { setError(t.toString()) } } else { setError("Invalid range") } mainActivity()?.hideKeyboard() } private fun setError(message: String) { binding.textInfo.text = "Error: $message" } // // Android Lifecycle overrides // override fun onViewCreated( view: View, savedInstanceState: Bundle? ) { super.onViewCreated(view, savedInstanceState) binding.buttonApply.setOnClickListener(::onApply) } // // Base Fragment overrides // override fun inflateBinding(layoutInflater: LayoutInflater): FragmentGetBlockRangeBinding = FragmentGetBlockRangeBinding.inflate(layoutInflater) override fun onActionButtonClicked() { super.onActionButtonClicked() } }