* Adopt SDK 1.10.0 API changes
* Rename ShieldedSapling -> LegacySapling
* Viewing key re-derived for fix fixture value
* Changes used API for retrieving Transparent address
- Switched API DerivationTool.deriveTransparentAddress() -> Synchronizer.getLegacyTransparentAddress()
- Renamed Transparent -> LegacyTransparent
* Adds new common transaction model class
- Synchronizer.toTransactions() now works only with clearedTransactions and pendingTransactions
-Added CommonTransaction wrapper for all attributes of PendingTransaction and TransactionOverview to cover as much as possible. It's prepared for discussion about which attributes we really need and which we can omit.
* Regeneration of addresses in fixture
- Applies for both Transparent and Sapling addresses
- Fixed related test
- Added a new test for checking Transparent address abbreviation, as it also serves as a little check of the fixture address and can prevent an incorrect address change in the future
* Remove Viewing key usage from entire app
- As we agreed that the app should not access to it now
- Removed from all related places
* Change CommonTransaction to sealed class
* Comments update
* Switch SDK to 1.10.0-beta01-SNAPSHOT version
* Revert back legacy naming on Transparent and Sapling addresses
* Increased timeout limit to satisfy SDK initialization
* Remove unused import
* [#653] Move copy to buffer action
- Trigger this action after seed phrase panel click and confirm via dialog window
- Added basic ui tests
- Added also dialog integration test
- Added related strings
* Revert "[#653] Move copy to buffer action"
This reverts commit 813eab00b747a779be5ef652745002f65c04572c.
* [#150] Refactoring the Backup flow to use Compose Scaffold
* Fix Backup flow screenshot test
- Removed scroll actions above nodes, which are no longer part of scroll behaviour - bottom navigation buttons are now part of Compose Scaffold component.
* Added scroll actions in screenshot test of Profile screen
- After tested the whole app with screenshot test on smaller screen device 4WVGA Nexus S
* Remove unnecessary screenshot test click action
- This click action on the Profile screen title seems to be unnecessary for the test and creates confusion
* ScreenshotTest module auto components init
- Changed the way we auto-initialize components in ScreenshotTest module
- Now we use androidx-startup library for it
- And we disabled the default way
* Add system back button navigation support
* Enable scrolling for Backup Test screen
* Fix Screenshot test on small screen in landscape
- Tested and fixed cases in which our screenshot test wasn't successful
- Tested on 4 WVGA Nexus S in landscpae mode
* Code clean
* Address review comments + stages refactoring
- Flattened BackupStage sealed class. Test and Failure are now regular stages.
- Introduced CheckSeed stage, instead of reusing Seed phrase for re-viewing.
- Simplified BackupView and custom Saver implementations.
- List of possible screen state stages is now lazy loaded value, instead of method.
- Some of the stages now override stage moving methods to enhance Backup screen state machine, as it's not linear.
- Existing tests updated to align with the new implementation of stages.
* Remove `run` block
* Rename CheckSeed -> ReviewSeed
Check might imply to another reader of the code that there is some going back to the test. I went with the word Review which seems to better convey how that screen is passive for the user.
* Simplify list construction
This should have better performance.
* Crash instead of allowing back navigation
* Add documentation
* Fix initialization error
* Add non-localized string tag
Co-authored-by: Carter Jernigan <git@carterjernigan.com>
* Temporary enable FTL test
* Enable emulator.wft tests for ui-integration-test module on CI
* Test Fladle configuration for ui-integration-test module
* Fix Fladle for ui-integration-test module
* Rename ui-integration-test module flade configuration
* Disable again FTL action from PRs
* Clear support for FTL from ui-integration-test module
* Refactor the emulator.wtf support across our modules.
* [#598] Refactoring ScreenshotTest to a separate test module
- Created a new com.android.test module
- Moved our ScreenShotTest to the separate module
- Enabled the new module for emulator.wtf service
- Cleaned up the app module from ScreenShotTest
- Updated Architecture and Setup documentation
* Exclude pure test modules from Detekt check
* Improved run configurations
- Changed common emulator.wtf run configuration name to align with the rest of our configurations
- Added configuration for the new screenshot tests module
- Updated documentation
* Linked code TODO
* Disabled self-instrumenting
- As it appeared to be the way how to leverage the app module Gradle settings in this new module
- App name is taken from app module settings
- Screenshot tests works with pseudolocales again
* fixed onboarding top bar
* fixed onboarding top bar
* fixed onboarding top bar
* fixed onboarding top bar
* fixed onboarding top bar
* Fix tests
Co-authored-by: Carter Jernigan <git@carterjernigan.com>
* [#174]added warning screen + StorageChecker.kt
* [#174]added warning screen + StorageChecker.kt
* added manual test
* added manual test
* [#573] Include free disk space in the Contact Support information
* resolved merge conflicts
* code review fixes
* [#573] Include free disk space in the Contact Support information
* added vector drawable
* fixed merge issues
* fixed support info test
* code review fixes
* SupportInfoTest fix
* Remove trailing comma
Co-authored-by: Carter Jernigan <git@carterjernigan.com>
* [#591] Fix getSurfaces() crash on FTL Robo
- Updated version of the CameraX dependency and filed issue to Google
* Add logging bind camera failure to console
* [#167] Increase brightness when displaying QR Code
* Use collectWith(lifecycleScope)
* Fix copy-paste errors
* manual test
Co-authored-by: Carter Jernigan <git@carterjernigan.com>
* [#551] Prevent screenshots when seed phrase is displayed on the screen
* Minor review changes
Make ScreenSecurity object simpler by eliminating additional ways of mutating its state.
* Add debug and test checks
* secured screens with seed phrase
* codereview fixes
* added test for Seed screen
* added Screen security test for backup views
* test for ScreenSecurity class
* added manual testing for Screen security
* ktlint format
* Clean up ScreenSecurityTest
* Remove debug check
I decided this would be annoying, especially for manual testing
* ktlint
* removed test logging
* removed test logging
Co-authored-by: Carter Jernigan <git@carterjernigan.com>
This moves navigation to its own file, simplifies the MainActivity, and moves Android integration composables to their own files.
Navigation still does not have tests, so a separate change will need to be implemented to add testing to navigation.
Note that this change modifies the on-disk representation of the wallet. Anyone who has an earlier build install will see a runtime crash. This is expected, as we are not supporting data migrations at this stage of development. The solution is to uninstall/reinstall the app.
* [#310] [Scaffold] Progress Status Circular Bar
- Added Z to Home ZECs balance
- Added USD balance text to Home
- Prepared Text extension functions for both
- Provided Zatoshi to USD conversion methods + filed related SDK conversion issue
* Update Home screen UI with progress bars
- Implemented scaffolding UI of progress bars
- Added related texts to strings
* Update Home screen UI with progress bars
- Connected some of the implemented UI elements to SDK values
- Added app update information to Home screen
- Update WalletSnapshot with progress field
* Update Home screen UI with progress bars
- Capturing and handling errors from SDK Synchronizer.
- Added related error strings.
- Simplified Home screen UI.
* Zboto font added. Load it in runtime. Import to Typography.
* Updated ZEC sign icon.
* Draw ZEC balance with Zboto font
* Simplify Home screen balances assigning
* Switch to PercentDecimal progress representatiton
* Support different locales while working with fiat currency
* Fix bug in checking of fiat currency value
* Generalize strings to provide possibility of other fiat currencies
* Add fiat currency conversion states mechanism
* Add TODO comment with reference to follow up SynchronizerError issue
* Add WalletDisplayValues to simplify HomeView composable
* Add CurrencyConversion class for connection to Price API (and convert Zatoshi to fiat currency)
* Add basic HomeView tests
* Add basic HomeViewIntegration test
* Review changes
- Used Duration API for times
- Allow injecting clock into currency conversion
- Moved FiatCurrencyConversionRateState to sdk-ext-ui because I suspect that we’ll consider this to be a UI object. I based this on the fact that current/stale cutoff values are arbitrary and probably should be the domain of the UI rather than the SDK.
- Added some tests, although additional coverage is needed
- Added fixtures for model objects
* Minor code refactoring
- Move UpdateInfoFixture class to fixture dir
- Remove unnecessary annotation
- Add common application context method to test suite
- Fix Test class import
- Move several WalletSnapshotFixture parameters to const fields
* Add WalletDisplayValuesTest to cover the model class.
* Fix import after changes merged
* Use the new MonetarySeparatorsFixture in related tests
* Add a few basic Zatoshi -> USD conversion tests
* Turn on core lib desugaring for sdk-ext-ui-lib module
* Make WalletDisplayValues a data class
I think there may be some instances where this can help with recomposition
* Add preference key for fiat currency
This allows us to configure reading the value with observers correctly, even if we don’t allow the user to change it right now.
* Delegate symbol and formatting to JVM
* Add tests for Locale
Co-authored-by: Carter Jernigan <git@carterjernigan.com>
Since we have strict compiler warnings, the API deprecations in Android API 33 will fail our build. This change therefore:
- Bumps the compile SDK
- Adds helper extensions to use the new methods on Android 33+ and old methods for older Android versions. Although the functionality is the same, the wrappers will make it easier to eliminate legacy API calls in the future
- Disabled Gradle warning. #508 is a followup to remove this flag later.
- Refactor Update screen tests
Co-authored-by: Honza <rychnovsky.honza@gmail.com>
* [#416] Robo test blank screens
- Solve also debouncing issue on screens navigation
- Implemented with navigateJustOnce ext function on NavHostController, which compares actual and final destinations
- Add popBackStackJustOnce as an extension function to our navigation too
* [#209] Update Compose dependency to latest version 1.2.0-beta03
- Update dependency
- Align our integration tests with the new Compose requirements
- Add integration folder to tests, if missing
- Split integration tests, which require activity to separate classes
- Remove unnecessary custom activity for each integration app part and create one custom common activity
- Implement Downloadable fonts from Compose 1.2
- Update Third party licenses documentation
* [#312] [#309] Scaffold Scan QR Screen
- Screen scaffolding.
- Model classes.
- Screen states handling.
- Needed dependencies added.
- Camera permission handling. Redirect to Settings.
- Added SettingsUtilTest class.
- Added view classes tests.
- Renamed tag class in update package.
- Fix the scan frame size while changing the screen orientation.
- Use local variable for cameraProvider.
- Use UUID for source of randomness.
- Eliminate blocking call for camera.
- Fix preview name.
- Remove Google Guava dependency.
- Suppress Lint warning.
- Improved calculation of the camera frame size. Moved it into Constraint layout.
- Added custom image analyser class.
- Implemented logic for the QR scan screen while QR code is found.
- Manual tests added.
- New module with integration tests for QR Scan screen. Added 3 integration and 4 view tests.
- Simplify QR Scan screen view basic tests.
- Switched from pure compose permission handling to Accompanist way of handling CAMERA permission.
- Added validation of Zcash wallet address from QR scanning result.
- Fix the integration tests for the CI WTF emulator runs.
- Add comment on RTL test result.
- Improve waitForDeviceIdle() method. Use it on the other test too.
- Change the integration test module main manifest package name.
- Debounce scans.
- Improve thread safety of scan collection.
- Added instructions on how to set up an emulator in manual tests.
- Replace compose collectAsState() with coroutine launch().
- Add sample() to get rid of several callback events at the same time.
- Stop updating the scanState when it's already in Scanning state.
- Fix condition on navigation.
- Remove validateJob check.
- Speed up the integration test
- Wrap ImageAnalysis.qrCodeFlow to remember.
- Auto-close the camera image when we're done with it in all cases.
- Update minimal SDK version to 24 for WTF emulators.
- Update Architecture documentation.
- Removed extra blank space in ui-design module definition.
- Add ui-integration-test-lib.
- Update Mermaid diagram with newly added module.
- Move UI modules into one wrap in the diagram.
- Move sdk-ext-lib and sdk-ext-ui under the same modules section.
- Update camera dependencies.
Co-authored-by: Carter Jernigan <git@carterjernigan.com>
- Added automatic exception logging, registered in the Application object
- The design sends the exception to a second process, as the main process could be in a bad state when crashing. If we ever encounter problems with this design, it is easily toggleable to turn off with a boolean resource
- Reading the process name is a bit complex on older Android versions, so we leverage a ContentProvider (which runs prior to Application.onCreate()) to get the process name
- Added a simple logging mechanism for multiprocess and multithread log messages
- Refactored spackle-lib into spackle-lib (multiplatform) and spackle-android-lib
Co-authored-by: Honza <rychnovsky.honza@gmail.com>
* [#312] [#309] Scaffold Scan QR Screen
- Screen scaffolding.
- Model classes.
- Screen states handling.
- Needed dependencies added.
- Camera permission handling. Redirect to Settings.
- Added SettingsUtilTest class.
- Added view classes tests.
- Renamed tag class in update package.
- Fix the scan frame size while changing the screen orientation.
- Suppress Lint warning
Co-authored-by: Carter Jernigan <git@carterjernigan.com>
- Basic screen UI scaffolding.
- Set up communication with Google Play in-app update API.
- Mocking communication with Google Play API.
- Added unit, UI and integration tests for the in-app update screen model, util, view and viewmodel classes.
- Added mock implementation of helper AppUpdateChecker class.
- Introduced ViewModel integration test.
- Filed issue for future manual testing of implemented in-app update mechanisms after the wallet app is released on Google Play.
- Implement FakeAppUpdateManager in AppUpdateCheckerMock instead of the ugly AppUpdateInfo instantiation - this affected the tests too.
Co-authored-by: Carter Jernigan <git@carterjernigan.com>
This improves the reliability of UI tests, especially on physical devices, by helping ensure the screen is on.
Co-authored-by: Honza <rychnovsky.honza@gmail.com>
This provides a basic scaffold for the About screen. There are several followup issues:
- #392 update the in-app legal text
- #398 Add open source attributions
This provides a basic screen for users to type a support inquiery, which then opens a pre-filled message in the user’s email app.
There are a few followup issues:
- Detect seed phrases in the email #377
- Report crashes in the generated email #378
- Fuzz timestamps #388
- Set the correct support email address #379
- Improve handling on devices without an email app #386
- Check solution with Parcelable to the Index model class.
- Align implementation with lint checks.
- Implement custom Saver object.
- Add test cases for the new custom Saver.
- Add fixture for the new test cases.
- Remove testChoices form BackupVM and add rememberSaveable to BackupView.
- Enhance TestChoices.Saver save/store mechanisms.
- Add integration test class with 3 tests.
- Add new callback choices and onChoicesChanged to BackupWallet composable and BackupTestSetup class to be able to test save/restore mechanism of Backup-Test stage.
- Refactor WrapBackup.
- This is a new pattern that helps us share more logic between the using the test activity and the main activity, which makes the state retention tests more valid
- Co-authored-by: Carter Jernigan <git@carterjernigan.com>
- Created dedicated test activity for integration tests.
- Created Onboarding integration test class with two state restoration tests.
- Moved OnboardingTestSetup to its own class.
- Filed related issues.
- Scrolling enabled for screens from Backup and Profile parts of the app.
- UI tests improved to always scroll to the desired views before working with them.
- Changed order of conditions of automatic autocompletion.
- Added a test for validation of autocompletion functionality
- Changed type of test tag on ChipLayout component, as it seems its not necessary to have this one for proper component functionality. The one from the test package is needed here for the newly added test. And other screen components also use only those from the test package.
- Implementing regex solution for validation of input ZecAmount after confirm button is pressed.
- Added also unit tests for this new feature.
- Move necessary components from sdk-ext-lib to sdk-ext-ui module.
- Align implementation with comments form PR.
- Fix name of run configuration.
- Ensure consistent behavior of tests.
- Prevent illegal input in ZEC Send/Request form.
- New SDL-EXT-UI module for UI related SDK helper components.
- Regex for continuous validation of the entered ZEC amount.
- Added a new unit tests for validation of the regex too.
- Using the regex on ZEC Request and ZEC Send screens.
- Updated existing and created a new UI tests for validating entered ZEC amount values on Request and Send screens.
- Improve code to be validated with DetektAll static analyzation.
- Architecture documentation update with the newly added sdk-ext-ui module.
- Added run configuration sdk-ext-lib:connectedCheck for AS.
- Added check for digits count between grouping separators + tests.
- Refactoring test class name and its separator value.
- Includes Zip321UriBuildFixture for the toUri() method from the Rust layer.
- Includes Zip321UriParseFixture for the fromUri() method from the Rust layer.
- Added ZecRequestTest class for testing ZecRequest methods.
- Align Zip321UriBuildFixture and Zip321UriParseFixture parameters.
- Added comments to the new() methods of Zip321BuildFixture and Zip321ParseFixture.
This allows the app to consume the snapshot version of the SDK, which contains a number of API changes.
A followup issue of #279 was filed so that the app can be reverted to the release version of the SDK once the SDK API stabilizes again.
Implements a basic scaffold for sending ZEC.
Some new model objects and an extension method were added that I hope to move to the SDK.
Followup issues include
- Press-and-hold for the Send button #249
- Prevent illegal input in input form #218
- Prevent undefined behavior if locale changes #217
- Add error handling to the Zec send screen #250
- Add confirmation after send is created #252
This moves the theme and common UI elements to a separate Gradle module.
This is a first step towards creating our own custom design system, as it would eventually allow hiding of Material Design from the rest of the app UI.
As part of this change, a new common utility module was created so that both the ui and ui-design modules can depend on it.
Preliminary and limited version of background sync, with the following limitations
- Sync is always enabled
- Default sync period is 24 hours and is not updated once the wallet is created
This change refactors the synchronizer to a global singleton that both WorkManager and the UI can interact with.
Test Orchestrator must be enabled, so that screenshot generation can walk through the app like a newly registered user. The screenshots are stored outside of the app's storage directory, so that Test Orchestrator does not delete them. Because hard-coded paths are used, it is possible this could be brittle with future versions of Android
A future enhancement would be to also copy these screenshots off of tests run on Firebase Test Lab. This would likely involve configuring Fladle/Flank with additional directories to pull.
Settings which are not yet implemented have not been included to not introduce non-functional buttons into the UI.
Followup issue #38 covers one of the key settings, which is how we'll implement authorization in the app
Besides bumping the version, we can now integrate this plugin the same way we do the others. The version is now declared in the settings.gradle.kts.
The change is a bit noisy, due to needing to move our repository restrictions around.
Note that the SDK master branch contains breaking API changes, which the Secant app hasn't yet been updated to support, so enabling an included build will have compile failures.
Implements a details screen showing various wallet addresses
Some known issues requiring followup in future pull requests:
- #159 Colors for light theme have not been defined yet
- #160 Color blocks have 2x borders along the top/bottom of the middle item
- #161 Some address types display placeholder values
This provides a very basic scaffold of the home screen and navigation to other child screens. Additional work needs to be done in both the SDK and this app to build all of the functionality. Specific known gaps
- Displaying synchronization status to the user, pending full designs on the progress and animation behaviors
- Improved APIs for listing and filtering transactions. This is the issue in the SDK https://github.com/zcash/zcash-android-wallet-sdk/issues/242
- Implement the UI for displaying transaction history
- Display fiat currency values
- Hook up buttons to navigate to other screens (scan #137, profile #145, send #134, request #135)
In addition to the UI, this implements improved state management for the WalletViewModel which emits a sealed class now.
Work remaining for followup PRs:
- Use drag-and-drop for chips instead of dropdown menus #85
- Add red background color for test fail screen #86
- Add images for various screens (depends on #66#64)
- Implement copy to clipboard #49
This sets up the infrastructure needed to continue implementing the onboarding UI for create and import of wallets. By fleshing out the global state management in the app now, we can better manage asynchronous IO to avoid blocking the UI.
This adds:
- Load and persistence a wallet in encrypted preferences
- The stored data is written as a single JSON object, as opposed to multiple entries, to ensure atomic writes
- The data is versioned, so that we can change the JSON format readily in the future
- Detection of application state, e.g. onboarding versus loading the user's wallet
- Touch points to initialize the SDK
Known issues
- We cannot use downloadable fonts with Compose, so the fonts must be embedded with the app
Questions
- How does the transparent button show a disabled state?
- Are the navigation buttons and secondary buttons supposed to be effectively the same style but one is smaller?
TODO
- Add gradients. Gradients are not implemented for background, progress bar, etc. Currently they simply use the start color for the gradient
- Icons are using Material Icons, pending decision on how to leverage the vectors in the design
- Add the border for hero images
- Add shapes for the callout, which is currently square
- Add padding
- Add drop shadows
- Double-check colors for correctness
This implements the logical flow between the onboarding stages, as well as nearly full test coverage of the flow.
There's a lot of followup work, especially to implement design styles. It currently contains various placeholder values, e.g. lorem ipsum text and color blocks instead of images. See #17