Skip to content

Commit 9404e90

Browse files
authored
Feature Flags (#65)
* Feature Flags :: Patch 1 * Feature Flags :: Patch 2
1 parent cca527c commit 9404e90

File tree

26 files changed

+246
-38
lines changed

26 files changed

+246
-38
lines changed

build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
buildscript {
22
ext {
3-
appVersion = "0.4.2"
3+
appVersion = "0.4.3"
44
minSdk = 26
55
targetSdk = 33
66
}

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

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,14 @@ import com.shifthackz.aisdv1.data.gateway.DatabaseClearGatewayImpl
44
import com.shifthackz.aisdv1.data.gateway.mediastore.MediaStoreGatewayFactory
55
import com.shifthackz.aisdv1.data.local.AppVersionLocalDataSource
66
import com.shifthackz.aisdv1.data.local.CoinLocalDataSource
7+
import com.shifthackz.aisdv1.data.local.FeatureFlagsLocalDataSource
78
import com.shifthackz.aisdv1.data.local.GenerationResultLocalDataSource
89
import com.shifthackz.aisdv1.data.local.ServerConfigurationLocalDataSource
910
import com.shifthackz.aisdv1.data.local.StableDiffusionModelsLocalDataSource
1011
import com.shifthackz.aisdv1.data.local.StableDiffusionSamplersLocalDataSource
1112
import com.shifthackz.aisdv1.domain.datasource.AppVersionDataSource
1213
import com.shifthackz.aisdv1.domain.datasource.CoinDataSource
14+
import com.shifthackz.aisdv1.domain.datasource.FeatureFlagsDataSource
1315
import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource
1416
import com.shifthackz.aisdv1.domain.datasource.ServerConfigurationDataSource
1517
import com.shifthackz.aisdv1.domain.datasource.StableDiffusionModelsDataSource
@@ -23,13 +25,12 @@ import org.koin.dsl.module
2325

2426
val localDataSourceModule = module {
2527
singleOf(::DatabaseClearGatewayImpl) bind DatabaseClearGateway::class
26-
27-
factory { MediaStoreGatewayFactory(androidContext(), get()).invoke() }
28-
28+
singleOf(::FeatureFlagsLocalDataSource) bind FeatureFlagsDataSource.Local::class
2929
factoryOf(::StableDiffusionModelsLocalDataSource) bind StableDiffusionModelsDataSource.Local::class
3030
factoryOf(::StableDiffusionSamplersLocalDataSource) bind StableDiffusionSamplersDataSource.Local::class
3131
factoryOf(::ServerConfigurationLocalDataSource) bind ServerConfigurationDataSource.Local::class
3232
factoryOf(::GenerationResultLocalDataSource) bind GenerationResultDataSource.Local::class
3333
factoryOf(::AppVersionLocalDataSource) bind AppVersionDataSource.Local::class
3434
factoryOf(::CoinLocalDataSource) bind CoinDataSource.Local::class
35+
factory { MediaStoreGatewayFactory(androidContext(), get()).invoke() }
3536
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import com.shifthackz.aisdv1.data.gateway.ServerConnectivityGatewayImpl
66
import com.shifthackz.aisdv1.data.provider.ServerUrlProvider
77
import com.shifthackz.aisdv1.data.remote.AppVersionRemoteDataSource
88
import com.shifthackz.aisdv1.data.remote.CoinRemoteDateSource
9+
import com.shifthackz.aisdv1.data.remote.FeatureFlagsRemoteDataSource
910
import com.shifthackz.aisdv1.data.remote.HordeGenerationRemoteDataSource
1011
import com.shifthackz.aisdv1.data.remote.HordeStatusSource
1112
import com.shifthackz.aisdv1.data.remote.MotdRemoteDataSource
@@ -15,6 +16,7 @@ import com.shifthackz.aisdv1.data.remote.StableDiffusionModelsRemoteDataSource
1516
import com.shifthackz.aisdv1.data.remote.StableDiffusionSamplersRemoteDataSource
1617
import com.shifthackz.aisdv1.domain.datasource.AppVersionDataSource
1718
import com.shifthackz.aisdv1.domain.datasource.CoinDataSource
19+
import com.shifthackz.aisdv1.domain.datasource.FeatureFlagsDataSource
1820
import com.shifthackz.aisdv1.domain.datasource.HordeGenerationDataSource
1921
import com.shifthackz.aisdv1.domain.datasource.MotdDataSource
2022
import com.shifthackz.aisdv1.domain.datasource.ServerConfigurationDataSource
@@ -54,6 +56,7 @@ val remoteDataSourceModule = module {
5456
factoryOf(::AppVersionRemoteDataSource) bind AppVersionDataSource.Remote::class
5557
factoryOf(::CoinRemoteDateSource) bind CoinDataSource.Remote::class
5658
factoryOf(::MotdRemoteDataSource) bind MotdDataSource.Remote::class
59+
factoryOf(::FeatureFlagsRemoteDataSource) bind FeatureFlagsDataSource.Remote::class
5760

5861
factory<ServerConnectivityGateway> {
5962
val lambda: () -> Boolean = {

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.shifthackz.aisdv1.data.di
22

33
import com.shifthackz.aisdv1.data.repository.AppVersionRepositoryImpl
44
import com.shifthackz.aisdv1.data.repository.CoinRepositoryImpl
5+
import com.shifthackz.aisdv1.data.repository.FeatureFlagsRepositoryImpl
56
import com.shifthackz.aisdv1.data.repository.GenerationResultRepositoryImpl
67
import com.shifthackz.aisdv1.data.repository.HordeGenerationRepositoryImpl
78
import com.shifthackz.aisdv1.data.repository.MotdRepositoryImpl
@@ -11,6 +12,7 @@ import com.shifthackz.aisdv1.data.repository.StableDiffusionModelsRepositoryImpl
1112
import com.shifthackz.aisdv1.data.repository.StableDiffusionSamplersRepositoryImpl
1213
import com.shifthackz.aisdv1.domain.repository.AppVersionRepository
1314
import com.shifthackz.aisdv1.domain.repository.CoinRepository
15+
import com.shifthackz.aisdv1.domain.repository.FeatureFlagsRepository
1416
import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository
1517
import com.shifthackz.aisdv1.domain.repository.HordeGenerationRepository
1618
import com.shifthackz.aisdv1.domain.repository.MotdRepository
@@ -32,4 +34,5 @@ val repositoryModule = module {
3234
factoryOf(::AppVersionRepositoryImpl) bind AppVersionRepository::class
3335
factoryOf(::CoinRepositoryImpl) bind CoinRepository::class
3436
factoryOf(::MotdRepositoryImpl) bind MotdRepository::class
37+
factoryOf(::FeatureFlagsRepositoryImpl) bind FeatureFlagsRepository::class
3538
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.shifthackz.aisdv1.data.local
2+
3+
import com.shifthackz.aisdv1.domain.datasource.FeatureFlagsDataSource
4+
import com.shifthackz.aisdv1.domain.entity.FeatureFlags
5+
import io.reactivex.rxjava3.core.Completable
6+
import io.reactivex.rxjava3.core.Single
7+
8+
internal class FeatureFlagsLocalDataSource : FeatureFlagsDataSource.Local {
9+
10+
private var featureFlags = FeatureFlags()
11+
private var fetched = false
12+
13+
override fun getIsLoaded() = Single.just(fetched)
14+
15+
override fun get() = Single.just(featureFlags)
16+
17+
override fun store(flags: FeatureFlags) = Completable.fromAction {
18+
fetched = true
19+
featureFlags = flags
20+
}
21+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.shifthackz.aisdv1.data.mappers
2+
3+
import com.shifthackz.aisdv1.domain.entity.FeatureFlags
4+
import com.shifthackz.aisdv1.network.response.FeatureFlagsResponse
5+
6+
fun FeatureFlagsResponse.mapToDomain(): FeatureFlags = with (this) {
7+
FeatureFlags(
8+
adHomeBottomEnable = adHomeBottomEnable ?: false,
9+
adGalleryBottomEnable = adGalleryBottomEnable ?: false,
10+
)
11+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.shifthackz.aisdv1.data.remote
2+
3+
import com.shifthackz.aisdv1.data.mappers.mapToDomain
4+
import com.shifthackz.aisdv1.domain.datasource.FeatureFlagsDataSource
5+
import com.shifthackz.aisdv1.domain.entity.FeatureFlags
6+
import com.shifthackz.aisdv1.network.api.sdai.FeatureFlagsRestApi
7+
import com.shifthackz.aisdv1.network.response.FeatureFlagsResponse
8+
import io.reactivex.rxjava3.core.Single
9+
10+
internal class FeatureFlagsRemoteDataSource(
11+
private val api: FeatureFlagsRestApi,
12+
) : FeatureFlagsDataSource.Remote {
13+
14+
override fun fetch(): Single<FeatureFlags> = api
15+
.fetchConfig()
16+
.map(FeatureFlagsResponse::mapToDomain)
17+
}

data/src/main/java/com/shifthackz/aisdv1/data/remote/HordeGenerationRemoteDataSource.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ internal class HordeGenerationRemoteDataSource(
9595
private class RetryException(val response: HordeGenerationCheckResponse): Throwable()
9696

9797
companion object {
98-
private val HORDE_SOCKET_PING_TIME_SECONDS = 10L
98+
private const val HORDE_SOCKET_PING_TIME_SECONDS = 10L
9999
}
100100
}
101101

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.shifthackz.aisdv1.data.repository
2+
3+
import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider
4+
import com.shifthackz.aisdv1.core.common.appbuild.BuildType
5+
import com.shifthackz.aisdv1.core.common.log.errorLog
6+
import com.shifthackz.aisdv1.domain.datasource.FeatureFlagsDataSource
7+
import com.shifthackz.aisdv1.domain.entity.FeatureFlags
8+
import com.shifthackz.aisdv1.domain.repository.FeatureFlagsRepository
9+
10+
internal class FeatureFlagsRepositoryImpl(
11+
private val buildInfoProvider: BuildInfoProvider,
12+
private val remoteDataSource: FeatureFlagsDataSource.Remote,
13+
private val localDataSource: FeatureFlagsDataSource.Local,
14+
) : FeatureFlagsRepository {
15+
16+
override fun get() = when (buildInfoProvider.buildType) {
17+
BuildType.FOSS -> localDataSource.get()
18+
BuildType.GOOGLE_PLAY -> localDataSource
19+
.getIsLoaded()
20+
.flatMap { loaded ->
21+
if (loaded) {
22+
return@flatMap localDataSource.get()
23+
}
24+
return@flatMap remoteDataSource.fetch()
25+
.flatMapCompletable(localDataSource::store)
26+
.andThen(localDataSource.get())
27+
}
28+
}.onErrorReturn { t ->
29+
errorLog(t)
30+
FeatureFlags()
31+
}
32+
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.shifthackz.aisdv1.domain.datasource
2+
3+
import com.shifthackz.aisdv1.domain.entity.FeatureFlags
4+
import io.reactivex.rxjava3.core.Completable
5+
import io.reactivex.rxjava3.core.Single
6+
7+
sealed interface FeatureFlagsDataSource {
8+
9+
interface Remote {
10+
fun fetch(): Single<FeatureFlags>
11+
}
12+
13+
interface Local {
14+
fun getIsLoaded(): Single<Boolean>
15+
fun get(): Single<FeatureFlags>
16+
fun store(flags: FeatureFlags): Completable
17+
}
18+
}

0 commit comments

Comments
 (0)