فهرست منبع

added blur to images

sirekanian 3 سال پیش
والد
کامیت
2d7ff9d61b

+ 9 - 3
app/schemas/com.sirekanian.spacetime.data.local.Database/1.json

@@ -2,11 +2,11 @@
   "formatVersion": 1,
   "database": {
     "version": 1,
-    "identityHash": "786fcc9fe1efc70145a58cebcc9c668b",
+    "identityHash": "945d4e0bf161f836d129c299b7132d6f",
     "entities": [
       {
         "tableName": "PageEntity",
-        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `url` TEXT NOT NULL, `date` TEXT NOT NULL)",
+        "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT NOT NULL, `url` TEXT NOT NULL, `date` TEXT NOT NULL, `blur` REAL NOT NULL)",
         "fields": [
           {
             "fieldPath": "id",
@@ -31,6 +31,12 @@
             "columnName": "date",
             "affinity": "TEXT",
             "notNull": true
+          },
+          {
+            "fieldPath": "blur",
+            "columnName": "blur",
+            "affinity": "REAL",
+            "notNull": true
           }
         ],
         "primaryKey": {
@@ -46,7 +52,7 @@
     "views": [],
     "setupQueries": [
       "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)",
-      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '786fcc9fe1efc70145a58cebcc9c668b')"
+      "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '945d4e0bf161f836d129c299b7132d6f')"
     ]
   }
 }

+ 3 - 3
app/src/main/java/com/sirekanian/spacetime/MainPresenter.kt

@@ -25,7 +25,7 @@ interface MainPresenter {
 
     val state: MainState
     fun observePages(): Flow<List<Page>>
-    fun addPage(page: ImagePage)
+    fun savePage(page: ImagePage)
     fun removePage(page: ImagePage)
 
 }
@@ -40,9 +40,9 @@ class MainPresenterImpl(
     override fun observePages(): Flow<List<Page>> =
         repository.observePages().map { it.plus(GalleryPage) }
 
-    override fun addPage(page: ImagePage) {
+    override fun savePage(page: ImagePage) {
         scope.launch {
-            repository.addPage(page)
+            repository.savePage(page)
         }
     }
 

+ 7 - 2
app/src/main/java/com/sirekanian/spacetime/MainScreen.kt

@@ -27,12 +27,17 @@ fun MainScreen(presenter: MainPresenter) {
     ) { index ->
         when (val page = pages[index]) {
             is ImagePage -> {
-                ImagePageContent(insets, page, onDelete = { presenter.removePage(page) })
+                ImagePageContent(
+                    insets,
+                    page,
+                    onDelete = { presenter.removePage(page) },
+                    onDone = { presenter.savePage(it) }
+                )
             }
             GalleryPage -> {
                 GalleryPageContent(insets, onSelect = { state.draft = Draft(it) })
             }
         }
     }
-    DraftAlertDialog(state, onConfirm = { presenter.addPage(it) })
+    DraftAlertDialog(state, onConfirm = { presenter.savePage(it) })
 }

+ 2 - 2
app/src/main/java/com/sirekanian/spacetime/data/DefaultDataCallback.kt

@@ -22,8 +22,8 @@ class DefaultDataCallback(resources: Resources) : RoomDatabase.Callback() {
 
     override fun onCreate(db: SupportSQLiteDatabase) {
         defaultPages.forEach { page ->
-            val args = arrayOf(page.name, page.url, page.date.value)
-            db.execSQL("INSERT INTO PageEntity (name, url, date) VALUES (?, ?, ?)", args)
+            val args = arrayOf(page.name, page.url, page.date.value, page.blur)
+            db.execSQL("INSERT INTO PageEntity (name, url, date, blur) VALUES (?, ?, ?, ?)", args)
         }
     }
 

+ 2 - 2
app/src/main/java/com/sirekanian/spacetime/data/Repository.kt

@@ -9,7 +9,7 @@ import kotlinx.coroutines.flow.map
 interface Repository {
 
     fun observePages(): Flow<List<ImagePage>>
-    suspend fun addPage(page: ImagePage)
+    suspend fun savePage(page: ImagePage)
     suspend fun removePage(page: ImagePage)
 
 }
@@ -19,7 +19,7 @@ class RepositoryImpl(private val dao: PageDao) : Repository {
     override fun observePages(): Flow<List<ImagePage>> =
         dao.observe().map { it.map(PageEntity::toModel) }
 
-    override suspend fun addPage(page: ImagePage) {
+    override suspend fun savePage(page: ImagePage) {
         dao.insert(page.toEntity())
     }
 

+ 2 - 5
app/src/main/java/com/sirekanian/spacetime/data/local/PageDao.kt

@@ -1,9 +1,6 @@
 package com.sirekanian.spacetime.data.local
 
-import androidx.room.Dao
-import androidx.room.Delete
-import androidx.room.Insert
-import androidx.room.Query
+import androidx.room.*
 import kotlinx.coroutines.flow.Flow
 
 @Dao
@@ -12,7 +9,7 @@ interface PageDao {
     @Query("SELECT * FROM PageEntity")
     fun observe(): Flow<List<PageEntity>>
 
-    @Insert
+    @Insert(onConflict = OnConflictStrategy.REPLACE)
     suspend fun insert(page: PageEntity)
 
     @Delete

+ 2 - 1
app/src/main/java/com/sirekanian/spacetime/data/local/PageEntity.kt

@@ -12,6 +12,7 @@ class PageEntity(
     val name: String,
     val url: String,
     val date: String,
+    val blur: Float,
 ) {
-    fun toModel() = ImagePage(id, name, url, DateField(date))
+    fun toModel() = ImagePage(id, name, url, DateField(date), blur)
 }

+ 9 - 3
app/src/main/java/com/sirekanian/spacetime/model/Page.kt

@@ -4,12 +4,18 @@ import com.sirekanian.spacetime.data.local.PageEntity
 import com.sirekanian.spacetime.ui.DateField
 
 fun createImagePage(name: String, url: String, date: DateField): ImagePage =
-    ImagePage(0, name, url, date)
+    ImagePage(0, name, url, date, blur = 0.5f)
 
 sealed class Page(val id: Int)
 
-class ImagePage(id: Int, val name: String, val url: String, val date: DateField) : Page(id) {
-    fun toEntity() = PageEntity(id, name, url, date.value)
+class ImagePage(
+    id: Int,
+    val name: String,
+    val url: String,
+    val date: DateField,
+    val blur: Float,
+) : Page(id) {
+    fun toEntity() = PageEntity(id, name, url, date.value, blur)
 }
 
 object GalleryPage : Page(-1)

+ 30 - 6
app/src/main/java/com/sirekanian/spacetime/ui/ImagePageContent.kt

@@ -2,16 +2,20 @@ package com.sirekanian.spacetime.ui
 
 import androidx.compose.foundation.layout.*
 import androidx.compose.material.MaterialTheme
+import androidx.compose.material.Slider
 import androidx.compose.material.Text
 import androidx.compose.material.icons.Icons
 import androidx.compose.material.icons.filled.ArrowBack
 import androidx.compose.material.icons.filled.Delete
+import androidx.compose.material.icons.filled.Done
 import androidx.compose.material.icons.filled.Edit
 import androidx.compose.runtime.*
 import androidx.compose.ui.Alignment
 import androidx.compose.ui.Modifier
+import androidx.compose.ui.draw.blur
 import androidx.compose.ui.layout.ContentScale
 import androidx.compose.ui.platform.LocalContext
+import androidx.compose.ui.unit.dp
 import coil.compose.AsyncImage
 import coil.request.ImageRequest
 import com.sirekanian.spacetime.ext.DefaultAnimatedVisibility
@@ -19,14 +23,22 @@ import com.sirekanian.spacetime.ext.VectorIconButton
 import com.sirekanian.spacetime.model.ImagePage
 
 @Composable
-fun ImagePageContent(insets: PaddingValues, page: ImagePage, onDelete: () -> Unit) {
+fun ImagePageContent(
+    insets: PaddingValues,
+    page: ImagePage,
+    onDelete: () -> Unit,
+    onDone: (ImagePage) -> Unit,
+) {
+    var blur by remember { mutableStateOf(page.blur) }
     AsyncImage(
         model = ImageRequest.Builder(LocalContext.current)
             .data(page.url)
             .crossfade(true)
             .build(),
         contentDescription = null,
-        modifier = Modifier.fillMaxSize(),
+        modifier = Modifier
+            .fillMaxSize()
+            .blur((blur * 32).dp),
         contentScale = ContentScale.Crop,
     )
     var isEditMode by remember { mutableStateOf(false) }
@@ -37,10 +49,22 @@ fun ImagePageContent(insets: PaddingValues, page: ImagePage, onDelete: () -> Uni
         }
     }
     DefaultAnimatedVisibility(visible = isEditMode) {
-        Row(Modifier.padding(insets)) {
-            VectorIconButton(Icons.Default.ArrowBack, onClick = { isEditMode = false })
-            Spacer(Modifier.weight(1f))
-            VectorIconButton(Icons.Default.Delete, onClick = { onDelete() })
+        Column(
+            modifier = Modifier
+                .padding(insets)
+                .fillMaxSize(),
+            verticalArrangement = Arrangement.SpaceBetween,
+        ) {
+            Row {
+                VectorIconButton(Icons.Default.ArrowBack, onClick = { isEditMode = false })
+                Spacer(Modifier.weight(1f))
+                VectorIconButton(Icons.Default.Delete, onClick = { onDelete() })
+                VectorIconButton(Icons.Default.Done, onClick = {
+                    onDone(ImagePage(page.id, page.name, page.url, page.date, blur))
+                    isEditMode = false
+                })
+            }
+            Slider(value = blur, onValueChange = { blur = it }, modifier = Modifier.padding(16.dp))
         }
     }
     Column(