From be0a2dda2f1380e6b61bf2fcf1d6292a25b81462 Mon Sep 17 00:00:00 2001 From: Aayush Gupta Date: Thu, 15 Oct 2026 16:09:25 +0800 Subject: [PATCH] Switch from runInTransaction to withWriteTransaction API Signed-off-by: Aayush Gupta --- .../playlist/dao/PlaylistRemoteDAO.kt | 6 +++ .../local/feed/service/FeedLoadManager.kt | 54 ++++++++++--------- .../local/playlist/RemotePlaylistManager.kt | 10 ++-- .../local/subscription/SubscriptionManager.kt | 5 +- 4 files changed, 43 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.kt b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.kt index 21116e42d..ca2a31b3c 100644 --- a/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.kt +++ b/app/src/main/java/org/schabi/newpipe/database/playlist/dao/PlaylistRemoteDAO.kt @@ -55,4 +55,10 @@ interface PlaylistRemoteDAO : BasicDAO { @Query("DELETE FROM remote_playlists WHERE uid = :playlistId") fun deletePlaylist(playlistId: Long): Int + + @Transaction + fun updatePlaylists(updateItems: List, deletedItems: List) { + deletedItems.forEach { deletePlaylist(it) } + updateItems.forEach { upsert(it) } + } } diff --git a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt index 1e1bdcf16..92d0464c5 100644 --- a/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/feed/service/FeedLoadManager.kt @@ -3,6 +3,7 @@ package org.schabi.newpipe.local.feed.service import android.content.Context import android.content.SharedPreferences import androidx.preference.PreferenceManager +import androidx.room3.withWriteTransaction import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable @@ -15,6 +16,7 @@ import java.time.OffsetDateTime import java.time.ZoneOffset import java.util.concurrent.atomic.AtomicBoolean import java.util.concurrent.atomic.AtomicInteger +import kotlinx.coroutines.runBlocking import org.schabi.newpipe.R import org.schabi.newpipe.database.feed.model.FeedGroupEntity import org.schabi.newpipe.database.subscription.NotificationMode @@ -287,37 +289,39 @@ class FeedLoadManager(private val context: Context) { private inner class DatabaseConsumer : Consumer>> { override fun accept(list: List>) { - feedDatabaseManager.database().runInTransaction { - for (notification in list) { - when { - notification.isOnNext -> { - val info = notification.value!! + runBlocking { + feedDatabaseManager.database().withWriteTransaction { + for (notification in list) { + when { + notification.isOnNext -> { + val info = notification.value!! - notification.value!!.newStreams = filterNewStreams(info.streams) + notification.value!!.newStreams = filterNewStreams(info.streams) - feedDatabaseManager.upsertAll(info.uid, info.streams) - subscriptionManager.updateFromInfo(info) + feedDatabaseManager.upsertAll(info.uid, info.streams) + subscriptionManager.updateFromInfo(info) - if (info.errors.isNotEmpty()) { - feedResultsHolder.addErrors( - info.errors.map { - FeedLoadService.RequestException( - info.uid, - "${info.serviceId}:${info.url}", - it - ) - } - ) - feedDatabaseManager.markAsOutdated(info.uid) + if (info.errors.isNotEmpty()) { + feedResultsHolder.addErrors( + info.errors.map { + FeedLoadService.RequestException( + info.uid, + "${info.serviceId}:${info.url}", + it + ) + } + ) + feedDatabaseManager.markAsOutdated(info.uid) + } } - } - notification.isOnError -> { - val error = notification.error - feedResultsHolder.addError(error!!) + notification.isOnError -> { + val error = notification.error + feedResultsHolder.addError(error!!) - if (error is FeedLoadService.RequestException) { - feedDatabaseManager.markAsOutdated(error.subscriptionId) + if (error is FeedLoadService.RequestException) { + feedDatabaseManager.markAsOutdated(error.subscriptionId) + } } } } diff --git a/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.kt b/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.kt index 6961b6bb4..318b6f38e 100644 --- a/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/playlist/RemotePlaylistManager.kt @@ -13,7 +13,7 @@ import org.schabi.newpipe.database.AppDatabase import org.schabi.newpipe.database.playlist.model.PlaylistRemoteEntity import org.schabi.newpipe.extractor.playlist.PlaylistInfo -class RemotePlaylistManager(private val database: AppDatabase) { +class RemotePlaylistManager(database: AppDatabase) { private val playlistRemoteTable = database.playlistRemoteDAO() val playlists: Flowable> @@ -38,10 +38,10 @@ class RemotePlaylistManager(private val database: AppDatabase) { deletedItems: List ): Completable { return Completable.fromRunnable { - database.runInTransaction { - deletedItems.forEach { playlistRemoteTable.deletePlaylist(it) } - updateItems.forEach { playlistRemoteTable.upsert(it) } - } + playlistRemoteTable.updatePlaylists( + updateItems = updateItems, + deletedItems = deletedItems + ) }.subscribeOn(Schedulers.io()) } diff --git a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt index 0329d3594..7ddf2df2f 100644 --- a/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt +++ b/app/src/main/java/org/schabi/newpipe/local/subscription/SubscriptionManager.kt @@ -1,6 +1,7 @@ package org.schabi.newpipe.local.subscription import android.content.Context +import androidx.room3.withWriteTransaction import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable @@ -50,11 +51,11 @@ class SubscriptionManager(context: Context) { } } - fun upsertAll(infoList: List>) { + suspend fun upsertAll(infoList: List>) { val listEntities = infoList.map { SubscriptionEntity.from(it.first) } subscriptionTable.upsertAll(listEntities) - database.runInTransaction { + database.withWriteTransaction { infoList.forEachIndexed { index, info -> // There may be no tabs on the channel to refresh the feed from if (info.second == null) return@forEachIndexed