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..048ebce034 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,13 @@ 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) + + @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..319af90642 100644 --- a/app/src/main/java/one/mixin/android/job/RefreshMarketJob.kt +++ b/app/src/main/java/one/mixin/android/job/RefreshMarketJob.kt @@ -5,28 +5,48 @@ import kotlinx.coroutines.runBlocking import one.mixin.android.extension.nowInUtc import one.mixin.android.vo.market.MarketCoin -class RefreshMarketJob(private val assetId: String) : BaseJob( - Params(PRIORITY_UI_HIGH) - .addTags(GROUP).requireNetwork(), +class RefreshMarketJob(private val id: String, private val isCoinId: Boolean) : BaseJob( + 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(assetId) + override fun onRun(): Unit = runBlocking { + val response = routeService.market(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( - 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/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) 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 {