- Automatically show the keyboard and focus the AutoCompleteTextView when the user selects 'Other...' in the Asset spinner, in the Receive screen.
- Created an extension function for EditText, which requests focus and shows the keyboard at the same time, so that the user can immediately start typing the desired text.
- Avoided a crash in ConnectedActivity when trying to obtain the Locale's associated currency, when a Locale does not have a currency.
- Standardized the process to obtain the coingecko supported currency, which will first try to use the current locale's currency and fallback to USD in case the first is not supported.
- Migrated the whole app to the new graphenej version, which removes the usage of the Android Service, enabling to aim for a better and simpler architecture.
- Did a good number of modifications to keep the same or better functionality in all parts of the app that use the NetworkService.
- In case the device is without connectivity, we cannot check in real time what the list of supported currencies is from the coingecko API. For this special corner cases we store a cache of this currency list.
- Added a new Earn more BTS card section to the Settings screen, above the Bugs or Ideas? one.
- Translated the new section string resources to all supported languages.
- Purging invalid entries of the 'equivalent_values' table
- Displaying whathever currency the user happen to have selected *at the moment*. The previous implementation had a flaw that would have made the currency that was used to calculate the equivalent values in first stick, even if the user changed to another locale settings later.
- Increased the margin of the QR codes generated in the Receive Transaction screen, so that they are easier to read using low end devices, specially when the app is in night mode.
- Only inserting an equivalent value into the database in case the value is equal non-negative (negative values are a result of errors)
- Using USD as fallback equivalent value currency
- For some reason if we use a memo longer than 107 chars we get an error, to avoid that error we are limiting the memo length to 100 chars using TextInputLayout's counter options to show the current char count and the max char count. If the current char count exceeds the max the TextInputLayout turns to red and the Send button is disabled.
- Modified the method that fetches the tellers from the webservice to keep requesting the tellers list until nothing is returned, to make sure the whole list of tellers is obtained.
- Modified the method that fetches the merchants from the webservice to keep requesting the merchants list until nothing is returned, to make sure the whole list of merchants is obtained.
- Modified the time the app waits to update the merchants and tellers list from 24 hours to just 3 hours.
- The crash was happening because the dialog that verifies the automatic time was being created in onResume, so if the user leaved the application while the fragment was showing and returned to it later another multiple dialogs would be created. The first one to be accepted correctly navigates the user back, but the second creates a crash because references a no longer existing fragment. The dialog creation was moved to onViewCreated instead, so that only one dialog is created.
- Trying to send a transaction in SendTransactionFragment can fail if the date/time is not correctly synced. A Time Sync Error dialog was created to warn the user about that situation so that they can take action and be able to correctly send transactions from bitsy.
- Translated the strings used in the Time Sync Error dialog to all supported languages, and hand corrected the Spanish version.
- A user is having issues with its active private key, but we have not enugh information to solve the problem. A possible exception causing this issue will be logged to Crashlytics so that we can understand what is going on and solve it.
- Added the PDFjet library as a Java Library module to the project and moved all the logic to create the transactions PDF in the TransactionsFragment to use the new PDF lib instead of the old one.
- Fixed the time formatter that was being used to format the transaction's times in exported PDF/CSV files, it was printing months in the place of minutes.
- The crash was happening due to an unhandled exception, the problem was that the statement that was raising an exception was out of the try/catch block.
- The amount field in the SendTransactionsFragment wasn't prepared to deal with Locales where the decimal separator is a comma. In order to deal with that internally, the commas in the amount are first converted to points before trying to convert the amount string to a double.
- Updated a bunch of libraries, fixed a couple of issues, and tested everything else worked correctly.
- Updated both compileSdkVersion and targetSdkVersion to 29 (Android 10).
- Added a mechanism to automatically scroll to the top in the TransactionsFragment when the difference between the old and new list of transactions is 1, which most probably means that a new transaction was detected.
- In ReceiveTransactionFragment, default the QR code to BTS in case the user has no balances so that he can easily show that QR to others and ask for funds.
- The create account transaction is paid by our faucet, for that reason we won't let users register premium account names for now. A couple of validations were added to make sure the account the user wants to create is not premium: account length has to be greater than 2 chars, account name has to start with a letter, and restrictions like having at least one dash, number or no vowels.
- Created the functionality to completely remove the current user account and its corresponding data from the database and the shared preferences, which will restart the whole application avoiding showing the License again.
- Created a Remove Account confirmation Dialog that appears when the user taps the REMOVE button. If the user has a PIN/Pattern selected, he must enter it successfully before showing the confirmation Dialog.
- Added a recurrent method that verifies every minute that the app is connected to the best node, and if that is not the case then it requests a reconnection.
- Moved the logic to generate the QR Code image from ReceiveTransactionFragment to its ViewModel (ReceiveTransactionViewModel), and used coroutines to send that process to a background thread to make sure this does not freeze the UI.
- The ReceiveTransactionFragment was using two ViewModels, which is not recommended. According to Google's MVVM guidelines, each activity/fragment should have only one ViewModel and that ViewModel should be coupled to only one activity/fragment. For that reason the methods used in the two ViewModels in ReceiveTransactionFragment were merged into ReceiveTransactionViewModel.
- The NetworkServiceManager expects a call to onActivityResumed after it has been configured to start the connection with the NetworkManager. But because we are using a single activity architecture, the call to onActivityResumed the first time the app starts is called before configuring the NetworkServiceManager thus leaving the NetworkService disconnected until another onResume activity lifecycle event is received. A fake call to onActivityResumed in NetworkServiceManager was added right after it has been configured in BitsyApplication to address this issue.