diff --git a/app/src/main/java/com/bnyro/wallpaper/db/dao/FavoritesDao.kt b/app/src/main/java/com/bnyro/wallpaper/db/dao/FavoritesDao.kt index 4bc4003..7c08aea 100644 --- a/app/src/main/java/com/bnyro/wallpaper/db/dao/FavoritesDao.kt +++ b/app/src/main/java/com/bnyro/wallpaper/db/dao/FavoritesDao.kt @@ -11,10 +11,10 @@ import kotlinx.coroutines.flow.Flow @Dao interface FavoritesDao { @Query("SELECT * FROM favorites") - fun getAll(): List + suspend fun getAll(): List @Query("SELECT * FROM favorites WHERE favorite = 1") - fun getFavorites(): List + suspend fun getFavorites(): List @Query("SELECT * FROM favorites WHERE favorite = 1 ORDER BY timeAdded DESC") fun getFavoritesFlow(): Flow> @@ -23,18 +23,18 @@ interface FavoritesDao { fun getHistoryFlow(): Flow> @Query("SELECT EXISTS (SELECT 1 FROM favorites WHERE favorite = 1 AND imgSrc = :imgSrc)") - fun isLiked(imgSrc: String): Boolean + suspend fun isLiked(imgSrc: String): Boolean @Query("SELECT * FROM favorites WHERE imgSrc = :imgSrc") - fun findByImgSrc(imgSrc: String): Wallpaper? + suspend fun findByImgSrc(imgSrc: String): Wallpaper? /** * Do not use this method directly unless when restoring backups */ @Insert(onConflict = OnConflictStrategy.REPLACE) - fun insertAll(wallpapers: List) + suspend fun insertAll(wallpapers: List) - fun insert(wallpaper: Wallpaper, isFavorite: Boolean?, isHistory: Boolean?) { + suspend fun insert(wallpaper: Wallpaper, isFavorite: Boolean?, isHistory: Boolean?) { val existingWallpaper = findByImgSrc(wallpaper.imgSrc) wallpaper.favorite = isFavorite ?: existingWallpaper?.favorite ?: false @@ -49,14 +49,14 @@ interface FavoritesDao { } @Update - fun updateWallpaper(wallpaper: Wallpaper) + suspend fun updateWallpaper(wallpaper: Wallpaper) - fun removeFromFavorites(wallpaper: Wallpaper) { + suspend fun removeFromFavorites(wallpaper: Wallpaper) { insertAll(listOf(wallpaper.copy(favorite = false))) cleanup() } @Query("DELETE FROM favorites WHERE favorite = 0 and inHistory = 0") - fun cleanup() + suspend fun cleanup() } diff --git a/app/src/main/java/com/bnyro/wallpaper/ext/AwaitQuery.kt b/app/src/main/java/com/bnyro/wallpaper/ext/AwaitQuery.kt deleted file mode 100644 index cf6651e..0000000 --- a/app/src/main/java/com/bnyro/wallpaper/ext/AwaitQuery.kt +++ /dev/null @@ -1,12 +0,0 @@ -package com.bnyro.wallpaper.ext - -fun awaitQuery(block: () -> T): T { - var result: T? = null - Thread { - result = block.invoke() - }.apply { - start() - join() - } - return result!! -} diff --git a/app/src/main/java/com/bnyro/wallpaper/ext/Query.kt b/app/src/main/java/com/bnyro/wallpaper/ext/Query.kt deleted file mode 100644 index 4d15bb8..0000000 --- a/app/src/main/java/com/bnyro/wallpaper/ext/Query.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.bnyro.wallpaper.ext - -fun query(query: () -> Unit) { - Thread(query).start() -} diff --git a/app/src/main/java/com/bnyro/wallpaper/ui/components/WallpaperGrid.kt b/app/src/main/java/com/bnyro/wallpaper/ui/components/WallpaperGrid.kt index f2a2f8d..d7c4bce 100644 --- a/app/src/main/java/com/bnyro/wallpaper/ui/components/WallpaperGrid.kt +++ b/app/src/main/java/com/bnyro/wallpaper/ui/components/WallpaperGrid.kt @@ -25,6 +25,7 @@ import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -34,7 +35,9 @@ import androidx.compose.ui.unit.dp import coil.compose.AsyncImage import com.bnyro.wallpaper.db.DatabaseHolder.Database import com.bnyro.wallpaper.db.obj.Wallpaper -import com.bnyro.wallpaper.ext.query +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext @Composable fun WallpaperGrid( @@ -67,7 +70,7 @@ fun WallpaperGrid( } LaunchedEffect(true) { - query { + withContext(Dispatchers.IO) { liked = Database.favoritesDao().isLiked(wallpaper.imgSrc) } } @@ -96,12 +99,14 @@ fun WallpaperGrid( .clip(CircleShape) .background(MaterialTheme.colorScheme.primaryContainer) ) { + val scope = rememberCoroutineScope() + ButtonWithIcon( modifier = Modifier, if (liked) Icons.Default.Favorite else Icons.Default.FavoriteBorder ) { liked = !liked - query { + scope.launch(Dispatchers.IO) { if (!liked) { Database.favoritesDao().removeFromFavorites(wallpaper) } else { diff --git a/app/src/main/java/com/bnyro/wallpaper/ui/components/WallpaperModeDialog.kt b/app/src/main/java/com/bnyro/wallpaper/ui/components/WallpaperModeDialog.kt index de7cc5e..a8fabbe 100644 --- a/app/src/main/java/com/bnyro/wallpaper/ui/components/WallpaperModeDialog.kt +++ b/app/src/main/java/com/bnyro/wallpaper/ui/components/WallpaperModeDialog.kt @@ -1,15 +1,18 @@ package com.bnyro.wallpaper.ui.components import androidx.compose.runtime.Composable +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import com.bnyro.wallpaper.R import com.bnyro.wallpaper.db.DatabaseHolder import com.bnyro.wallpaper.db.obj.Wallpaper -import com.bnyro.wallpaper.ext.awaitQuery import com.bnyro.wallpaper.ui.components.dialogs.ListDialog import com.bnyro.wallpaper.ui.models.WallpaperHelperModel import com.bnyro.wallpaper.util.Preferences +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext @Composable fun WallpaperModeDialog( @@ -19,6 +22,7 @@ fun WallpaperModeDialog( applyFilter: Boolean = false ) { val context = LocalContext.current + val scope = rememberCoroutineScope() ListDialog( title = stringResource(R.string.set_wallpaper), @@ -30,22 +34,24 @@ fun WallpaperModeDialog( ), onDismissRequest = onDismissRequest, onClick = { index -> - if (Preferences.getBoolean(Preferences.wallpaperHistory, true)) { - awaitQuery { + scope.launch(Dispatchers.IO) { + if (Preferences.getBoolean(Preferences.wallpaperHistory, true)) { DatabaseHolder.Database.favoritesDao() .insert(wallpaper, null, true) } - } - if (index == 3) { - wallpaperHelperModel.setWallpaperWith(context, wallpaper) - } else { - if (applyFilter) { - wallpaperHelperModel.setWallpaperWithFilter(wallpaper = wallpaper, index) - } else { - wallpaperHelperModel.setWallpaper(wallpaper = wallpaper, index) + withContext(Dispatchers.Main) { + if (index == 3) { + wallpaperHelperModel.setWallpaperWith(context, wallpaper) + } else { + if (applyFilter) { + wallpaperHelperModel.setWallpaperWithFilter(wallpaper = wallpaper, index) + } else { + wallpaperHelperModel.setWallpaper(wallpaper = wallpaper, index) + } + } + onDismissRequest.invoke() } } - onDismissRequest.invoke() } ) } \ No newline at end of file diff --git a/app/src/main/java/com/bnyro/wallpaper/ui/components/WallpaperView.kt b/app/src/main/java/com/bnyro/wallpaper/ui/components/WallpaperView.kt index d082875..3f5be09 100644 --- a/app/src/main/java/com/bnyro/wallpaper/ui/components/WallpaperView.kt +++ b/app/src/main/java/com/bnyro/wallpaper/ui/components/WallpaperView.kt @@ -20,6 +20,7 @@ import androidx.compose.runtime.MutableState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -38,7 +39,6 @@ import com.bnyro.wallpaper.R import com.bnyro.wallpaper.db.DatabaseHolder.Database import com.bnyro.wallpaper.db.obj.Wallpaper import com.bnyro.wallpaper.enums.MultiState -import com.bnyro.wallpaper.ext.query import com.bnyro.wallpaper.ui.components.bottombar.BottomBar import com.bnyro.wallpaper.ui.components.bottombar.WallpaperViewTopBar import com.bnyro.wallpaper.ui.components.dialogs.MultiStateDialog @@ -47,6 +47,9 @@ import com.bnyro.wallpaper.ui.models.WallpaperHelperModel import com.bnyro.wallpaper.ext.rememberZoomState import com.bnyro.wallpaper.ext.zoomArea import com.bnyro.wallpaper.ext.zoomImage +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch +import kotlinx.coroutines.withContext import java.time.Instant @Composable @@ -62,7 +65,7 @@ fun WallpaperView( var showModeSelection by remember { mutableStateOf(false) } var liked by remember { mutableStateOf(false) } LaunchedEffect(true) { - query { + withContext(Dispatchers.IO) { liked = Database.favoritesDao().isLiked(wallpaper.imgSrc) } } @@ -139,6 +142,8 @@ fun WallpaperView( .align(Alignment.BottomCenter), horizontalAlignment = Alignment.CenterHorizontally ) { + val scope = rememberCoroutineScope() + AnimatedVisibility( visible = showUi ) { @@ -161,7 +166,7 @@ fun WallpaperView( }, onClickFavourite = { liked = !liked - query { + scope.launch(Dispatchers.IO) { if (!liked) { Database.favoritesDao().removeFromFavorites(wallpaper) } else { diff --git a/app/src/main/java/com/bnyro/wallpaper/util/BackgroundWorker.kt b/app/src/main/java/com/bnyro/wallpaper/util/BackgroundWorker.kt index 85c928b..c4889fa 100644 --- a/app/src/main/java/com/bnyro/wallpaper/util/BackgroundWorker.kt +++ b/app/src/main/java/com/bnyro/wallpaper/util/BackgroundWorker.kt @@ -8,7 +8,6 @@ import com.bnyro.wallpaper.db.DatabaseHolder import com.bnyro.wallpaper.db.obj.Wallpaper import com.bnyro.wallpaper.obj.WallpaperConfig import com.bnyro.wallpaper.enums.WallpaperSource -import com.bnyro.wallpaper.ext.awaitQuery import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext @@ -66,7 +65,7 @@ class BackgroundWorker( } private suspend fun getFavoritesWallpaper(): Bitmap? { - val favoriteUrl = awaitQuery { + val favoriteUrl = withContext(Dispatchers.IO) { DatabaseHolder.Database.favoritesDao().getFavorites() }.randomOrNull()?.imgSrc return ImageHelper.getSuspend(applicationContext, favoriteUrl, true)