Switch from runInTransaction to withWriteTransaction API

Signed-off-by: Aayush Gupta <contact@aayush.io>
This commit is contained in:
Aayush Gupta
2026-10-15 16:09:25 +08:00
parent 7e77ba6893
commit be0a2dda2f
4 changed files with 43 additions and 32 deletions
@@ -55,4 +55,10 @@ interface PlaylistRemoteDAO : BasicDAO<PlaylistRemoteEntity> {
@Query("DELETE FROM remote_playlists WHERE uid = :playlistId")
fun deletePlaylist(playlistId: Long): Int
@Transaction
fun updatePlaylists(updateItems: List<PlaylistRemoteEntity>, deletedItems: List<Long>) {
deletedItems.forEach { deletePlaylist(it) }
updateItems.forEach { upsert(it) }
}
}
@@ -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<List<Notification<FeedUpdateInfo>>> {
override fun accept(list: List<Notification<FeedUpdateInfo>>) {
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)
}
}
}
}
@@ -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<MutableList<PlaylistRemoteEntity>>
@@ -38,10 +38,10 @@ class RemotePlaylistManager(private val database: AppDatabase) {
deletedItems: List<Long>
): 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())
}
@@ -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<Pair<ChannelInfo, ChannelTabInfo?>>) {
suspend fun upsertAll(infoList: List<Pair<ChannelInfo, ChannelTabInfo?>>) {
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