Эх сурвалжийг харах

replaced flow with suspend function

sirekanian 3 жил өмнө
parent
commit
1636ce5558

+ 14 - 7
app/src/main/java/com/sirekanian/acf/MainActivity.kt

@@ -4,9 +4,6 @@ import android.os.Bundle
 import androidx.activity.ComponentActivity
 import androidx.activity.compose.BackHandler
 import androidx.activity.compose.setContent
-import androidx.compose.animation.AnimatedVisibility
-import androidx.compose.animation.fadeIn
-import androidx.compose.animation.fadeOut
 import androidx.compose.foundation.background
 import androidx.compose.foundation.layout.*
 import androidx.compose.material.Divider
@@ -17,6 +14,7 @@ import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
 import androidx.compose.ui.unit.Dp
 import androidx.core.view.WindowCompat
+import com.sirekanian.acf.ext.DefaultAnimatedVisibility
 import com.sirekanian.acf.ext.app
 import com.sirekanian.acf.ext.isCyrillicResources
 import com.sirekanian.acf.ui.*
@@ -31,8 +29,17 @@ class MainActivity : ComponentActivity() {
             val isCyrillic = isCyrillicResources()
             val state = remember { MainState(coroutineScope, isCyrillic) }
             val presenter = remember { createPresenter(app(), state) }
-            val data: List<WarmongerModel> by presenter.observeData().collectAsState(listOf())
-            val tags: List<TagModel> by produceState(listOf()) { value = presenter.getTags() }
+            val data: List<WarmongerModel> by produceState(
+                initialValue = listOf(),
+                key1 = state.search.fullQuery,
+            ) {
+                value = presenter.getWarmongers()
+            }
+            val tags: List<TagModel> by produceState(
+                initialValue = listOf()
+            ) {
+                value = presenter.getTags()
+            }
             val hasData by derivedStateOf { data.isNotEmpty() }
             BackHandler(enabled = state.search.isOpened) {
                 state.search.isOpened = false
@@ -80,13 +87,13 @@ fun MainLayout(
     fabVisible: Boolean,
 ) {
     MainBottomSheet(dialogState = state.dialog) {
-        AnimatedVisibility(contentVisible, enter = fadeIn(), exit = fadeOut()) {
+        DefaultAnimatedVisibility(contentVisible) {
             content(WindowInsets.systemBars.asPaddingValues())
         }
         Surface(Modifier.fillMaxWidth(), elevation = toolbarElevation) {
             toolbar(WindowInsets.statusBars.asPaddingValues())
         }
-        AnimatedVisibility(fabVisible, enter = fadeIn(), exit = fadeOut()) {
+        DefaultAnimatedVisibility(fabVisible) {
             BottomBox(Modifier.padding(D.fabPadding)) {
                 fab()
             }

+ 7 - 9
app/src/main/java/com/sirekanian/acf/MainPresenter.kt

@@ -4,15 +4,13 @@ import com.sirekanian.acf.data.Repository
 import com.sirekanian.acf.data.Tag
 import com.sirekanian.acf.data.Warmonger
 import kotlinx.coroutines.Dispatchers.IO
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.map
 import kotlinx.coroutines.withContext
 
 fun createPresenter(app: App, state: MainState): MainPresenter =
     MainPresenterImpl(app.repository, state)
 
 interface MainPresenter {
-    fun observeData(): Flow<List<WarmongerModel>>
+    suspend fun getWarmongers(): List<WarmongerModel>
     suspend fun getTags(): List<TagModel>
     suspend fun updateData()
 }
@@ -22,15 +20,15 @@ class MainPresenterImpl(
     private val state: MainState,
 ) : MainPresenter {
 
-    override fun observeData(): Flow<List<WarmongerModel>> =
-        repository.observeByQuery(state.search.fullQuery).map { warmongers ->
-            warmongers.map { warmonger ->
-                Warmonger.toModel(warmonger, state.isCyrillic)
-            }
+    override suspend fun getWarmongers(): List<WarmongerModel> =
+        repository.getWarmongers(state.search.fullQuery).map { warmonger ->
+            Warmonger.toModel(warmonger, state.isCyrillic)
         }
 
     override suspend fun getTags(): List<TagModel> =
-        repository.getTags().map { Tag.toModel(it, state.isCyrillic) }
+        repository.getTags().map { tag ->
+            Tag.toModel(tag, state.isCyrillic)
+        }
 
     @Suppress("unused") // TODO: 1202468796234411
     override suspend fun updateData() =

+ 13 - 21
app/src/main/java/com/sirekanian/acf/data/Repository.kt

@@ -4,15 +4,10 @@ import android.database.sqlite.SQLiteException
 import com.sirekanian.acf.ProgressState
 import com.sirekanian.acf.data.local.TagDao
 import com.sirekanian.acf.data.local.WarmongerDao
-import com.sirekanian.acf.data.local.WarmongerEntity
 import com.sirekanian.acf.data.remote.getWarmongers
-import kotlinx.coroutines.flow.Flow
-import kotlinx.coroutines.flow.catch
-import kotlinx.coroutines.flow.flowOf
-import kotlinx.coroutines.flow.map
 
 interface Repository {
-    fun observeByQuery(query: String?): Flow<List<Warmonger>>
+    suspend fun getWarmongers(query: String?): List<Warmonger>
     suspend fun getTags(): List<Tag>
     suspend fun updateFromRemote(progressState: ProgressState)
 }
@@ -22,26 +17,23 @@ class RepositoryImpl(
     private val tagDao: TagDao,
 ) : Repository {
 
-    override fun observeByQuery(query: String?): Flow<List<Warmonger>> =
+    override suspend fun getWarmongers(query: String?): List<Warmonger> =
         when {
-            query == null -> dao.observeAll()
-            query.isEmpty() -> flowOf(listOf())
-            else -> dao.observeByQuery(query)
-        }.fromEntities()
+            query == null -> dao.getAll()
+            query.isEmpty() -> listOf()
+            else -> {
+                try {
+                    dao.getByQuery(query)
+                } catch (ex: SQLiteException) {
+                    // TODO: 1202308718694574
+                    listOf()
+                }
+            }
+        }.map(Warmonger::fromEntity)
 
     override suspend fun getTags(): List<Tag> =
         tagDao.getTags().map(Tag::fromEntity)
 
-    private fun Flow<List<WarmongerEntity>>.fromEntities(): Flow<List<Warmonger>> =
-        map { it.map(Warmonger::fromEntity) }.catch {
-            if (it is SQLiteException) {
-                // TODO: 1202308718694574
-                emit(listOf())
-            } else {
-                throw it
-            }
-        }
-
     override suspend fun updateFromRemote(progressState: ProgressState) {
         try {
             progressState.show()

+ 2 - 3
app/src/main/java/com/sirekanian/acf/data/local/WarmongerDao.kt

@@ -4,7 +4,6 @@ import androidx.room.Dao
 import androidx.room.Insert
 import androidx.room.Query
 import androidx.room.Transaction
-import kotlinx.coroutines.flow.Flow
 
 private const val LIMIT = 200
 
@@ -12,10 +11,10 @@ private const val LIMIT = 200
 interface WarmongerDao {
 
     @Query("SELECT rowid, * FROM WarmongerEntity ORDER BY cyrillicName LIMIT $LIMIT")
-    fun observeAll(): Flow<List<WarmongerEntity>>
+    suspend fun getAll(): List<WarmongerEntity>
 
     @Query("SELECT rowid, * FROM WarmongerEntity WHERE WarmongerEntity MATCH :query LIMIT $LIMIT")
-    fun observeByQuery(query: String): Flow<List<WarmongerEntity>>
+    suspend fun getByQuery(query: String): List<WarmongerEntity>
 
     @Query("DELETE FROM WarmongerEntity")
     suspend fun deleteAll()