From fc98208c30c0fb75c42d3448b6ab745a008e30a2 Mon Sep 17 00:00:00 2001 From: Severiano Jaramillo Date: Wed, 28 Nov 2018 21:52:00 -0600 Subject: [PATCH] - Add method to update account balances. - Create BalancesRepository to handle Balances related db operations. --- .../activities/MainActivity.kt | 58 ++++++++++++++++++- .../bitsybitshareswallet/daos/BalanceDao.kt | 6 +- .../repositories/BalanceRepository.kt | 35 +++++++++++ 3 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 app/src/main/java/cy/agorise/bitsybitshareswallet/repositories/BalanceRepository.kt diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/activities/MainActivity.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/activities/MainActivity.kt index 2824123..75b753b 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/activities/MainActivity.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/activities/MainActivity.kt @@ -2,23 +2,40 @@ package cy.agorise.bitsybitshareswallet.activities import android.content.Intent import android.os.Bundle +import android.preference.PreferenceManager import android.util.Log import android.view.Menu import android.view.MenuItem import android.widget.Toast +import androidx.collection.LongSparseArray import com.google.android.material.bottomnavigation.BottomNavigationView import cy.agorise.bitsybitshareswallet.R +import cy.agorise.bitsybitshareswallet.entities.Balance import cy.agorise.bitsybitshareswallet.fragments.BalancesFragment import cy.agorise.bitsybitshareswallet.fragments.MerchantsFragment import cy.agorise.bitsybitshareswallet.processors.TransfersLoader +import cy.agorise.bitsybitshareswallet.repositories.BalanceRepository +import cy.agorise.bitsybitshareswallet.utils.Constants +import cy.agorise.graphenej.AssetAmount +import cy.agorise.graphenej.RPC +import cy.agorise.graphenej.UserAccount import cy.agorise.graphenej.api.ApiAccess import cy.agorise.graphenej.api.ConnectionStatusUpdate +import cy.agorise.graphenej.api.calls.GetAccountBalances import cy.agorise.graphenej.models.JsonRpcResponse import kotlinx.android.synthetic.main.activity_main.* +import java.util.ArrayList class MainActivity : ConnectedActivity() { private val TAG = this.javaClass.simpleName + private val requestMap = LongSparseArray() + + /* Current user account */ + private var mCurrentAccount: UserAccount? = null + + private var mBalanceRepository: BalanceRepository? = null + private val mOnNavigationItemSelectedListener = BottomNavigationView.OnNavigationItemSelectedListener { item -> when (item.itemId) { R.id.navigation_receive -> { @@ -47,6 +64,13 @@ class MainActivity : ConnectedActivity() { navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener) navigation.selectedItemId = R.id.navigation_balances + + val userId = PreferenceManager.getDefaultSharedPreferences(this) + .getString(Constants.KEY_CURRENT_ACCOUNT_ID, "") + if (userId != "") + mCurrentAccount = UserAccount(userId) + + mBalanceRepository = BalanceRepository(this) } private fun loadBalancesFragment() { @@ -79,7 +103,9 @@ class MainActivity : ConnectedActivity() { } override fun handleJsonRpcResponse(response: JsonRpcResponse<*>) { - + if (requestMap.get(response.id) == RPC.CALL_GET_ACCOUNT_BALANCES) { + handleBalanceUpdate(response as JsonRpcResponse>) + } } /** @@ -100,8 +126,38 @@ class MainActivity : ConnectedActivity() { Log.d(TAG, "ConnectionStatusUpdate: API_NETWORK_BROADCAST") // Instantiating this loader is enough to kick-start the transfers loading procedure TransfersLoader(this, lifecycle) + + updateBalances() } } } } + + private fun updateBalances() { + if (mNetworkService!!.isConnected) { + val id = mNetworkService!!.sendMessage( + GetAccountBalances(mCurrentAccount, ArrayList()), + GetAccountBalances.REQUIRED_API + ) + requestMap.put(id, RPC.CALL_GET_ACCOUNT_BALANCES) + } + } + + private fun handleBalanceUpdate(response: JsonRpcResponse>) { + Log.d(TAG, "handleBalanceUpdate") + val now = System.currentTimeMillis() / 1000 + val assetBalances = response.result + val balances = ArrayList() + for (assetBalance in assetBalances) { + val balance = Balance( + mCurrentAccount!!.objectId, + assetBalance.asset.objectId, + assetBalance.amount.toLong(), + now + ) + + balances.add(balance) + } + mBalanceRepository!!.insertAll(balances) + } } diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/daos/BalanceDao.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/daos/BalanceDao.kt index 222f9f8..277b14c 100644 --- a/app/src/main/java/cy/agorise/bitsybitshareswallet/daos/BalanceDao.kt +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/daos/BalanceDao.kt @@ -3,6 +3,7 @@ package cy.agorise.bitsybitshareswallet.daos import androidx.lifecycle.LiveData import androidx.room.Dao import androidx.room.Insert +import androidx.room.OnConflictStrategy import androidx.room.Query import cy.agorise.bitsybitshareswallet.entities.Balance @@ -11,6 +12,9 @@ interface BalanceDao { @Insert fun insert(balance: Balance) + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insertAll(balances: List) + @Query("SELECT * FROM balances") - fun getAllBalances(): LiveData> + fun getAll(): LiveData> } \ No newline at end of file diff --git a/app/src/main/java/cy/agorise/bitsybitshareswallet/repositories/BalanceRepository.kt b/app/src/main/java/cy/agorise/bitsybitshareswallet/repositories/BalanceRepository.kt new file mode 100644 index 0000000..201979c --- /dev/null +++ b/app/src/main/java/cy/agorise/bitsybitshareswallet/repositories/BalanceRepository.kt @@ -0,0 +1,35 @@ +package cy.agorise.bitsybitshareswallet.repositories + +import android.content.Context +import android.os.AsyncTask +import androidx.lifecycle.LiveData +import cy.agorise.bitsybitshareswallet.daos.BalanceDao +import cy.agorise.bitsybitshareswallet.daos.BitsyDatabase +import cy.agorise.bitsybitshareswallet.entities.Balance + +class BalanceRepository internal constructor(context: Context) { + + private val mBalanceDao: BalanceDao + + init { + val db = BitsyDatabase.getDatabase(context) + mBalanceDao = db!!.balanceDao() + } + + fun insertAll(balances: List) { + insertAllAsyncTask(mBalanceDao).execute(balances) + } + + fun getAll(): LiveData> { + return mBalanceDao.getAll() + } + + private class insertAllAsyncTask internal constructor(private val mAsyncTaskDao: BalanceDao) : + AsyncTask, Void, Void>() { + + override fun doInBackground(vararg transfers: List): Void? { + mAsyncTaskDao.insertAll(transfers[0]) + return null + } + } +} \ No newline at end of file