zcash-android-wallet-sdk/demo-app
Carter Jernigan c0a2c11418
[#615] Refactor lightwalletd client
* [#615] Refactor lightwalletd client

This moves the lightwalletd client code to a separate Gradle module, but does not yet do much clean up the public API (e.g. hiding generated GRPC objects).  That will be a followon change via #673

I’ve prototyped a safer version of the API that would be implemented for #673 for two specific calls: obtaining the current block height and obtaining the light wallet info.  These were the easiest endpoints to update and they provide a useful exploration for the future changes needed.

* Fix benchmarking for networking module

- Moved to fixture and build type check components to the new networking module, so it's accessible from all needed parts of the projects
- Changed fixture return type to fit to all needed usages

* Align with previous review comment

* Fix wrong merge

* Add basic sanity test

- To satisfy tests requirements on emulators.wtf service

* Remove grpc dependency from sdk-lib module

* Repackage cash.z.wallet.sdk.rpc to cash.z.wallet.sdk.internal.rpc

* Fix BuildConfig path

* Update demo-app paths to rpc

* Fix broken grpc services locations

- Our aim here is to change only the local services location (package name), the server location can't be changed due to backward compatibility.

* Enhance GRPC Response model

* Adopt enhanced GRPC response model

- Adopted in a few endpoints

* Enhance Connection failure type

* Add simple fixture test

* Refactor fetchTransaction() to work with Response

- Refactored this server call to adopt our new Response mechanism
- GrpsStatusResolver.resolveFailureFromStatus() now accepts Throwable input
- Added Response.Failure.toThrowable() to satisfy subsequent server calls results processing
- A few other minor refactoring changes

* Remove commented out log

* Unify return type of collection returning methods

- Switched fetchUtxos() to return Sequence instead of List
- Added a check on empty tAddress input

* fetchUtxos returns flow

- Switched fetchUtxos() to return Flow of Service.GetAddressUtxosReply
- Internally it calls getAddressUtxosStream() instead of getAddressUtxos() from GRPC layer

* Update unsafe suffix documentation

* Address several minor change requests

* Remove code parameter

- Removed from the locally triggered failures with default codes.

* Rename local variable

* Switch from empty response to exception

- Our server calls now rather throw IllegalArgumentException than return an empty response
- Removed commented out log message
- Updated javadocs

* Update proto files

- Plus related api changes adoption

* Unify new clients instances name

* AGP 7.4.0 changes

-  packagingOptions -> androidComponents in sdk-lib and lightwallet-client-lib modules

* SDK version bump

* Response resolver tests

* Release build upload timeout increase

* Release build upload timeout increase fix

* Revert timeout

- As Github has some infrastructure troubles and we need to wait

* Add migrations documentation

* Sort packaging filters

* Remove private field from public documentation

* Hide private variables

* Remove package from Android Manifest

* Throw exception instead of custom error

- This step unify our approach to validation on client side across all server calls

* Replace setAddresses index const with number

* Fix indentation in proto file

---------

Co-authored-by: Honza <rychnovsky.honza@gmail.com>
2023-02-01 11:14:55 +01:00
..
assets [#255] Refactor Gradle Modules 2021-08-31 14:53:25 -04:00
src [#615] Refactor lightwalletd client 2023-02-01 11:14:55 +01:00
README.md [#255] Refactor Gradle Modules 2021-08-31 14:53:25 -04:00
build.gradle.kts [#631] Improve demo app compose UI for testing 2023-01-09 10:42:38 -05:00
lint-baseline.xml [#343] Store database files in no_backup folder 2022-08-12 11:05:00 -04:00
proguard-project.txt [#862] Disable logging with ProGuard for Demo-app 2023-01-05 08:56:26 +01:00

README.md

Android demo app

This is a demo app that exercises code in https://github.com/zcash/zcash-android-wallet-sdk, which has all the Android-related functionalities necessary to build a mobile Zcash shielded wallet.

It relies on Lightwalletd, a backend service that provides a bandwidth-efficient interface to the Zcash blockchain. There is an equivalent iOS demo app.

Contents

Requirements

The demo app is built in Kotlin, and targets API 21. The demo pulls the pre-built SDK from jcenter so, unlike the SDK, it does not require Rust or the NDK!

Back to contents

Installation

In short, you simply will need to:

  1. (pre-requisite) Install Android Studio and setup an emulator or device
  2. Clone this repo: https://github.com/zcash/zcash-android-wallet-sdk
  3. Open the demo-app folder in Android Studio and launch the app
    (recommended build variant: zcashmainnetDebug)

Back to contents

Exploring the demo app

After building the app, the emulator should launch with a basic app that exercises the SDK (see picture below). To explore the app, click on each menu item, in order, and also look at the associated code.

The android demo app, running in Android Studio

The demo app is not trying to show what's possible, but to present how to accomplish the building blocks of wallet functionality in a simple way in code. It is comprised of the following self-contained demos. All data is reset between demos in order to keep the behavior repeatable and independent of state.

Demos

Menu Item Related Code Description
Get Private Key GetPrivateKeyFragment.kt Given a seed, display its viewing key and spending key
Get Address GetAddressFragment.kt Given a seed, display its z-addr
Get Balance GetBalanceFragment.kt Display the balance
Get Latest Height GetLatestHeightFragment.kt Given a lightwalletd server, retrieve the latest block height
Get Block GetBlockFragment.kt Given a lightwalletd server, retrieve a compact block
Get Block Range GetBlockRangeFragment.kt Given a lightwalletd server, retrieve a range of compact blocks
List Transactions ListTransactionsFragment.kt Given a seed, list all related shielded transactions
Send SendFragment.kt Send and monitor a transaction, the most complex demo

Back to contents

Getting started

Were assuming you already have a brilliant app idea, a vision for the apps UI, and know the ins and outs of the Android lifecycle. Well just stick to the Zcash app part of “getting started.”

Similarly, the best way to build a functioning Zcash shielded app is to implement the functionalities that are listed in the demo app, in roughly that order:

  1. Generate and safely store your private key.
  2. Get the associated address, and display it to the user on a receive screen. You may also want to generate a QR code from this address.
  3. Make sure your app can talk to the lightwalletd server and check by asking for the latest height, and verify that its current with the Zcash network.
  4. Try interacting with lightwalletd by fetching a block and processing it. Then try fetching a range of blocks, which is much more efficient.
  5. Now that you have the blocks process them and list transactions that send to or are from that wallet, to calculate your balance.
  6. With a current balance (and funds, of course), send a transaction and monitor its transaction status and update the UI with the results.

Back to contents

Resources

You dont need to do it all on your own.

Back to contents