aboutsummaryrefslogtreecommitdiff
path: root/app/src/main
diff options
context:
space:
mode:
Diffstat (limited to 'app/src/main')
-rw-r--r--app/src/main/kotlin/com/pitchedapps/frost/db/FbTabsDb.kt31
1 files changed, 19 insertions, 12 deletions
diff --git a/app/src/main/kotlin/com/pitchedapps/frost/db/FbTabsDb.kt b/app/src/main/kotlin/com/pitchedapps/frost/db/FbTabsDb.kt
index ff64f5eb..44e62938 100644
--- a/app/src/main/kotlin/com/pitchedapps/frost/db/FbTabsDb.kt
+++ b/app/src/main/kotlin/com/pitchedapps/frost/db/FbTabsDb.kt
@@ -33,6 +33,8 @@ import com.raizlabs.android.dbflow.kotlinextensions.fastSave
import com.raizlabs.android.dbflow.kotlinextensions.from
import com.raizlabs.android.dbflow.kotlinextensions.select
import com.raizlabs.android.dbflow.structure.BaseModel
+import kotlinx.coroutines.NonCancellable
+import kotlinx.coroutines.withContext
/**
* Created by Allan Wang on 2017-05-30.
@@ -52,21 +54,26 @@ interface FbTabDao {
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun _insertAll(items: List<FbTabEntity>)
-
- @Transaction
- suspend fun _save(items: List<FbTabEntity>) {
- _deleteAll()
- _insertAll(items)
- }
}
+/**
+ * Saving tabs operates by deleting all db items and saving the new list.
+ * Transactions can't be done with suspensions in room as switching threads during the process
+ * may result in a deadlock.
+ * In this case, there may be a chance that the 'transaction' completes partially,
+ * but we'll just fallback to the default anyways.
+ */
suspend fun FbTabDao.save(items: List<FbItem>) {
- _save((items.takeIf { it.isNotEmpty() } ?: defaultTabs()).mapIndexed { index, fbItem ->
- FbTabEntity(
- index,
- fbItem
- )
- })
+ withContext(NonCancellable) {
+ _deleteAll()
+ val entities = (items.takeIf { it.isNotEmpty() } ?: defaultTabs()).mapIndexed { index, fbItem ->
+ FbTabEntity(
+ index,
+ fbItem
+ )
+ }
+ _insertAll(entities)
+ }
}
suspend fun FbTabDao.selectAll(): List<FbItem> = _selectAll().map { it.tab }.takeIf { it.isNotEmpty() } ?: defaultTabs()