Skip to content

Commit 5b24062

Browse files
authored
Gallery detail route for generation result dialog (#78)
* Issue #69 :: Patch 1 * Update dependencies :: Patch 1 (#80) * img2img random input (#79) * img2img random image :: Patch 1 * img2img random image :: Patch 2 * Issue #69 :: Patch 1 * Issue #69 :: Patch 2
1 parent 143c3d4 commit 5b24062

File tree

16 files changed

+149
-9
lines changed

16 files changed

+149
-9
lines changed

data/src/main/java/com/shifthackz/aisdv1/data/di/RepositoryModule.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import com.shifthackz.aisdv1.data.repository.ServerConfigurationRepositoryImpl
1111
import com.shifthackz.aisdv1.data.repository.StableDiffusionGenerationRepositoryImpl
1212
import com.shifthackz.aisdv1.data.repository.StableDiffusionModelsRepositoryImpl
1313
import com.shifthackz.aisdv1.data.repository.StableDiffusionSamplersRepositoryImpl
14+
import com.shifthackz.aisdv1.data.repository.TemporaryGenerationResultRepositoryImpl
1415
import com.shifthackz.aisdv1.domain.repository.AppVersionRepository
1516
import com.shifthackz.aisdv1.domain.repository.CoinRepository
1617
import com.shifthackz.aisdv1.domain.repository.FeatureFlagsRepository
@@ -22,11 +23,14 @@ import com.shifthackz.aisdv1.domain.repository.ServerConfigurationRepository
2223
import com.shifthackz.aisdv1.domain.repository.StableDiffusionGenerationRepository
2324
import com.shifthackz.aisdv1.domain.repository.StableDiffusionModelsRepository
2425
import com.shifthackz.aisdv1.domain.repository.StableDiffusionSamplersRepository
26+
import com.shifthackz.aisdv1.domain.repository.TemporaryGenerationResultRepository
2527
import org.koin.core.module.dsl.factoryOf
28+
import org.koin.core.module.dsl.singleOf
2629
import org.koin.dsl.bind
2730
import org.koin.dsl.module
2831

2932
val repositoryModule = module {
33+
singleOf(::TemporaryGenerationResultRepositoryImpl) bind TemporaryGenerationResultRepository::class
3034
factoryOf(::HordeGenerationRepositoryImpl) bind HordeGenerationRepository::class
3135
factoryOf(::StableDiffusionGenerationRepositoryImpl) bind StableDiffusionGenerationRepository::class
3236
factoryOf(::StableDiffusionModelsRepositoryImpl) bind StableDiffusionModelsRepository::class
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.shifthackz.aisdv1.data.repository
2+
3+
import com.shifthackz.aisdv1.domain.entity.AiGenerationResult
4+
import com.shifthackz.aisdv1.domain.repository.TemporaryGenerationResultRepository
5+
import io.reactivex.rxjava3.core.Completable
6+
import io.reactivex.rxjava3.core.Single
7+
8+
internal class TemporaryGenerationResultRepositoryImpl : TemporaryGenerationResultRepository {
9+
10+
private var lastCachedResult: AiGenerationResult? = null
11+
12+
override fun put(result: AiGenerationResult) = Completable.fromAction {
13+
lastCachedResult = result
14+
}
15+
16+
override fun get(): Single<AiGenerationResult> {
17+
return lastCachedResult
18+
?.let { Single.just(it) }
19+
?: Single.error(Throwable("No last cached result"))
20+
}
21+
}

domain/src/main/java/com/shifthackz/aisdv1/domain/di/DomainModule.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ import com.shifthackz.aisdv1.domain.usecase.caching.ClearAppCacheUseCase
44
import com.shifthackz.aisdv1.domain.usecase.caching.ClearAppCacheUseCaseImpl
55
import com.shifthackz.aisdv1.domain.usecase.caching.DataPreLoaderUseCase
66
import com.shifthackz.aisdv1.domain.usecase.caching.DataPreLoaderUseCaseImpl
7+
import com.shifthackz.aisdv1.domain.usecase.caching.GetLastResultFromCacheUseCase
8+
import com.shifthackz.aisdv1.domain.usecase.caching.SaveLastResultToCacheUseCase
9+
import com.shifthackz.aisdv1.domain.usecase.caching.GetLastResultFromCacheUseCaseImpl
10+
import com.shifthackz.aisdv1.domain.usecase.caching.SaveLastResultToCacheUseCaseImpl
711
import com.shifthackz.aisdv1.domain.usecase.coin.EarnRewardedCoinsUseCase
812
import com.shifthackz.aisdv1.domain.usecase.coin.EarnRewardedCoinsUseCaseImpl
913
import com.shifthackz.aisdv1.domain.usecase.coin.ObserveCoinsUseCase
@@ -88,6 +92,8 @@ internal val useCasesModule = module {
8892
factoryOf(::GetMediaStoreInfoUseCaseImpl) bind GetMediaStoreInfoUseCase::class
8993
factoryOf(::GetFeatureFlagsUseCaseImpl) bind GetFeatureFlagsUseCase::class
9094
factoryOf(::GetRandomImageUseCaseImpl) bind GetRandomImageUseCase::class
95+
factoryOf(::SaveLastResultToCacheUseCaseImpl) bind SaveLastResultToCacheUseCase::class
96+
factoryOf(::GetLastResultFromCacheUseCaseImpl) bind GetLastResultFromCacheUseCase::class
9197
}
9298

9399
internal val debugModule = module {
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.shifthackz.aisdv1.domain.repository
2+
3+
import com.shifthackz.aisdv1.domain.entity.AiGenerationResult
4+
import io.reactivex.rxjava3.core.Completable
5+
import io.reactivex.rxjava3.core.Single
6+
7+
/**
8+
* Used to store last [AiGenerationResult] in RAM, for the case when user did not save it to DB yet,
9+
* but it is needed to be loaded in GalleryDetail when accessing from result dialog.
10+
*/
11+
interface TemporaryGenerationResultRepository {
12+
/**
13+
* Saves the instance of last [AiGenerationResult] to RAM.
14+
*
15+
* @param result data of [AiGenerationResult] to save.
16+
*/
17+
fun put(result: AiGenerationResult): Completable
18+
19+
/**
20+
* Returns an instance of [AiGenerationResult] in [Single] source.
21+
*
22+
* @throws "No last cached result" error in [Single.error] source.
23+
*/
24+
fun get(): Single<AiGenerationResult>
25+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.shifthackz.aisdv1.domain.usecase.caching
2+
3+
import com.shifthackz.aisdv1.domain.entity.AiGenerationResult
4+
import io.reactivex.rxjava3.core.Single
5+
6+
interface GetLastResultFromCacheUseCase {
7+
operator fun invoke(): Single<AiGenerationResult>
8+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.shifthackz.aisdv1.domain.usecase.caching
2+
3+
import com.shifthackz.aisdv1.domain.repository.TemporaryGenerationResultRepository
4+
5+
internal class GetLastResultFromCacheUseCaseImpl(
6+
private val temporaryGenerationResultRepository: TemporaryGenerationResultRepository,
7+
) : GetLastResultFromCacheUseCase {
8+
9+
override fun invoke() = temporaryGenerationResultRepository.get()
10+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.shifthackz.aisdv1.domain.usecase.caching
2+
3+
import com.shifthackz.aisdv1.domain.entity.AiGenerationResult
4+
import io.reactivex.rxjava3.core.Single
5+
6+
interface SaveLastResultToCacheUseCase {
7+
operator fun invoke(result: AiGenerationResult): Single<AiGenerationResult>
8+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.shifthackz.aisdv1.domain.usecase.caching
2+
3+
import com.shifthackz.aisdv1.domain.entity.AiGenerationResult
4+
import com.shifthackz.aisdv1.domain.preference.PreferenceManager
5+
import com.shifthackz.aisdv1.domain.repository.TemporaryGenerationResultRepository
6+
import io.reactivex.rxjava3.core.Single
7+
8+
internal class SaveLastResultToCacheUseCaseImpl(
9+
private val temporaryGenerationResultRepository: TemporaryGenerationResultRepository,
10+
private val preferenceManager: PreferenceManager,
11+
) : SaveLastResultToCacheUseCase {
12+
13+
override fun invoke(result: AiGenerationResult): Single<AiGenerationResult> {
14+
if (preferenceManager.autoSaveAiResults) return Single.just(result)
15+
return temporaryGenerationResultRepository
16+
.put(result)
17+
.andThen(Single.just(result))
18+
}
19+
}

presentation/src/main/java/com/shifthackz/aisdv1/presentation/di/ViewModelModule.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,6 @@ val viewModelModule = module {
6161
}
6262

6363
viewModel { parameters ->
64-
GalleryDetailViewModel(get(), parameters.get(), get(), get(), get(), get(), get(), get(), get())
64+
GalleryDetailViewModel(get(), parameters.get(), get(), get(), get(), get(), get(), get(), get(), get())
6565
}
6666
}

presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailViewModel.kt

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel
99
import com.shifthackz.aisdv1.domain.entity.AiGenerationResult
1010
import com.shifthackz.aisdv1.domain.entity.FeatureFlags
1111
import com.shifthackz.aisdv1.domain.feature.analytics.Analytics
12+
import com.shifthackz.aisdv1.domain.usecase.caching.GetLastResultFromCacheUseCase
1213
import com.shifthackz.aisdv1.domain.usecase.features.GetFeatureFlagsUseCase
1314
import com.shifthackz.aisdv1.domain.usecase.gallery.DeleteGalleryItemUseCase
1415
import com.shifthackz.aisdv1.domain.usecase.generation.GetGenerationResultUseCase
@@ -22,6 +23,7 @@ class GalleryDetailViewModel(
2223
getFeatureFlagsUseCase: GetFeatureFlagsUseCase,
2324
private val itemId: Long,
2425
private val getGenerationResultUseCase: GetGenerationResultUseCase,
26+
private val getLastResultFromCacheUseCase: GetLastResultFromCacheUseCase,
2527
private val deleteGalleryItemUseCase: DeleteGalleryItemUseCase,
2628
private val galleryDetailBitmapExporter: GalleryDetailBitmapExporter,
2729
private val base64ToBitmapConverter: Base64ToBitmapConverter,
@@ -35,7 +37,7 @@ class GalleryDetailViewModel(
3537
init {
3638
!Single.zip(
3739
getFeatureFlagsUseCase(),
38-
getGenerationResultUseCase(itemId),
40+
getGenerationResult(itemId),
3941
::Pair,
4042
)
4143
.subscribeOnMainThread(schedulersProvider)
@@ -104,10 +106,15 @@ class GalleryDetailViewModel(
104106
}
105107

106108
private fun sendPromptToGenerationScreen(screenType: AiGenerationResult.Type) =
107-
!getGenerationResultUseCase(itemId)
109+
!getGenerationResult(itemId)
108110
.subscribeOnMainThread(schedulersProvider)
109111
.subscribeBy(::errorLog) { ai ->
110112
generationFormUpdateEvent.update(ai, screenType)
111113
emitEffect(GalleryDetailEffect.NavigateBack)
112114
}
115+
116+
private fun getGenerationResult(id: Long): Single<AiGenerationResult> {
117+
if (id <= 0) return getLastResultFromCacheUseCase.invoke()
118+
return getGenerationResultUseCase(id)
119+
}
113120
}

0 commit comments

Comments
 (0)