Skip to content

Commit b8641d2

Browse files
authored
Handle LocalDiffusion process death in TextToImageTask.kt (#239)
1 parent e3ad790 commit b8641d2

File tree

3 files changed

+27
-1
lines changed

3 files changed

+27
-1
lines changed

data/src/main/java/com/shifthackz/aisdv1/data/preference/PreferenceManagerImpl.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,12 @@ class PreferenceManagerImpl(
212212
.apply()
213213
.also { onPreferencesChanged() }
214214

215+
override var backgroundProcessCount: Int
216+
get() = preferences.getInt(KEY_BACKGROUND_PROCESS_COUNT, 0)
217+
set(value) = preferences.edit()
218+
.putInt(KEY_BACKGROUND_PROCESS_COUNT, value)
219+
.apply()
220+
215221
override var galleryGrid: Grid
216222
get() = preferences.getInt(KEY_GALLERY_GRID, 0).let { Grid.entries[it] }
217223
set(value) = preferences.edit()
@@ -273,6 +279,7 @@ class PreferenceManagerImpl(
273279
const val KEY_DESIGN_COLOR_TOKEN = "key_design_color_token_theme"
274280
const val KEY_DESIGN_DARK_TOKEN = "key_design_dark_color_token_theme"
275281
const val KEY_BACKGROUND_GENERATION = "key_background_generation"
282+
const val KEY_BACKGROUND_PROCESS_COUNT = "key_background_process_count"
276283
const val KEY_GALLERY_GRID = "key_gallery_grid"
277284
}
278285
}

domain/src/main/java/com/shifthackz/aisdv1/domain/preference/PreferenceManager.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ interface PreferenceManager {
3232
var designColorToken: String
3333
var designDarkThemeToken: String
3434
var backgroundGeneration: Boolean
35+
var backgroundProcessCount: Int
3536
var galleryGrid: Grid
3637

3738
fun observe(): Flowable<Settings>

feature/work/src/main/java/com/shifthackz/aisdv1/work/task/TextToImageTask.kt

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,9 @@ internal class TextToImageTask(
2323
workerParameters: WorkerParameters,
2424
pushNotificationManager: PushNotificationManager,
2525
activityIntentProvider: ActivityIntentProvider,
26-
preferenceManager: PreferenceManager,
2726
observeHordeProcessStatusUseCase: ObserveHordeProcessStatusUseCase,
2827
observeLocalDiffusionProcessStatusUseCase: ObserveLocalDiffusionProcessStatusUseCase,
28+
private val preferenceManager: PreferenceManager,
2929
private val backgroundWorkObserver: BackgroundWorkObserver,
3030
private val textToImageUseCase: TextToImageUseCase,
3131
private val fileProviderDescriptor: FileProviderDescriptor,
@@ -45,12 +45,26 @@ internal class TextToImageTask(
4545
override val genericNotificationId: Int = NOTIFICATION_TEXT_TO_IMAGE_GENERIC
4646

4747
override fun createWork(): Single<Result> {
48+
// Workaround for LocalDiffusion provider:
49+
//
50+
// If LocalDiffusion process previously died, prevent WorkManager to go to infinite
51+
// task repeat loop.
52+
if (preferenceManager.backgroundProcessCount > 0) {
53+
handleProcess()
54+
handleError(Throwable("Background process count > 0"))
55+
compositeDisposable.clear()
56+
return Single.just(Result.failure())
57+
}
58+
59+
preferenceManager.backgroundProcessCount++
4860
handleStart()
4961
backgroundWorkObserver.refreshStatus()
5062
backgroundWorkObserver.dismissResult()
63+
5164
return try {
5265
val file = File(fileProviderDescriptor.workCacheDirPath, Constants.FILE_TEXT_TO_IMAGE)
5366
if (!file.exists()) {
67+
preferenceManager.backgroundProcessCount--
5468
handleError(Throwable("File is null."))
5569
compositeDisposable.clear()
5670
return Single.just(Result.failure())
@@ -60,6 +74,7 @@ internal class TextToImageTask(
6074
val payload = bytes.toTextToImagePayload()
6175

6276
if (payload == null) {
77+
preferenceManager.backgroundProcessCount--
6378
handleError(Throwable("Payload is null."))
6479
compositeDisposable.clear()
6580
return Single.just(Result.failure())
@@ -71,15 +86,18 @@ internal class TextToImageTask(
7186
textToImageUseCase(payload)
7287
.doOnSubscribe { handleProcess() }
7388
.map { result ->
89+
preferenceManager.backgroundProcessCount--
7490
handleSuccess(result)
7591
Result.success()
7692
}
7793
.onErrorReturn { t ->
94+
preferenceManager.backgroundProcessCount--
7895
handleError(t)
7996
Result.failure()
8097
}
8198
.doFinally { compositeDisposable.clear() }
8299
} catch (e: Exception) {
100+
preferenceManager.backgroundProcessCount--
83101
handleError(e)
84102
compositeDisposable.clear()
85103
Single.just(Result.failure())

0 commit comments

Comments
 (0)