Skip to content

Commit d2fbfd9

Browse files
authored
Background generation (based on WorkManager API) (#228)
* Prototype WorkManager implementation * - Beta Work manager implementation - Local Diffusion VAE memory leak fix - core notification & localization infra * Stable (kind of) work manager implementation * Introduce start notification, optimize work scheduling * Optimize presentation module resources * Resolve merge conflicts * Add some Unit Tests * Fix i2i form gallery input * Selection toggle
1 parent bbf2eec commit d2fbfd9

File tree

167 files changed

+3063
-951
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

167 files changed

+3063
-951
lines changed

app/build.gradle

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,15 @@ android {
9090
dependencies {
9191
implementation project(":core:common")
9292
implementation project(":core:imageprocessing")
93+
implementation project(":core:notification")
9394
implementation project(":core:validation")
9495
implementation project(":presentation")
9596
implementation project(":network")
9697
implementation project(":storage")
9798
implementation project(":domain")
9899
implementation project(":feature:auth")
99100
implementation project(":feature:diffusion")
101+
implementation project(":feature:work")
100102
implementation project(":data")
101103
implementation project(":demo")
102104
implementation di.koinCore
@@ -107,6 +109,7 @@ dependencies {
107109
implementation log.timber
108110
implementation ui.catppuccinSplashscreen
109111
implementation ui.catppuccinLegacy
112+
implementation androidx.workManager
110113
}
111114

112115
kapt {

app/src/dev/AndroidManifest.xml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
<?xml version="1.0" encoding="utf-8"?>
2+
<manifest xmlns:tools="http://schemas.android.com/tools"
3+
xmlns:android="http://schemas.android.com/apk/res/android">
4+
5+
<uses-feature
6+
android:name="android.hardware.camera"
7+
android:required="false" />
8+
9+
<uses-permission android:name="android.permission.CAMERA" />
10+
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
11+
<uses-permission android:name="android.permission.INTERNET" />
12+
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
13+
<uses-permission android:name="android.permission.VIBRATE" />
14+
<uses-permission android:name="android.permission.WAKE_LOCK" />
15+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
16+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
17+
18+
<uses-permission
19+
android:name="android.permission.READ_EXTERNAL_STORAGE"
20+
android:maxSdkVersion="32" />
21+
22+
<uses-permission
23+
android:name="android.permission.WRITE_EXTERNAL_STORAGE"
24+
android:maxSdkVersion="31"
25+
tools:ignore="ScopedStorage" />
26+
27+
<uses-permission
28+
android:name="android.permission.MANAGE_EXTERNAL_STORAGE"
29+
tools:ignore="ScopedStorage" />
30+
31+
</manifest>

app/src/foss/AndroidManifest.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@
1010
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
1111
<uses-permission android:name="android.permission.INTERNET" />
1212
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
13+
<uses-permission android:name="android.permission.VIBRATE" />
1314
<uses-permission android:name="android.permission.WAKE_LOCK" />
15+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
16+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
1417

1518
<uses-permission
1619
android:name="android.permission.READ_EXTERNAL_STORAGE"

app/src/main/AndroidManifest.xml

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,12 @@
2525
</intent-filter>
2626
</activity>
2727

28+
<provider
29+
android:name="androidx.startup.InitializationProvider"
30+
android:authorities="${applicationId}.androidx-startup"
31+
tools:node="remove">
32+
</provider>
33+
2834
<provider
2935
android:name="androidx.core.content.FileProvider"
3036
android:authorities="${applicationId}.fileprovider"
@@ -35,6 +41,11 @@
3541
android:resource="@xml/file_provider_paths" />
3642
</provider>
3743

44+
<service
45+
android:name="androidx.work.impl.foreground.SystemForegroundService"
46+
android:foregroundServiceType="dataSync"
47+
tools:node="merge" />
48+
3849
<service
3950
android:name="androidx.appcompat.app.AppLocalesMetadataHolderService"
4051
android:enabled="false"

app/src/main/java/com/shifthackz/aisdv1/app/AiStableDiffusionClientApp.kt

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,29 @@ import android.app.Application
55
import android.database.CursorWindow
66
import android.os.StrictMode
77
import android.os.StrictMode.VmPolicy
8+
import androidx.work.Configuration
9+
import androidx.work.WorkManager
810
import com.shifthackz.aisdv1.app.di.featureModule
911
import com.shifthackz.aisdv1.app.di.preferenceModule
1012
import com.shifthackz.aisdv1.app.di.providersModule
1113
import com.shifthackz.aisdv1.core.common.log.FileLoggingTree
1214
import com.shifthackz.aisdv1.core.common.log.errorLog
1315
import com.shifthackz.aisdv1.core.imageprocessing.di.imageProcessingModule
16+
import com.shifthackz.aisdv1.core.notification.di.notificationModule
1417
import com.shifthackz.aisdv1.core.validation.di.validatorsModule
1518
import com.shifthackz.aisdv1.data.di.dataModule
1619
import com.shifthackz.aisdv1.demo.di.demoModule
1720
import com.shifthackz.aisdv1.domain.di.domainModule
1821
import com.shifthackz.aisdv1.network.di.networkModule
1922
import com.shifthackz.aisdv1.presentation.di.presentationModule
2023
import com.shifthackz.aisdv1.storage.di.databaseModule
24+
import com.shifthackz.aisdv1.work.di.SdaiWorkerFactory
25+
import com.shifthackz.aisdv1.work.di.backgroundWorkModule
26+
import org.koin.android.ext.android.inject
2127
import org.koin.android.ext.koin.androidContext
2228
import org.koin.core.context.startKoin
2329
import timber.log.Timber
2430

25-
2631
class AiStableDiffusionClientApp : Application() {
2732

2833
override fun onCreate() {
@@ -32,6 +37,7 @@ class AiStableDiffusionClientApp : Application() {
3237
initializeKoin()
3338
initializeLogging()
3439
initializeCursorSize()
40+
initializeWorkManager()
3541
}
3642

3743
/**
@@ -53,12 +59,14 @@ class AiStableDiffusionClientApp : Application() {
5359
private fun initializeKoin() = startKoin {
5460
androidContext(this@AiStableDiffusionClientApp)
5561
modules(
62+
notificationModule,
5663
demoModule,
5764
*featureModule,
5865
preferenceModule,
5966
providersModule,
6067
*domainModule,
6168
*dataModule,
69+
backgroundWorkModule,
6270
networkModule,
6371
databaseModule,
6472
validatorsModule,
@@ -73,4 +81,17 @@ class AiStableDiffusionClientApp : Application() {
7381
}
7482
Timber.plant(FileLoggingTree())
7583
}
84+
85+
private fun initializeWorkManager() {
86+
try {
87+
val workerFactory: SdaiWorkerFactory by inject()
88+
val configuration = Configuration.Builder()
89+
.setWorkerFactory(workerFactory)
90+
.build()
91+
92+
WorkManager.initialize(this, configuration)
93+
} catch (e: Exception) {
94+
errorLog(e)
95+
}
96+
}
7697
}

app/src/main/java/com/shifthackz/aisdv1/app/di/ProvidersModule.kt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package com.shifthackz.aisdv1.app.di
22

3+
import android.content.Intent
34
import com.shifthackz.aisdv1.app.BuildConfig
5+
import com.shifthackz.aisdv1.core.common.appbuild.ActivityIntentProvider
46
import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider
57
import com.shifthackz.aisdv1.core.common.appbuild.BuildType
68
import com.shifthackz.aisdv1.core.common.appbuild.BuildVersion
@@ -20,10 +22,12 @@ import com.shifthackz.aisdv1.network.qualifiers.ApiUrlProvider
2022
import com.shifthackz.aisdv1.network.qualifiers.CredentialsProvider
2123
import com.shifthackz.aisdv1.network.qualifiers.NetworkHeaders
2224
import com.shifthackz.aisdv1.network.qualifiers.NetworkPrefixes
25+
import com.shifthackz.aisdv1.presentation.activity.AiStableDiffusionActivity
2326
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
2427
import io.reactivex.rxjava3.core.Scheduler
2528
import io.reactivex.rxjava3.schedulers.Schedulers
2629
import org.koin.android.ext.koin.androidApplication
30+
import org.koin.android.ext.koin.androidContext
2731
import org.koin.dsl.module
2832
import java.util.Date
2933
import java.util.concurrent.Executor
@@ -150,8 +154,8 @@ val providersModule = module {
150154
override val providerPath: String = "${androidApplication().packageName}.fileprovider"
151155
override val imagesCacheDirPath: String = "${androidApplication().cacheDir}/images"
152156
override val logsCacheDirPath: String = "${androidApplication().cacheDir}/logs"
153-
override val localModelDirPath: String =
154-
"${androidApplication().filesDir.absolutePath}/model"
157+
override val localModelDirPath: String = "${androidApplication().filesDir.absolutePath}/model"
158+
override val workCacheDirPath: String = "${androidApplication().cacheDir}/work"
155159
}
156160
}
157161

@@ -166,4 +170,10 @@ val providersModule = module {
166170
single {
167171
LocalModelIdProvider { get<PreferenceManager>().localModelId }
168172
}
173+
174+
single {
175+
ActivityIntentProvider {
176+
Intent(androidContext(), AiStableDiffusionActivity::class.java)
177+
}
178+
}
169179
}

app/src/main/res/xml/file_provider_paths.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@
88
name="folder_logs"
99
path="logs/" />
1010

11+
<cache-path
12+
name="folder_work"
13+
path="work/" />
14+
1115
<external-path name="media" path="." />
1216
<external-path name="external_files" path="."/>
1317
<external-path name="external" path="."/>

app/src/playstore/AndroidManifest.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,10 @@
1010
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
1111
<uses-permission android:name="android.permission.INTERNET" />
1212
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
13+
<uses-permission android:name="android.permission.VIBRATE" />
1314
<uses-permission android:name="android.permission.WAKE_LOCK" />
15+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
16+
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_DATA_SYNC" />
1417

1518
<uses-permission
1619
android:name="android.permission.READ_EXTERNAL_STORAGE"
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.shifthackz.aisdv1.core.common.appbuild
2+
3+
import android.content.Intent
4+
5+
fun interface ActivityIntentProvider {
6+
operator fun invoke(): Intent
7+
}

core/ui/src/main/java/com/shifthackz/aisdv1/core/contract/RxDisposableContract.kt renamed to core/common/src/main/java/com/shifthackz/aisdv1/core/common/contract/RxDisposableContract.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.shifthackz.aisdv1.core.contract
1+
package com.shifthackz.aisdv1.core.common.contract
22

33
import io.reactivex.rxjava3.disposables.CompositeDisposable
44
import io.reactivex.rxjava3.disposables.Disposable

0 commit comments

Comments
 (0)