Introducing a supported currencies cache for the equivalent values feature

- 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.
This commit is contained in:
Nelson R. Perez 2019-11-07 16:36:49 -05:00
parent 2ef589526d
commit f8b7a11ba9
2 changed files with 21 additions and 0 deletions

View file

@ -1,7 +1,9 @@
package cy.agorise.bitsybitshareswallet.repositories package cy.agorise.bitsybitshareswallet.repositories
import android.content.Context import android.content.Context
import android.content.SharedPreferences
import android.os.AsyncTask import android.os.AsyncTask
import android.preference.PreferenceManager
import android.util.Log import android.util.Log
import androidx.lifecycle.LiveData import androidx.lifecycle.LiveData
import cy.agorise.bitsybitshareswallet.database.BitsyDatabase import cy.agorise.bitsybitshareswallet.database.BitsyDatabase
@ -26,11 +28,13 @@ class TransferRepository internal constructor(context: Context) {
private val mTransferDao: TransferDao private val mTransferDao: TransferDao
private val mEquivalentValuesDao: EquivalentValueDao private val mEquivalentValuesDao: EquivalentValueDao
private val compositeDisposable = CompositeDisposable() private val compositeDisposable = CompositeDisposable()
private val mPreferences: SharedPreferences
init { init {
val db = BitsyDatabase.getDatabase(context) val db = BitsyDatabase.getDatabase(context)
mTransferDao = db!!.transferDao() mTransferDao = db!!.transferDao()
mEquivalentValuesDao = db.equivalentValueDao() mEquivalentValuesDao = db.equivalentValueDao()
mPreferences = PreferenceManager.getDefaultSharedPreferences(context)
} }
fun insertAll(transfers: List<Transfer>) { fun insertAll(transfers: List<Transfer>) {
@ -177,10 +181,24 @@ class TransferRepository internal constructor(context: Context) {
val response = sg.getService(CoingeckoService::class.java) val response = sg.getService(CoingeckoService::class.java)
?.getSupportedCurrencies() ?.getSupportedCurrencies()
?.execute() ?.execute()
// Updating the supported currencies cache
mPreferences.edit()
.putStringSet(Constants.KEY_COINGECKO_CURRENCIES_CACHE, response?.body()?.toMutableSet() ?: setOf())
.apply()
if(response?.body()?.indexOf(symbol.toLowerCase()) == -1) if(response?.body()?.indexOf(symbol.toLowerCase()) == -1)
"usd" "usd"
else else
it it
} }
.onErrorReturn {
// Error caused potentially by the lack of connectivity. If this happens we just
// retrieve the value from the cache
val currencies = mPreferences.getStringSet(Constants.KEY_COINGECKO_CURRENCIES_CACHE, setOf())
var selectedCurrency = "usd"
if(currencies.contains(symbol)) {
selectedCurrency = symbol
}
selectedCurrency
}
} }
} }

View file

@ -48,6 +48,9 @@ object Constants {
/** Coingecko's API URL */ /** Coingecko's API URL */
const val COINGECKO_URL = "https://api.coingecko.com" const val COINGECKO_URL = "https://api.coingecko.com"
/** Key used to store and retrieve a cache of the coingecko supported currencies */
const val KEY_COINGECKO_CURRENCIES_CACHE = "key_coingecko_currencies_cache"
/** The fee to send in every transfer (0.01%) */ /** The fee to send in every transfer (0.01%) */
const val FEE_PERCENTAGE = 0.0001 const val FEE_PERCENTAGE = 0.0001