From 505c0eb074cc0882f3be5ee0480113f934f55d6d Mon Sep 17 00:00:00 2001 From: SeniorZhai Date: Sun, 26 Jan 2025 22:31:04 +0800 Subject: [PATCH 1/2] Remove local data --- .../java/one/mixin/android/db/MarketCoinDao.kt | 6 ++++++ .../main/java/one/mixin/android/db/MarketDao.kt | 3 +++ .../java/one/mixin/android/db/MarketFavoredDao.kt | 6 +++++- .../one/mixin/android/job/RefreshMarketJob.kt | 15 ++++++++++++--- .../android/ui/wallet/MarketDetailsFragment.kt | 2 +- 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/app/src/main/java/one/mixin/android/db/MarketCoinDao.kt b/app/src/main/java/one/mixin/android/db/MarketCoinDao.kt index 62bcaf7ee7..534d960158 100644 --- a/app/src/main/java/one/mixin/android/db/MarketCoinDao.kt +++ b/app/src/main/java/one/mixin/android/db/MarketCoinDao.kt @@ -13,4 +13,10 @@ interface MarketCoinDao : BaseDao { @Query("SELECT asset_id FROM market_coins WHERE coin_id = :coinId") suspend fun findTokenIdsByCoinId(coinId: String): List + + @Query("DELETE FROM market_coins WHERE coin_id = :coinId AND asset_id NOT IN (:assetIds)") + suspend fun deleteMarketCoinsNotInAssetIds(coinId: String, assetIds: List) + + @Query("DELETE FROM market_coins WHERE coin_id = :coinId") + suspend fun deleteByCoinId(coinId: String) } \ No newline at end of file diff --git a/app/src/main/java/one/mixin/android/db/MarketDao.kt b/app/src/main/java/one/mixin/android/db/MarketDao.kt index 9534455c46..e47c6250b2 100644 --- a/app/src/main/java/one/mixin/android/db/MarketDao.kt +++ b/app/src/main/java/one/mixin/android/db/MarketDao.kt @@ -86,4 +86,7 @@ interface MarketDao : BaseDao { @Query("SELECT m.* FROM markets m LEFT JOIN market_coins mc on mc.coin_id = m.coin_id WHERE mc.asset_id = :assetId") suspend fun simpleCoinItemByAssetId(assetId: String): CoinItem? + + @Query("DELETE FROM markets WHERE coin_id = :coinId") + suspend fun deleteByCoinId(coinId: String) } \ No newline at end of file diff --git a/app/src/main/java/one/mixin/android/db/MarketFavoredDao.kt b/app/src/main/java/one/mixin/android/db/MarketFavoredDao.kt index 0c885ef5f6..2e2299c147 100644 --- a/app/src/main/java/one/mixin/android/db/MarketFavoredDao.kt +++ b/app/src/main/java/one/mixin/android/db/MarketFavoredDao.kt @@ -1,7 +1,11 @@ package one.mixin.android.db import androidx.room.Dao +import androidx.room.Query import one.mixin.android.vo.market.MarketFavored @Dao -interface MarketFavoredDao : BaseDao \ No newline at end of file +interface MarketFavoredDao : BaseDao { + @Query("DELETE FROM market_favored WHERE coin_id = :coinId") + suspend fun deleteByCoinId(coinId: String) +} diff --git a/app/src/main/java/one/mixin/android/job/RefreshMarketJob.kt b/app/src/main/java/one/mixin/android/job/RefreshMarketJob.kt index 4addb8a419..131d7a7f36 100644 --- a/app/src/main/java/one/mixin/android/job/RefreshMarketJob.kt +++ b/app/src/main/java/one/mixin/android/job/RefreshMarketJob.kt @@ -5,7 +5,7 @@ import kotlinx.coroutines.runBlocking import one.mixin.android.extension.nowInUtc import one.mixin.android.vo.market.MarketCoin -class RefreshMarketJob(private val assetId: String) : BaseJob( +class RefreshMarketJob(private val id: String, private val isCoinId: Boolean) : BaseJob( Params(PRIORITY_UI_HIGH) .addTags(GROUP).requireNetwork(), ) { @@ -15,9 +15,9 @@ class RefreshMarketJob(private val assetId: String) : BaseJob( } override fun onRun() = runBlocking { - val response = routeService.market(assetId) + val response = routeService.market(id) // asset id or coin id if (response.isSuccess && response.data != null) { - response.data?.let { market-> + response.data?.let { market -> marketDao.insert(market) marketCoinDao.insertList(market.assetIds?.map { assetId -> MarketCoin( @@ -26,7 +26,16 @@ class RefreshMarketJob(private val assetId: String) : BaseJob( createdAt = nowInUtc() ) } ?: emptyList()) + if (market.assetIds.isNullOrEmpty()) { + marketCoinDao.deleteByCoinId(market.coinId) + } else { + marketCoinDao.deleteMarketCoinsNotInAssetIds(market.coinId, market.assetIds) + } } + } else if (response.errorCode == 404 && isCoinId) { + marketCoinDao.deleteByCoinId(id) + marketFavoredDao.deleteByCoinId(id) + marketDao.deleteByCoinId(id) } } } diff --git a/app/src/main/java/one/mixin/android/ui/wallet/MarketDetailsFragment.kt b/app/src/main/java/one/mixin/android/ui/wallet/MarketDetailsFragment.kt index a96e33c69e..2536dccb63 100644 --- a/app/src/main/java/one/mixin/android/ui/wallet/MarketDetailsFragment.kt +++ b/app/src/main/java/one/mixin/android/ui/wallet/MarketDetailsFragment.kt @@ -80,7 +80,7 @@ class MarketDetailsFragment : BaseFragment(R.layout.fragment_details_market) { savedInstanceState: Bundle?, ) { super.onViewCreated(view, savedInstanceState) - jobManager.addJobInBackground(RefreshMarketJob(marketItem.coinId)) + jobManager.addJobInBackground(RefreshMarketJob(marketItem.coinId, true)) binding.apply { titleView.apply { setSubTitle(marketItem.symbol, marketItem.name) From 32c524281152afaa96fc257b8f218191a2a8b9a9 Mon Sep 17 00:00:00 2001 From: SeniorZhai Date: Sun, 26 Jan 2025 22:44:52 +0800 Subject: [PATCH 2/2] Update --- .../one/mixin/android/db/MarketCoinDao.kt | 3 +++ .../one/mixin/android/job/RefreshMarketJob.kt | 25 +++++++++++++------ .../android/ui/wallet/TransactionsFragment.kt | 2 +- 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/one/mixin/android/db/MarketCoinDao.kt b/app/src/main/java/one/mixin/android/db/MarketCoinDao.kt index 534d960158..048ebce034 100644 --- a/app/src/main/java/one/mixin/android/db/MarketCoinDao.kt +++ b/app/src/main/java/one/mixin/android/db/MarketCoinDao.kt @@ -14,6 +14,9 @@ interface MarketCoinDao : BaseDao { @Query("SELECT asset_id FROM market_coins WHERE coin_id = :coinId") suspend fun findTokenIdsByCoinId(coinId: String): List + @Query("SELECT coin_id FROM market_coins WHERE asset_id = :assetId") + suspend fun findCoinIdByTokenId(assetId: String): String? + @Query("DELETE FROM market_coins WHERE coin_id = :coinId AND asset_id NOT IN (:assetIds)") suspend fun deleteMarketCoinsNotInAssetIds(coinId: String, assetIds: List) diff --git a/app/src/main/java/one/mixin/android/job/RefreshMarketJob.kt b/app/src/main/java/one/mixin/android/job/RefreshMarketJob.kt index 131d7a7f36..319af90642 100644 --- a/app/src/main/java/one/mixin/android/job/RefreshMarketJob.kt +++ b/app/src/main/java/one/mixin/android/job/RefreshMarketJob.kt @@ -6,33 +6,44 @@ import one.mixin.android.extension.nowInUtc import one.mixin.android.vo.market.MarketCoin class RefreshMarketJob(private val id: String, private val isCoinId: Boolean) : BaseJob( - Params(PRIORITY_UI_HIGH) - .addTags(GROUP).requireNetwork(), + Params(PRIORITY_UI_HIGH).addTags(GROUP).requireNetwork(), ) { companion object { private const val serialVersionUID = 1L const val GROUP = "RefreshMarketJob" } - override fun onRun() = runBlocking { - val response = routeService.market(id) // asset id or coin id + override fun onRun(): Unit = runBlocking { + val response = routeService.market(id) if (response.isSuccess && response.data != null) { response.data?.let { market -> marketDao.insert(market) marketCoinDao.insertList(market.assetIds?.map { assetId -> MarketCoin( - coinId = market.coinId, - assetId = assetId, - createdAt = nowInUtc() + coinId = market.coinId, assetId = assetId, createdAt = nowInUtc() ) } ?: emptyList()) + + if (isCoinId.not()) { // id is token id + marketCoinDao.findCoinIdByTokenId(id)?.let { localCoinId -> + if (localCoinId != market.coinId) { // Clean up old data when coin ID changes + marketCoinDao.deleteByCoinId(localCoinId) + marketDao.deleteByCoinId(localCoinId) + marketFavoredDao.deleteByCoinId(localCoinId) + } + } + } + if (market.assetIds.isNullOrEmpty()) { + // Remove coin relationships when no assets are mapped marketCoinDao.deleteByCoinId(market.coinId) } else { + // Remove obsolete asset mappings marketCoinDao.deleteMarketCoinsNotInAssetIds(market.coinId, market.assetIds) } } } else if (response.errorCode == 404 && isCoinId) { + // Clean up all related data when market is not found marketCoinDao.deleteByCoinId(id) marketFavoredDao.deleteByCoinId(id) marketDao.deleteByCoinId(id) diff --git a/app/src/main/java/one/mixin/android/ui/wallet/TransactionsFragment.kt b/app/src/main/java/one/mixin/android/ui/wallet/TransactionsFragment.kt index 3970222421..28ab13edde 100644 --- a/app/src/main/java/one/mixin/android/ui/wallet/TransactionsFragment.kt +++ b/app/src/main/java/one/mixin/android/ui/wallet/TransactionsFragment.kt @@ -196,7 +196,7 @@ class TransactionsFragment : BaseFragment(R.layout.fragment_transactions), OnSna } var market = walletViewModel.findMarketItemByAssetId(asset.assetId) if (market == null) { - jobManager.addJobInBackground(RefreshMarketJob(asset.assetId)) + jobManager.addJobInBackground(RefreshMarketJob(asset.assetId, false)) market = MarketItem( "", asset.name, asset.symbol, asset.iconUrl, asset.priceUsd, "", "", "", "", "", runCatching {