Skip to content

Commit 3cca660

Browse files
committed
feat(domain): add gallery use cases and ThumbnailData entity
- Add ThumbnailData entity - Add DeleteAllUnlikedUseCase for bulk delete - Add GetGalleryItemsRawUseCase - Add GetThumbnailInfoUseCase - Add HideItemsUseCase - Add LikeItemsUseCase - Add ToggleLikeUseCase - Update DomainModule with new use cases - Update AiGenerationResult entity - Update Grid entity - Update GetGalleryPagedIdsUseCase - Update GenerationResultRepository - Update MediaStoreGateway - Update GenerationResultDataSource - Update BackgroundWorkObserver
1 parent 96289bd commit 3cca660

22 files changed

+193
-3
lines changed

domain/src/main/java/dev/minios/pdaiv1/domain/datasource/GenerationResultDataSource.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package dev.minios.pdaiv1.domain.datasource
22

33
import dev.minios.pdaiv1.domain.entity.AiGenerationResult
4+
import dev.minios.pdaiv1.domain.entity.ThumbnailData
45
import io.reactivex.rxjava3.core.Completable
56
import io.reactivex.rxjava3.core.Single
67

@@ -10,11 +11,16 @@ sealed interface GenerationResultDataSource {
1011
fun insert(result: AiGenerationResult): Single<Long>
1112
fun queryAll(): Single<List<AiGenerationResult>>
1213
fun queryAllIds(): Single<List<Long>>
14+
fun queryAllIdsWithBlurHash(): Single<List<Pair<Long, String>>>
15+
fun queryThumbnailInfoByIdList(idList: List<Long>): Single<List<ThumbnailData>>
1316
fun queryPage(limit: Int, offset: Int): Single<List<AiGenerationResult>>
1417
fun queryById(id: Long): Single<AiGenerationResult>
1518
fun queryByIdList(idList: List<Long>): Single<List<AiGenerationResult>>
1619
fun deleteById(id: Long): Completable
1720
fun deleteByIdList(idList: List<Long>): Completable
1821
fun deleteAll(): Completable
22+
fun deleteAllUnliked(): Completable
23+
fun likeByIds(idList: List<Long>): Completable
24+
fun hideByIds(idList: List<Long>): Completable
1925
}
2026
}

domain/src/main/java/dev/minios/pdaiv1/domain/di/DomainModule.kt

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,24 @@ import dev.minios.pdaiv1.domain.usecase.gallery.GetAllGalleryUseCase
6262
import dev.minios.pdaiv1.domain.usecase.gallery.GetAllGalleryUseCaseImpl
6363
import dev.minios.pdaiv1.domain.usecase.gallery.GetGalleryItemsUseCase
6464
import dev.minios.pdaiv1.domain.usecase.gallery.GetGalleryItemsUseCaseImpl
65+
import dev.minios.pdaiv1.domain.usecase.gallery.GetGalleryItemsRawUseCase
66+
import dev.minios.pdaiv1.domain.usecase.gallery.GetGalleryItemsRawUseCaseImpl
6567
import dev.minios.pdaiv1.domain.usecase.gallery.GetGalleryPagedIdsUseCase
6668
import dev.minios.pdaiv1.domain.usecase.gallery.GetGalleryPagedIdsUseCaseImpl
6769
import dev.minios.pdaiv1.domain.usecase.gallery.GetMediaStoreInfoUseCase
6870
import dev.minios.pdaiv1.domain.usecase.gallery.GetMediaStoreInfoUseCaseImpl
71+
import dev.minios.pdaiv1.domain.usecase.gallery.GetThumbnailInfoUseCase
72+
import dev.minios.pdaiv1.domain.usecase.gallery.GetThumbnailInfoUseCaseImpl
6973
import dev.minios.pdaiv1.domain.usecase.gallery.ToggleImageVisibilityUseCase
7074
import dev.minios.pdaiv1.domain.usecase.gallery.ToggleImageVisibilityUseCaseImpl
75+
import dev.minios.pdaiv1.domain.usecase.gallery.ToggleLikeUseCase
76+
import dev.minios.pdaiv1.domain.usecase.gallery.ToggleLikeUseCaseImpl
77+
import dev.minios.pdaiv1.domain.usecase.gallery.DeleteAllUnlikedUseCase
78+
import dev.minios.pdaiv1.domain.usecase.gallery.DeleteAllUnlikedUseCaseImpl
79+
import dev.minios.pdaiv1.domain.usecase.gallery.LikeItemsUseCase
80+
import dev.minios.pdaiv1.domain.usecase.gallery.LikeItemsUseCaseImpl
81+
import dev.minios.pdaiv1.domain.usecase.gallery.HideItemsUseCase
82+
import dev.minios.pdaiv1.domain.usecase.gallery.HideItemsUseCaseImpl
7183
import dev.minios.pdaiv1.domain.usecase.generation.FalAiGenerationUseCase
7284
import dev.minios.pdaiv1.domain.usecase.generation.FalAiGenerationUseCaseImpl
7385
import dev.minios.pdaiv1.domain.usecase.generation.GetGenerationResultPagedUseCase
@@ -157,7 +169,9 @@ internal val useCasesModule = module {
157169
factoryOf(::GetGenerationResultPagedUseCaseImpl) bind GetGenerationResultPagedUseCase::class
158170
factoryOf(::GetAllGalleryUseCaseImpl) bind GetAllGalleryUseCase::class
159171
factoryOf(::GetGalleryItemsUseCaseImpl) bind GetGalleryItemsUseCase::class
172+
factoryOf(::GetGalleryItemsRawUseCaseImpl) bind GetGalleryItemsRawUseCase::class
160173
factoryOf(::GetGalleryPagedIdsUseCaseImpl) bind GetGalleryPagedIdsUseCase::class
174+
factoryOf(::GetThumbnailInfoUseCaseImpl) bind GetThumbnailInfoUseCase::class
161175
factoryOf(::GetGenerationResultUseCaseImpl) bind GetGenerationResultUseCase::class
162176
factoryOf(::DeleteGalleryItemUseCaseImpl) bind DeleteGalleryItemUseCase::class
163177
factoryOf(::DeleteGalleryItemsUseCaseImpl) bind DeleteGalleryItemsUseCase::class
@@ -182,6 +196,10 @@ internal val useCasesModule = module {
182196
factoryOf(::ObserveHordeProcessStatusUseCaseImpl) bind ObserveHordeProcessStatusUseCase::class
183197
factoryOf(::GetMediaStoreInfoUseCaseImpl) bind GetMediaStoreInfoUseCase::class
184198
factoryOf(::ToggleImageVisibilityUseCaseImpl) bind ToggleImageVisibilityUseCase::class
199+
factoryOf(::ToggleLikeUseCaseImpl) bind ToggleLikeUseCase::class
200+
factoryOf(::DeleteAllUnlikedUseCaseImpl) bind DeleteAllUnlikedUseCase::class
201+
factoryOf(::LikeItemsUseCaseImpl) bind LikeItemsUseCase::class
202+
factoryOf(::HideItemsUseCaseImpl) bind HideItemsUseCase::class
185203
factoryOf(::GetRandomImageUseCaseImpl) bind GetRandomImageUseCase::class
186204
factoryOf(::SaveLastResultToCacheUseCaseImpl) bind SaveLastResultToCacheUseCase::class
187205
factoryOf(::GetLastResultFromCacheUseCaseImpl) bind GetLastResultFromCacheUseCase::class

domain/src/main/java/dev/minios/pdaiv1/domain/entity/AiGenerationResult.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,12 @@ data class AiGenerationResult(
2121
val subSeedStrength: Float,
2222
val denoisingStrength: Float,
2323
val hidden: Boolean,
24+
val liked: Boolean = false,
2425
val mediaPath: String = "",
2526
val inputMediaPath: String = "",
2627
val mediaType: MediaType = MediaType.IMAGE,
2728
val modelName: String = "",
29+
val blurHash: String = "",
2830
) {
2931
enum class Type(val key: String) {
3032
TEXT_TO_IMAGE("txt2img"),
Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,24 @@
11
package dev.minios.pdaiv1.domain.entity
22

33
enum class Grid(val size: Int) {
4+
Fixed1(1),
45
Fixed2(2),
56
Fixed3(3),
67
Fixed4(4),
7-
Fixed5(5);
8+
Fixed5(5),
9+
Fixed6(6);
10+
11+
companion object {
12+
fun fromSize(size: Int): Grid = entries.find { it.size == size } ?: Fixed3
13+
14+
fun zoomIn(current: Grid): Grid {
15+
val index = entries.indexOf(current)
16+
return if (index > 0) entries[index - 1] else current
17+
}
18+
19+
fun zoomOut(current: Grid): Grid {
20+
val index = entries.indexOf(current)
21+
return if (index < entries.lastIndex) entries[index + 1] else current
22+
}
23+
}
824
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package dev.minios.pdaiv1.domain.entity
2+
3+
/**
4+
* Lightweight data class for thumbnail loading.
5+
* Contains only necessary fields without heavy Base64 image data.
6+
*/
7+
data class ThumbnailData(
8+
val id: Long,
9+
val mediaPath: String,
10+
val hidden: Boolean,
11+
val blurHash: String,
12+
)

domain/src/main/java/dev/minios/pdaiv1/domain/feature/work/BackgroundWorkObserver.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,14 @@ import io.reactivex.rxjava3.core.Flowable
88
interface BackgroundWorkObserver {
99
fun observeStatus(): Flowable<BackgroundWorkStatus>
1010
fun observeResult(): Flowable<BackgroundWorkResult>
11+
fun observeNewImage(): Flowable<Unit>
12+
fun observeGalleryChanged(): Flowable<Unit>
1113
fun dismissResult()
1214
fun refreshStatus()
1315
fun postStatusMessage(title: String, subTitle: String)
1416
fun postSuccessSignal(result: List<AiGenerationResult>)
17+
fun postNewImageSignal()
18+
fun postGalleryChangedSignal()
1519
fun postCancelSignal()
1620
fun postFailedSignal(t: Throwable)
1721
fun hasActiveTasks(): Boolean
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package dev.minios.pdaiv1.domain.gateway
22

33
import dev.minios.pdaiv1.domain.entity.MediaStoreInfo
4+
import java.io.File
45

56
interface MediaStoreGateway {
67
fun exportToFile(fileName: String, content: ByteArray)
8+
fun exportFromFile(fileName: String, sourceFile: File)
79
fun getInfo(): MediaStoreInfo
810
}

domain/src/main/java/dev/minios/pdaiv1/domain/repository/GenerationResultRepository.kt

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package dev.minios.pdaiv1.domain.repository
22

33
import dev.minios.pdaiv1.domain.entity.AiGenerationResult
44
import dev.minios.pdaiv1.domain.entity.MediaStoreInfo
5+
import dev.minios.pdaiv1.domain.entity.ThumbnailData
56
import io.reactivex.rxjava3.core.Completable
67
import io.reactivex.rxjava3.core.Single
78

@@ -11,6 +12,10 @@ interface GenerationResultRepository {
1112

1213
fun getAllIds(): Single<List<Long>>
1314

15+
fun getAllIdsWithBlurHash(): Single<List<Pair<Long, String>>>
16+
17+
fun getThumbnailInfoByIds(idList: List<Long>): Single<List<ThumbnailData>>
18+
1419
fun getPage(limit: Int, offset: Int): Single<List<AiGenerationResult>>
1520

1621
fun getMediaStoreInfo(): Single<MediaStoreInfo>
@@ -19,6 +24,12 @@ interface GenerationResultRepository {
1924

2025
fun getByIds(idList: List<Long>): Single<List<AiGenerationResult>>
2126

27+
/**
28+
* Returns raw data without loading full images from files.
29+
* Use this for thumbnail loading where only mediaPath is needed.
30+
*/
31+
fun getByIdsRaw(idList: List<Long>): Single<List<AiGenerationResult>>
32+
2233
fun insert(result: AiGenerationResult): Single<Long>
2334

2435
fun deleteById(id: Long): Completable
@@ -27,8 +38,16 @@ interface GenerationResultRepository {
2738

2839
fun deleteAll(): Completable
2940

41+
fun deleteAllUnliked(): Completable
42+
3043
fun toggleVisibility(id: Long): Single<Boolean>
3144

45+
fun toggleLike(id: Long): Single<Boolean>
46+
47+
fun likeByIds(idList: List<Long>): Completable
48+
49+
fun hideByIds(idList: List<Long>): Completable
50+
3251
/**
3352
* Migrates existing gallery items from base64 storage to file-based storage.
3453
* This runs in the background at app startup.
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package dev.minios.pdaiv1.domain.usecase.gallery
2+
3+
import io.reactivex.rxjava3.core.Completable
4+
5+
interface DeleteAllUnlikedUseCase {
6+
operator fun invoke(): Completable
7+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package dev.minios.pdaiv1.domain.usecase.gallery
2+
3+
import dev.minios.pdaiv1.domain.repository.GenerationResultRepository
4+
5+
internal class DeleteAllUnlikedUseCaseImpl(
6+
private val generationResultRepository: GenerationResultRepository,
7+
) : DeleteAllUnlikedUseCase {
8+
9+
override fun invoke() = generationResultRepository.deleteAllUnliked()
10+
}

0 commit comments

Comments
 (0)