Skip to content

Commit 3e83857

Browse files
committed
SDAI Cloud instance (#28)
* Custom sdai cloud patch 1 * Custom sdai cloud patch 2 * Custom sdai cloud patch 3 * Custom sdai cloud patch 4 * Custom sdai cloud patch 5 * Custom sdai cloud patch 6 * Custom sdai cloud patch 7 * Custom sdai cloud patch 8
1 parent e54b2c0 commit 3e83857

File tree

66 files changed

+1209
-233
lines changed

Some content is hidden

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

66 files changed

+1209
-233
lines changed

app/app.gradle

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ android {
2121
defaultConfig {
2222
applicationId "com.shifthackz.aisdv1.app"
2323

24+
buildConfigField "String", "CLOUD_AI_URL", "\"https://sdai.moroz.cc\""
2425
buildConfigField "String", "UPDATE_API_URL", "\"https://sdai.moroz.cc\""
2526
buildConfigField "String", "DEMO_MODE_API_URL", "\"https://sdai.moroz.cc\""
2627
buildConfigField "String", "POLICY_URL", "\"https://sdai.moroz.cc/policy.html\""

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,13 @@ val providersModule = module {
2727
object : ApiUrlProvider {
2828
override val stableDiffusionAutomaticApiUrl: String = DEFAULT_SERVER_URL
2929
override val stableDiffusionAppUpdateApiUrl: String = BuildConfig.UPDATE_API_URL
30+
override val stableDiffusionCloudAiApiUrl: String = BuildConfig.CLOUD_AI_URL
3031
}
3132
}
3233

3334
single<LinksProvider> {
3435
object : LinksProvider {
36+
override val cloudUrl: String = BuildConfig.CLOUD_AI_URL
3537
override val privacyPolicyUrl: String = BuildConfig.POLICY_URL
3638
override val gitHubSourceUrl: String = BuildConfig.GITHUB_SOURCE_URL
3739
override val setupInstructionsUrl: String = BuildConfig.SETUP_INSTRUCTIONS_URL

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
buildscript {
22
ext {
33
appVersion = "0.2.0"
4-
minSdk = 24
4+
minSdk = 26
55
targetSdk = 33
66
}
77
dependencies {

core/common/src/main/java/com/shifthackz/aisdv1/core/common/links/LinksProvider.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.shifthackz.aisdv1.core.common.links
22

33
interface LinksProvider {
4+
val cloudUrl: String
45
val privacyPolicyUrl: String
56
val gitHubSourceUrl: String
67
val setupInstructionsUrl: String
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package com.shifthackz.aisdv1.core.common.reactive
2+
3+
import io.reactivex.rxjava3.core.Completable
4+
import io.reactivex.rxjava3.core.Flowable
5+
import io.reactivex.rxjava3.core.Observable
6+
import io.reactivex.rxjava3.core.Single
7+
import io.reactivex.rxjava3.functions.Function
8+
import org.reactivestreams.Publisher
9+
import java.util.concurrent.TimeUnit
10+
11+
fun <T: Any> Single<T>.retryWithDelay(
12+
maxRetries: Long,
13+
delay: Long,
14+
unit: TimeUnit,
15+
tryCallback: (Long) -> Unit = {}
16+
): Single<T> {
17+
return this.retryWhen(FlowableRetryWithDelay(maxRetries, unit.toMillis(delay), tryCallback))
18+
}
19+
20+
fun <T : Any> Observable<T>.retryWithDelay(
21+
maxRetries: Long,
22+
delay: Long,
23+
unit: TimeUnit,
24+
tryCallback: (Long) -> Unit = {}
25+
): Observable<T> {
26+
return this.retryWhen(ObservableRetryWithDelay(maxRetries, unit.toMillis(delay), tryCallback))
27+
}
28+
29+
fun <T : Any> Flowable<T>.retryWithDelay(
30+
maxRetries: Long,
31+
delay: Long,
32+
unit: TimeUnit,
33+
tryCallback: (Long) -> Unit = {}
34+
): Flowable<T> {
35+
return this.retryWhen(FlowableRetryWithDelay(maxRetries, unit.toMillis(delay), tryCallback))
36+
}
37+
38+
fun Completable.retryWithDelay(
39+
maxRetries: Long,
40+
delay: Long,
41+
unit: TimeUnit,
42+
tryCallback: (Long) -> Unit = {}
43+
): Completable {
44+
return this.retryWhen(FlowableRetryWithDelay(maxRetries, unit.toMillis(delay), tryCallback))
45+
}
46+
47+
class ObservableRetryWithDelay(
48+
private val maxRetries: Long,
49+
private val retryDelayMillis: Long,
50+
private val tryCallback: (Long) -> Unit
51+
) : Function<Observable<Throwable>, Observable<Any>> {
52+
53+
private var retryCount: Long = 0
54+
55+
override fun apply(attemps: Observable<Throwable>): Observable<Any> {
56+
return attemps.flatMap {
57+
if (++retryCount < maxRetries) {
58+
// When this Observable calls onNext, the original
59+
// Observable will be retried (i.e. re-subscribed).
60+
return@flatMap Observable.timer(retryDelayMillis, TimeUnit.MILLISECONDS)
61+
.doOnNext {
62+
tryCallback(retryCount)
63+
}
64+
}
65+
// Max retries hit. Just pass the error along.
66+
Observable.error(it)
67+
}
68+
}
69+
70+
}
71+
72+
class FlowableRetryWithDelay(
73+
private val maxRetries: Long,
74+
private val retryDelayMillis: Long,
75+
private val tryCallback: (Long) -> Unit
76+
) : Function<Flowable<Throwable>, Publisher<Any>> {
77+
78+
private var retryCount: Long = 0
79+
80+
override fun apply(attemps: Flowable<Throwable>): Publisher<Any> {
81+
return attemps.flatMap {
82+
if (++retryCount < maxRetries) {
83+
// When this Observable calls onNext, the original
84+
// Observable will be retried (i.e. re-subscribed).
85+
return@flatMap Flowable
86+
.timer(retryDelayMillis, TimeUnit.MILLISECONDS)
87+
.doOnNext {
88+
tryCallback(retryCount)
89+
}
90+
}
91+
// Max retries hit. Just pass the error along.
92+
Flowable.error<Any>(it)
93+
}
94+
}
95+
}

core/common/src/main/java/com/shifthackz/aisdv1/core/common/schedulers/SchedulersExtensions.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.shifthackz.aisdv1.core.common.schedulers
22

33
import io.reactivex.rxjava3.core.Completable
4+
import io.reactivex.rxjava3.core.Flowable
45
import io.reactivex.rxjava3.core.Observable
56
import io.reactivex.rxjava3.core.Single
67

@@ -13,6 +14,12 @@ fun <T : Any> Observable<T>.subscribeOnMainThread(provider: SchedulersProvider):
1314
.subscribeOn(provider.io)
1415
.observeOn(provider.ui)
1516

17+
fun <T : Any> Flowable<T>.subscribeOnMainThread(provider: SchedulersProvider): Flowable<T> =
18+
this
19+
.subscribeOn(provider.io)
20+
.observeOn(provider.ui)
21+
22+
1623
fun Completable.subscribeOnMainThread(provider: SchedulersProvider): Completable = this
1724
.subscribeOn(provider.io)
1825
.observeOn(provider.ui)

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

Lines changed: 1 addition & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,31 +2,20 @@ package com.shifthackz.aisdv1.data.di
22

33
import com.shifthackz.aisdv1.data.gateway.DatabaseClearGatewayImpl
44
import com.shifthackz.aisdv1.data.local.*
5-
import com.shifthackz.aisdv1.data.provider.ServerUrlProvider
65
import com.shifthackz.aisdv1.domain.datasource.*
76
import com.shifthackz.aisdv1.domain.gateway.DatabaseClearGateway
8-
import com.shifthackz.aisdv1.domain.preference.PreferenceManager
9-
import io.reactivex.rxjava3.core.Single
107
import org.koin.core.module.dsl.factoryOf
118
import org.koin.core.module.dsl.singleOf
129
import org.koin.dsl.bind
1310
import org.koin.dsl.module
1411

1512
val localDataSourceModule = module {
16-
17-
single {
18-
ServerUrlProvider { endpoint ->
19-
Single
20-
.fromCallable(get<PreferenceManager>()::serverUrl)
21-
.map { baseUrl -> "$baseUrl/$endpoint" }
22-
}
23-
}
24-
2513
singleOf(::DatabaseClearGatewayImpl) bind DatabaseClearGateway::class
2614

2715
factoryOf(::StableDiffusionModelsLocalDataSource) bind StableDiffusionModelsDataSource.Local::class
2816
factoryOf(::StableDiffusionSamplersLocalDataSource) bind StableDiffusionSamplersDataSource.Local::class
2917
factoryOf(::ServerConfigurationLocalDataSource) bind ServerConfigurationDataSource.Local::class
3018
factoryOf(::GenerationResultLocalDataSource) bind GenerationResultDataSource.Local::class
3119
factoryOf(::AppVersionLocalDataSource) bind AppVersionDataSource.Local::class
20+
factoryOf(::CoinLocalDataSource) bind CoinDataSource.Local::class
3221
}
Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,40 @@
11
package com.shifthackz.aisdv1.data.di
22

3+
import com.shifthackz.aisdv1.core.common.links.LinksProvider
34
import com.shifthackz.aisdv1.data.gateway.ServerConnectivityGatewayImpl
5+
import com.shifthackz.aisdv1.data.provider.ServerUrlProvider
46
import com.shifthackz.aisdv1.data.remote.*
57
import com.shifthackz.aisdv1.domain.datasource.*
68
import com.shifthackz.aisdv1.domain.gateway.ServerConnectivityGateway
9+
import com.shifthackz.aisdv1.domain.preference.PreferenceManager
10+
import com.shifthackz.aisdv1.network.connectivity.ConnectivityMonitor
11+
import io.reactivex.rxjava3.core.Single
712
import org.koin.core.module.dsl.factoryOf
13+
import org.koin.core.parameter.parametersOf
814
import org.koin.dsl.bind
915
import org.koin.dsl.module
1016

1117
val remoteDataSourceModule = module {
12-
factoryOf(::ServerConnectivityGatewayImpl) bind ServerConnectivityGateway::class
18+
single {
19+
ServerUrlProvider { endpoint ->
20+
val prefs = get<PreferenceManager>()
21+
val links = get<LinksProvider>()
22+
val chain = if (prefs.useSdAiCloud) Single.fromCallable(links::cloudUrl)
23+
else Single.fromCallable(prefs::serverUrl)
24+
chain.map { baseUrl -> "$baseUrl/$endpoint" }
25+
}
26+
}
27+
1328
factoryOf(::StableDiffusionGenerationRemoteDataSource) bind StableDiffusionGenerationDataSource.Remote::class
1429
factoryOf(::StableDiffusionSamplersRemoteDataSource) bind StableDiffusionSamplersDataSource.Remote::class
1530
factoryOf(::StableDiffusionModelsRemoteDataSource) bind StableDiffusionModelsDataSource.Remote::class
1631
factoryOf(::ServerConfigurationRemoteDataSource) bind ServerConfigurationDataSource.Remote::class
1732
factoryOf(::AppVersionRemoteDataSource) bind AppVersionDataSource.Remote::class
33+
factoryOf(::CoinRemoteDateSource) bind CoinDataSource.Remote::class
34+
35+
factory<ServerConnectivityGateway> {
36+
val lambda: () -> Boolean = { get<PreferenceManager>().useSdAiCloud }
37+
val monitor = get<ConnectivityMonitor> { parametersOf(lambda) }
38+
ServerConnectivityGatewayImpl(monitor, get())
39+
}
1840
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,4 +13,5 @@ val repositoryModule = module {
1313
factoryOf(::ServerConfigurationRepositoryImpl) bind ServerConfigurationRepository::class
1414
factoryOf(::GenerationResultRepositoryImpl) bind GenerationResultRepository::class
1515
factoryOf(::AppVersionRepositoryImpl) bind AppVersionRepository::class
16+
factoryOf(::CoinRepositoryImpl) bind CoinRepository::class
1617
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.shifthackz.aisdv1.data.local
2+
3+
import com.shifthackz.aisdv1.domain.datasource.CoinDataSource
4+
import com.shifthackz.aisdv1.storage.db.coins.dao.CoinDao
5+
import com.shifthackz.aisdv1.storage.db.coins.entity.CoinEntity
6+
import io.reactivex.rxjava3.core.Completable
7+
import java.util.*
8+
9+
internal class CoinLocalDataSource(
10+
private val coinDao: CoinDao,
11+
) : CoinDataSource.Local {
12+
13+
override fun observeQuerySpentCoinsForPeriod(start: Long, end: Long) = coinDao
14+
.observeQueryAvailableCoinsForPeriod(start, end)
15+
.map { it.size }
16+
17+
override fun onCoinSpent(): Completable = coinDao.insert(
18+
CoinEntity(0L, Date())
19+
)
20+
}

0 commit comments

Comments
 (0)