├── .github
├── CODEOWNERS
├── FUNDING.yml
├── ISSUE_TEMPLATE
│ ├── bug_report.md
│ └── feature_request.md
├── dependabot.yml
├── pull_request_template.md
└── workflows
│ └── android_test.yml
├── .gitignore
├── .idea
├── icon.svg
└── inspectionProfiles
│ └── Project_Default.xml
├── CODE_OF_CONDUCT.md
├── LICENSE
├── README.md
├── adb_remove.sh
├── app
├── .gitignore
├── build.gradle.kts
├── proguard-rules.pro
└── src
│ ├── foss
│ └── AndroidManifest.xml
│ ├── full
│ └── AndroidManifest.xml
│ ├── main
│ ├── AndroidManifest.xml
│ ├── ic_launcher-playstore.png
│ ├── java
│ │ └── com
│ │ │ └── shifthackz
│ │ │ └── aisdv1
│ │ │ └── app
│ │ │ ├── AiStableDiffusionClientApp.kt
│ │ │ └── di
│ │ │ ├── FeatureModule.kt
│ │ │ ├── PreferenceModule.kt
│ │ │ └── ProvidersModule.kt
│ └── res
│ │ ├── drawable
│ │ ├── ic_launcher_foreground.xml
│ │ └── ic_sd_flat.xml
│ │ ├── mipmap-anydpi-v26
│ │ ├── ic_launcher.xml
│ │ └── ic_launcher_round.xml
│ │ ├── mipmap-hdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-mdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xhdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xxhdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── mipmap-xxxhdpi
│ │ ├── ic_launcher.png
│ │ └── ic_launcher_round.png
│ │ ├── values-night
│ │ └── themes.xml
│ │ ├── values
│ │ ├── colors.xml
│ │ ├── ic_launcher_background.xml
│ │ └── themes.xml
│ │ └── xml
│ │ ├── file_provider_paths.xml
│ │ └── locale_config.xml
│ └── playstore
│ └── AndroidManifest.xml
├── build-logic
├── convention
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ └── kotlin
│ │ ├── ApplicationConventionPlugin.kt
│ │ ├── BaselineProFmConventionPlugin.kt
│ │ ├── ComposeConventionPlugin.kt
│ │ ├── FlavorsConventionPlugin.kt
│ │ ├── JacocoConventionPlugin.kt
│ │ ├── LibraryConventionPlugin.kt
│ │ └── com
│ │ └── shifthackz
│ │ └── aisdv1
│ │ └── buildlogic
│ │ ├── Android.kt
│ │ ├── Application.kt
│ │ ├── Compose.kt
│ │ ├── Flavors.kt
│ │ ├── Jacoco.kt
│ │ └── Project.kt
└── settings.gradle.kts
├── build.gradle.kts
├── core
├── common
│ ├── .gitignore
│ ├── build.gradle.kts
│ ├── consumer-rules.pro
│ ├── proguard-rules.pro
│ └── src
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ │ └── com
│ │ │ └── shifthackz
│ │ │ └── aisdv1
│ │ │ └── core
│ │ │ └── common
│ │ │ ├── appbuild
│ │ │ ├── ActivityIntentProvider.kt
│ │ │ ├── BuildInfoProvider.kt
│ │ │ ├── BuildType.kt
│ │ │ └── BuildVersion.kt
│ │ │ ├── contract
│ │ │ └── RxDisposableContract.kt
│ │ │ ├── extensions
│ │ │ ├── AppExtensions.kt
│ │ │ ├── ClipboardExtensions.kt
│ │ │ ├── DateExtensions.kt
│ │ │ ├── KotlinExtensions.kt
│ │ │ ├── StringExtensions.kt
│ │ │ ├── UnitExtensions.kt
│ │ │ └── UriExtensions.kt
│ │ │ ├── file
│ │ │ ├── FileExtensions.kt
│ │ │ └── FileProviderDescriptor.kt
│ │ │ ├── links
│ │ │ └── LinksProvider.kt
│ │ │ ├── log
│ │ │ ├── FileLoggingTree.kt
│ │ │ └── TimberLogging.kt
│ │ │ ├── math
│ │ │ └── MathUtils.kt
│ │ │ ├── model
│ │ │ ├── Hexagonal.kt
│ │ │ ├── Quadruple.kt
│ │ │ └── Quintuple.kt
│ │ │ ├── reactive
│ │ │ └── RetryExtensions.kt
│ │ │ ├── schedulers
│ │ │ ├── DispatchersProvider.kt
│ │ │ ├── SchedulersExtensions.kt
│ │ │ ├── SchedulersProvider.kt
│ │ │ └── SchedulersToken.kt
│ │ │ └── time
│ │ │ └── TimeProvider.kt
│ │ └── test
│ │ └── java
│ │ └── com
│ │ └── shifthackz
│ │ └── aisdv1
│ │ └── core
│ │ └── common
│ │ ├── appbuild
│ │ └── BuildVersionTest.kt
│ │ ├── extensions
│ │ ├── DateExtensionsTest.kt
│ │ ├── KotlinExtensionsTest.kt
│ │ └── StringExtensionsTest.kt
│ │ └── math
│ │ └── MathUtilsTest.kt
├── imageprocessing
│ ├── .gitignore
│ ├── build.gradle.kts
│ ├── consumer-rules.pro
│ ├── proguard-rules.pro
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ └── com
│ │ │ └── shifthackz
│ │ │ └── aisdv1
│ │ │ └── core
│ │ │ └── imageprocessing
│ │ │ ├── Base64EncodingConverter.kt
│ │ │ ├── Base64ToBitmapConverter.kt
│ │ │ ├── BitmapToBase64Converter.kt
│ │ │ ├── contract
│ │ │ └── RxImageProcessor.kt
│ │ │ ├── di
│ │ │ └── ImageProcessingModule.kt
│ │ │ └── utils
│ │ │ └── Base64ImageUtils.kt
│ │ └── res
│ │ └── drawable
│ │ └── ic_broken.webp
├── localization
│ ├── .gitignore
│ ├── build.gradle.kts
│ ├── consumer-rules.pro
│ ├── proguard-rules.pro
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ └── com
│ │ │ └── shifthackz
│ │ │ └── aisdv1
│ │ │ └── core
│ │ │ └── localization
│ │ │ ├── Localization.kt
│ │ │ └── formatter
│ │ │ └── DurationFormatter.kt
│ │ └── res
│ │ ├── drawable
│ │ ├── cn.png
│ │ ├── gb.png
│ │ ├── ru.png
│ │ ├── tr.png
│ │ └── ua.png
│ │ ├── values-ru
│ │ └── strings.xml
│ │ ├── values-tr
│ │ └── strings.xml
│ │ ├── values-uk
│ │ └── strings.xml
│ │ ├── values-zh
│ │ └── strings.xml
│ │ └── values
│ │ └── strings.xml
├── notification
│ ├── .gitignore
│ ├── build.gradle.kts
│ ├── consumer-rules.pro
│ ├── proguard-rules.pro
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ ├── java
│ │ └── com
│ │ │ └── shifthackz
│ │ │ └── aisdv1
│ │ │ └── core
│ │ │ └── notification
│ │ │ ├── PushNotificationManager.kt
│ │ │ ├── PushNotificationManagerImpl.kt
│ │ │ └── di
│ │ │ └── NotificationModule.kt
│ │ └── res
│ │ └── drawable
│ │ └── ic_notification.xml
├── ui
│ ├── .gitignore
│ ├── build.gradle.kts
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── shifthackz
│ │ └── aisdv1
│ │ └── core
│ │ ├── extensions
│ │ ├── ComposableExtensions.kt
│ │ ├── LazyGridScopePagingItemsExtension.kt
│ │ ├── RealPathExtensions.kt
│ │ ├── RowScopeExtensions.kt
│ │ ├── ShakeExtensions.kt
│ │ └── ShimmerExtensions.kt
│ │ ├── model
│ │ └── UiText.kt
│ │ ├── sharing
│ │ └── SharingExtensions.kt
│ │ └── viewmodel
│ │ ├── MviRxViewModel.kt
│ │ └── RxViewModel.kt
└── validation
│ ├── .gitignore
│ ├── build.gradle.kts
│ ├── consumer-rules.pro
│ ├── proguard-rules.pro
│ └── src
│ ├── main
│ ├── AndroidManifest.xml
│ └── java
│ │ └── com
│ │ └── shifthackz
│ │ └── aisdv1
│ │ └── core
│ │ └── validation
│ │ ├── ValidationResult.kt
│ │ ├── common
│ │ ├── CommonStringValidator.kt
│ │ └── CommonStringValidatorImpl.kt
│ │ ├── di
│ │ └── ValidatorsModule.kt
│ │ ├── dimension
│ │ ├── DimensionValidator.kt
│ │ └── DimensionValidatorImpl.kt
│ │ ├── path
│ │ ├── FilePathValidator.kt
│ │ └── FilePathValidatorImpl.kt
│ │ └── url
│ │ ├── UrlValidator.kt
│ │ └── UrlValidatorImpl.kt
│ └── test
│ └── java
│ └── com
│ └── shifthackz
│ └── aisdv1
│ └── core
│ └── validation
│ ├── common
│ └── CommonStringValidatorImplTest.kt
│ ├── dimension
│ └── DimensionValidatorImplTest.kt
│ ├── path
│ └── FilePathValidatorImplTest.kt
│ └── url
│ └── UrlValidatorImplTest.kt
├── data
├── .gitignore
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ ├── main
│ ├── AndroidManifest.xml
│ └── java
│ │ └── com
│ │ └── shifthackz
│ │ └── aisdv1
│ │ └── data
│ │ ├── core
│ │ ├── CoreGenerationRepository.kt
│ │ └── CoreMediaStoreRepository.kt
│ │ ├── di
│ │ ├── DataModule.kt
│ │ ├── LocalDataSourceModule.kt
│ │ ├── RemoteDataSourceModule.kt
│ │ └── RepositoryModule.kt
│ │ ├── gateway
│ │ ├── DatabaseClearGatewayImpl.kt
│ │ ├── ServerConnectivityGatewayImpl.kt
│ │ └── mediastore
│ │ │ ├── MediaStoreGatewayFactory.kt
│ │ │ ├── MediaStoreGatewayImpl.kt
│ │ │ └── MediaStoreGatewayOldImpl.kt
│ │ ├── local
│ │ ├── DownloadableModelLocalDataSource.kt
│ │ ├── EmbeddingsLocalDataSource.kt
│ │ ├── GenerationResultLocalDataSource.kt
│ │ ├── HuggingFaceModelsLocalDataSource.kt
│ │ ├── LorasLocalDataSource.kt
│ │ ├── ServerConfigurationLocalDataSource.kt
│ │ ├── StabilityAiCreditsLocalDataSource.kt
│ │ ├── StableDiffusionHyperNetworksLocalDataSource.kt
│ │ ├── StableDiffusionModelsLocalDataSource.kt
│ │ ├── StableDiffusionSamplersLocalDataSource.kt
│ │ ├── SupportersLocalDataSource.kt
│ │ └── SwarmUiModelsLocalDataSource.kt
│ │ ├── mappers
│ │ ├── AiGenerationResultMappers.kt
│ │ ├── HuggingFaceModelMappers.kt
│ │ ├── ImageToImagePayloadMappers.kt
│ │ ├── LocalAiModelMappers.kt
│ │ ├── ResponseParamsMapper.kt
│ │ ├── ServerConfigurationMappers.kt
│ │ ├── StabilityAiEngineMappers.kt
│ │ ├── StabilityAiPromptMappers.kt
│ │ ├── StableDiffusionEmbeddingsMappers.kt
│ │ ├── StableDiffusionHyperNetworksMappers.kt
│ │ ├── StableDiffusionLorasMappers.kt
│ │ ├── StableDiffusionModelsMappers.kt
│ │ ├── StableDiffusionSamplersMappers.kt
│ │ ├── SupportersMappers.kt
│ │ ├── SwarmUiModelsMappers.kt
│ │ └── TextToImagePayloadMappers.kt
│ │ ├── preference
│ │ ├── PreferenceManagerImpl.kt
│ │ └── SessionPreferenceImpl.kt
│ │ ├── provider
│ │ └── ServerUrlProvider.kt
│ │ ├── remote
│ │ ├── DownloadableModelRemoteDataSource.kt
│ │ ├── HordeGenerationRemoteDataSource.kt
│ │ ├── HuggingFaceGenerationRemoteDataSource.kt
│ │ ├── HuggingFaceModelsRemoteDataSource.kt
│ │ ├── OpenAiGenerationRemoteDataSource.kt
│ │ ├── RandomImageRemoteDataSource.kt
│ │ ├── ReportRemoteDataSource.kt
│ │ ├── ServerConfigurationRemoteDataSource.kt
│ │ ├── StabilityAiCreditsRemoteDataSource.kt
│ │ ├── StabilityAiEnginesRemoteDataSource.kt
│ │ ├── StabilityAiGenerationRemoteDataSource.kt
│ │ ├── StableDiffusionEmbeddingsRemoteDataSource.kt
│ │ ├── StableDiffusionGenerationRemoteDataSource.kt
│ │ ├── StableDiffusionHyperNetworksRemoteDataSource.kt
│ │ ├── StableDiffusionLorasRemoteDataSource.kt
│ │ ├── StableDiffusionModelsRemoteDataSource.kt
│ │ ├── StableDiffusionSamplersRemoteDataSource.kt
│ │ ├── SupportersRemoteDataSource.kt
│ │ ├── SwarmUiEmbeddingsRemoteDataSource.kt
│ │ ├── SwarmUiGenerationRemoteDataSource.kt
│ │ ├── SwarmUiLorasRemoteDataSource.kt
│ │ ├── SwarmUiModelsRemoteDataSource.kt
│ │ └── SwarmUiSessionDataSourceImpl.kt
│ │ └── repository
│ │ ├── DownloadableModelRepositoryImpl.kt
│ │ ├── EmbeddingsRepositoryImpl.kt
│ │ ├── GenerationResultRepositoryImpl.kt
│ │ ├── HordeGenerationRepositoryImpl.kt
│ │ ├── HuggingFaceGenerationRepositoryImpl.kt
│ │ ├── HuggingFaceModelsRepositoryImpl.kt
│ │ ├── LocalDiffusionGenerationRepositoryImpl.kt
│ │ ├── LorasRepositoryImpl.kt
│ │ ├── MediaPipeGenerationRepositoryImpl.kt
│ │ ├── OpenAiGenerationRepositoryImpl.kt
│ │ ├── RandomImageRepositoryImpl.kt
│ │ ├── ReportRepositoryImpl.kt
│ │ ├── ServerConfigurationRepositoryImpl.kt
│ │ ├── StabilityAiCreditsRepositoryImpl.kt
│ │ ├── StabilityAiEnginesRepositoryImpl.kt
│ │ ├── StabilityAiGenerationRepositoryImpl.kt
│ │ ├── StableDiffusionGenerationRepositoryImpl.kt
│ │ ├── StableDiffusionHyperNetworksRepositoryImpl.kt
│ │ ├── StableDiffusionModelsRepositoryImpl.kt
│ │ ├── StableDiffusionSamplersRepositoryImpl.kt
│ │ ├── SupportersRepositoryImpl.kt
│ │ ├── SwarmUiGenerationRepositoryImpl.kt
│ │ ├── SwarmUiModelsRepositoryImpl.kt
│ │ ├── TemporaryGenerationResultRepositoryImpl.kt
│ │ └── WakeLockRepositoryImpl.kt
│ └── test
│ └── java
│ └── com
│ └── shifthackz
│ └── aisdv1
│ └── data
│ ├── gateway
│ ├── DatabaseClearGatewayImplTest.kt
│ ├── ServerConnectivityGatewayImplTest.kt
│ └── mediastore
│ │ └── MediaStoreGatewayFactoryTest.kt
│ ├── local
│ ├── DownloadableModelLocalDataSourceTest.kt
│ ├── EmbeddingsLocalDataSourceTest.kt
│ ├── GenerationResultLocalDataSourceTest.kt
│ ├── HuggingFaceModelsLocalDataSourceTest.kt
│ ├── LorasLocalDataSourceTest.kt
│ ├── ServerConfigurationLocalDataSourceTest.kt
│ ├── StabilityAiCreditsLocalDataSourceTest.kt
│ ├── StableDiffusionHyperNetworksLocalDataSourceTest.kt
│ ├── StableDiffusionModelsLocalDataSourceTest.kt
│ ├── StableDiffusionSamplersLocalDataSourceTest.kt
│ ├── SupportersLocalDataSourceTest.kt
│ └── SwarmUiModelsLocalDataSourceTest.kt
│ ├── mocks
│ ├── AiGenerationResultMocks.kt
│ ├── DownloadableModelResponseMocks.kt
│ ├── GenerationResultEntityMocks.kt
│ ├── HuggingFaceModelEntityMocks.kt
│ ├── HuggingFaceModelMocks.kt
│ ├── HuggingFaceModelRawMocks.kt
│ ├── ImageToImagePayloadMocks.kt
│ ├── LocalAiModelMocks.kt
│ ├── LocalModelEntityMocks.kt
│ ├── OpenAiResponseMocks.kt
│ ├── SdEmbeddingsResponseMocks.kt
│ ├── SdGenerationResponseMocks.kt
│ ├── ServerConfigurationEntityMocks.kt
│ ├── ServerConfigurationMocks.kt
│ ├── ServerConfigurationRawMocks.kt
│ ├── StabilityAiEngineMocks.kt
│ ├── StabilityAiEngineRawMocks.kt
│ ├── StabilityGenerationResponseMocks.kt
│ ├── StableDiffusionEmbeddingEntityMocks.kt
│ ├── StableDiffusionEmbeddingMocks.kt
│ ├── StableDiffusionHyperNetworkEntityMocks.kt
│ ├── StableDiffusionHyperNetworkMocks.kt
│ ├── StableDiffusionHyperNetworkRawMocks.kt
│ ├── StableDiffusionLoraEntityMocks.kt
│ ├── StableDiffusionLoraMocks.kt
│ ├── StableDiffusionLoraRawMocks.kt
│ ├── StableDiffusionModelEntityMocks.kt
│ ├── StableDiffusionModelMocks.kt
│ ├── StableDiffusionModelRawMocks.kt
│ ├── StableDiffusionSamplerEntityMocks.kt
│ ├── StableDiffusionSamplerMocks.kt
│ ├── StableDiffusionSamplerRawMocks.kt
│ ├── SupporterEntityMocks.kt
│ ├── SupporterMocks.kt
│ ├── SupporterRawMocks.kt
│ ├── SwarmUiGenerationResponseMocks.kt
│ ├── SwarmUiModelEntityMocks.kt
│ ├── SwarmUiModelMocks.kt
│ ├── SwarmUiModelRawMocks.kt
│ └── TextToImagePayloadMocks.kt
│ ├── preference
│ ├── PreferenceManagerImplTest.kt
│ └── SessionPreferenceImplTest.kt
│ ├── remote
│ ├── DownloadableModelRemoteDataSourceTest.kt
│ ├── HordeGenerationRemoteDataSourceTest.kt
│ ├── HuggingFaceGenerationRemoteDataSourceTest.kt
│ ├── HuggingFaceModelsRemoteDataSourceTest.kt
│ ├── OpenAiGenerationRemoteDataSourceTest.kt
│ ├── RandomImageRemoteDataSourceTest.kt
│ ├── ServerConfigurationRemoteDataSourceTest.kt
│ ├── StabilityAiCreditsRemoteDataSourceTest.kt
│ ├── StabilityAiEnginesRemoteDataSourceTest.kt
│ ├── StabilityAiGenerationRemoteDataSourceTest.kt
│ ├── StableDiffusionEmbeddingsRemoteDataSourceTest.kt
│ ├── StableDiffusionGenerationRemoteDataSourceTest.kt
│ ├── StableDiffusionHyperNetworksRemoteDataSourceTest.kt
│ ├── StableDiffusionLorasRemoteDataSourceTest.kt
│ ├── StableDiffusionModelsRemoteDataSourceTest.kt
│ ├── StableDiffusionSamplersRemoteDataSourceTest.kt
│ ├── SupportersRemoteDataSourceTest.kt
│ ├── SwarmUiEmbeddingsRemoteDataSourceTest.kt
│ ├── SwarmUiGenerationRemoteDataSourceTest.kt
│ ├── SwarmUiLorasRemoteDataSourceTest.kt
│ ├── SwarmUiModelsRemoteDataSourceTest.kt
│ └── SwarmUiSessionDataSourceImplTest.kt
│ └── repository
│ ├── DownloadableModelRepositoryImplTest.kt
│ ├── EmbeddingsRepositoryImplTest.kt
│ ├── GenerationResultRepositoryImplTest.kt
│ ├── HordeGenerationRepositoryImplTest.kt
│ ├── HuggingFaceGenerationRepositoryImplTest.kt
│ ├── HuggingFaceModelsRepositoryImplTest.kt
│ ├── LocalDiffusionGenerationRepositoryImplTest.kt
│ ├── LorasRepositoryImplTest.kt
│ ├── OpenAiGenerationRepositoryImplTest.kt
│ ├── RandomImageRepositoryImplTest.kt
│ ├── ServerConfigurationRepositoryImplTest.kt
│ ├── StabilityAiCreditsRepositoryImplTest.kt
│ ├── StabilityAiEnginesRepositoryImplTest.kt
│ ├── StabilityAiGenerationRepositoryImplTest.kt
│ ├── StableDiffusionGenerationRepositoryImplTest.kt
│ ├── StableDiffusionHyperNetworksRepositoryImplTest.kt
│ ├── StableDiffusionModelsRepositoryImplTest.kt
│ ├── StableDiffusionSamplersRepositoryImplTest.kt
│ ├── SupportersRepositoryImplTest.kt
│ ├── SwarmUiGenerationRepositoryImplTest.kt
│ ├── SwarmUiModelsRepositoryImplTest.kt
│ ├── TemporaryGenerationResultRepositoryImplTest.kt
│ └── WakeLockRepositoryImplTest.kt
├── demo
├── .gitignore
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ ├── main
│ ├── AndroidManifest.xml
│ └── java
│ │ └── com
│ │ └── shifthackz
│ │ └── aisdv1
│ │ └── demo
│ │ ├── DemoFeature.kt
│ │ ├── ImageToImageDemoImpl.kt
│ │ ├── TextToImageDemoImpl.kt
│ │ ├── di
│ │ └── DemoModule.kt
│ │ └── serialize
│ │ └── DemoDataSerializer.kt
│ └── test
│ └── java
│ └── com
│ └── shifthackz
│ └── aisdv1
│ └── demo
│ ├── ImageToImageDemoImplTest.kt
│ ├── TextToImageDemoImplTest.kt
│ └── mocks
│ ├── ImageToImagePayloadMocks.kt
│ └── TextToImagePayloadMocks.kt
├── docs
├── CNAME
├── app-ads.txt
├── assets
│ ├── 4pda.png
│ ├── fdroid.png
│ ├── github-header-image.png
│ ├── google_play.png
│ ├── scr_group_1.png
│ ├── scr_group_2.png
│ └── sdai.png
├── coins.json
├── feature-flags.json
├── hf-models.json
├── index.html
├── mediapipe.json
├── models.json
├── motd.json
├── policy.html
├── sdapi
│ └── v1
│ │ ├── embeddings
│ │ ├── hypernetworks
│ │ ├── loras
│ │ ├── options
│ │ ├── samplers
│ │ └── sd-models
├── supporters.json
└── version.json
├── domain
├── .gitignore
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ ├── main
│ ├── AndroidManifest.xml
│ └── java
│ │ └── com
│ │ └── shifthackz
│ │ └── aisdv1
│ │ └── domain
│ │ ├── datasource
│ │ ├── DownloadableModelDataSource.kt
│ │ ├── EmbeddingsDataSource.kt
│ │ ├── GenerationResultDataSource.kt
│ │ ├── HordeGenerationDataSource.kt
│ │ ├── HuggingFaceGenerationDataSource.kt
│ │ ├── HuggingFaceModelsDataSource.kt
│ │ ├── LorasDataSource.kt
│ │ ├── OpenAiGenerationDataSource.kt
│ │ ├── RandomImageDataSource.kt
│ │ ├── ReportDataSource.kt
│ │ ├── ServerConfigurationDataSource.kt
│ │ ├── StabilityAiCreditsDataSource.kt
│ │ ├── StabilityAiEnginesDataSource.kt
│ │ ├── StabilityAiGenerationDataSource.kt
│ │ ├── StableDiffusionGenerationDataSource.kt
│ │ ├── StableDiffusionHyperNetworksDataSource.kt
│ │ ├── StableDiffusionModelsDataSource.kt
│ │ ├── StableDiffusionSamplersDataSource.kt
│ │ ├── SupportersDataSource.kt
│ │ ├── SwarmUiGenerationDataSource.kt
│ │ ├── SwarmUiModelsDataSource.kt
│ │ └── SwarmUiSessionDataSource.kt
│ │ ├── demo
│ │ ├── ImageToImageDemo.kt
│ │ └── TextToImageDemo.kt
│ │ ├── di
│ │ └── DomainModule.kt
│ │ ├── entity
│ │ ├── AiGenerationResult.kt
│ │ ├── BackgroundWorkResult.kt
│ │ ├── BackgroundWorkStatus.kt
│ │ ├── ColorToken.kt
│ │ ├── Configuration.kt
│ │ ├── DarkThemeToken.kt
│ │ ├── DownloadState.kt
│ │ ├── Embedding.kt
│ │ ├── FeatureTag.kt
│ │ ├── Grid.kt
│ │ ├── HordeProcessStatus.kt
│ │ ├── HuggingFaceModel.kt
│ │ ├── ImageToImagePayload.kt
│ │ ├── LoRA.kt
│ │ ├── LocalAiModel.kt
│ │ ├── LocalDiffusionStatus.kt
│ │ ├── MediaStoreInfo.kt
│ │ ├── OpenAiModel.kt
│ │ ├── OpenAiQuality.kt
│ │ ├── OpenAiSize.kt
│ │ ├── OpenAiStyle.kt
│ │ ├── ReportReason.kt
│ │ ├── ServerConfiguration.kt
│ │ ├── ServerSource.kt
│ │ ├── Settings.kt
│ │ ├── StabilityAiClipGuidance.kt
│ │ ├── StabilityAiEngine.kt
│ │ ├── StabilityAiSampler.kt
│ │ ├── StabilityAiStylePreset.kt
│ │ ├── StableDiffusionHyperNetwork.kt
│ │ ├── StableDiffusionModel.kt
│ │ ├── StableDiffusionSampler.kt
│ │ ├── Supporter.kt
│ │ ├── SwarmUiModel.kt
│ │ └── TextToImagePayload.kt
│ │ ├── extensions
│ │ └── RxRetry.kt
│ │ ├── feature
│ │ ├── auth
│ │ │ ├── AuthorizationCredentials.kt
│ │ │ └── AuthorizationStore.kt
│ │ ├── diffusion
│ │ │ └── LocalDiffusion.kt
│ │ ├── mediapipe
│ │ │ └── MediaPipe.kt
│ │ └── work
│ │ │ ├── BackgroundTaskManager.kt
│ │ │ └── BackgroundWorkObserver.kt
│ │ ├── gateway
│ │ ├── DatabaseClearGateway.kt
│ │ ├── MediaStoreGateway.kt
│ │ └── ServerConnectivityGateway.kt
│ │ ├── interactor
│ │ ├── settings
│ │ │ ├── SetupConnectionInterActor.kt
│ │ │ └── SetupConnectionInterActorImpl.kt
│ │ └── wakelock
│ │ │ ├── WakeLockInterActor.kt
│ │ │ └── WakeLockInterActorImpl.kt
│ │ ├── preference
│ │ ├── PreferenceManager.kt
│ │ └── SessionPreference.kt
│ │ ├── repository
│ │ ├── DownloadableModelRepository.kt
│ │ ├── EmbeddingsRepository.kt
│ │ ├── GenerationResultRepository.kt
│ │ ├── HordeGenerationRepository.kt
│ │ ├── HuggingFaceGenerationRepository.kt
│ │ ├── HuggingFaceModelsRepository.kt
│ │ ├── LocalDiffusionGenerationRepository.kt
│ │ ├── LorasRepository.kt
│ │ ├── MediaPipeGenerationRepository.kt
│ │ ├── OpenAiGenerationRepository.kt
│ │ ├── RandomImageRepository.kt
│ │ ├── ReportRepository.kt
│ │ ├── ServerConfigurationRepository.kt
│ │ ├── StabilityAiCreditsRepository.kt
│ │ ├── StabilityAiEnginesRepository.kt
│ │ ├── StabilityAiGenerationRepository.kt
│ │ ├── StableDiffusionGenerationRepository.kt
│ │ ├── StableDiffusionHyperNetworksRepository.kt
│ │ ├── StableDiffusionModelsRepository.kt
│ │ ├── StableDiffusionSamplersRepository.kt
│ │ ├── SupportersRepository.kt
│ │ ├── SwarmUiGenerationRepository.kt
│ │ ├── SwarmUiModelsRepository.kt
│ │ ├── TemporaryGenerationResultRepository.kt
│ │ └── WakeLockRepository.kt
│ │ └── usecase
│ │ ├── caching
│ │ ├── ClearAppCacheUseCase.kt
│ │ ├── ClearAppCacheUseCaseImpl.kt
│ │ ├── DataPreLoaderUseCase.kt
│ │ ├── DataPreLoaderUseCaseImpl.kt
│ │ ├── GetLastResultFromCacheUseCase.kt
│ │ ├── GetLastResultFromCacheUseCaseImpl.kt
│ │ ├── SaveLastResultToCacheUseCase.kt
│ │ └── SaveLastResultToCacheUseCaseImpl.kt
│ │ ├── connectivity
│ │ ├── ObserveSeverConnectivityUseCase.kt
│ │ ├── ObserveSeverConnectivityUseCaseImpl.kt
│ │ ├── PingStableDiffusionServiceUseCase.kt
│ │ ├── PingStableDiffusionServiceUseCaseImpl.kt
│ │ ├── TestConnectivityUseCase.kt
│ │ ├── TestConnectivityUseCaseImpl.kt
│ │ ├── TestHordeApiKeyUseCase.kt
│ │ ├── TestHordeApiKeyUseCaseImpl.kt
│ │ ├── TestHuggingFaceApiKeyUseCase.kt
│ │ ├── TestHuggingFaceApiKeyUseCaseImpl.kt
│ │ ├── TestOpenAiApiKeyUseCase.kt
│ │ ├── TestOpenAiApiKeyUseCaseImpl.kt
│ │ ├── TestStabilityAiApiKeyUseCase.kt
│ │ ├── TestStabilityAiApiKeyUseCaseImpl.kt
│ │ ├── TestSwarmUiConnectivityUseCase.kt
│ │ └── TestSwarmUiConnectivityUseCaseImpl.kt
│ │ ├── debug
│ │ ├── DebugInsertBadBase64UseCase.kt
│ │ └── DebugInsertBadBase64UseCaseImpl.kt
│ │ ├── donate
│ │ ├── FetchAndGetSupportersUseCase.kt
│ │ └── FetchAndGetSupportersUseCaseImpl.kt
│ │ ├── downloadable
│ │ ├── DeleteModelUseCase.kt
│ │ ├── DeleteModelUseCaseImpl.kt
│ │ ├── DownloadModelUseCase.kt
│ │ ├── DownloadModelUseCaseImpl.kt
│ │ ├── GetLocalMediaPipeModelsUseCase.kt
│ │ ├── GetLocalMediaPipeModelsUseCaseImpl.kt
│ │ ├── GetLocalModelUseCase.kt
│ │ ├── GetLocalModelUseCaseImpl.kt
│ │ ├── GetLocalOnnxModelsUseCase.kt
│ │ ├── GetLocalOnnxModelsUseCaseImpl.kt
│ │ ├── ObserveLocalOnnxModelsUseCase.kt
│ │ └── ObserveLocalOnnxModelsUseCaseImpl.kt
│ │ ├── gallery
│ │ ├── DeleteAllGalleryUseCase.kt
│ │ ├── DeleteAllGalleryUseCaseImpl.kt
│ │ ├── DeleteGalleryItemUseCase.kt
│ │ ├── DeleteGalleryItemUseCaseImpl.kt
│ │ ├── DeleteGalleryItemsUseCase.kt
│ │ ├── DeleteGalleryItemsUseCaseImpl.kt
│ │ ├── GetAllGalleryUseCase.kt
│ │ ├── GetAllGalleryUseCaseImpl.kt
│ │ ├── GetGalleryItemsUseCase.kt
│ │ ├── GetGalleryItemsUseCaseImpl.kt
│ │ ├── GetMediaStoreInfoUseCase.kt
│ │ ├── GetMediaStoreInfoUseCaseImpl.kt
│ │ ├── ToggleImageVisibilityUseCase.kt
│ │ └── ToggleImageVisibilityUseCaseImpl.kt
│ │ ├── generation
│ │ ├── GetGenerationResultPagedUseCase.kt
│ │ ├── GetGenerationResultPagedUseCaseImpl.kt
│ │ ├── GetGenerationResultUseCase.kt
│ │ ├── GetGenerationResultUseCaseImpl.kt
│ │ ├── GetRandomImageUseCase.kt
│ │ ├── GetRandomImageUseCaseImpl.kt
│ │ ├── ImageToImageUseCase.kt
│ │ ├── ImageToImageUseCaseImpl.kt
│ │ ├── InterruptGenerationUseCase.kt
│ │ ├── InterruptGenerationUseCaseImpl.kt
│ │ ├── ObserveHordeProcessStatusUseCase.kt
│ │ ├── ObserveHordeProcessStatusUseCaseImpl.kt
│ │ ├── ObserveLocalDiffusionProcessStatusUseCase.kt
│ │ ├── ObserveLocalDiffusionProcessStatusUseCaseImpl.kt
│ │ ├── SaveGenerationResultUseCase.kt
│ │ ├── SaveGenerationResultUseCaseImpl.kt
│ │ ├── TextToImageUseCase.kt
│ │ └── TextToImageUseCaseImpl.kt
│ │ ├── huggingface
│ │ ├── FetchAndGetHuggingFaceModelsUseCase.kt
│ │ └── FetchAndGetHuggingFaceModelsUseCaseImpl.kt
│ │ ├── report
│ │ ├── SendReportUseCase.kt
│ │ └── SendReportUseCaseImpl.kt
│ │ ├── sdembedding
│ │ ├── FetchAndGetEmbeddingsUseCase.kt
│ │ └── FetchAndGetEmbeddingsUseCaseImpl.kt
│ │ ├── sdhypernet
│ │ ├── FetchAndGetHyperNetworksUseCase.kt
│ │ └── FetchAndGetHyperNetworksUseCaseImpl.kt
│ │ ├── sdlora
│ │ ├── FetchAndGetLorasUseCase.kt
│ │ └── FetchAndGetLorasUseCaseImpl.kt
│ │ ├── sdmodel
│ │ ├── GetStableDiffusionModelsUseCase.kt
│ │ ├── GetStableDiffusionModelsUseCaseImpl.kt
│ │ ├── SelectStableDiffusionModelUseCase.kt
│ │ └── SelectStableDiffusionModelUseCaseImpl.kt
│ │ ├── sdsampler
│ │ ├── GetStableDiffusionSamplersUseCase.kt
│ │ └── GetStableDiffusionSamplersUseCaseImpl.kt
│ │ ├── settings
│ │ ├── ConnectToA1111UseCase.kt
│ │ ├── ConnectToA1111UseCaseImpl.kt
│ │ ├── ConnectToHordeUseCase.kt
│ │ ├── ConnectToHordeUseCaseImpl.kt
│ │ ├── ConnectToHuggingFaceUseCase.kt
│ │ ├── ConnectToHuggingFaceUseCaseImpl.kt
│ │ ├── ConnectToLocalDiffusionUseCase.kt
│ │ ├── ConnectToLocalDiffusionUseCaseImpl.kt
│ │ ├── ConnectToMediaPipeUseCase.kt
│ │ ├── ConnectToMediaPipeUseCaseImpl.kt
│ │ ├── ConnectToOpenAiUseCase.kt
│ │ ├── ConnectToOpenAiUseCaseImpl.kt
│ │ ├── ConnectToStabilityAiUseCase.kt
│ │ ├── ConnectToStabilityAiUseCaseImpl.kt
│ │ ├── ConnectToSwarmUiUseCase.kt
│ │ ├── ConnectToSwarmUiUseCaseImpl.kt
│ │ ├── GetConfigurationUseCase.kt
│ │ ├── GetConfigurationUseCaseImpl.kt
│ │ ├── SetServerConfigurationUseCase.kt
│ │ └── SetServerConfigurationUseCaseImpl.kt
│ │ ├── splash
│ │ ├── SplashNavigationUseCase.kt
│ │ └── SplashNavigationUseCaseImpl.kt
│ │ ├── stabilityai
│ │ ├── FetchAndGetStabilityAiEnginesUseCase.kt
│ │ ├── FetchAndGetStabilityAiEnginesUseCaseImpl.kt
│ │ ├── ObserveStabilityAiCreditsUseCase.kt
│ │ └── ObserveStabilityAiCreditsUseCaseImpl.kt
│ │ ├── swarmmodel
│ │ ├── FetchAndGetSwarmUiModelsUseCase.kt
│ │ └── FetchAndGetSwarmUiModelsUseCaseImpl.kt
│ │ └── wakelock
│ │ ├── AcquireWakelockUseCase.kt
│ │ ├── AcquireWakelockUseCaseImpl.kt
│ │ ├── ReleaseWakeLockUseCase.kt
│ │ └── ReleaseWakeLockUseCaseImpl.kt
│ └── test
│ └── java
│ └── com
│ └── shifthackz
│ └── aisdv1
│ └── domain
│ ├── mocks
│ ├── AiGenerationResultMocks.kt
│ ├── ConfigurationMocks.kt
│ ├── HuggingFaceModelMocks.kt
│ ├── ImageToImagePayloadMocks.kt
│ ├── LocalAiModelMocks.kt
│ ├── LoraMocks.kt
│ ├── MediaStoreInfoMocks.kt
│ ├── ServerConfigurationMocks.kt
│ ├── SettingsMocks.kt
│ ├── StabilityAiEngineMocks.kt
│ ├── StableDiffusionEmbeddingMocks.kt
│ ├── StableDiffusionHyperNetworkMocks.kt
│ ├── StableDiffusionModelMocks.kt
│ ├── StableDiffusionSamplerMocks.kt
│ ├── SupporterMocks.kt
│ └── TextToImagePayloadMocks.kt
│ └── usecase
│ ├── caching
│ ├── ClearAppCacheUseCaseImplTest.kt
│ ├── DataPreLoaderUseCaseImplTest.kt
│ ├── GetLastResultFromCacheUseCaseImplTest.kt
│ └── SaveLastResultToCacheUseCaseImplTest.kt
│ ├── connectivity
│ ├── ObserveSeverConnectivityUseCaseImplTest.kt
│ ├── PingStableDiffusionServiceUseCaseImplTest.kt
│ ├── TestConnectivityUseCaseImplTest.kt
│ ├── TestHordeApiKeyUseCaseImplTest.kt
│ ├── TestHuggingFaceApiKeyUseCaseImplTest.kt
│ ├── TestOpenAiApiKeyUseCaseImplTest.kt
│ └── TestStabilityAiApiKeyUseCaseImplTest.kt
│ ├── debug
│ └── DebugInsertBadBase64UseCaseImplTest.kt
│ ├── donate
│ └── FetchAndGetSupportersUseCaseImplTest.kt
│ ├── downloadable
│ ├── DeleteModelUseCaseImplTest.kt
│ ├── DownloadModelUseCaseImplTest.kt
│ ├── GetLocalOnnxModelsUseCaseImplTest.kt
│ └── ObserveLocalOnnxModelsUseCaseImplTest.kt
│ ├── gallery
│ ├── DeleteAllGalleryUseCaseImplTest.kt
│ ├── DeleteGalleryItemUseCaseImplTest.kt
│ ├── DeleteGalleryItemsUseCaseImplTest.kt
│ ├── GetAllGalleryUseCaseImplTest.kt
│ ├── GetMediaStoreInfoUseCaseImplTest.kt
│ └── ToggleImageVisibilityUseCaseImplTest.kt
│ ├── generation
│ ├── GetGenerationResultPagedUseCaseImplTest.kt
│ ├── GetGenerationResultUseCaseImplTest.kt
│ ├── GetRandomImageUseCaseImplTest.kt
│ ├── ImageToImageUseCaseImplTest.kt
│ ├── InterruptGenerationUseCaseImplTest.kt
│ ├── ObserveHordeProcessStatusUseCaseImplTest.kt
│ ├── ObserveLocalDiffusionProcessStatusUseCaseImplTest.kt
│ ├── SaveGenerationResultUseCaseImplTest.kt
│ └── TextToImageUseCaseImplTest.kt
│ ├── huggingface
│ └── FetchAndGetHuggingFaceModelsUseCaseImplTest.kt
│ ├── sdembedding
│ └── FetchAndGetEmbeddingsUseCaseImplTest.kt
│ ├── sdhypernet
│ └── FetchAndGetHyperNetworksUseCaseImplTest.kt
│ ├── sdlora
│ └── FetchAndGetLorasUseCaseImplTest.kt
│ ├── sdmodel
│ ├── GetStableDiffusionModelsUseCaseImplTest.kt
│ └── SelectStableDiffusionModelUseCaseImplTest.kt
│ ├── sdsampler
│ └── GetStableDiffusionSamplersUseCaseImplTest.kt
│ ├── settings
│ ├── ConnectToA1111UseCaseImplTest.kt
│ ├── ConnectToHordeUseCaseImplTest.kt
│ ├── ConnectToHuggingFaceUseCaseImplTest.kt
│ ├── ConnectToLocalDiffusionUseCaseImplTest.kt
│ ├── ConnectToOpenAiUseCaseImplTest.kt
│ ├── ConnectToStabilityAiUseCaseImplTest.kt
│ ├── GetConfigurationUseCaseImplTest.kt
│ └── SetServerConfigurationUseCaseImplTest.kt
│ ├── splash
│ └── SplashNavigationUseCaseImplTest.kt
│ ├── stabilityai
│ ├── FetchAndGetStabilityAiEnginesUseCaseImplTest.kt
│ └── ObserveStabilityAiCreditsUseCaseImplTest.kt
│ └── wakelock
│ ├── AcquireWakelockUseCaseImplTest.kt
│ └── ReleaseWakeLockUseCaseImplTest.kt
├── fastlane
└── metadata
│ └── android
│ └── en-US
│ ├── full_description.txt
│ ├── images
│ ├── featureGraphic.png
│ ├── icon.png
│ └── phoneScreenshots
│ │ ├── 1.png
│ │ ├── 2.png
│ │ ├── 3.png
│ │ ├── 4.png
│ │ ├── 5.png
│ │ ├── 6.png
│ │ └── 7.png
│ └── short_description.txt
├── feature
├── auth
│ ├── .gitignore
│ ├── build.gradle.kts
│ ├── consumer-rules.pro
│ ├── proguard-rules.pro
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── shifthackz
│ │ └── aisdv1
│ │ └── feature
│ │ └── auth
│ │ ├── AuthorizationMappers.kt
│ │ ├── AuthorizationStoreImpl.kt
│ │ ├── credentials
│ │ ├── Credentials.kt
│ │ ├── EmptyCredentials.kt
│ │ └── HttpBasicCredentials.kt
│ │ ├── crypto
│ │ ├── CryptoProvider.kt
│ │ └── CryptoProviderImpl.kt
│ │ └── di
│ │ └── AuthModule.kt
├── diffusion
│ ├── .gitignore
│ ├── build.gradle.kts
│ ├── consumer-rules.pro
│ ├── proguard-rules.pro
│ └── src
│ │ └── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ └── com
│ │ └── shifthackz
│ │ └── aisdv1
│ │ └── feature
│ │ └── diffusion
│ │ ├── LocalDiffusionContract.kt
│ │ ├── LocalDiffusionImpl.kt
│ │ ├── ai
│ │ ├── extensions
│ │ │ ├── ArrayExtensions.kt
│ │ │ ├── StringExtensions.kt
│ │ │ └── TensorExtensions.kt
│ │ ├── scheduler
│ │ │ ├── EulerAncestralDiscreteLocalDiffusionScheduler.kt
│ │ │ └── LocalDiffusionScheduler.kt
│ │ ├── tokenizer
│ │ │ ├── EnglishTextTokenizer.kt
│ │ │ ├── LocalDiffusionTextTokenizer.kt
│ │ │ └── TokenizerByteSet.kt
│ │ ├── unet
│ │ │ └── UNet.kt
│ │ └── vae
│ │ │ └── VaeDecoder.kt
│ │ ├── di
│ │ └── DiffusionModule.kt
│ │ ├── entity
│ │ ├── LocalDiffusionAlias.kt
│ │ ├── LocalDiffusionConfig.kt
│ │ ├── LocalDiffusionFlag.kt
│ │ └── LocalDiffusionTensor.kt
│ │ ├── environment
│ │ ├── DeviceNNAPIFlagProvider.kt
│ │ ├── LocalModelIdProvider.kt
│ │ ├── OrtEnvironmentProvider.kt
│ │ └── OrtEnvironmentProviderImpl.kt
│ │ └── extensions
│ │ └── LocalDiffusionPaths.kt
├── mediapipe
│ ├── .gitignore
│ ├── build.gradle.kts
│ ├── consumer-rules.pro
│ ├── proguard-rules.pro
│ └── src
│ │ ├── foss
│ │ └── java
│ │ │ └── com
│ │ │ └── shifthackz
│ │ │ └── aisdv1
│ │ │ └── feature
│ │ │ └── mediapipe
│ │ │ └── MediaPipeImpl.kt
│ │ ├── full
│ │ └── java
│ │ │ └── com
│ │ │ └── shifthackz
│ │ │ └── aisdv1
│ │ │ └── feature
│ │ │ └── mediapipe
│ │ │ └── MediaPipeImpl.kt
│ │ ├── main
│ │ ├── AndroidManifest.xml
│ │ └── java
│ │ │ └── com
│ │ │ └── shifthackz
│ │ │ └── aisdv1
│ │ │ └── feature
│ │ │ └── mediapipe
│ │ │ ├── di
│ │ │ └── MediaPipeModule.kt
│ │ │ └── extensions
│ │ │ └── MediaPipeModelPaths.kt
│ │ ├── playstore
│ │ └── java
│ │ │ └── com
│ │ │ └── shifthackz
│ │ │ └── aisdv1
│ │ │ └── feature
│ │ │ └── mediapipe
│ │ │ └── MediaPipeImpl.kt
│ │ └── test
│ │ └── java
│ │ └── com
│ │ └── shifthackz
│ │ └── aisdv1
│ │ └── feature
│ │ └── mediapipe
│ │ └── ExampleUnitTest.kt
└── work
│ ├── .gitignore
│ ├── build.gradle.kts
│ ├── consumer-rules.pro
│ ├── proguard-rules.pro
│ └── src
│ └── main
│ ├── AndroidManifest.xml
│ └── java
│ └── com
│ └── shifthackz
│ └── aisdv1
│ └── work
│ ├── BackgroundTaskManagerImpl.kt
│ ├── BackgroundWorkObserverImpl.kt
│ ├── Constants.kt
│ ├── core
│ ├── CoreGenerationWorker.kt
│ ├── NotificationWorker.kt
│ └── Rx3Worker.kt
│ ├── di
│ ├── BackgroundWorkModule.kt
│ ├── SdaiWorkerFactory.kt
│ └── WorkManagerProvider.kt
│ ├── mappers
│ ├── ImageToImagePayloadMappers.kt
│ └── TextToImagePayloadMappers.kt
│ └── task
│ ├── ImageToImageTask.kt
│ └── TextToImageTask.kt
├── gradle.properties
├── gradle
├── libs.versions.toml
└── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── gradlew
├── gradlew.bat
├── network
├── .gitignore
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ ├── main
│ ├── AndroidManifest.xml
│ └── java
│ │ └── com
│ │ └── shifthackz
│ │ └── aisdv1
│ │ └── network
│ │ ├── api
│ │ ├── automatic1111
│ │ │ └── Automatic1111RestApi.kt
│ │ ├── horde
│ │ │ └── HordeRestApi.kt
│ │ ├── huggingface
│ │ │ ├── HuggingFaceApi.kt
│ │ │ ├── HuggingFaceInferenceApi.kt
│ │ │ └── HuggingFaceInferenceApiImpl.kt
│ │ ├── imagecdn
│ │ │ ├── ImageCdnRestApi.kt
│ │ │ └── ImageCdnRestApiImpl.kt
│ │ ├── openai
│ │ │ └── OpenAiApi.kt
│ │ ├── sdai
│ │ │ ├── DonateApi.kt
│ │ │ ├── DownloadableModelsApi.kt
│ │ │ ├── DownloadableModelsApiImpl.kt
│ │ │ ├── HuggingFaceModelsApi.kt
│ │ │ └── ReportApi.kt
│ │ ├── stabilityai
│ │ │ └── StabilityAiApi.kt
│ │ └── swarmui
│ │ │ ├── SwarmUiApi.kt
│ │ │ └── SwarmUiApiImpl.kt
│ │ ├── authenticator
│ │ └── RestAuthenticator.kt
│ │ ├── connectivity
│ │ └── ConnectivityMonitor.kt
│ │ ├── di
│ │ └── NetworkModule.kt
│ │ ├── error
│ │ └── StabilityAiErrorMapper.kt
│ │ ├── exception
│ │ └── BadSessionException.kt
│ │ ├── extensions
│ │ ├── ResponseBodyExtensions.kt
│ │ └── RetrofitExtensions.kt
│ │ ├── interceptor
│ │ ├── HeaderInterceptor.kt
│ │ └── LoggingInterceptor.kt
│ │ ├── model
│ │ ├── HuggingFaceModelRaw.kt
│ │ ├── OpenAiImageRaw.kt
│ │ ├── ServerConfigurationRaw.kt
│ │ ├── StabilityAiEngineRaw.kt
│ │ ├── StabilityTextPromptRaw.kt
│ │ ├── StableDiffusionHyperNetworkRaw.kt
│ │ ├── StableDiffusionLoraRaw.kt
│ │ ├── StableDiffusionModelRaw.kt
│ │ ├── StableDiffusionSamplerRaw.kt
│ │ ├── SupporterRaw.kt
│ │ └── SwarmUiModelRaw.kt
│ │ ├── qualifiers
│ │ ├── ApiKeyProvider.kt
│ │ ├── ApiUrlProvider.kt
│ │ ├── CredentialsProvider.kt
│ │ ├── HttpInterceptor.kt
│ │ ├── NetworkHeaders.kt
│ │ ├── NetworkInterceptor.kt
│ │ ├── NetworkPrefixes.kt
│ │ ├── RetrofitCallAdapters.kt
│ │ └── RetrofitConverterFactories.kt
│ │ ├── request
│ │ ├── HordeGenerationAsyncRequest.kt
│ │ ├── HuggingFaceGenerationRequest.kt
│ │ ├── ImageToImageRequest.kt
│ │ ├── OpenAiRequest.kt
│ │ ├── ReportRequest.kt
│ │ ├── StabilityTextToImageRequest.kt
│ │ ├── SwarmUiGenerationRequest.kt
│ │ ├── SwarmUiModelsRequest.kt
│ │ └── TextToImageRequest.kt
│ │ └── response
│ │ ├── AppVersionResponse.kt
│ │ ├── CoinsResponse.kt
│ │ ├── DownloadableModelResponse.kt
│ │ ├── HordeGenerationAsyncResponse.kt
│ │ ├── HordeGenerationCheckResponse.kt
│ │ ├── HordeUserResponse.kt
│ │ ├── HuggingFaceErrorResponse.kt
│ │ ├── OpenAiResponse.kt
│ │ ├── SdEmbeddingsResponse.kt
│ │ ├── SdGenerationResponse.kt
│ │ ├── StabilityAiErrorResponse.kt
│ │ ├── StabilityCreditsResponse.kt
│ │ ├── StabilityGenerationResponse.kt
│ │ ├── SwarmUiGenerationResponse.kt
│ │ ├── SwarmUiModelsResponse.kt
│ │ └── SwarmUiSessionResponse.kt
│ └── test
│ └── java
│ └── com
│ └── shifthackz
│ └── aisdv1
│ └── network
│ └── authenticator
│ └── RestAuthenticatorTest.kt
├── presentation
├── .gitignore
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
└── src
│ ├── main
│ ├── AndroidManifest.xml
│ ├── java
│ │ └── com
│ │ │ └── shifthackz
│ │ │ └── aisdv1
│ │ │ └── presentation
│ │ │ ├── activity
│ │ │ ├── AiStableDiffusionActivity.kt
│ │ │ ├── AiStableDiffusionViewModel.kt
│ │ │ ├── AppIntent.kt
│ │ │ └── AppState.kt
│ │ │ ├── core
│ │ │ ├── GenerationFormUpdateEvent.kt
│ │ │ ├── GenerationMviIntent.kt
│ │ │ ├── GenerationMviState.kt
│ │ │ └── GenerationMviViewModel.kt
│ │ │ ├── di
│ │ │ ├── NavigationModule.kt
│ │ │ ├── PresentationModule.kt
│ │ │ ├── UiUtilsModule.kt
│ │ │ └── ViewModelModule.kt
│ │ │ ├── extensions
│ │ │ ├── BooleanExtensions.kt
│ │ │ └── NavControllerExtensions.kt
│ │ │ ├── modal
│ │ │ ├── ModalRenderer.kt
│ │ │ ├── crop
│ │ │ │ └── CropImageModal.kt
│ │ │ ├── download
│ │ │ │ ├── DownloadDialog.kt
│ │ │ │ ├── DownloadDialogEffect.kt
│ │ │ │ ├── DownloadDialogIntent.kt
│ │ │ │ ├── DownloadDialogState.kt
│ │ │ │ └── DownloadDialogViewModel.kt
│ │ │ ├── embedding
│ │ │ │ ├── EmbeddingIntent.kt
│ │ │ │ ├── EmbeddingScreen.kt
│ │ │ │ ├── EmbeddingState.kt
│ │ │ │ └── EmbeddingViewModel.kt
│ │ │ ├── extras
│ │ │ │ ├── ExtrasEffect.kt
│ │ │ │ ├── ExtrasIntent.kt
│ │ │ │ ├── ExtrasScreen.kt
│ │ │ │ ├── ExtrasState.kt
│ │ │ │ └── ExtrasViewModel.kt
│ │ │ ├── grid
│ │ │ │ └── GridBottomSheet.kt
│ │ │ ├── history
│ │ │ │ ├── InputHistoryItemUi.kt
│ │ │ │ ├── InputHistoryPagingSource.kt
│ │ │ │ ├── InputHistoryScreen.kt
│ │ │ │ └── InputHistoryViewModel.kt
│ │ │ ├── language
│ │ │ │ └── LanguageBottomSheet.kt
│ │ │ ├── ldscheduler
│ │ │ │ └── LDSchedulerBottomSheer.kt
│ │ │ └── tag
│ │ │ │ ├── EditTagDialog.kt
│ │ │ │ ├── EditTagEffect.kt
│ │ │ │ ├── EditTagIntent.kt
│ │ │ │ ├── EditTagState.kt
│ │ │ │ └── EditTagViewModel.kt
│ │ │ ├── model
│ │ │ ├── ErrorState.kt
│ │ │ ├── ExtraType.kt
│ │ │ ├── InPaintModel.kt
│ │ │ ├── LaunchSource.kt
│ │ │ ├── Modal.kt
│ │ │ ├── MotionEvent.kt
│ │ │ └── NavItem.kt
│ │ │ ├── navigation
│ │ │ ├── NavigationEffect.kt
│ │ │ ├── NavigationRoute.kt
│ │ │ ├── graph
│ │ │ │ ├── DrawerNavGraph.kt
│ │ │ │ ├── HomeNavGraph.kt
│ │ │ │ └── MainNavGraph.kt
│ │ │ └── router
│ │ │ │ ├── Router.kt
│ │ │ │ ├── drawer
│ │ │ │ ├── DrawerRouter.kt
│ │ │ │ └── DrawerRouterImpl.kt
│ │ │ │ ├── home
│ │ │ │ ├── HomeRouter.kt
│ │ │ │ └── HomeRouterImpl.kt
│ │ │ │ └── main
│ │ │ │ ├── MainRouter.kt
│ │ │ │ ├── MainRouterExtensions.kt
│ │ │ │ └── MainRouterImpl.kt
│ │ │ ├── screen
│ │ │ ├── debug
│ │ │ │ ├── DebugMenuAccessor.kt
│ │ │ │ ├── DebugMenuEffect.kt
│ │ │ │ ├── DebugMenuIntent.kt
│ │ │ │ ├── DebugMenuMappers.kt
│ │ │ │ ├── DebugMenuScreen.kt
│ │ │ │ ├── DebugMenuState.kt
│ │ │ │ └── DebugMenuViewModel.kt
│ │ │ ├── donate
│ │ │ │ ├── DonateEffect.kt
│ │ │ │ ├── DonateIntent.kt
│ │ │ │ ├── DonateScreen.kt
│ │ │ │ ├── DonateState.kt
│ │ │ │ └── DonateViewModel.kt
│ │ │ ├── drawer
│ │ │ │ ├── DrawerIntent.kt
│ │ │ │ ├── DrawerScreen.kt
│ │ │ │ └── DrawerViewModel.kt
│ │ │ ├── gallery
│ │ │ │ ├── detail
│ │ │ │ │ ├── GalleryDetailBitmapExporter.kt
│ │ │ │ │ ├── GalleryDetailEffect.kt
│ │ │ │ │ ├── GalleryDetailIntent.kt
│ │ │ │ │ ├── GalleryDetailMocks.kt
│ │ │ │ │ ├── GalleryDetailScreen.kt
│ │ │ │ │ ├── GalleryDetailSharing.kt
│ │ │ │ │ ├── GalleryDetailState.kt
│ │ │ │ │ └── GalleryDetailViewModel.kt
│ │ │ │ └── list
│ │ │ │ │ ├── GalleryEffect.kt
│ │ │ │ │ ├── GalleryExporter.kt
│ │ │ │ │ ├── GalleryIntent.kt
│ │ │ │ │ ├── GalleryPagingSource.kt
│ │ │ │ │ ├── GalleryScreen.kt
│ │ │ │ │ ├── GalleryState.kt
│ │ │ │ │ └── GalleryViewModel.kt
│ │ │ ├── home
│ │ │ │ ├── HomeNavigationIntent.kt
│ │ │ │ ├── HomeNavigationMappers.kt
│ │ │ │ ├── HomeNavigationScreen.kt
│ │ │ │ └── HomeNavigationViewModel.kt
│ │ │ ├── img2img
│ │ │ │ ├── ImageToImageEffect.kt
│ │ │ │ ├── ImageToImageScreen.kt
│ │ │ │ ├── ImageToImageState.kt
│ │ │ │ └── ImageToImageViewModel.kt
│ │ │ ├── inpaint
│ │ │ │ ├── InPaintIntent.kt
│ │ │ │ ├── InPaintScreen.kt
│ │ │ │ ├── InPaintState.kt
│ │ │ │ ├── InPaintStateProducer.kt
│ │ │ │ ├── InPaintViewModel.kt
│ │ │ │ ├── components
│ │ │ │ │ ├── CapSizeSlider.kt
│ │ │ │ │ └── InPaintComponent.kt
│ │ │ │ └── forms
│ │ │ │ │ ├── ImageDrawForm.kt
│ │ │ │ │ └── InPaintParamsForm.kt
│ │ │ ├── loader
│ │ │ │ ├── ConfigurationLoaderScreen.kt
│ │ │ │ ├── ConfigurationLoaderState.kt
│ │ │ │ └── ConfigurationLoaderViewModel.kt
│ │ │ ├── logger
│ │ │ │ ├── LoggerIntent.kt
│ │ │ │ ├── LoggerScreen.kt
│ │ │ │ ├── LoggerState.kt
│ │ │ │ └── LoggerViewModel.kt
│ │ │ ├── onboarding
│ │ │ │ ├── OnBoardingDensity.kt
│ │ │ │ ├── OnBoardingIntent.kt
│ │ │ │ ├── OnBoardingPage.kt
│ │ │ │ ├── OnBoardingScreen.kt
│ │ │ │ ├── OnBoardingState.kt
│ │ │ │ ├── OnBoardingText.kt
│ │ │ │ ├── OnBoardingViewModel.kt
│ │ │ │ └── page
│ │ │ │ │ ├── FormPageContent.kt
│ │ │ │ │ ├── LocalDiffusionPageContent.kt
│ │ │ │ │ ├── LookAndFeelPageContent.kt
│ │ │ │ │ └── ProvidersPageContent.kt
│ │ │ ├── report
│ │ │ │ ├── ReportIntent.kt
│ │ │ │ ├── ReportScreen.kt
│ │ │ │ ├── ReportState.kt
│ │ │ │ └── ReportViewModel.kt
│ │ │ ├── settings
│ │ │ │ ├── SettingsEffect.kt
│ │ │ │ ├── SettingsIntent.kt
│ │ │ │ ├── SettingsScreen.kt
│ │ │ │ ├── SettingsState.kt
│ │ │ │ └── SettingsViewModel.kt
│ │ │ ├── setup
│ │ │ │ ├── ServerSetupEffect.kt
│ │ │ │ ├── ServerSetupIntent.kt
│ │ │ │ ├── ServerSetupScreen.kt
│ │ │ │ ├── ServerSetupScreenTags.kt
│ │ │ │ ├── ServerSetupState.kt
│ │ │ │ ├── ServerSetupViewModel.kt
│ │ │ │ ├── components
│ │ │ │ │ ├── ConfigurationModeButton.kt
│ │ │ │ │ └── ConfigurationStepBar.kt
│ │ │ │ ├── forms
│ │ │ │ │ ├── AuthCredentialsForm.kt
│ │ │ │ │ ├── Automatic1111Form.kt
│ │ │ │ │ ├── HordeForm.kt
│ │ │ │ │ ├── HuggingFaceForm.kt
│ │ │ │ │ ├── LocalDiffusionForm.kt
│ │ │ │ │ ├── MediaPipeForm.kt
│ │ │ │ │ ├── OpenAiForm.kt
│ │ │ │ │ ├── StabilityAiForm.kt
│ │ │ │ │ └── SwarmUiForm.kt
│ │ │ │ ├── mappers
│ │ │ │ │ ├── FeatureTagMapper.kt
│ │ │ │ │ ├── LocalModelMappers.kt
│ │ │ │ │ ├── ModesMapper.kt
│ │ │ │ │ ├── ServerSetupValidationFilePathErrorMapper.kt
│ │ │ │ │ ├── ServerSetupValidationStringErrorMapper.kt
│ │ │ │ │ └── ServerSetupValidationUrlMapper.kt
│ │ │ │ └── steps
│ │ │ │ │ ├── BaseStepWrapper.kt
│ │ │ │ │ ├── ConfigurationStep.kt
│ │ │ │ │ └── SourceSelectionStep.kt
│ │ │ ├── splash
│ │ │ │ ├── SplashScreen.kt
│ │ │ │ └── SplashViewModel.kt
│ │ │ ├── txt2img
│ │ │ │ ├── TextToImageScreen.kt
│ │ │ │ ├── TextToImageState.kt
│ │ │ │ └── TextToImageViewModel.kt
│ │ │ └── web
│ │ │ │ ├── SdaiWebViewClient.kt
│ │ │ │ ├── WebViewScreen.kt
│ │ │ │ └── webui
│ │ │ │ ├── WebUiIntent.kt
│ │ │ │ ├── WebUiScreen.kt
│ │ │ │ ├── WebUiState.kt
│ │ │ │ └── WebUiViewModel.kt
│ │ │ ├── theme
│ │ │ ├── ColorTheme.kt
│ │ │ ├── SliderTheme.kt
│ │ │ ├── TextFieldColors.kt
│ │ │ └── global
│ │ │ │ ├── AiSdAppTheme.kt
│ │ │ │ ├── AiSdAppThemeState.kt
│ │ │ │ └── AiSdAppThemeViewModel.kt
│ │ │ ├── utils
│ │ │ ├── Constants.kt
│ │ │ ├── ExtrasFormatter.kt
│ │ │ ├── FileSavableExporter.kt
│ │ │ ├── PermissionUtil.kt
│ │ │ ├── ReportProblemEmailComposer.kt
│ │ │ └── UriToBitmap.kt
│ │ │ └── widget
│ │ │ ├── color
│ │ │ ├── AccentColorSelector.kt
│ │ │ ├── ColorComposable.kt
│ │ │ └── DarkThemeColorSelector.kt
│ │ │ ├── connectivity
│ │ │ ├── ConnectivityComposable.kt
│ │ │ ├── ConnectivityState.kt
│ │ │ └── ConnectivityViewModel.kt
│ │ │ ├── dialog
│ │ │ ├── DecisionInteractiveDialog.kt
│ │ │ ├── ErrorDialog.kt
│ │ │ ├── GenerationImageResultDialog.kt
│ │ │ ├── InfoDialog.kt
│ │ │ └── ProgressDialog.kt
│ │ │ ├── engine
│ │ │ ├── EngineSelectionComponent.kt
│ │ │ ├── EngineSelectionIntent.kt
│ │ │ ├── EngineSelectionState.kt
│ │ │ └── EngineSelectionViewModel.kt
│ │ │ ├── error
│ │ │ └── ErrorComposable.kt
│ │ │ ├── frame
│ │ │ └── PhoneFrame.kt
│ │ │ ├── image
│ │ │ └── ZoomableImage.kt
│ │ │ ├── input
│ │ │ ├── DropdownTextField.kt
│ │ │ ├── GenerationInputForm.kt
│ │ │ ├── SliderTextInputField.kt
│ │ │ └── chip
│ │ │ │ ├── ChipTextField.kt
│ │ │ │ ├── ChipTextFieldItem.kt
│ │ │ │ └── ChipTextFieldWithItem.kt
│ │ │ ├── item
│ │ │ ├── GridIcon.kt
│ │ │ ├── NavigationItemIcon.kt
│ │ │ ├── SettingsHeader.kt
│ │ │ ├── SettingsItem.kt
│ │ │ └── SupporterItem.kt
│ │ │ ├── source
│ │ │ └── ServerSourceLabel.kt
│ │ │ ├── toolbar
│ │ │ ├── GenearionBottomToolbar.kt
│ │ │ └── ModalDialogToolbar.kt
│ │ │ └── work
│ │ │ ├── BackgroundWorkIntent.kt
│ │ │ ├── BackgroundWorkState.kt
│ │ │ ├── BackgroundWorkViewModel.kt
│ │ │ └── BackgroundWorkWidget.kt
│ └── res
│ │ └── drawable
│ │ ├── ic_bmc.webp
│ │ ├── ic_gallery.xml
│ │ ├── ic_github.xml
│ │ ├── ic_image.xml
│ │ ├── ic_img2img.xml
│ │ ├── ic_sdai_logo.webp
│ │ ├── ic_share.xml
│ │ ├── ic_speaker_texture.jpg
│ │ ├── ic_text.xml
│ │ └── ic_txt2img.xml
│ └── test
│ └── java
│ └── com
│ └── shifthackz
│ └── aisdv1
│ └── presentation
│ ├── activity
│ └── AiStableDiffusionViewModelTest.kt
│ ├── core
│ ├── CoreComposeTest.kt
│ ├── CoreGenerationMviViewModelTest.kt
│ ├── CoreViewModelInitializeStrategy.kt
│ └── CoreViewModelTest.kt
│ ├── mocks
│ ├── AiGenerationResultMocks.kt
│ ├── HuggingFaceModelMocks.kt
│ ├── LocalAiModelMocks.kt
│ ├── StabilityAiEngineMocks.kt
│ ├── StableDiffusionEmbeddingMocks.kt
│ ├── StableDiffusionLoraMocks.kt
│ ├── StableDiffusionModelMocks.kt
│ ├── StableDiffusionSamplerMocks.kt
│ ├── SupporterMocks.kt
│ └── SwarmUiModelMocks.kt
│ ├── modal
│ ├── embedding
│ │ └── EmbeddingViewModelTest.kt
│ ├── extras
│ │ └── ExtrasViewModelTest.kt
│ └── tag
│ │ └── EditTagViewModelTest.kt
│ ├── navigation
│ └── router
│ │ ├── drawer
│ │ └── DrawerRouterImplTest.kt
│ │ └── main
│ │ └── MainRouterImplTest.kt
│ ├── screen
│ ├── debug
│ │ └── DebugMenuViewModelTest.kt
│ ├── donate
│ │ └── DonateViewModelTest.kt
│ ├── drawer
│ │ └── DrawerViewModelTest.kt
│ ├── gallery
│ │ ├── detail
│ │ │ └── GalleryDetailViewModelTest.kt
│ │ └── list
│ │ │ └── GalleryViewModelTest.kt
│ ├── img2img
│ │ └── ImageToImageViewModelTest.kt
│ ├── inpaint
│ │ └── InPaintViewModelTest.kt
│ ├── loader
│ │ └── ConfigurationLoaderViewModelTest.kt
│ ├── logger
│ │ └── LoggerViewModelTest.kt
│ ├── onboarding
│ │ └── OnBoardingViewModelSplashSourceTest.kt
│ ├── settings
│ │ └── SettingsViewModelTest.kt
│ ├── setup
│ │ ├── ServerSetupScreenTest.kt
│ │ └── ServerSetupViewModelTest.kt
│ ├── splash
│ │ └── SplashViewModelTest.kt
│ ├── txt2img
│ │ └── TextToImageViewModelTest.kt
│ └── web
│ │ └── webui
│ │ └── WebUiViewModelTest.kt
│ ├── stub
│ ├── DispatchersProviderStub.kt
│ └── SchedulersProviderStub.kt
│ └── widget
│ ├── connectivity
│ └── ConnectivityViewModelTest.kt
│ └── engine
│ └── EngineSelectionViewModelTest.kt
├── settings.gradle.kts
└── storage
├── .gitignore
├── build.gradle.kts
├── consumer-rules.pro
├── proguard-rules.pro
├── schemas
├── com.shifthackz.aisdv1.storage.db.cache.CacheDatabase
│ └── 1.json
└── com.shifthackz.aisdv1.storage.db.persistent.PersistentDatabase
│ ├── 1.json
│ ├── 2.json
│ ├── 3.json
│ ├── 4.json
│ ├── 5.json
│ ├── 6.json
│ └── 7.json
└── src
└── main
├── AndroidManifest.xml
└── java
└── com
└── shifthackz
└── aisdv1
└── storage
├── converters
├── DateConverters.kt
├── ListConverters.kt
└── MapConverters.kt
├── db
├── cache
│ ├── CacheDatabase.kt
│ ├── contract
│ │ ├── ServerConfigurationContract.kt
│ │ ├── StableDiffusionEmbeddingContract.kt
│ │ ├── StableDiffusionHyperNetworkContract.kt
│ │ ├── StableDiffusionLoraContract.kt
│ │ ├── StableDiffusionModelContract.kt
│ │ ├── StableDiffusionSamplerContract.kt
│ │ └── SwarmUiModelContract.kt
│ ├── dao
│ │ ├── ServerConfigurationDao.kt
│ │ ├── StableDiffusionEmbeddingDao.kt
│ │ ├── StableDiffusionHyperNetworkDao.kt
│ │ ├── StableDiffusionLoraDao.kt
│ │ ├── StableDiffusionModelDao.kt
│ │ ├── StableDiffusionSamplerDao.kt
│ │ └── SwarmUiModelDao.kt
│ └── entity
│ │ ├── ServerConfigurationEntity.kt
│ │ ├── StableDiffusionEmbeddingEntity.kt
│ │ ├── StableDiffusionHyperNetworkEntity.kt
│ │ ├── StableDiffusionLoraEntity.kt
│ │ ├── StableDiffusionModelEntity.kt
│ │ ├── StableDiffusionSamplerEntity.kt
│ │ └── SwarmUiModelEntity.kt
└── persistent
│ ├── PersistentDatabase.kt
│ ├── contract
│ ├── GenerationResultContract.kt
│ ├── HuggingFaceModelContract.kt
│ ├── LocalModelContract.kt
│ └── SupporterContract.kt
│ ├── dao
│ ├── GenerationResultDao.kt
│ ├── HuggingFaceModelDao.kt
│ ├── LocalModelDao.kt
│ └── SupporterDao.kt
│ └── entity
│ ├── GenerationResultEntity.kt
│ ├── HuggingFaceModelEntity.kt
│ ├── LocalModelEntity.kt
│ └── SupporterEntity.kt
├── di
└── DatabaseModule.kt
└── gateway
├── GatewayClearCacheDb.kt
└── GatewayClearPersistentDb.kt
/.github/CODEOWNERS:
--------------------------------------------------------------------------------
1 | @ShiftHackZ
2 |
--------------------------------------------------------------------------------
/.github/pull_request_template.md:
--------------------------------------------------------------------------------
1 | ### Description
2 | - Describe your PR here
3 |
4 | ### Screenshots / Video (Optional)
5 |
6 | ### Checklist
7 | - [ ] I have ensured this PR does not contain any breaking changes for existing functionality;
8 | - [ ] I have added automated tests that cover the new behavior and removed obsolete tests and code;
9 |
10 | ### Tested On
11 | - [ ] Emulator
12 | - [ ] Real device
13 |
--------------------------------------------------------------------------------
/adb_remove.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | adb uninstall com.shifthackz.aisdv1.app
3 | adb uninstall com.shifthackz.aisdv1.app.foss
4 | exit 0
5 |
--------------------------------------------------------------------------------
/app/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/app/src/main/ic_launcher-playstore.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/app/src/main/ic_launcher-playstore.png
--------------------------------------------------------------------------------
/app/src/main/java/com/shifthackz/aisdv1/app/di/FeatureModule.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.app.di
2 |
3 | import com.shifthackz.aisdv1.feature.auth.di.authModule
4 | import com.shifthackz.aisdv1.feature.diffusion.di.diffusionModule
5 | import com.shifthackz.aisdv1.feature.mediapipe.di.mediaPipeModule
6 |
7 | val featureModule = arrayOf(
8 | authModule,
9 | diffusionModule,
10 | mediaPipeModule,
11 | )
12 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-anydpi-v26/ic_launcher_round.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/app/src/main/res/mipmap-hdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-hdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/app/src/main/res/mipmap-mdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-mdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/app/src/main/res/mipmap-xhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
--------------------------------------------------------------------------------
/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
--------------------------------------------------------------------------------
/app/src/main/res/values/colors.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #FFBB86FC
4 | #FF6200EE
5 | #FF3700B3
6 | #FF03DAC5
7 | #FF018786
8 | #FF000000
9 | #FFFFFFFF
10 |
--------------------------------------------------------------------------------
/app/src/main/res/values/ic_launcher_background.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 | #F2EFEF
4 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/file_provider_paths.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
7 |
10 |
11 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/app/src/main/res/xml/locale_config.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/build-logic/convention/src/main/kotlin/FlavorsConventionPlugin.kt:
--------------------------------------------------------------------------------
1 | import com.android.build.gradle.LibraryExtension
2 | import com.shifthackz.aisdv1.buildlogic.configureFlavorsCommon
3 | import org.gradle.api.Plugin
4 | import org.gradle.api.Project
5 | import org.gradle.kotlin.dsl.configure
6 |
7 | class FlavorsConventionPlugin : Plugin {
8 |
9 | override fun apply(target: Project) {
10 | with(target) {
11 | extensions.configure {
12 | configureFlavorsCommon(this)
13 | }
14 | }
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/build-logic/convention/src/main/kotlin/com/shifthackz/aisdv1/buildlogic/Application.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.buildlogic
2 |
3 | import com.android.build.api.dsl.ApplicationExtension
4 | import org.gradle.api.Project
5 |
6 | internal fun Project.configureApplication(
7 | commonExtension: ApplicationExtension,
8 | ) {
9 | commonExtension.apply {
10 | configureKotlinAndroid(this)
11 | bundle.language.enableSplit = false
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/build-logic/convention/src/main/kotlin/com/shifthackz/aisdv1/buildlogic/Project.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.buildlogic
2 |
3 | import org.gradle.api.Project
4 | import org.gradle.api.artifacts.VersionCatalog
5 | import org.gradle.api.artifacts.VersionCatalogsExtension
6 | import org.gradle.kotlin.dsl.getByType
7 |
8 | val Project.libs: VersionCatalog
9 | get() = extensions.getByType().named("libs")
10 |
--------------------------------------------------------------------------------
/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.android.application) apply false
3 | alias(libs.plugins.android.library) apply false
4 | alias(libs.plugins.jetbrains.kotlin.android) apply false
5 | alias(libs.plugins.jetbrains.kotlin.serialization) apply false
6 | alias(libs.plugins.compose.compiler) apply false
7 | alias(libs.plugins.google.ksp) apply false
8 | alias(libs.plugins.androidx.room) apply false
9 | }
10 |
--------------------------------------------------------------------------------
/core/common/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/core/common/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.generic.library)
3 | }
4 |
5 | android {
6 | namespace = "com.shifthackz.aisdv1.core.common"
7 | }
8 |
9 | dependencies {
10 | implementation(libs.androidx.core)
11 | implementation(libs.koin.core)
12 | implementation(libs.rx.java)
13 | implementation(libs.timber)
14 | testImplementation(libs.test.junit)
15 | }
16 |
--------------------------------------------------------------------------------
/core/common/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/core/common/consumer-rules.pro
--------------------------------------------------------------------------------
/core/common/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/core/common/src/main/java/com/shifthackz/aisdv1/core/common/appbuild/ActivityIntentProvider.kt:
--------------------------------------------------------------------------------
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 | }
8 |
--------------------------------------------------------------------------------
/core/common/src/main/java/com/shifthackz/aisdv1/core/common/appbuild/BuildType.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.core.common.appbuild
2 |
3 | enum class BuildType {
4 | FULL,
5 | FOSS,
6 | PLAY;
7 |
8 | companion object {
9 | fun fromBuildConfig(input: String) = when (input) {
10 | "FULL" -> FULL
11 | "FOSS" -> FOSS
12 | else -> PLAY
13 | }
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/ClipboardExtensions.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.core.common.extensions
2 |
3 | import android.content.ClipData
4 | import android.content.ClipboardManager
5 | import android.content.Context
6 |
7 | fun Context.copyToClipboard(text: CharSequence) {
8 | val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
9 | val clip = ClipData.newPlainText("label", text)
10 | clipboard.setPrimaryClip(clip)
11 | }
12 |
--------------------------------------------------------------------------------
/core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/KotlinExtensions.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.core.common.extensions
2 |
3 | inline fun T.applyIf(predicate: Boolean, block: T.() -> Unit): T {
4 | if (!predicate) return this
5 | return apply(block)
6 | }
7 |
--------------------------------------------------------------------------------
/core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/UnitExtensions.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.core.common.extensions
2 |
3 | val EmptyLambda: () -> Unit = {}
4 |
--------------------------------------------------------------------------------
/core/common/src/main/java/com/shifthackz/aisdv1/core/common/file/FileProviderDescriptor.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.core.common.file
2 |
3 | const val LOCAL_DIFFUSION_CUSTOM_PATH = "/storage/emulated/0/Download/SDAI/model"
4 |
5 | interface FileProviderDescriptor {
6 | val providerPath: String
7 | val imagesCacheDirPath: String
8 | val logsCacheDirPath: String
9 | val localModelDirPath: String
10 | val workCacheDirPath: String
11 | }
12 |
--------------------------------------------------------------------------------
/core/common/src/main/java/com/shifthackz/aisdv1/core/common/links/LinksProvider.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.core.common.links
2 |
3 | interface LinksProvider {
4 | val hordeUrl: String
5 | val hordeSignUpUrl: String
6 | val huggingFaceUrl: String
7 | val openAiInfoUrl: String
8 | val stabilityAiInfoUrl: String
9 | val privacyPolicyUrl: String
10 | val donateUrl: String
11 | val gitHubSourceUrl: String
12 | val setupInstructionsUrl: String
13 | val swarmUiInfoUrl: String
14 | val demoModeUrl: String
15 | }
16 |
--------------------------------------------------------------------------------
/core/common/src/main/java/com/shifthackz/aisdv1/core/common/math/MathUtils.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.core.common.math
2 |
3 | import kotlin.math.pow
4 | import kotlin.math.roundToInt
5 |
6 | fun Double.roundTo(numFractionDigits: Int): Double {
7 | val factor = 10.0.pow(numFractionDigits.toDouble())
8 | return (this * factor).roundToInt() / factor
9 | }
10 |
11 | fun Float.roundTo(numFractionDigits: Int): Float {
12 | val factor = 10.0.pow(numFractionDigits.toDouble())
13 | return ((this * factor).roundToInt() / factor).toFloat()
14 | }
15 |
--------------------------------------------------------------------------------
/core/common/src/main/java/com/shifthackz/aisdv1/core/common/model/Hexagonal.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.core.common.model
2 |
3 | import java.io.Serializable
4 |
5 | data class Hexagonal(
6 | val first: A,
7 | val second: B,
8 | val third: C,
9 | val fourth: D,
10 | val fifth: E,
11 | val sixth: F,
12 | ) : Serializable {
13 |
14 | override fun toString(): String = "($first, $second, $third, $fourth, $fifth, $sixth)"
15 | }
16 |
--------------------------------------------------------------------------------
/core/common/src/main/java/com/shifthackz/aisdv1/core/common/model/Quadruple.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.core.common.model
2 |
3 | import java.io.Serializable
4 |
5 | data class Quadruple(
6 | val first: A,
7 | val second: B,
8 | val third: C,
9 | val fourth: D,
10 | ) : Serializable {
11 |
12 | override fun toString(): String = "($first, $second, $third, $fourth)"
13 | }
14 |
--------------------------------------------------------------------------------
/core/common/src/main/java/com/shifthackz/aisdv1/core/common/model/Quintuple.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.core.common.model
2 |
3 | import java.io.Serializable
4 |
5 | data class Quintuple(
6 | val first: A,
7 | val second: B,
8 | val third: C,
9 | val fourth: D,
10 | val fifth: E,
11 | ) : Serializable {
12 |
13 | override fun toString(): String = "($first, $second, $third, $fourth, $fifth)"
14 | }
15 |
--------------------------------------------------------------------------------
/core/common/src/main/java/com/shifthackz/aisdv1/core/common/schedulers/DispatchersProvider.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.core.common.schedulers
2 |
3 | import kotlinx.coroutines.CoroutineDispatcher
4 |
5 | interface DispatchersProvider {
6 | val io: CoroutineDispatcher
7 | val ui: CoroutineDispatcher
8 | val immediate: CoroutineDispatcher
9 | }
10 |
--------------------------------------------------------------------------------
/core/common/src/main/java/com/shifthackz/aisdv1/core/common/schedulers/SchedulersToken.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.core.common.schedulers
2 |
3 | enum class SchedulersToken(val type: String) {
4 | MAIN_THREAD("Main thread"),
5 | IO_THREAD("IO thread"),
6 | COMPUTATION("Computation"),
7 | SINGLE_THREAD("Single thread"),
8 | }
9 |
--------------------------------------------------------------------------------
/core/common/src/main/java/com/shifthackz/aisdv1/core/common/time/TimeProvider.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.core.common.time
2 |
3 | import java.util.Date
4 |
5 | interface TimeProvider {
6 | fun nanoTime(): Long
7 | fun currentTimeMillis(): Long
8 | fun currentDate(): Date
9 | }
10 |
--------------------------------------------------------------------------------
/core/imageprocessing/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/core/imageprocessing/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.generic.library)
3 | }
4 |
5 | android {
6 | namespace = "com.shifthackz.aisdv1.core.imageprocessing"
7 | }
8 |
9 | dependencies {
10 | implementation(project(":core:common"))
11 | implementation(libs.koin.core)
12 | implementation(libs.koin.android)
13 | implementation(libs.rx.kotlin)
14 | }
15 |
--------------------------------------------------------------------------------
/core/imageprocessing/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/core/imageprocessing/consumer-rules.pro
--------------------------------------------------------------------------------
/core/imageprocessing/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/core/imageprocessing/src/main/java/com/shifthackz/aisdv1/core/imageprocessing/contract/RxImageProcessor.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.core.imageprocessing.contract
2 |
3 | import io.reactivex.rxjava3.core.Single
4 |
5 | interface RxImageProcessor {
6 | operator fun invoke(input: I): Single
7 | }
8 |
--------------------------------------------------------------------------------
/core/imageprocessing/src/main/res/drawable/ic_broken.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/core/imageprocessing/src/main/res/drawable/ic_broken.webp
--------------------------------------------------------------------------------
/core/localization/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/core/localization/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.generic.library)
3 | }
4 |
5 | android {
6 | namespace = "com.shifthackz.aisdv1.core.localization"
7 | }
8 |
--------------------------------------------------------------------------------
/core/localization/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/core/localization/consumer-rules.pro
--------------------------------------------------------------------------------
/core/localization/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/core/localization/src/main/res/drawable/cn.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/core/localization/src/main/res/drawable/cn.png
--------------------------------------------------------------------------------
/core/localization/src/main/res/drawable/gb.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/core/localization/src/main/res/drawable/gb.png
--------------------------------------------------------------------------------
/core/localization/src/main/res/drawable/ru.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/core/localization/src/main/res/drawable/ru.png
--------------------------------------------------------------------------------
/core/localization/src/main/res/drawable/tr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/core/localization/src/main/res/drawable/tr.png
--------------------------------------------------------------------------------
/core/localization/src/main/res/drawable/ua.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/core/localization/src/main/res/drawable/ua.png
--------------------------------------------------------------------------------
/core/notification/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/core/notification/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.generic.library)
3 | }
4 |
5 | android {
6 | namespace = "com.shifthackz.aisdv1.core.notification"
7 | }
8 |
9 | dependencies {
10 | implementation(project(":core:common"))
11 | implementation(project(":core:ui"))
12 | implementation(libs.koin.core)
13 | implementation(libs.koin.android)
14 | implementation(libs.androidx.core)
15 | }
16 |
--------------------------------------------------------------------------------
/core/notification/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/core/notification/consumer-rules.pro
--------------------------------------------------------------------------------
/core/notification/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/core/ui/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/core/ui/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.generic.compose)
3 | }
4 |
5 | android {
6 | namespace = "com.shifthackz.aisdv1.core.ui"
7 | }
8 |
--------------------------------------------------------------------------------
/core/ui/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/core/ui/src/main/java/com/shifthackz/aisdv1/core/viewmodel/RxViewModel.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.core.viewmodel
2 |
3 | import androidx.lifecycle.ViewModel
4 | import com.shifthackz.aisdv1.core.common.contract.RxDisposableContract
5 | import io.reactivex.rxjava3.disposables.CompositeDisposable
6 |
7 | abstract class RxViewModel : ViewModel(), RxDisposableContract {
8 |
9 | override val compositeDisposable = CompositeDisposable()
10 |
11 | override fun onCleared() {
12 | super.onCleared()
13 | compositeDisposable.clear()
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/core/validation/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/core/validation/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.generic.library)
3 | }
4 |
5 | android {
6 | namespace = "com.shifthackz.aisdv1.core.validation"
7 | }
8 |
9 | dependencies {
10 | implementation(libs.koin.core)
11 | implementation(libs.rx.kotlin)
12 | testImplementation(libs.test.junit)
13 | testImplementation(libs.test.mockk)
14 | }
15 |
--------------------------------------------------------------------------------
/core/validation/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/core/validation/consumer-rules.pro
--------------------------------------------------------------------------------
/core/validation/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/ValidationResult.kt:
--------------------------------------------------------------------------------
1 | @file:Suppress("unused")
2 |
3 | package com.shifthackz.aisdv1.core.validation
4 |
5 | data class ValidationResult(
6 | val isValid: Boolean,
7 | val validationError: T? = null,
8 | ) {
9 | val isNotValid: Boolean
10 | get() = !isValid
11 | }
12 |
--------------------------------------------------------------------------------
/core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/common/CommonStringValidator.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.core.validation.common
2 |
3 | import com.shifthackz.aisdv1.core.validation.ValidationResult
4 |
5 | interface CommonStringValidator {
6 |
7 | operator fun invoke(input: String?) : ValidationResult
8 |
9 | sealed interface Error {
10 | data object Empty : Error
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/dimension/DimensionValidator.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.core.validation.dimension
2 |
3 | import com.shifthackz.aisdv1.core.validation.ValidationResult
4 |
5 | fun interface DimensionValidator {
6 |
7 | operator fun invoke(input: String?): ValidationResult
8 |
9 | sealed interface Error {
10 | data object Empty : Error
11 | data object Unexpected : Error
12 | data class LessThanMinimum(val min: Int) : Error
13 | data class BiggerThanMaximum(val max: Int) : Error
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/path/FilePathValidator.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.core.validation.path
2 |
3 | import com.shifthackz.aisdv1.core.validation.ValidationResult
4 |
5 | interface FilePathValidator {
6 |
7 | operator fun invoke(input: String?): ValidationResult
8 |
9 | sealed interface Error {
10 | data object Empty : Error
11 | data object Invalid : Error
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/url/UrlValidator.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.core.validation.url
2 |
3 | import com.shifthackz.aisdv1.core.validation.ValidationResult
4 |
5 | interface UrlValidator {
6 |
7 | operator fun invoke(input: String?): ValidationResult
8 |
9 | sealed interface Error {
10 | data object Empty : Error
11 | data object BadScheme : Error
12 | data object BadPort : Error
13 | data object Invalid : Error
14 | data object Localhost : Error
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/data/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/data/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/data/consumer-rules.pro
--------------------------------------------------------------------------------
/data/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/data/src/main/java/com/shifthackz/aisdv1/data/di/DataModule.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.di
2 |
3 | val dataModule = (remoteDataSourceModule + localDataSourceModule + repositoryModule)
4 | .toTypedArray()
5 |
--------------------------------------------------------------------------------
/data/src/main/java/com/shifthackz/aisdv1/data/preference/SessionPreferenceImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.preference
2 |
3 | import com.shifthackz.aisdv1.domain.preference.SessionPreference
4 |
5 | class SessionPreferenceImpl : SessionPreference {
6 |
7 | private var _swarmUiSessionId: String = ""
8 |
9 | override var swarmUiSessionId: String
10 | get() = _swarmUiSessionId
11 | set(value) {
12 | _swarmUiSessionId = value
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/data/src/main/java/com/shifthackz/aisdv1/data/provider/ServerUrlProvider.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.provider
2 |
3 | import io.reactivex.rxjava3.core.Single
4 |
5 | fun interface ServerUrlProvider {
6 | operator fun invoke(endpoint: String): Single
7 | }
8 |
--------------------------------------------------------------------------------
/data/src/main/java/com/shifthackz/aisdv1/data/remote/RandomImageRemoteDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.remote
2 |
3 | import com.shifthackz.aisdv1.domain.datasource.RandomImageDataSource
4 | import com.shifthackz.aisdv1.network.api.imagecdn.ImageCdnRestApi
5 |
6 | internal class RandomImageRemoteDataSource(
7 | private val api: ImageCdnRestApi,
8 | ) : RandomImageDataSource.Remote {
9 |
10 | override fun fetch() = api.fetchRandomImage()
11 | }
12 |
--------------------------------------------------------------------------------
/data/src/main/java/com/shifthackz/aisdv1/data/repository/RandomImageRepositoryImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.repository
2 |
3 | import com.shifthackz.aisdv1.domain.datasource.RandomImageDataSource
4 | import com.shifthackz.aisdv1.domain.repository.RandomImageRepository
5 |
6 | internal class RandomImageRepositoryImpl(
7 | private val remoteDataSource: RandomImageDataSource.Remote,
8 | ) : RandomImageRepository {
9 |
10 | override fun fetchAndGet() = remoteDataSource.fetch()
11 | }
12 |
--------------------------------------------------------------------------------
/data/src/main/java/com/shifthackz/aisdv1/data/repository/StabilityAiEnginesRepositoryImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.repository
2 |
3 | import com.shifthackz.aisdv1.domain.datasource.StabilityAiEnginesDataSource
4 | import com.shifthackz.aisdv1.domain.repository.StabilityAiEnginesRepository
5 |
6 | internal class StabilityAiEnginesRepositoryImpl(
7 | private val remoteDataSource: StabilityAiEnginesDataSource.Remote,
8 | ) : StabilityAiEnginesRepository {
9 |
10 | override fun fetchAndGet() = remoteDataSource.fetch()
11 | }
12 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/DownloadableModelResponseMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.network.response.DownloadableModelResponse
4 |
5 | val mockDownloadableModelsResponse = listOf(
6 | DownloadableModelResponse(
7 | id = "1",
8 | name = "Model 1",
9 | size = "5 Gb",
10 | sources = listOf("https://example.com/1.html"),
11 | )
12 | )
13 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/HuggingFaceModelEntityMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.storage.db.persistent.entity.HuggingFaceModelEntity
4 |
5 | val mockHuggingFaceModelEntity = HuggingFaceModelEntity(
6 | id = "050598",
7 | name = "Super model",
8 | alias = "❤",
9 | source = "https://life.archive.org/models/unique/050598",
10 | )
11 |
12 | val mockHuggingFaceModelEntities = listOf(
13 | mockHuggingFaceModelEntity,
14 | )
15 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/HuggingFaceModelMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.domain.entity.HuggingFaceModel
4 |
5 | val mockHuggingFaceModel = HuggingFaceModel(
6 | id = "050598",
7 | name = "Super model",
8 | alias = "❤",
9 | source = "https://life.archive.org/models/unique/050598",
10 | )
11 |
12 | val mockHuggingFaceModels = listOf(mockHuggingFaceModel)
13 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/LocalAiModelMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.domain.entity.LocalAiModel
4 |
5 | val mockLocalAiModel = LocalAiModel(
6 | id = "5598",
7 | type = LocalAiModel.Type.ONNX,
8 | name = "Model 5598",
9 | size = "5 Gb",
10 | sources = listOf("https://example.com/1.html"),
11 | downloaded = false,
12 | selected = false,
13 | )
14 |
15 | val mockLocalAiModels = listOf(mockLocalAiModel)
16 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SdEmbeddingsResponseMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.network.response.SdEmbeddingsResponse
4 |
5 | val mockSdEmbeddingsResponse = SdEmbeddingsResponse(
6 | loaded = mapOf("1504" to "5598"),
7 | )
8 |
9 | val mockEmptySdEmbeddingsResponse = SdEmbeddingsResponse(
10 | loaded = emptyMap(),
11 | )
12 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SdGenerationResponseMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.network.response.SdGenerationResponse
4 |
5 | val mockSdGenerationResponse = SdGenerationResponse(
6 | images = listOf("base64"),
7 | info = "info",
8 | )
9 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/ServerConfigurationEntityMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.storage.db.cache.entity.ServerConfigurationEntity
4 |
5 | val mockServerConfigurationEntity = ServerConfigurationEntity(
6 | serverId = "5598",
7 | sdModelCheckpoint = "checkpoint",
8 | )
9 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/ServerConfigurationMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.domain.entity.ServerConfiguration
4 |
5 | val mockServerConfiguration = ServerConfiguration("checkpoint")
6 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/ServerConfigurationRawMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.network.model.ServerConfigurationRaw
4 |
5 | val mockServerConfigurationRaw = ServerConfigurationRaw("5598")
6 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StabilityAiEngineMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.domain.entity.StabilityAiEngine
4 |
5 | val mockStabilityAiEngines = listOf(
6 | StabilityAiEngine(
7 | id = "5598",
8 | name = "engine_5598",
9 | ),
10 | )
11 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StabilityAiEngineRawMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.network.model.StabilityAiEngineRaw
4 |
5 | val mockStabilityAiEnginesRaw = listOf(
6 | StabilityAiEngineRaw(
7 | description = "❤",
8 | id = "5598",
9 | name = "Super engine",
10 | type = "unique",
11 | ),
12 | )
13 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionEmbeddingEntityMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionEmbeddingEntity
4 |
5 | val mockStableDiffusionEmbeddingEntities = listOf(
6 | StableDiffusionEmbeddingEntity(
7 | id = "5598",
8 | keyword = "keyword_5598",
9 | ),
10 | StableDiffusionEmbeddingEntity(
11 | id = "151297",
12 | keyword = "keyword_151297",
13 | ),
14 | )
15 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionEmbeddingMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.domain.entity.Embedding
4 |
5 | val mockEmbeddings = listOf(
6 | Embedding("keyword_5598"),
7 | Embedding("keyword_151297"),
8 | )
9 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionHyperNetworkEntityMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionHyperNetworkEntity
4 |
5 | val mockStableDiffusionHyperNetworkEntities = listOf(
6 | StableDiffusionHyperNetworkEntity(
7 | id = "5598",
8 | name = "net_5598",
9 | path = "/unknown",
10 | ),
11 | StableDiffusionHyperNetworkEntity(
12 | id = "151297",
13 | name = "net_151297",
14 | path = "/unknown",
15 | ),
16 | )
17 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionHyperNetworkMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.domain.entity.StableDiffusionHyperNetwork
4 |
5 | val mockStableDiffusionHyperNetworks = listOf(
6 | StableDiffusionHyperNetwork(
7 | name = "net_5598",
8 | path = "/unknown",
9 | ),
10 | StableDiffusionHyperNetwork(
11 | name = "net_151297",
12 | path = "/unknown",
13 | )
14 | )
15 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionHyperNetworkRawMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.network.model.StableDiffusionHyperNetworkRaw
4 |
5 | val mockStableDiffusionHyperNetworkRaw = listOf(
6 | StableDiffusionHyperNetworkRaw(
7 | name = "5598",
8 | path = "Unknown",
9 | ),
10 | )
11 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionLoraMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.domain.entity.LoRA
4 |
5 | val mockStableDiffusionLoras = listOf(
6 | LoRA(
7 | name = "name_5598",
8 | alias = "alias_5598",
9 | path = "/unknown",
10 | ),
11 | LoRA(
12 | name = "name_151297",
13 | alias = "alias_151297",
14 | path = "/unknown",
15 | ),
16 | )
17 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionLoraRawMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.network.model.StableDiffusionLoraRaw
4 |
5 | val mockStableDiffusionLoraRaw = listOf(
6 | StableDiffusionLoraRaw(
7 | name = "Super lora",
8 | alias = "5598",
9 | path = "Unknown",
10 | ),
11 | )
12 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionModelRawMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.network.model.StableDiffusionModelRaw
4 |
5 | val mockStableDiffusionModelRaw = listOf(
6 | StableDiffusionModelRaw(
7 | title = "5598",
8 | modelName = "5598",
9 | hash = "hash5598",
10 | sha256 = "sha5598",
11 | filename = "Unknown",
12 | config = "Unconfigurable",
13 | ),
14 | )
15 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionSamplerMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.domain.entity.StableDiffusionSampler
4 |
5 | val mockStableDiffusionSamplers = listOf(
6 | StableDiffusionSampler(
7 | name = "name_5598",
8 | aliases = emptyList(),
9 | options = emptyMap(),
10 | ),
11 | StableDiffusionSampler(
12 | name = "name_151297",
13 | aliases = emptyList(),
14 | options = emptyMap(),
15 | ),
16 | )
17 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionSamplerRawMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.network.model.StableDiffusionSamplerRaw
4 |
5 | val mockStableDiffusionSamplerRaw = listOf(
6 | StableDiffusionSamplerRaw(
7 | "5598",
8 | listOf(),
9 | mapOf(),
10 | )
11 | )
12 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SupporterEntityMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.storage.db.persistent.entity.SupporterEntity
4 | import java.util.Date
5 |
6 | val mockSupporterEntities = listOf(
7 | SupporterEntity(
8 | id = 5598,
9 | name = "NZ",
10 | date = Date(1998, 5, 5),
11 | message = "I always wanted support you ❤",
12 | ),
13 | )
14 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SupporterMocks.kt:
--------------------------------------------------------------------------------
1 | @file:Suppress("DEPRECATION")
2 |
3 | package com.shifthackz.aisdv1.data.mocks
4 |
5 | import com.shifthackz.aisdv1.domain.entity.Supporter
6 | import java.util.Date
7 |
8 | val mockSupporters = listOf(
9 | Supporter(
10 | id = 5598,
11 | name = "NZ",
12 | date = Date(1998, 5, 5),
13 | message = "I always wanted support you ❤",
14 | ),
15 | )
16 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SupporterRawMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.network.model.SupporterRaw
4 |
5 | val mockSupportersRaw = listOf(
6 | SupporterRaw(
7 | id = 5598,
8 | name = "NZ",
9 | date = "1998-05-05",
10 | message = "I always wanted support you ❤",
11 | type = "bmc",
12 | amount = "55.98",
13 | currency = "USD",
14 | ),
15 | )
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SwarmUiGenerationResponseMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.network.response.SwarmUiGenerationResponse
4 |
5 | val mockSwarmUiGenerationResponse = SwarmUiGenerationResponse(
6 | images = listOf("/tmp/img.jpg"),
7 | )
8 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SwarmUiModelEntityMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.storage.db.cache.entity.SwarmUiModelEntity
4 |
5 | val mockSwarmUiModelEntities = listOf(
6 | SwarmUiModelEntity(
7 | id = "5598",
8 | name = "5598",
9 | title = "5598",
10 | author = "",
11 | ),
12 | )
13 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SwarmUiModelMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.domain.entity.SwarmUiModel
4 |
5 | val mockSwarmUiModels = listOf(
6 | SwarmUiModel(
7 | name = "5598",
8 | title = "5598",
9 | author = "5598",
10 | ),
11 | )
12 |
--------------------------------------------------------------------------------
/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SwarmUiModelRawMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.data.mocks
2 |
3 | import com.shifthackz.aisdv1.network.model.SwarmUiModelRaw
4 |
5 | val mockSwarmUiModelsRaw = listOf(
6 | SwarmUiModelRaw(
7 | name = "5598",
8 | title = "5598",
9 | author = "5598",
10 | ),
11 | )
12 |
--------------------------------------------------------------------------------
/demo/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/demo/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.generic.library)
3 | }
4 |
5 | android {
6 | namespace = "com.shifthackz.aisdv1.demo"
7 | }
8 |
9 | dependencies {
10 | implementation(project(":core:common"))
11 | implementation(project(":domain"))
12 | implementation(libs.koin.core)
13 | implementation(libs.rx.kotlin)
14 | testImplementation(libs.test.junit)
15 | testImplementation(libs.test.mockk)
16 | }
17 |
--------------------------------------------------------------------------------
/demo/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/demo/consumer-rules.pro
--------------------------------------------------------------------------------
/demo/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/docs/CNAME:
--------------------------------------------------------------------------------
1 | sdai.moroz.cc
--------------------------------------------------------------------------------
/docs/app-ads.txt:
--------------------------------------------------------------------------------
1 | applovin.com, b31d4c3b02df6a3d84596566b17b0318, DIRECT
2 | loopme.com, 11303, RESELLER, 6c8d5f95897a5a3b
3 | rubiconproject.com, 16356, RESELLER, 0bfd66d529a55807
4 | rubiconproject.com, 20744, RESELLER, 0bfd66d529a55807
5 | pubmatic.com, 158154, RESELLER, 5d62403b186f2ace
6 | pubmatic.com, 158862, RESELLER, 5d62403b186f2ace
7 | pubmatic.com, 159509, RESELLER, 5d62403b186f2ace
8 | xandr.com, 13799, RESELLER
9 | media.net, 8CUD06Z68, RESELLER
10 |
--------------------------------------------------------------------------------
/docs/assets/4pda.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/docs/assets/4pda.png
--------------------------------------------------------------------------------
/docs/assets/fdroid.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/docs/assets/fdroid.png
--------------------------------------------------------------------------------
/docs/assets/github-header-image.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/docs/assets/github-header-image.png
--------------------------------------------------------------------------------
/docs/assets/google_play.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/docs/assets/google_play.png
--------------------------------------------------------------------------------
/docs/assets/scr_group_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/docs/assets/scr_group_1.png
--------------------------------------------------------------------------------
/docs/assets/scr_group_2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/docs/assets/scr_group_2.png
--------------------------------------------------------------------------------
/docs/assets/sdai.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/docs/assets/sdai.png
--------------------------------------------------------------------------------
/docs/coins.json:
--------------------------------------------------------------------------------
1 | {
2 | "coins_per_day": 0
3 | }
4 |
--------------------------------------------------------------------------------
/docs/feature-flags.json:
--------------------------------------------------------------------------------
1 | {
2 | "ad_home_bottom_enable": true,
3 | "ad_gallery_bottom_enable": true
4 | }
5 |
--------------------------------------------------------------------------------
/docs/motd.json:
--------------------------------------------------------------------------------
1 | {
2 | "display": true,
3 | "title_old": "Cloud maintenance",
4 | "subtitle_old": "SDAI cloud is now under maintenance. We are working hard to get online as soon as possible, come and check later.",
5 | "title": "SDAI Cloud unavailable",
6 | "subtitle": "SDAI cloud temporary unavailable due to technical maintenance, it will be available in November 2023."
7 | }
8 |
--------------------------------------------------------------------------------
/docs/sdapi/v1/embeddings:
--------------------------------------------------------------------------------
1 | {}
2 |
--------------------------------------------------------------------------------
/docs/sdapi/v1/hypernetworks:
--------------------------------------------------------------------------------
1 | []
2 |
--------------------------------------------------------------------------------
/docs/sdapi/v1/loras:
--------------------------------------------------------------------------------
1 | []
2 |
--------------------------------------------------------------------------------
/docs/sdapi/v1/options:
--------------------------------------------------------------------------------
1 | {
2 | "sd_model_checkpoint": "Default"
3 | }
4 |
--------------------------------------------------------------------------------
/docs/sdapi/v1/samplers:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "name": "Euler a",
4 | "aliases": ["Euler a"],
5 | "options": {
6 | "default": "Euler a"
7 | }
8 | }
9 | ]
10 |
--------------------------------------------------------------------------------
/docs/sdapi/v1/sd-models:
--------------------------------------------------------------------------------
1 | [
2 | {
3 | "title": "Default",
4 | "model_name": "Default",
5 | "hash": "default",
6 | "sha256": null,
7 | "filename": "default.ckpt",
8 | "config": null
9 | }
10 | ]
11 |
--------------------------------------------------------------------------------
/docs/version.json:
--------------------------------------------------------------------------------
1 | {
2 | "googleplay": "0.5.3",
3 | "fdroid": "0.4.3"
4 | }
5 |
--------------------------------------------------------------------------------
/domain/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/domain/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.generic.library)
3 | }
4 |
5 | android {
6 | namespace = "com.shifthackz.aisdv1.domain"
7 | }
8 |
9 | dependencies {
10 | implementation(project(":core:common"))
11 | implementation(libs.koin.core)
12 | implementation(libs.rx.kotlin)
13 | testImplementation(libs.test.junit)
14 | testImplementation(libs.test.mockito)
15 | testImplementation(libs.test.mockk)
16 | }
17 |
--------------------------------------------------------------------------------
/domain/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/domain/consumer-rules.pro
--------------------------------------------------------------------------------
/domain/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/OpenAiGenerationDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.datasource
2 |
3 | import com.shifthackz.aisdv1.domain.entity.AiGenerationResult
4 | import com.shifthackz.aisdv1.domain.entity.TextToImagePayload
5 | import io.reactivex.rxjava3.core.Single
6 |
7 | sealed interface OpenAiGenerationDataSource {
8 | interface Remote : OpenAiGenerationDataSource {
9 | fun validateApiKey(): Single
10 | fun textToImage(payload: TextToImagePayload): Single
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/RandomImageDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.datasource
2 |
3 | import android.graphics.Bitmap
4 | import io.reactivex.rxjava3.core.Single
5 |
6 | sealed interface RandomImageDataSource {
7 |
8 | interface Remote : RandomImageDataSource {
9 | fun fetch(): Single
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/ReportDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.datasource
2 |
3 | import com.shifthackz.aisdv1.domain.entity.ReportReason
4 | import io.reactivex.rxjava3.core.Completable
5 |
6 | sealed interface ReportDataSource {
7 |
8 | interface Remote : ReportDataSource {
9 |
10 | fun send(
11 | text: String,
12 | reason: ReportReason,
13 | image: String,
14 | source: String,
15 | model: String,
16 | ): Completable
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/StabilityAiEnginesDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.datasource
2 |
3 | import com.shifthackz.aisdv1.domain.entity.StabilityAiEngine
4 | import io.reactivex.rxjava3.core.Single
5 |
6 | sealed interface StabilityAiEnginesDataSource {
7 | interface Remote : StabilityAiGenerationDataSource {
8 | fun fetch(): Single>
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/SwarmUiSessionDataSource.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.datasource
2 |
3 | import io.reactivex.rxjava3.core.Single
4 |
5 | interface SwarmUiSessionDataSource {
6 | fun getSessionId(connectUrl: String? = null): Single
7 | fun forceRenew(connectUrl: String? = null): Single
8 | fun handleSessionError(chain: Single): Single
9 | }
10 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/demo/ImageToImageDemo.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.demo
2 |
3 | import com.shifthackz.aisdv1.domain.entity.AiGenerationResult
4 | import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload
5 | import io.reactivex.rxjava3.core.Single
6 |
7 | fun interface ImageToImageDemo {
8 | fun getDemoBase64(payload: ImageToImagePayload): Single
9 | }
10 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/demo/TextToImageDemo.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.demo
2 |
3 | import com.shifthackz.aisdv1.domain.entity.AiGenerationResult
4 | import com.shifthackz.aisdv1.domain.entity.TextToImagePayload
5 | import io.reactivex.rxjava3.core.Single
6 |
7 | fun interface TextToImageDemo {
8 | fun getDemoBase64(payload: TextToImagePayload): Single
9 | }
10 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/BackgroundWorkResult.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.entity
2 |
3 | sealed interface BackgroundWorkResult {
4 | data object None : BackgroundWorkResult
5 | data class Success(val ai: List) : BackgroundWorkResult
6 | data class Error(val t: Throwable) : BackgroundWorkResult
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/BackgroundWorkStatus.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.entity
2 |
3 | data class BackgroundWorkStatus(
4 | val running: Boolean,
5 | val statusTitle: String,
6 | val statusSubTitle: String,
7 | )
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ColorToken.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.entity
2 |
3 | enum class ColorToken {
4 | ROSEWATER,
5 | FLAMINGO,
6 | PINK,
7 | MAUVE,
8 | RED,
9 | MAROON,
10 | PEACH,
11 | YELLOW,
12 | GREEN,
13 | TEAL,
14 | SKY,
15 | SAPPHIRE,
16 | BLUE,
17 | LAVENDER;
18 |
19 | companion object {
20 | fun parse(value: String) = entries.find { "$it" == value } ?: MAUVE
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/DarkThemeToken.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.entity
2 |
3 | enum class DarkThemeToken {
4 | FRAPPE, MACCHIATO, MOCHA;
5 |
6 | companion object {
7 | fun parse(value: String) = entries.find { "$it" == value } ?: FRAPPE
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/DownloadState.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.entity
2 |
3 | import java.io.File
4 |
5 | sealed interface DownloadState {
6 | data object Unknown : DownloadState
7 | data class Downloading(val percent: Int = 0) : DownloadState
8 | data class Complete(val file: File) : DownloadState
9 | data class Error(val error: Throwable) : DownloadState
10 | }
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Embedding.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.entity
2 |
3 | data class Embedding(
4 | val keyword: String,
5 | )
6 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/FeatureTag.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.entity
2 |
3 | enum class FeatureTag {
4 | Txt2Img,
5 | Img2Img,
6 | OwnServer,
7 | Lora,
8 | TextualInversion,
9 | HyperNetworks,
10 | Batch,
11 | MultipleModels,
12 | Offline,
13 | }
14 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Grid.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.entity
2 |
3 | enum class Grid(val size: Int) {
4 | Fixed2(2),
5 | Fixed3(3),
6 | Fixed4(4),
7 | Fixed5(5);
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/HordeProcessStatus.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.entity
2 |
3 | data class HordeProcessStatus(
4 | val waitTimeSeconds: Int,
5 | val queuePosition: Int?,
6 | )
7 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/LoRA.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.entity
2 |
3 | data class LoRA(
4 | val name: String,
5 | val alias: String,
6 | val path: String,
7 | )
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/LocalDiffusionStatus.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.entity
2 |
3 | data class LocalDiffusionStatus(
4 | val current: Int,
5 | val total: Int,
6 | )
7 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/MediaStoreInfo.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.entity
2 |
3 | import android.net.Uri
4 |
5 | data class MediaStoreInfo(
6 | val count: Int = 0,
7 | val folderUri: Uri? = null,
8 | ) {
9 | val isEmpty: Boolean
10 | get() = this == MediaStoreInfo()
11 |
12 | val isNotEmpty: Boolean
13 | get() = !isEmpty
14 | }
15 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/OpenAiModel.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.entity
2 |
3 | import java.io.Serializable
4 |
5 | enum class OpenAiModel(val alias: String) : Serializable {
6 | DALL_E_2("dall-e-2"),
7 | DALL_E_3("dall-e-3");
8 |
9 | companion object {
10 | fun parse(value: String?): OpenAiModel = entries.find { it.alias == value } ?: DALL_E_2
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/OpenAiQuality.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.entity
2 |
3 | enum class OpenAiQuality(val key: String) {
4 | STANDARD("standard"),
5 | HD("hd");
6 | }
7 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/OpenAiStyle.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.entity
2 |
3 | enum class OpenAiStyle(val key: String) {
4 | VIVID("vivid"),
5 | NATURAL("natural");
6 | }
7 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ReportReason.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.entity
2 |
3 | enum class ReportReason {
4 | IntellectualPropertyInfringement,
5 | Violence,
6 | InappropriateContent,
7 | AdultContent,
8 | HatefulSpeech,
9 | Other;
10 | }
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ServerConfiguration.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.entity
2 |
3 | data class ServerConfiguration(
4 | val sdModelCheckpoint: String,
5 | )
6 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StabilityAiClipGuidance.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.entity
2 |
3 | import java.io.Serializable
4 |
5 | enum class StabilityAiClipGuidance : Serializable {
6 | NONE,
7 | FAST_BLUE,
8 | FAST_GREEN,
9 | SIMPLE,
10 | SLOW,
11 | SLOWER,
12 | SLOWEST;
13 | }
14 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StabilityAiEngine.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.entity
2 |
3 | data class StabilityAiEngine(
4 | val id: String,
5 | val name: String,
6 | )
7 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StabilityAiSampler.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.entity
2 |
3 | enum class StabilityAiSampler {
4 | NONE,
5 | DDIM,
6 | DDPM,
7 | K_DPMPP_2M,
8 | K_DPMPP_2S_ANCESTRAL,
9 | K_DPM_2,
10 | K_DPM_2_ANCESTRAL,
11 | K_EULER,
12 | K_EULER_ANCESTRAL,
13 | K_HEUN,
14 | K_LMS;
15 | }
16 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StableDiffusionHyperNetwork.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.entity
2 |
3 | data class StableDiffusionHyperNetwork(
4 | val name: String,
5 | val path: String,
6 | )
7 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StableDiffusionModel.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.entity
2 |
3 | data class StableDiffusionModel(
4 | val title: String,
5 | val modelName: String,
6 | val hash: String,
7 | val sha256: String,
8 | val filename: String,
9 | val config: String,
10 | )
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StableDiffusionSampler.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.entity
2 |
3 | data class StableDiffusionSampler(
4 | val name: String,
5 | val aliases: List,
6 | val options: Map,
7 | )
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Supporter.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.entity
2 |
3 | import java.util.Date
4 |
5 | data class Supporter(
6 | val id: Int,
7 | val name: String,
8 | val date: Date,
9 | val message: String,
10 | )
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/SwarmUiModel.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.entity
2 |
3 | class SwarmUiModel(
4 | val name: String,
5 | val title: String,
6 | val author: String,
7 | )
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/feature/auth/AuthorizationStore.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.feature.auth
2 |
3 | interface AuthorizationStore {
4 | fun getAuthorizationCredentials(): AuthorizationCredentials
5 | fun storeAuthorizationCredentials(credentials: AuthorizationCredentials)
6 | }
7 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/feature/mediapipe/MediaPipe.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.feature.mediapipe
2 |
3 | import android.graphics.Bitmap
4 | import com.shifthackz.aisdv1.domain.entity.TextToImagePayload
5 | import io.reactivex.rxjava3.core.Single
6 |
7 | interface MediaPipe {
8 | fun process(payload: TextToImagePayload): Single
9 | }
10 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/feature/work/BackgroundTaskManager.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.feature.work
2 |
3 | import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload
4 | import com.shifthackz.aisdv1.domain.entity.TextToImagePayload
5 |
6 | interface BackgroundTaskManager {
7 | fun scheduleTextToImageTask(payload: TextToImagePayload)
8 | fun scheduleImageToImageTask(payload: ImageToImagePayload)
9 | fun retryLastTextToImageTask(): Result
10 | fun retryLastImageToImageTask(): Result
11 | fun cancelAll(): Result
12 | }
13 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/gateway/DatabaseClearGateway.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.gateway
2 |
3 | import io.reactivex.rxjava3.core.Completable
4 |
5 | interface DatabaseClearGateway {
6 | fun clearSessionScopeDb(): Completable
7 | fun clearStorageScopeDb(): Completable
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/gateway/MediaStoreGateway.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.gateway
2 |
3 | import com.shifthackz.aisdv1.domain.entity.MediaStoreInfo
4 |
5 | interface MediaStoreGateway {
6 | fun exportToFile(fileName: String, content: ByteArray)
7 | fun getInfo(): MediaStoreInfo
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/gateway/ServerConnectivityGateway.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.gateway
2 |
3 | import io.reactivex.rxjava3.core.Flowable
4 |
5 | fun interface ServerConnectivityGateway {
6 | fun observe(): Flowable
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/interactor/wakelock/WakeLockInterActor.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.interactor.wakelock
2 |
3 | import com.shifthackz.aisdv1.domain.usecase.wakelock.AcquireWakelockUseCase
4 | import com.shifthackz.aisdv1.domain.usecase.wakelock.ReleaseWakeLockUseCase
5 |
6 | interface WakeLockInterActor {
7 | val acquireWakelockUseCase: AcquireWakelockUseCase
8 | val releaseWakeLockUseCase: ReleaseWakeLockUseCase
9 | }
10 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/interactor/wakelock/WakeLockInterActorImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.interactor.wakelock
2 |
3 | import com.shifthackz.aisdv1.domain.usecase.wakelock.AcquireWakelockUseCase
4 | import com.shifthackz.aisdv1.domain.usecase.wakelock.ReleaseWakeLockUseCase
5 |
6 | internal data class WakeLockInterActorImpl(
7 | override val acquireWakelockUseCase: AcquireWakelockUseCase,
8 | override val releaseWakeLockUseCase: ReleaseWakeLockUseCase
9 | ) : WakeLockInterActor
10 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/preference/SessionPreference.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.preference
2 |
3 | interface SessionPreference {
4 | var swarmUiSessionId: String
5 | }
6 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/EmbeddingsRepository.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.repository
2 |
3 | import com.shifthackz.aisdv1.domain.entity.Embedding
4 | import io.reactivex.rxjava3.core.Completable
5 | import io.reactivex.rxjava3.core.Single
6 |
7 | interface EmbeddingsRepository {
8 | fun fetchEmbeddings(): Completable
9 | fun fetchAndGetEmbeddings(): Single>
10 | fun getEmbeddings(): Single>
11 | }
12 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/HuggingFaceModelsRepository.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.repository
2 |
3 | import com.shifthackz.aisdv1.domain.entity.HuggingFaceModel
4 | import io.reactivex.rxjava3.core.Completable
5 | import io.reactivex.rxjava3.core.Single
6 |
7 | interface HuggingFaceModelsRepository {
8 | fun fetchHuggingFaceModels(): Completable
9 | fun fetchAndGetHuggingFaceModels(): Single>
10 | fun getHuggingFaceModels(): Single>
11 | }
12 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/LorasRepository.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.repository
2 |
3 | import com.shifthackz.aisdv1.domain.entity.LoRA
4 | import io.reactivex.rxjava3.core.Completable
5 | import io.reactivex.rxjava3.core.Single
6 |
7 | interface LorasRepository {
8 | fun fetchLoras(): Completable
9 | fun fetchAndGetLoras(): Single>
10 | fun getLoras(): Single>
11 | }
12 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/MediaPipeGenerationRepository.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.repository
2 |
3 | import com.shifthackz.aisdv1.domain.entity.AiGenerationResult
4 | import com.shifthackz.aisdv1.domain.entity.LocalDiffusionStatus
5 | import com.shifthackz.aisdv1.domain.entity.TextToImagePayload
6 | import io.reactivex.rxjava3.core.Observable
7 | import io.reactivex.rxjava3.core.Single
8 |
9 | interface MediaPipeGenerationRepository {
10 | fun generateFromText(payload: TextToImagePayload): Single
11 | }
12 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/OpenAiGenerationRepository.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.repository
2 |
3 | import com.shifthackz.aisdv1.domain.entity.AiGenerationResult
4 | import com.shifthackz.aisdv1.domain.entity.TextToImagePayload
5 | import io.reactivex.rxjava3.core.Single
6 |
7 | interface OpenAiGenerationRepository {
8 | fun validateApiKey(): Single
9 | fun generateFromText(payload: TextToImagePayload): Single
10 | }
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/RandomImageRepository.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.repository
2 |
3 | import android.graphics.Bitmap
4 | import io.reactivex.rxjava3.core.Single
5 |
6 | interface RandomImageRepository {
7 | fun fetchAndGet(): Single
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/ReportRepository.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.repository
2 |
3 | import com.shifthackz.aisdv1.domain.entity.ReportReason
4 | import io.reactivex.rxjava3.core.Completable
5 |
6 | interface ReportRepository {
7 | fun send(text: String, reason: ReportReason, image: String): Completable
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/StabilityAiCreditsRepository.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.repository
2 |
3 | import io.reactivex.rxjava3.core.Completable
4 | import io.reactivex.rxjava3.core.Flowable
5 | import io.reactivex.rxjava3.core.Single
6 |
7 | interface StabilityAiCreditsRepository {
8 | fun fetch(): Completable
9 | fun fetchAndGet(): Single
10 | fun fetchAndObserve(): Flowable
11 | fun get(): Single
12 | fun observe(): Flowable
13 | }
14 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/StabilityAiEnginesRepository.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.repository
2 |
3 | import com.shifthackz.aisdv1.domain.entity.StabilityAiEngine
4 | import io.reactivex.rxjava3.core.Single
5 |
6 | interface StabilityAiEnginesRepository {
7 | fun fetchAndGet(): Single>
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/StableDiffusionHyperNetworksRepository.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.repository
2 |
3 | import com.shifthackz.aisdv1.domain.entity.StableDiffusionHyperNetwork
4 | import io.reactivex.rxjava3.core.Completable
5 | import io.reactivex.rxjava3.core.Single
6 |
7 | interface StableDiffusionHyperNetworksRepository {
8 | fun fetchHyperNetworks(): Completable
9 | fun fetchAndGetHyperNetworks(): Single>
10 | fun getHyperNetworks(): Single>
11 | }
12 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/StableDiffusionModelsRepository.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.repository
2 |
3 | import com.shifthackz.aisdv1.domain.entity.StableDiffusionModel
4 | import io.reactivex.rxjava3.core.Completable
5 | import io.reactivex.rxjava3.core.Single
6 |
7 | interface StableDiffusionModelsRepository {
8 | fun fetchModels(): Completable
9 | fun fetchAndGetModels(): Single>
10 | fun getModels(): Single>
11 | }
12 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/StableDiffusionSamplersRepository.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.repository
2 |
3 | import com.shifthackz.aisdv1.domain.entity.StableDiffusionSampler
4 | import io.reactivex.rxjava3.core.Completable
5 | import io.reactivex.rxjava3.core.Single
6 |
7 | interface StableDiffusionSamplersRepository {
8 | fun fetchSamplers(): Completable
9 |
10 | fun getSamplers(): Single>
11 | }
12 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/SupportersRepository.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.repository
2 |
3 | import com.shifthackz.aisdv1.domain.entity.Supporter
4 | import io.reactivex.rxjava3.core.Completable
5 | import io.reactivex.rxjava3.core.Single
6 |
7 | interface SupportersRepository {
8 | fun fetchSupporters(): Completable
9 | fun fetchAndGetSupporters(): Single>
10 | fun getSupporters(): Single>
11 | }
12 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/SwarmUiModelsRepository.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.repository
2 |
3 | import com.shifthackz.aisdv1.domain.entity.SwarmUiModel
4 | import io.reactivex.rxjava3.core.Completable
5 | import io.reactivex.rxjava3.core.Single
6 |
7 | interface SwarmUiModelsRepository {
8 | fun fetchModels(): Completable
9 | fun fetchAndGetModels(): Single>
10 | fun getModels(): Single>
11 | }
12 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/WakeLockRepository.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.repository
2 |
3 | import android.os.PowerManager
4 |
5 | interface WakeLockRepository {
6 | val wakeLock: PowerManager.WakeLock
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/ClearAppCacheUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.caching
2 |
3 | import io.reactivex.rxjava3.core.Completable
4 |
5 | interface ClearAppCacheUseCase {
6 | operator fun invoke(): Completable
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/DataPreLoaderUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.caching
2 |
3 | import io.reactivex.rxjava3.core.Completable
4 |
5 | interface DataPreLoaderUseCase {
6 | operator fun invoke(): Completable
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/GetLastResultFromCacheUseCase.kt:
--------------------------------------------------------------------------------
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
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/GetLastResultFromCacheUseCaseImpl.kt:
--------------------------------------------------------------------------------
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 | }
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/SaveLastResultToCacheUseCase.kt:
--------------------------------------------------------------------------------
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
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/ObserveSeverConnectivityUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.connectivity
2 |
3 | import io.reactivex.rxjava3.core.Flowable
4 |
5 | interface ObserveSeverConnectivityUseCase {
6 | operator fun invoke(): Flowable
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/ObserveSeverConnectivityUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.connectivity
2 |
3 | import com.shifthackz.aisdv1.domain.gateway.ServerConnectivityGateway
4 |
5 | internal class ObserveSeverConnectivityUseCaseImpl(
6 | private val serverConnectivityGateway: ServerConnectivityGateway,
7 | ) : ObserveSeverConnectivityUseCase {
8 |
9 | override fun invoke() = serverConnectivityGateway
10 | .observe()
11 | .distinctUntilChanged()
12 | }
13 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/PingStableDiffusionServiceUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.connectivity
2 |
3 | import io.reactivex.rxjava3.core.Completable
4 |
5 | interface PingStableDiffusionServiceUseCase {
6 | operator fun invoke(): Completable
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/PingStableDiffusionServiceUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.connectivity
2 |
3 | import com.shifthackz.aisdv1.domain.repository.StableDiffusionGenerationRepository
4 | import io.reactivex.rxjava3.core.Completable
5 |
6 | internal class PingStableDiffusionServiceUseCaseImpl(
7 | private val repository: StableDiffusionGenerationRepository,
8 | ) : PingStableDiffusionServiceUseCase {
9 |
10 | override operator fun invoke(): Completable = repository.checkApiAvailability()
11 | }
12 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestConnectivityUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.connectivity
2 |
3 | import io.reactivex.rxjava3.core.Completable
4 |
5 | interface TestConnectivityUseCase {
6 | operator fun invoke(url: String): Completable
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestConnectivityUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.connectivity
2 |
3 | import com.shifthackz.aisdv1.domain.repository.StableDiffusionGenerationRepository
4 |
5 | internal class TestConnectivityUseCaseImpl(
6 | private val repository: StableDiffusionGenerationRepository,
7 | ) : TestConnectivityUseCase {
8 |
9 | override fun invoke(url: String) = repository.checkApiAvailability(url)
10 | }
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestHordeApiKeyUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.connectivity
2 |
3 | import io.reactivex.rxjava3.core.Single
4 |
5 | interface TestHordeApiKeyUseCase {
6 | operator fun invoke(): Single
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestHordeApiKeyUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.connectivity
2 |
3 | import com.shifthackz.aisdv1.domain.repository.HordeGenerationRepository
4 |
5 | internal class TestHordeApiKeyUseCaseImpl(
6 | private val hordeGenerationRepository: HordeGenerationRepository,
7 | ) : TestHordeApiKeyUseCase {
8 |
9 | override fun invoke() = hordeGenerationRepository.validateApiKey()
10 | }
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestHuggingFaceApiKeyUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.connectivity
2 |
3 | import io.reactivex.rxjava3.core.Single
4 |
5 | interface TestHuggingFaceApiKeyUseCase {
6 | operator fun invoke(): Single
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestHuggingFaceApiKeyUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.connectivity
2 |
3 | import com.shifthackz.aisdv1.domain.repository.HuggingFaceGenerationRepository
4 |
5 | internal class TestHuggingFaceApiKeyUseCaseImpl(
6 | private val huggingFaceGenerationRepository: HuggingFaceGenerationRepository,
7 | ) : TestHuggingFaceApiKeyUseCase {
8 |
9 | override fun invoke() = huggingFaceGenerationRepository.validateApiKey()
10 | }
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestOpenAiApiKeyUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.connectivity
2 |
3 | import io.reactivex.rxjava3.core.Single
4 |
5 | interface TestOpenAiApiKeyUseCase {
6 | operator fun invoke(): Single
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestOpenAiApiKeyUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.connectivity
2 |
3 | import com.shifthackz.aisdv1.domain.repository.OpenAiGenerationRepository
4 |
5 | internal class TestOpenAiApiKeyUseCaseImpl(
6 | private val openAiGenerationRepository: OpenAiGenerationRepository,
7 | ) : TestOpenAiApiKeyUseCase {
8 |
9 | override fun invoke() = openAiGenerationRepository.validateApiKey()
10 | }
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestStabilityAiApiKeyUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.connectivity
2 |
3 | import io.reactivex.rxjava3.core.Single
4 |
5 | interface TestStabilityAiApiKeyUseCase {
6 | operator fun invoke(): Single
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestStabilityAiApiKeyUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.connectivity
2 |
3 | import com.shifthackz.aisdv1.domain.repository.StabilityAiGenerationRepository
4 |
5 | internal class TestStabilityAiApiKeyUseCaseImpl(
6 | private val stabilityAiGenerationRepository: StabilityAiGenerationRepository,
7 | ) : TestStabilityAiApiKeyUseCase {
8 |
9 | override fun invoke() = stabilityAiGenerationRepository.validateApiKey()
10 | }
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestSwarmUiConnectivityUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.connectivity
2 |
3 | import io.reactivex.rxjava3.core.Completable
4 |
5 | interface TestSwarmUiConnectivityUseCase {
6 | operator fun invoke(url: String): Completable
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestSwarmUiConnectivityUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.connectivity
2 |
3 | import com.shifthackz.aisdv1.domain.repository.SwarmUiGenerationRepository
4 |
5 | class TestSwarmUiConnectivityUseCaseImpl(
6 | private val repository: SwarmUiGenerationRepository,
7 | ) : TestSwarmUiConnectivityUseCase {
8 |
9 | override fun invoke(url: String) = repository.checkApiAvailability(url)
10 | }
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/debug/DebugInsertBadBase64UseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.debug
2 |
3 | import io.reactivex.rxjava3.core.Completable
4 |
5 | interface DebugInsertBadBase64UseCase {
6 | operator fun invoke(): Completable
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/donate/FetchAndGetSupportersUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.donate
2 |
3 | import com.shifthackz.aisdv1.domain.entity.Supporter
4 | import io.reactivex.rxjava3.core.Single
5 |
6 | interface FetchAndGetSupportersUseCase {
7 | operator fun invoke(): Single>
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/donate/FetchAndGetSupportersUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.donate
2 |
3 | import com.shifthackz.aisdv1.domain.entity.Supporter
4 | import com.shifthackz.aisdv1.domain.repository.SupportersRepository
5 | import io.reactivex.rxjava3.core.Single
6 |
7 | class FetchAndGetSupportersUseCaseImpl(
8 | private val supportersRepository: SupportersRepository,
9 | ) : FetchAndGetSupportersUseCase {
10 |
11 | override fun invoke(): Single> = supportersRepository.fetchAndGetSupporters()
12 | }
13 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/DeleteModelUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.downloadable
2 |
3 | import io.reactivex.rxjava3.core.Completable
4 |
5 | interface DeleteModelUseCase {
6 | operator fun invoke(id: String): Completable
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/DeleteModelUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.downloadable
2 |
3 | import com.shifthackz.aisdv1.domain.repository.DownloadableModelRepository
4 |
5 | internal class DeleteModelUseCaseImpl(
6 | private val downloadableModelRepository: DownloadableModelRepository,
7 | ) : DeleteModelUseCase {
8 |
9 | override fun invoke(id: String) = downloadableModelRepository.delete(id)
10 | }
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/DownloadModelUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.downloadable
2 |
3 | import com.shifthackz.aisdv1.domain.entity.DownloadState
4 | import io.reactivex.rxjava3.core.Observable
5 |
6 | interface DownloadModelUseCase {
7 | operator fun invoke(id: String, url: String): Observable
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/DownloadModelUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.downloadable
2 |
3 | import com.shifthackz.aisdv1.domain.repository.DownloadableModelRepository
4 |
5 | internal class DownloadModelUseCaseImpl(
6 | private val downloadableModelRepository: DownloadableModelRepository,
7 | ) : DownloadModelUseCase {
8 |
9 | override fun invoke(id: String, url: String) = downloadableModelRepository.download(id, url)
10 | }
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalMediaPipeModelsUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.downloadable
2 |
3 | import com.shifthackz.aisdv1.domain.entity.LocalAiModel
4 | import io.reactivex.rxjava3.core.Single
5 |
6 | interface GetLocalMediaPipeModelsUseCase {
7 | operator fun invoke(): Single>
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalMediaPipeModelsUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.downloadable
2 |
3 | import com.shifthackz.aisdv1.domain.repository.DownloadableModelRepository
4 |
5 | internal class GetLocalMediaPipeModelsUseCaseImpl(
6 | private val downloadableModelRepository: DownloadableModelRepository,
7 | ) : GetLocalMediaPipeModelsUseCase {
8 |
9 | override fun invoke() = downloadableModelRepository.getAllMediaPipe()
10 | }
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalModelUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.downloadable
2 |
3 | import com.shifthackz.aisdv1.domain.entity.LocalAiModel
4 | import io.reactivex.rxjava3.core.Single
5 |
6 | interface GetLocalModelUseCase {
7 | operator fun invoke(id: String): Single
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalModelUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.downloadable
2 |
3 | import com.shifthackz.aisdv1.domain.datasource.DownloadableModelDataSource
4 | import com.shifthackz.aisdv1.domain.entity.LocalAiModel
5 | import io.reactivex.rxjava3.core.Single
6 |
7 | internal class GetLocalModelUseCaseImpl(
8 | private val localDataSource: DownloadableModelDataSource.Local,
9 | ) : GetLocalModelUseCase {
10 |
11 | override fun invoke(id: String): Single = localDataSource.getById(id)
12 | }
13 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalOnnxModelsUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.downloadable
2 |
3 | import com.shifthackz.aisdv1.domain.entity.LocalAiModel
4 | import io.reactivex.rxjava3.core.Single
5 |
6 | interface GetLocalOnnxModelsUseCase {
7 | operator fun invoke(): Single>
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalOnnxModelsUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.downloadable
2 |
3 | import com.shifthackz.aisdv1.domain.repository.DownloadableModelRepository
4 |
5 | internal class GetLocalOnnxModelsUseCaseImpl(
6 | private val downloadableModelRepository: DownloadableModelRepository,
7 | ) : GetLocalOnnxModelsUseCase {
8 |
9 | override fun invoke() = downloadableModelRepository.getAllOnnx()
10 | }
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/ObserveLocalOnnxModelsUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.downloadable
2 |
3 | import com.shifthackz.aisdv1.domain.entity.LocalAiModel
4 | import io.reactivex.rxjava3.core.Flowable
5 |
6 | interface ObserveLocalOnnxModelsUseCase {
7 | operator fun invoke(): Flowable>
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/ObserveLocalOnnxModelsUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.downloadable
2 |
3 | import com.shifthackz.aisdv1.domain.repository.DownloadableModelRepository
4 |
5 | internal class ObserveLocalOnnxModelsUseCaseImpl(
6 | private val repository: DownloadableModelRepository,
7 | ) : ObserveLocalOnnxModelsUseCase {
8 |
9 | override fun invoke() = repository
10 | .observeAllOnnx()
11 | .distinctUntilChanged()
12 | }
13 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteAllGalleryUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.gallery
2 |
3 | import io.reactivex.rxjava3.core.Completable
4 |
5 | interface DeleteAllGalleryUseCase {
6 | operator fun invoke(): Completable
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteAllGalleryUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.gallery
2 |
3 | import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository
4 | import io.reactivex.rxjava3.core.Completable
5 |
6 | internal class DeleteAllGalleryUseCaseImpl(
7 | private val generationResultRepository: GenerationResultRepository,
8 | ) : DeleteAllGalleryUseCase {
9 |
10 | override fun invoke(): Completable = generationResultRepository.deleteAll()
11 | }
12 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteGalleryItemUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.gallery
2 |
3 | import io.reactivex.rxjava3.core.Completable
4 |
5 | interface DeleteGalleryItemUseCase {
6 | operator fun invoke(id: Long): Completable
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteGalleryItemUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.gallery
2 |
3 | import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository
4 | import io.reactivex.rxjava3.core.Completable
5 |
6 | internal class DeleteGalleryItemUseCaseImpl(
7 | private val repository: GenerationResultRepository,
8 | ) : DeleteGalleryItemUseCase {
9 |
10 | override fun invoke(id: Long): Completable = repository.deleteById(id)
11 | }
12 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteGalleryItemsUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.gallery
2 |
3 | import io.reactivex.rxjava3.core.Completable
4 |
5 | interface DeleteGalleryItemsUseCase {
6 | operator fun invoke(ids: List): Completable
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteGalleryItemsUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.gallery
2 |
3 | import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository
4 | import io.reactivex.rxjava3.core.Completable
5 |
6 | internal class DeleteGalleryItemsUseCaseImpl(
7 | private val generationResultRepository: GenerationResultRepository,
8 | ) : DeleteGalleryItemsUseCase {
9 |
10 | override fun invoke(ids: List): Completable = generationResultRepository.deleteByIdList(ids)
11 | }
12 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetAllGalleryUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.gallery
2 |
3 | import com.shifthackz.aisdv1.domain.entity.AiGenerationResult
4 | import io.reactivex.rxjava3.core.Single
5 |
6 | interface GetAllGalleryUseCase {
7 | operator fun invoke(): Single>
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetAllGalleryUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.gallery
2 |
3 | import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository
4 |
5 | internal class GetAllGalleryUseCaseImpl(
6 | private val repository: GenerationResultRepository,
7 | ) : GetAllGalleryUseCase {
8 |
9 | override operator fun invoke() = repository.getAll()
10 | }
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryItemsUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.gallery
2 |
3 | import com.shifthackz.aisdv1.domain.entity.AiGenerationResult
4 | import io.reactivex.rxjava3.core.Single
5 |
6 | interface GetGalleryItemsUseCase {
7 | operator fun invoke(ids: List): Single>
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryItemsUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.gallery
2 |
3 | import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository
4 |
5 | internal class GetGalleryItemsUseCaseImpl(
6 | private val generationResultRepository: GenerationResultRepository,
7 | ) : GetGalleryItemsUseCase {
8 |
9 | override fun invoke(ids: List) = generationResultRepository.getByIds(ids)
10 | }
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetMediaStoreInfoUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.gallery
2 |
3 | import com.shifthackz.aisdv1.domain.entity.MediaStoreInfo
4 | import io.reactivex.rxjava3.core.Single
5 |
6 | interface GetMediaStoreInfoUseCase {
7 | operator fun invoke(): Single
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetMediaStoreInfoUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.gallery
2 |
3 | import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository
4 |
5 | class GetMediaStoreInfoUseCaseImpl(
6 | private val repository: GenerationResultRepository,
7 | ) : GetMediaStoreInfoUseCase {
8 |
9 | override fun invoke() = repository.getMediaStoreInfo()
10 | }
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/ToggleImageVisibilityUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.gallery
2 |
3 | import io.reactivex.rxjava3.core.Single
4 |
5 | interface ToggleImageVisibilityUseCase {
6 | operator fun invoke(id: Long): Single
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/ToggleImageVisibilityUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.gallery
2 |
3 | import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository
4 |
5 | internal class ToggleImageVisibilityUseCaseImpl(
6 | private val repository: GenerationResultRepository,
7 | ) : ToggleImageVisibilityUseCase {
8 |
9 | override fun invoke(id: Long) = repository.toggleVisibility(id)
10 | }
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/GetGenerationResultPagedUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.generation
2 |
3 | import com.shifthackz.aisdv1.domain.entity.AiGenerationResult
4 | import io.reactivex.rxjava3.core.Single
5 |
6 | interface GetGenerationResultPagedUseCase {
7 | operator fun invoke(limit: Int, offset: Int): Single>
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/GetGenerationResultPagedUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.generation
2 |
3 | import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository
4 |
5 | internal class GetGenerationResultPagedUseCaseImpl(
6 | private val repository: GenerationResultRepository,
7 | ) : GetGenerationResultPagedUseCase {
8 |
9 | override operator fun invoke(limit: Int, offset: Int) = repository.getPage(limit, offset)
10 | }
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/GetGenerationResultUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.generation
2 |
3 | import com.shifthackz.aisdv1.domain.entity.AiGenerationResult
4 | import io.reactivex.rxjava3.core.Single
5 |
6 | interface GetGenerationResultUseCase {
7 | operator fun invoke(id: Long): Single
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/GetGenerationResultUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.generation
2 |
3 | import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository
4 |
5 | internal class GetGenerationResultUseCaseImpl(
6 | private val repository: GenerationResultRepository,
7 | ) : GetGenerationResultUseCase {
8 |
9 | override operator fun invoke(id: Long) = repository.getById(id)
10 | }
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/GetRandomImageUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.generation
2 |
3 | import android.graphics.Bitmap
4 | import io.reactivex.rxjava3.core.Single
5 |
6 | interface GetRandomImageUseCase {
7 | operator fun invoke(): Single
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/GetRandomImageUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.generation
2 |
3 | import com.shifthackz.aisdv1.domain.repository.RandomImageRepository
4 |
5 | class GetRandomImageUseCaseImpl(
6 | private val randomImageRepository: RandomImageRepository,
7 | ) : GetRandomImageUseCase {
8 |
9 | override fun invoke() = randomImageRepository.fetchAndGet()
10 | }
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/ImageToImageUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.generation
2 |
3 | import com.shifthackz.aisdv1.domain.entity.AiGenerationResult
4 | import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload
5 | import io.reactivex.rxjava3.core.Single
6 |
7 | interface ImageToImageUseCase {
8 | operator fun invoke(payload: ImageToImagePayload): Single>
9 | }
10 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/InterruptGenerationUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.generation
2 |
3 | import io.reactivex.rxjava3.core.Completable
4 |
5 | interface InterruptGenerationUseCase {
6 | operator fun invoke(): Completable
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/ObserveHordeProcessStatusUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.generation
2 |
3 | import com.shifthackz.aisdv1.domain.entity.HordeProcessStatus
4 | import io.reactivex.rxjava3.core.Flowable
5 |
6 | interface ObserveHordeProcessStatusUseCase {
7 | operator fun invoke(): Flowable
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/ObserveHordeProcessStatusUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.generation
2 |
3 | import com.shifthackz.aisdv1.domain.repository.HordeGenerationRepository
4 |
5 | internal class ObserveHordeProcessStatusUseCaseImpl(
6 | private val hordeGenerationRepository: HordeGenerationRepository,
7 | ) : ObserveHordeProcessStatusUseCase {
8 |
9 | override fun invoke() = hordeGenerationRepository
10 | .observeStatus()
11 | .distinctUntilChanged()
12 | }
13 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/ObserveLocalDiffusionProcessStatusUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.generation
2 |
3 | import com.shifthackz.aisdv1.domain.entity.LocalDiffusionStatus
4 | import io.reactivex.rxjava3.core.Observable
5 |
6 | interface ObserveLocalDiffusionProcessStatusUseCase {
7 | operator fun invoke(): Observable
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/SaveGenerationResultUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.generation
2 |
3 | import com.shifthackz.aisdv1.domain.entity.AiGenerationResult
4 | import io.reactivex.rxjava3.core.Completable
5 |
6 | interface SaveGenerationResultUseCase {
7 | operator fun invoke(result: AiGenerationResult): Completable
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/SaveGenerationResultUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.generation
2 |
3 | import com.shifthackz.aisdv1.domain.entity.AiGenerationResult
4 | import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository
5 |
6 | internal class SaveGenerationResultUseCaseImpl(
7 | private val repository: GenerationResultRepository,
8 | ) : SaveGenerationResultUseCase {
9 |
10 | override fun invoke(result: AiGenerationResult) = repository
11 | .insert(result)
12 | .ignoreElement()
13 | }
14 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/TextToImageUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.generation
2 |
3 | import com.shifthackz.aisdv1.domain.entity.AiGenerationResult
4 | import com.shifthackz.aisdv1.domain.entity.TextToImagePayload
5 | import io.reactivex.rxjava3.core.Single
6 |
7 | interface TextToImageUseCase {
8 | operator fun invoke(payload: TextToImagePayload): Single>
9 | }
10 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/huggingface/FetchAndGetHuggingFaceModelsUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.huggingface
2 |
3 | import com.shifthackz.aisdv1.domain.entity.HuggingFaceModel
4 | import io.reactivex.rxjava3.core.Single
5 |
6 | interface FetchAndGetHuggingFaceModelsUseCase {
7 | operator fun invoke(): Single>
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/huggingface/FetchAndGetHuggingFaceModelsUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.huggingface
2 |
3 | import com.shifthackz.aisdv1.domain.repository.HuggingFaceModelsRepository
4 |
5 | internal class FetchAndGetHuggingFaceModelsUseCaseImpl(
6 | private val huggingFaceModelsRepository: HuggingFaceModelsRepository,
7 | ) : FetchAndGetHuggingFaceModelsUseCase {
8 |
9 | override fun invoke() = huggingFaceModelsRepository.fetchAndGetHuggingFaceModels()
10 | }
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/report/SendReportUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.report
2 |
3 | import com.shifthackz.aisdv1.domain.entity.ReportReason
4 | import io.reactivex.rxjava3.core.Completable
5 |
6 | interface SendReportUseCase {
7 | operator fun invoke(text: String, reason: ReportReason, image: String): Completable
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/report/SendReportUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.report
2 |
3 | import com.shifthackz.aisdv1.domain.entity.ReportReason
4 | import com.shifthackz.aisdv1.domain.repository.ReportRepository
5 |
6 | class SendReportUseCaseImpl(
7 | private val repository: ReportRepository,
8 | ) : SendReportUseCase {
9 |
10 | override fun invoke(text: String, reason: ReportReason, image: String) =
11 | repository.send(text, reason, image)
12 |
13 | }
14 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdembedding/FetchAndGetEmbeddingsUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.sdembedding
2 |
3 | import com.shifthackz.aisdv1.domain.entity.Embedding
4 | import io.reactivex.rxjava3.core.Single
5 |
6 | interface FetchAndGetEmbeddingsUseCase {
7 | operator fun invoke(): Single>
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdembedding/FetchAndGetEmbeddingsUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.sdembedding
2 |
3 | import com.shifthackz.aisdv1.domain.entity.Embedding
4 | import com.shifthackz.aisdv1.domain.repository.EmbeddingsRepository
5 | import io.reactivex.rxjava3.core.Single
6 |
7 | internal class FetchAndGetEmbeddingsUseCaseImpl(
8 | private val repository: EmbeddingsRepository,
9 | ) : FetchAndGetEmbeddingsUseCase {
10 |
11 | override fun invoke(): Single> = repository.fetchAndGetEmbeddings()
12 | }
13 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdhypernet/FetchAndGetHyperNetworksUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.sdhypernet
2 |
3 | import com.shifthackz.aisdv1.domain.entity.StableDiffusionHyperNetwork
4 | import io.reactivex.rxjava3.core.Single
5 |
6 | interface FetchAndGetHyperNetworksUseCase {
7 | operator fun invoke(): Single>
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdhypernet/FetchAndGetHyperNetworksUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.sdhypernet
2 |
3 | import com.shifthackz.aisdv1.domain.repository.StableDiffusionHyperNetworksRepository
4 |
5 | internal class FetchAndGetHyperNetworksUseCaseImpl(
6 | private val stableDiffusionHyperNetworksRepository: StableDiffusionHyperNetworksRepository,
7 | ) : FetchAndGetHyperNetworksUseCase {
8 | override fun invoke() = stableDiffusionHyperNetworksRepository.fetchAndGetHyperNetworks()
9 | }
10 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdlora/FetchAndGetLorasUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.sdlora
2 |
3 | import com.shifthackz.aisdv1.domain.entity.LoRA
4 | import io.reactivex.rxjava3.core.Single
5 |
6 | interface FetchAndGetLorasUseCase {
7 | operator fun invoke(): Single>
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdlora/FetchAndGetLorasUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.sdlora
2 |
3 | import com.shifthackz.aisdv1.domain.repository.LorasRepository
4 |
5 | internal class FetchAndGetLorasUseCaseImpl(
6 | private val lorasRepository: LorasRepository,
7 | ) : FetchAndGetLorasUseCase {
8 |
9 | override fun invoke() = lorasRepository.fetchAndGetLoras()
10 | }
11 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdmodel/GetStableDiffusionModelsUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.sdmodel
2 |
3 | import com.shifthackz.aisdv1.domain.entity.StableDiffusionModel
4 | import io.reactivex.rxjava3.core.Single
5 |
6 | interface GetStableDiffusionModelsUseCase {
7 | operator fun invoke(): Single>>
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdmodel/SelectStableDiffusionModelUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.sdmodel
2 |
3 | import io.reactivex.rxjava3.core.Completable
4 |
5 | interface SelectStableDiffusionModelUseCase {
6 | operator fun invoke(modelName: String): Completable
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdsampler/GetStableDiffusionSamplersUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.sdsampler
2 |
3 | import com.shifthackz.aisdv1.domain.entity.StableDiffusionSampler
4 | import io.reactivex.rxjava3.core.Single
5 |
6 | interface GetStableDiffusionSamplersUseCase {
7 | operator fun invoke(): Single>
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToA1111UseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.settings
2 |
3 | import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationCredentials
4 | import io.reactivex.rxjava3.core.Single
5 |
6 | interface ConnectToA1111UseCase {
7 | operator fun invoke(
8 | url: String,
9 | isDemo: Boolean,
10 | credentials: AuthorizationCredentials,
11 | ): Single>
12 | }
13 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToHordeUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.settings
2 |
3 | import io.reactivex.rxjava3.core.Single
4 |
5 | interface ConnectToHordeUseCase {
6 | operator fun invoke(apiKey: String): Single>
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToHuggingFaceUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.settings
2 |
3 | import io.reactivex.rxjava3.core.Single
4 |
5 | interface ConnectToHuggingFaceUseCase {
6 | operator fun invoke(apiKey: String, model: String): Single>
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToLocalDiffusionUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.settings
2 |
3 | import io.reactivex.rxjava3.core.Single
4 |
5 | interface ConnectToLocalDiffusionUseCase {
6 | operator fun invoke(modelId: String): Single>
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToMediaPipeUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.settings
2 |
3 | import io.reactivex.rxjava3.core.Single
4 |
5 | interface ConnectToMediaPipeUseCase {
6 | operator fun invoke(modelId: String): Single>
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToOpenAiUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.settings
2 |
3 | import io.reactivex.rxjava3.core.Single
4 |
5 | interface ConnectToOpenAiUseCase {
6 | operator fun invoke(apiKey: String): Single>
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToStabilityAiUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.settings
2 |
3 | import io.reactivex.rxjava3.core.Single
4 |
5 | interface ConnectToStabilityAiUseCase {
6 | operator fun invoke(apiKey: String): Single>
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToSwarmUiUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.settings
2 |
3 | import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationCredentials
4 | import io.reactivex.rxjava3.core.Single
5 |
6 | interface ConnectToSwarmUiUseCase {
7 | operator fun invoke(url: String, credentials: AuthorizationCredentials): Single>
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/GetConfigurationUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.settings
2 |
3 | import com.shifthackz.aisdv1.domain.entity.Configuration
4 | import io.reactivex.rxjava3.core.Single
5 |
6 | interface GetConfigurationUseCase {
7 | operator fun invoke(): Single
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/SetServerConfigurationUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.settings
2 |
3 | import com.shifthackz.aisdv1.domain.entity.Configuration
4 | import io.reactivex.rxjava3.core.Completable
5 |
6 | interface SetServerConfigurationUseCase {
7 | operator fun invoke(configuration: Configuration): Completable
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/splash/SplashNavigationUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.splash
2 |
3 | import io.reactivex.rxjava3.core.Single
4 |
5 | interface SplashNavigationUseCase {
6 | operator fun invoke(): Single
7 |
8 | enum class Action {
9 | LAUNCH_ONBOARDING,
10 | LAUNCH_SERVER_SETUP,
11 | LAUNCH_HOME;
12 | }
13 | }
14 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/stabilityai/FetchAndGetStabilityAiEnginesUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.stabilityai
2 |
3 | import com.shifthackz.aisdv1.domain.entity.StabilityAiEngine
4 | import io.reactivex.rxjava3.core.Single
5 |
6 | interface FetchAndGetStabilityAiEnginesUseCase {
7 | operator fun invoke(): Single>
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/stabilityai/ObserveStabilityAiCreditsUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.stabilityai
2 |
3 | import io.reactivex.rxjava3.core.Flowable
4 |
5 | interface ObserveStabilityAiCreditsUseCase {
6 | operator fun invoke(): Flowable
7 | }
8 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/swarmmodel/FetchAndGetSwarmUiModelsUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.swarmmodel
2 |
3 | import com.shifthackz.aisdv1.domain.entity.SwarmUiModel
4 | import io.reactivex.rxjava3.core.Single
5 |
6 | interface FetchAndGetSwarmUiModelsUseCase {
7 | operator fun invoke(): Single>
8 | }
9 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/wakelock/AcquireWakelockUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.wakelock
2 |
3 | interface AcquireWakelockUseCase {
4 | operator fun invoke(timeout: Long = DEFAULT_TIMEOUT): Result
5 |
6 | companion object {
7 | const val DEFAULT_TIMEOUT = 10 * 60 * 1000L // 60 minutes
8 | }
9 | }
10 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/wakelock/ReleaseWakeLockUseCase.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.wakelock
2 |
3 | interface ReleaseWakeLockUseCase {
4 | operator fun invoke(): Result
5 | }
6 |
--------------------------------------------------------------------------------
/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/wakelock/ReleaseWakeLockUseCaseImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.usecase.wakelock
2 |
3 | import com.shifthackz.aisdv1.core.common.log.errorLog
4 | import com.shifthackz.aisdv1.domain.repository.WakeLockRepository
5 |
6 | internal class ReleaseWakeLockUseCaseImpl(
7 | private val wakeLockRepository: WakeLockRepository,
8 | ) : ReleaseWakeLockUseCase {
9 |
10 | override fun invoke() = runCatching {
11 | wakeLockRepository.wakeLock.release()
12 | }.onFailure { t ->
13 | errorLog(t)
14 | }
15 | }
16 |
--------------------------------------------------------------------------------
/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/HuggingFaceModelMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.mocks
2 |
3 | import com.shifthackz.aisdv1.domain.entity.HuggingFaceModel
4 |
5 | val mockHuggingFaceModels = listOf(
6 | HuggingFaceModel.default,
7 | HuggingFaceModel(
8 | "80974f2d-7ee0-48e5-97bc-448de3c1d634",
9 | "Analog Diffusion",
10 | "wavymulder/Analog-Diffusion",
11 | "https://huggingface.co/wavymulder/Analog-Diffusion",
12 | ),
13 | )
14 |
--------------------------------------------------------------------------------
/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/LocalAiModelMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.mocks
2 |
3 | import com.shifthackz.aisdv1.domain.entity.LocalAiModel
4 |
5 | val mockLocalAiModels = listOf(
6 | LocalAiModel.CustomOnnx,
7 | LocalAiModel(
8 | id = "1",
9 | type = LocalAiModel.Type.ONNX,
10 | name = "Model 1",
11 | size = "5 Gb",
12 | sources = listOf("https://example.com/1.html"),
13 | downloaded = false,
14 | selected = false,
15 | ),
16 | )
17 |
--------------------------------------------------------------------------------
/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/LoraMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.mocks
2 |
3 | import com.shifthackz.aisdv1.domain.entity.LoRA
4 |
5 | val mockLoRAs = listOf(
6 | LoRA(
7 | name = "5598",
8 | alias = "5598",
9 | path = "/unknown",
10 | ),
11 | LoRA(
12 | name = "151297",
13 | alias = "151297",
14 | path = "/unknown",
15 | ),
16 | )
17 |
--------------------------------------------------------------------------------
/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/MediaStoreInfoMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.mocks
2 |
3 | import android.net.Uri
4 | import com.shifthackz.aisdv1.domain.entity.MediaStoreInfo
5 |
6 | val mockMediaStoreInfo = MediaStoreInfo(
7 | count = 5598,
8 | folderUri = Uri.EMPTY,
9 | )
10 |
--------------------------------------------------------------------------------
/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/ServerConfigurationMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.mocks
2 |
3 | import com.shifthackz.aisdv1.domain.entity.ServerConfiguration
4 |
5 | val mockServerConfiguration = ServerConfiguration("checkpoint")
6 |
--------------------------------------------------------------------------------
/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/StabilityAiEngineMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.mocks
2 |
3 | import com.shifthackz.aisdv1.domain.entity.StabilityAiEngine
4 |
5 | val mockStabilityAiEngines = listOf(
6 | StabilityAiEngine(
7 | id = "engine_1",
8 | name = "Engine 1",
9 | ),
10 | StabilityAiEngine(
11 | id = "engine_2",
12 | name = "Engine 2",
13 | ),
14 | )
15 |
--------------------------------------------------------------------------------
/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/StableDiffusionEmbeddingMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.mocks
2 |
3 | import com.shifthackz.aisdv1.domain.entity.Embedding
4 |
5 | val mockEmbeddings = listOf(
6 | Embedding("embedding_1"),
7 | Embedding("embedding_2"),
8 | Embedding("embedding_3"),
9 | )
10 |
--------------------------------------------------------------------------------
/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/StableDiffusionHyperNetworkMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.mocks
2 |
3 | import com.shifthackz.aisdv1.domain.entity.StableDiffusionHyperNetwork
4 |
5 | val mockStableDiffusionHyperNetworks = listOf(
6 | StableDiffusionHyperNetwork(
7 | name = "hyper_net_1",
8 | path = "",
9 | ),
10 | StableDiffusionHyperNetwork(
11 | name = "hyper_net_2",
12 | path = "",
13 | ),
14 | )
15 |
--------------------------------------------------------------------------------
/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/StableDiffusionSamplerMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.mocks
2 |
3 | import com.shifthackz.aisdv1.domain.entity.StableDiffusionSampler
4 |
5 | val mockStableDiffusionSamplers = listOf(
6 | StableDiffusionSampler(
7 | name = "sampler_1",
8 | aliases = listOf("alias_1"),
9 | options = mapOf("option" to "value"),
10 | ),
11 | StableDiffusionSampler(
12 | name = "sampler_2",
13 | aliases = listOf("alias_2"),
14 | options = mapOf("option" to "value"),
15 | ),
16 | )
17 |
--------------------------------------------------------------------------------
/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/SupporterMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.domain.mocks
2 |
3 | import com.shifthackz.aisdv1.domain.entity.Supporter
4 | import java.util.Date
5 |
6 | val mockSupporters = listOf(
7 | Supporter(
8 | id = 5598,
9 | name = "NZ",
10 | date = Date(5598L),
11 | message = "I always wanted support you ❤",
12 | ),
13 | )
14 |
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/featureGraphic.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/fastlane/metadata/android/en-US/images/featureGraphic.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/icon.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/fastlane/metadata/android/en-US/images/icon.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/fastlane/metadata/android/en-US/images/phoneScreenshots/1.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/fastlane/metadata/android/en-US/images/phoneScreenshots/2.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/fastlane/metadata/android/en-US/images/phoneScreenshots/3.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/fastlane/metadata/android/en-US/images/phoneScreenshots/4.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/fastlane/metadata/android/en-US/images/phoneScreenshots/5.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/fastlane/metadata/android/en-US/images/phoneScreenshots/6.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/images/phoneScreenshots/7.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/fastlane/metadata/android/en-US/images/phoneScreenshots/7.png
--------------------------------------------------------------------------------
/fastlane/metadata/android/en-US/short_description.txt:
--------------------------------------------------------------------------------
1 | Generate Stable Diffusion assets with AI provider of your choice.
2 |
--------------------------------------------------------------------------------
/feature/auth/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/feature/auth/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.generic.library)
3 | }
4 |
5 | android {
6 | namespace = "com.shifthackz.aisdv1.feature.auth"
7 | }
8 |
9 | dependencies {
10 | implementation(project(":core:common"))
11 | implementation(project(":domain"))
12 | implementation(libs.koin.core)
13 | implementation(libs.koin.android)
14 | implementation(libs.androidx.security.crypto)
15 | implementation(libs.google.gson)
16 | }
17 |
--------------------------------------------------------------------------------
/feature/auth/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/feature/auth/consumer-rules.pro
--------------------------------------------------------------------------------
/feature/auth/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/credentials/Credentials.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.feature.auth.credentials
2 |
3 | internal interface Credentials {
4 | fun toJson(): String
5 | }
6 |
--------------------------------------------------------------------------------
/feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/credentials/EmptyCredentials.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.feature.auth.credentials
2 |
3 | internal class EmptyCredentials : Credentials {
4 | override fun toJson(): String = ""
5 | }
6 |
--------------------------------------------------------------------------------
/feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/crypto/CryptoProvider.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.feature.auth.crypto
2 |
3 | import android.content.SharedPreferences
4 |
5 | internal interface CryptoProvider {
6 | fun getAuthorizationPreferences(): SharedPreferences
7 | }
8 |
--------------------------------------------------------------------------------
/feature/diffusion/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/feature/diffusion/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.generic.library)
3 | }
4 |
5 | android {
6 | namespace = "com.shifthackz.aisdv1.feature.diffusion"
7 | }
8 |
9 | dependencies {
10 | implementation(project(":core:common"))
11 | implementation(project(":domain"))
12 | implementation(libs.koin.core)
13 | implementation(libs.rx.kotlin)
14 | implementation(libs.microsoft.onnx.runtime.android)
15 | }
16 |
--------------------------------------------------------------------------------
/feature/diffusion/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/feature/diffusion/consumer-rules.pro
--------------------------------------------------------------------------------
/feature/diffusion/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/tokenizer/LocalDiffusionTextTokenizer.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.feature.diffusion.ai.tokenizer
2 |
3 | import ai.onnxruntime.OnnxTensor
4 |
5 | interface LocalDiffusionTextTokenizer {
6 | val maxLength: Int
7 | fun initialize()
8 | fun decode(ids: IntArray?): String?
9 | fun encode(text: String?): IntArray?
10 | fun tensor(ids: IntArray?): OnnxTensor?
11 | fun createUnconditionalInput(text: String?): IntArray?
12 | fun close()
13 | }
14 |
--------------------------------------------------------------------------------
/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/entity/LocalDiffusionAlias.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.feature.diffusion.entity
2 |
3 | typealias Array3D = Array>>
4 |
--------------------------------------------------------------------------------
/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/entity/LocalDiffusionFlag.kt:
--------------------------------------------------------------------------------
1 | @file:Suppress("unused")
2 |
3 | package com.shifthackz.aisdv1.feature.diffusion.entity
4 |
5 | enum class LocalDiffusionFlag(val value: Int) {
6 | CPU(0),
7 | NN_API(1);
8 | }
9 |
--------------------------------------------------------------------------------
/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/environment/DeviceNNAPIFlagProvider.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.feature.diffusion.environment
2 |
3 | fun interface DeviceNNAPIFlagProvider {
4 | fun get(): Int
5 | }
6 |
--------------------------------------------------------------------------------
/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/environment/LocalModelIdProvider.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.feature.diffusion.environment
2 |
3 | fun interface LocalModelIdProvider {
4 | fun get(): String
5 | }
6 |
--------------------------------------------------------------------------------
/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/environment/OrtEnvironmentProvider.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.feature.diffusion.environment
2 |
3 | import ai.onnxruntime.OrtEnvironment
4 |
5 | internal fun interface OrtEnvironmentProvider {
6 | fun get(): OrtEnvironment
7 | }
8 |
--------------------------------------------------------------------------------
/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/environment/OrtEnvironmentProviderImpl.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.feature.diffusion.environment
2 |
3 | import ai.onnxruntime.OrtEnvironment
4 |
5 | internal class OrtEnvironmentProviderImpl : OrtEnvironmentProvider {
6 |
7 | private val environment: OrtEnvironment = OrtEnvironment.getEnvironment()
8 |
9 | override fun get(): OrtEnvironment {
10 | return environment
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/feature/mediapipe/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/feature/mediapipe/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/feature/mediapipe/consumer-rules.pro
--------------------------------------------------------------------------------
/feature/mediapipe/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/feature/mediapipe/src/main/java/com/shifthackz/aisdv1/feature/mediapipe/di/MediaPipeModule.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.feature.mediapipe.di
2 |
3 | import com.shifthackz.aisdv1.domain.feature.mediapipe.MediaPipe
4 | import com.shifthackz.aisdv1.feature.mediapipe.MediaPipeImpl
5 | import org.koin.core.module.dsl.factoryOf
6 | import org.koin.dsl.bind
7 | import org.koin.dsl.module
8 |
9 | val mediaPipeModule = module {
10 | factoryOf(::MediaPipeImpl) bind MediaPipe::class
11 | }
12 |
--------------------------------------------------------------------------------
/feature/mediapipe/src/test/java/com/shifthackz/aisdv1/feature/mediapipe/ExampleUnitTest.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.feature.mediapipe
2 |
3 | import org.junit.Assert.*
4 | import org.junit.Test
5 |
6 | /**
7 | * Example local unit test, which will execute on the development machine (host).
8 | *
9 | * See [testing documentation](http://d.android.com/tools/testing).
10 | */
11 | class ExampleUnitTest {
12 | @Test
13 | fun addition_isCorrect() {
14 | assertEquals(4, 2 + 2)
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/feature/work/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/feature/work/build.gradle.kts:
--------------------------------------------------------------------------------
1 | plugins {
2 | alias(libs.plugins.generic.library)
3 | }
4 |
5 | android {
6 | namespace = "com.shifthackz.aisdv1.feature.work"
7 | }
8 |
9 | dependencies {
10 | implementation(project(":core:common"))
11 | implementation(project(":core:localization"))
12 | implementation(project(":core:notification"))
13 | implementation(project(":domain"))
14 | implementation(libs.koin.core)
15 | implementation(libs.koin.android)
16 | implementation(libs.rx.kotlin)
17 | implementation(libs.androidx.work.runtime)
18 | }
19 |
--------------------------------------------------------------------------------
/feature/work/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/feature/work/consumer-rules.pro
--------------------------------------------------------------------------------
/feature/work/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/feature/work/src/main/java/com/shifthackz/aisdv1/work/Constants.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.work
2 |
3 | internal object Constants {
4 |
5 | const val NOTIFICATION_TEXT_TO_IMAGE_FOREGROUND = 5598
6 | const val NOTIFICATION_TEXT_TO_IMAGE_GENERIC = 5599
7 | const val NOTIFICATION_IMAGE_TO_IMAGE_FOREGROUND = 151297
8 | const val NOTIFICATION_IMAGE_TO_IMAGE_GENERIC = 151298
9 |
10 | const val TAG_GENERATION = "work_ai_generation"
11 |
12 | const val FILE_TEXT_TO_IMAGE = "txt2img.bin"
13 | const val FILE_IMAGE_TO_IMAGE = "img2img.bin"
14 | }
15 |
--------------------------------------------------------------------------------
/feature/work/src/main/java/com/shifthackz/aisdv1/work/di/WorkManagerProvider.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.work.di
2 |
3 | import androidx.work.WorkManager
4 |
5 | fun interface WorkManagerProvider {
6 | operator fun invoke(): WorkManager
7 | }
8 |
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.jar:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/gradle/wrapper/gradle-wrapper.jar
--------------------------------------------------------------------------------
/gradle/wrapper/gradle-wrapper.properties:
--------------------------------------------------------------------------------
1 | #Sat Mar 15 08:34:28 EET 2025
2 | distributionBase=GRADLE_USER_HOME
3 | distributionPath=wrapper/dists
4 | distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip
5 | zipStoreBase=GRADLE_USER_HOME
6 | zipStorePath=wrapper/dists
7 |
--------------------------------------------------------------------------------
/network/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/network/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/network/consumer-rules.pro
--------------------------------------------------------------------------------
/network/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/api/huggingface/HuggingFaceApi.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.api.huggingface
2 |
3 | import io.reactivex.rxjava3.core.Completable
4 | import retrofit2.http.GET
5 |
6 | interface HuggingFaceApi {
7 |
8 | @GET("/api/whoami-v2")
9 | fun validateBearerToken(): Completable
10 | }
11 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/api/imagecdn/ImageCdnRestApi.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.api.imagecdn
2 |
3 | import android.graphics.Bitmap
4 | import io.reactivex.rxjava3.core.Single
5 | import okhttp3.ResponseBody
6 | import retrofit2.http.GET
7 | import retrofit2.http.Path
8 |
9 | interface ImageCdnRestApi {
10 |
11 | fun fetchRandomImage(): Single
12 |
13 | interface RawApi {
14 |
15 | @GET("/{size}/{size}")
16 | fun fetchRandomImage(@Path("size") size: String): Single
17 | }
18 | }
19 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/api/sdai/DonateApi.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.api.sdai
2 |
3 | import com.shifthackz.aisdv1.network.model.SupporterRaw
4 | import io.reactivex.rxjava3.core.Single
5 | import retrofit2.http.GET
6 |
7 | interface DonateApi {
8 |
9 | @GET("/supporters.json")
10 | fun fetchSupporters(): Single>
11 | }
12 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/api/sdai/HuggingFaceModelsApi.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.api.sdai
2 |
3 | import com.shifthackz.aisdv1.network.model.HuggingFaceModelRaw
4 | import io.reactivex.rxjava3.core.Single
5 | import retrofit2.http.GET
6 |
7 | interface HuggingFaceModelsApi {
8 |
9 | @GET("/hf-models.json")
10 | fun fetchHuggingFaceModels(): Single>
11 | }
12 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/api/sdai/ReportApi.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.api.sdai
2 |
3 | import com.shifthackz.aisdv1.network.request.ReportRequest
4 | import io.reactivex.rxjava3.core.Completable
5 | import retrofit2.http.Body
6 | import retrofit2.http.POST
7 |
8 | interface ReportApi {
9 |
10 | @POST("/report")
11 | fun postReport(@Body request: ReportRequest): Completable
12 | }
13 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/exception/BadSessionException.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.exception
2 |
3 | class BadSessionException : Throwable()
4 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/extensions/RetrofitExtensions.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.extensions
2 |
3 | import retrofit2.Retrofit
4 |
5 | internal fun Retrofit.Builder.withBaseUrl(baseUrl: String): Retrofit = this
6 | .baseUrl(baseUrl)
7 | .build()
8 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/interceptor/LoggingInterceptor.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.interceptor
2 |
3 | import com.shifthackz.aisdv1.core.common.log.debugLog
4 | import okhttp3.logging.HttpLoggingInterceptor
5 |
6 | internal class LoggingInterceptor {
7 |
8 | fun get() = HttpLoggingInterceptor { message ->
9 | debugLog(HTTP_TAG, message)
10 | }.apply {
11 | level = HttpLoggingInterceptor.Level.HEADERS
12 | }
13 |
14 | companion object {
15 | private const val HTTP_TAG = "HTTP"
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/model/HuggingFaceModelRaw.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.model
2 |
3 | import com.google.gson.annotations.SerializedName
4 |
5 | data class HuggingFaceModelRaw(
6 | @SerializedName("id")
7 | val id: String?,
8 | @SerializedName("name")
9 | val name: String?,
10 | @SerializedName("alias")
11 | val alias: String?,
12 | @SerializedName("source")
13 | val source: String?,
14 | )
15 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/model/OpenAiImageRaw.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.model
2 |
3 | import com.google.gson.annotations.SerializedName
4 |
5 | /**
6 | * Response object for OpenAI image.
7 | *
8 | * Documentation: https://platform.openai.com/docs/api-reference/images/object
9 | */
10 | data class OpenAiImageRaw(
11 | @SerializedName("b64_json")
12 | val b64json: String?,
13 | @SerializedName("url")
14 | val url: String?,
15 | @SerializedName("revised_prompt")
16 | val revisedPrompt: String?,
17 | )
18 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/model/ServerConfigurationRaw.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.model
2 |
3 | import com.google.gson.annotations.SerializedName
4 |
5 | data class ServerConfigurationRaw(
6 | @SerializedName("sd_model_checkpoint")
7 | val sdModelCheckpoint: String?,
8 | )
9 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/model/StabilityAiEngineRaw.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.model
2 |
3 | import com.google.gson.annotations.SerializedName
4 |
5 | data class StabilityAiEngineRaw(
6 | @SerializedName("description")
7 | val description: String?,
8 | @SerializedName("id")
9 | val id: String?,
10 | @SerializedName("name")
11 | val name: String?,
12 | @SerializedName("type")
13 | val type: String?,
14 | )
15 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/model/StabilityTextPromptRaw.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.model
2 |
3 | import com.google.gson.annotations.SerializedName
4 |
5 | data class StabilityTextPromptRaw(
6 | @SerializedName("text")
7 | val text: String,
8 | @SerializedName("weight")
9 | val weight: Double,
10 | )
11 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/model/StableDiffusionHyperNetworkRaw.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.model
2 |
3 | import com.google.gson.annotations.SerializedName
4 |
5 | data class StableDiffusionHyperNetworkRaw(
6 | @SerializedName("name")
7 | val name: String?,
8 | @SerializedName("path")
9 | val path: String?,
10 | )
11 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/model/StableDiffusionLoraRaw.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.model
2 |
3 | import com.google.gson.annotations.SerializedName
4 |
5 | data class StableDiffusionLoraRaw(
6 | @SerializedName("name")
7 | val name: String?,
8 | @SerializedName("alias")
9 | val alias: String?,
10 | @SerializedName("path")
11 | val path: String?,
12 | )
13 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/model/StableDiffusionSamplerRaw.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.model
2 |
3 | import com.google.gson.annotations.SerializedName
4 |
5 | data class StableDiffusionSamplerRaw(
6 | @SerializedName("name")
7 | val name: String?,
8 | @SerializedName("aliases")
9 | val aliases: List?,
10 | @SerializedName("options")
11 | val options: Map?,
12 | )
13 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/model/SwarmUiModelRaw.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.model
2 |
3 | import com.google.gson.annotations.SerializedName
4 |
5 | data class SwarmUiModelRaw(
6 | @SerializedName("name")
7 | val name: String?,
8 | @SerializedName("title")
9 | val title: String?,
10 | @SerializedName("author")
11 | val author: String?,
12 | )
13 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/ApiKeyProvider.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.qualifiers
2 |
3 | fun interface ApiKeyProvider {
4 | operator fun invoke(): Pair?
5 | }
6 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/ApiUrlProvider.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.qualifiers
2 |
3 | interface ApiUrlProvider {
4 | val stableDiffusionAutomaticApiUrl: String
5 | val stableDiffusionAppApiUrl: String
6 | val stableDiffusionReportApiUrl: String
7 | val hordeApiUrl: String
8 | val imageCdnApiUrl: String
9 | val huggingFaceApiUrl: String
10 | val huggingFaceInferenceApiUrl: String
11 | val openAiApiUrl: String
12 | val stabilityAiApiUrl: String
13 | }
14 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/CredentialsProvider.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.qualifiers
2 |
3 | interface CredentialsProvider {
4 | operator fun invoke(): Data
5 |
6 | sealed interface Data {
7 | data object None : Data
8 | data class HttpBasic(val login: String, val password: String) : Data
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/HttpInterceptor.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.qualifiers
2 |
3 | import okhttp3.Interceptor
4 |
5 | internal data class HttpInterceptors(val interceptors: List)
6 |
7 | @JvmInline
8 | internal value class HttpInterceptor(
9 | private val interceptor: Interceptor
10 | ) : Interceptor by interceptor {
11 | val type: String
12 | get() = interceptor::class.java.name
13 | }
14 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/NetworkHeaders.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.qualifiers
2 |
3 | object NetworkHeaders {
4 | const val APP_VERSION = "X-App-Version"
5 | const val API_KEY = "apikey"
6 | const val AUTHORIZATION = "authorization"
7 | }
8 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/NetworkInterceptor.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.qualifiers
2 |
3 | import okhttp3.Interceptor
4 |
5 | internal data class NetworkInterceptors(val interceptors: List)
6 |
7 | @JvmInline
8 | internal value class NetworkInterceptor(
9 | private val interceptor: Interceptor,
10 | ) : Interceptor by interceptor {
11 | val type: String
12 | get() = interceptor::class.java.name
13 | }
14 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/NetworkPrefixes.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.qualifiers
2 |
3 | object NetworkPrefixes {
4 | const val BEARER = "Bearer"
5 | }
6 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/RetrofitCallAdapters.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.qualifiers
2 |
3 | import retrofit2.CallAdapter
4 |
5 | internal data class RetrofitCallAdapters(val data: List)
6 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/RetrofitConverterFactories.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.qualifiers
2 |
3 | import retrofit2.Converter
4 |
5 | internal data class RetrofitConverterFactories(val data: List)
6 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/request/HuggingFaceGenerationRequest.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.request
2 |
3 | import com.google.gson.annotations.SerializedName
4 |
5 | data class HuggingFaceGenerationRequest(
6 | @SerializedName("inputs")
7 | val inputs: Any,
8 | @SerializedName("parameters")
9 | val parameters: Map,
10 | )
11 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/request/ReportRequest.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.request
2 |
3 | import com.google.gson.annotations.SerializedName
4 |
5 | data class ReportRequest(
6 | @SerializedName("text")
7 | val text: String,
8 | @SerializedName("reason")
9 | val reason: String,
10 | @SerializedName("image")
11 | val image: String,
12 | @SerializedName("server_source")
13 | val serverSource: String,
14 | @SerializedName("model")
15 | val model: String,
16 | )
17 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/request/SwarmUiModelsRequest.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.request
2 |
3 | import com.google.gson.annotations.SerializedName
4 |
5 | data class SwarmUiModelsRequest(
6 | @SerializedName("session_id")
7 | val sessionId: String,
8 | @SerializedName("subtype")
9 | val subType: String,
10 | @SerializedName("path")
11 | val path: String,
12 | @SerializedName("depth")
13 | val depth: Int,
14 | )
15 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/response/AppVersionResponse.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.response
2 |
3 | import com.google.gson.annotations.SerializedName
4 |
5 | data class AppVersionResponse(
6 | @SerializedName("googleplay")
7 | val googlePlay: String?,
8 | )
9 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/response/CoinsResponse.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.response
2 |
3 | import com.google.gson.annotations.SerializedName
4 |
5 | data class CoinsResponse(
6 | @SerializedName("coins_per_day")
7 | val coinsPerDay: Int?,
8 | )
9 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/response/DownloadableModelResponse.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.response
2 |
3 | import com.google.gson.annotations.SerializedName
4 |
5 | data class DownloadableModelResponse(
6 | @SerializedName("id")
7 | val id: String?,
8 | @SerializedName("name")
9 | val name: String?,
10 | @SerializedName("size")
11 | val size: String?,
12 | @SerializedName("sources")
13 | val sources: List?,
14 | )
15 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/response/HordeGenerationAsyncResponse.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.response
2 |
3 | import com.google.gson.annotations.SerializedName
4 |
5 | data class HordeGenerationAsyncResponse(
6 | @SerializedName("message")
7 | val message: String?,
8 | @SerializedName("id")
9 | val id: String?,
10 | @SerializedName("kudos")
11 | val kudos: Int?,
12 | )
13 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/response/HordeUserResponse.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.response
2 |
3 | import com.google.gson.annotations.SerializedName
4 |
5 | data class HordeUserResponse(
6 | @SerializedName("id")
7 | val id: Int?,
8 | )
9 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/response/HuggingFaceErrorResponse.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.response
2 |
3 | import com.google.gson.annotations.SerializedName
4 |
5 | data class HuggingFaceErrorResponse(
6 | @SerializedName("error")
7 | val error: String?,
8 | @SerializedName("estimated_time")
9 | val estimatedTime: Double?,
10 | )
11 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/response/OpenAiResponse.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.response
2 |
3 | import com.google.gson.annotations.SerializedName
4 | import com.shifthackz.aisdv1.network.model.OpenAiImageRaw
5 |
6 | data class OpenAiResponse(
7 | @SerializedName("created")
8 | val created: Long?,
9 | @SerializedName("data")
10 | val data: List?
11 | )
12 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/response/SdEmbeddingsResponse.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.response
2 |
3 | import com.google.gson.annotations.SerializedName
4 |
5 | data class SdEmbeddingsResponse(
6 | @SerializedName("loaded")
7 | val loaded: Map?,
8 | )
9 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/response/StabilityAiErrorResponse.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.response
2 |
3 | import com.google.gson.annotations.SerializedName
4 |
5 | data class StabilityAiErrorResponse(
6 | @SerializedName("id")
7 | val id: String?,
8 | @SerializedName("name")
9 | val name: String?,
10 | @SerializedName("message")
11 | val message: String?,
12 | )
13 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/response/StabilityCreditsResponse.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.response
2 |
3 | import com.google.gson.annotations.SerializedName
4 |
5 | data class StabilityCreditsResponse(
6 | @SerializedName("credits")
7 | val credits: Float?,
8 | )
9 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/response/StabilityGenerationResponse.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.response
2 |
3 | import com.google.gson.annotations.SerializedName
4 |
5 | data class StabilityGenerationResponse(
6 | @SerializedName("artifacts")
7 | val artifacts: List?,
8 | ) {
9 |
10 | data class Artifact(
11 | @SerializedName("base64")
12 | val base64: String?,
13 | @SerializedName("finishReason")
14 | val finishReason: String?,
15 | @SerializedName("seed")
16 | val seed: Long?,
17 | )
18 | }
19 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/response/SwarmUiGenerationResponse.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.response
2 |
3 | import com.google.gson.annotations.SerializedName
4 |
5 | data class SwarmUiGenerationResponse(
6 | @SerializedName("images")
7 | val images: List?,
8 | )
9 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/response/SwarmUiModelsResponse.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.response
2 |
3 | import com.google.gson.annotations.SerializedName
4 | import com.shifthackz.aisdv1.network.model.SwarmUiModelRaw
5 |
6 | data class SwarmUiModelsResponse(
7 | @SerializedName("files")
8 | val files: List?,
9 | )
10 |
--------------------------------------------------------------------------------
/network/src/main/java/com/shifthackz/aisdv1/network/response/SwarmUiSessionResponse.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.network.response
2 |
3 | import com.google.gson.annotations.SerializedName
4 |
5 | data class SwarmUiSessionResponse(
6 | @SerializedName("session_id")
7 | val sessionId: String?,
8 | )
9 |
--------------------------------------------------------------------------------
/presentation/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/presentation/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/presentation/consumer-rules.pro
--------------------------------------------------------------------------------
/presentation/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AppIntent.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.activity
2 |
3 | import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute
4 | import com.shifthackz.android.core.mvi.MviIntent
5 |
6 | sealed interface AppIntent : MviIntent {
7 |
8 | data object GrantStoragePermission : AppIntent
9 | data object HideSplash : AppIntent
10 |
11 | data class HomeRoute(val navRoute: NavigationRoute) : AppIntent
12 | }
13 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AppState.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.activity
2 |
3 | import androidx.compose.runtime.Immutable
4 | import com.shifthackz.aisdv1.presentation.model.NavItem
5 | import com.shifthackz.aisdv1.presentation.navigation.graph.mainDrawerNavItems
6 | import com.shifthackz.android.core.mvi.MviState
7 |
8 | @Immutable
9 | data class AppState(
10 | val drawerItems: List = mainDrawerNavItems(),
11 | val isShowSplash: Boolean = true,
12 | ) : MviState
13 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/di/PresentationModule.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.di
2 |
3 | val presentationModule = (navigationModule + viewModelModule + uiUtilsModule).toTypedArray()
4 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/extensions/BooleanExtensions.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.extensions
2 |
3 | import com.shifthackz.aisdv1.core.model.UiText
4 | import com.shifthackz.aisdv1.core.model.asUiText
5 | import com.shifthackz.aisdv1.core.localization.R as LocalizationR
6 |
7 | fun Boolean.mapToUi(): UiText = (if (this) LocalizationR.string.yes else LocalizationR.string.no).asUiText()
8 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/extensions/NavControllerExtensions.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.extensions
2 |
3 | import androidx.navigation.NavController
4 | import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute
5 |
6 | fun NavController.navigatePopUpToCurrent(navRoute: NavigationRoute) {
7 | navigate(navRoute) {
8 | currentBackStackEntry?.destination?.route?.let {
9 | popUpTo(it) { inclusive = true }
10 | }
11 | }
12 | }
13 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/download/DownloadDialogEffect.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.modal.download
2 |
3 | import com.shifthackz.android.core.mvi.MviEffect
4 |
5 | sealed interface DownloadDialogEffect : MviEffect {
6 |
7 | data object Close : DownloadDialogEffect
8 |
9 | data class StartDownload(val url: String) : DownloadDialogEffect
10 | }
11 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/download/DownloadDialogIntent.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.modal.download
2 |
3 | import com.shifthackz.android.core.mvi.MviIntent
4 |
5 | sealed interface DownloadDialogIntent : MviIntent {
6 |
7 | data class LoadModelData(val id: String): DownloadDialogIntent
8 |
9 | data class SelectSource(val url: String) : DownloadDialogIntent
10 |
11 | data object Close : DownloadDialogIntent
12 |
13 | data object StartDownload : DownloadDialogIntent
14 | }
15 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/download/DownloadDialogState.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.modal.download
2 |
3 | import androidx.compose.runtime.Immutable
4 | import com.shifthackz.android.core.mvi.MviState
5 |
6 | @Immutable
7 | data class DownloadDialogState(
8 | val sources: List> = emptyList(),
9 | ) : MviState {
10 |
11 | val selectedUrl: String
12 | get() = sources.find { (_, selected) -> selected }?.first ?: ""
13 | }
14 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/embedding/EmbeddingIntent.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.modal.embedding
2 |
3 | import com.shifthackz.android.core.mvi.MviIntent
4 |
5 | sealed interface EmbeddingIntent : MviIntent {
6 |
7 | data object Close : EmbeddingIntent
8 |
9 | data class ChangeSelector(val flag: Boolean) : EmbeddingIntent
10 |
11 | data class ToggleItem(val item: EmbeddingItemUi) : EmbeddingIntent
12 |
13 | data object ApplyNewPrompts : EmbeddingIntent
14 | }
15 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/extras/ExtrasEffect.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.modal.extras
2 |
3 | import com.shifthackz.android.core.mvi.MviEffect
4 |
5 | sealed interface ExtrasEffect : MviEffect {
6 |
7 | data class ApplyPrompts(
8 | val prompt: String,
9 | val negativePrompt: String,
10 | ) : ExtrasEffect
11 |
12 | data object Close : ExtrasEffect
13 | }
14 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/extras/ExtrasIntent.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.modal.extras
2 |
3 | import com.shifthackz.android.core.mvi.MviIntent
4 |
5 | sealed interface ExtrasIntent : MviIntent {
6 |
7 | data class ToggleItem(val item: ExtraItemUi) : ExtrasIntent
8 |
9 | data object ApplyPrompts : ExtrasIntent
10 |
11 | data object Close : ExtrasIntent
12 | }
13 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/history/InputHistoryItemUi.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.modal.history
2 |
3 | import android.graphics.Bitmap
4 | import androidx.compose.runtime.Immutable
5 | import com.shifthackz.aisdv1.domain.entity.AiGenerationResult
6 |
7 | @Immutable
8 | data class InputHistoryItemUi(
9 | val generationResult: AiGenerationResult,
10 | val bitmap: Bitmap,
11 | )
12 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/tag/EditTagEffect.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.modal.tag
2 |
3 | import com.shifthackz.android.core.mvi.MviEffect
4 |
5 | sealed interface EditTagEffect : MviEffect {
6 |
7 | data object Close : EditTagEffect
8 |
9 | data class ApplyPrompts(
10 | val prompt: String,
11 | val negativePrompt: String,
12 | ) : EditTagEffect
13 | }
14 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/ErrorState.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.model
2 |
3 | import androidx.compose.runtime.Immutable
4 | import com.shifthackz.aisdv1.core.model.UiText
5 | import com.shifthackz.android.core.mvi.MviState
6 |
7 | sealed interface ErrorState : MviState {
8 |
9 | data object None : ErrorState
10 |
11 | data object Generic : ErrorState
12 |
13 | @Immutable
14 | data class WithMessage(val message: UiText) : ErrorState
15 | }
16 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/ExtraType.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.model
2 |
3 | enum class ExtraType(val raw: String) {
4 | Lora("lora"),
5 | HyperNet("hyper_net");
6 | }
7 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/LaunchSource.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.model
2 |
3 | enum class LaunchSource {
4 | SPLASH,
5 | SETTINGS;
6 |
7 | companion object {
8 | fun fromKey(key: Int) = entries.firstOrNull { it.ordinal == key } ?: SPLASH
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/MotionEvent.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.model
2 |
3 | enum class MotionEvent {
4 | Idle, Down, Move, Up
5 | }
6 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/Router.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.navigation.router
2 |
3 | import com.shifthackz.aisdv1.presentation.navigation.NavigationEffect
4 | import io.reactivex.rxjava3.core.Observable
5 |
6 | interface Router {
7 | fun observe(): Observable
8 | }
9 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/drawer/DrawerRouter.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.navigation.router.drawer
2 |
3 | import com.shifthackz.aisdv1.presentation.navigation.NavigationEffect
4 | import com.shifthackz.aisdv1.presentation.navigation.router.Router
5 |
6 | interface DrawerRouter : Router {
7 |
8 | fun openDrawer()
9 |
10 | fun closeDrawer()
11 | }
12 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/debug/DebugMenuEffect.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.screen.debug
2 |
3 | import com.shifthackz.aisdv1.core.model.UiText
4 | import com.shifthackz.android.core.mvi.MviEffect
5 |
6 | sealed interface DebugMenuEffect : MviEffect {
7 | data class Message(val message: UiText) : DebugMenuEffect
8 | }
9 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/debug/DebugMenuState.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.screen.debug
2 |
3 | import com.shifthackz.aisdv1.core.common.schedulers.SchedulersToken
4 | import com.shifthackz.aisdv1.presentation.model.Modal
5 | import com.shifthackz.android.core.mvi.MviState
6 |
7 | data class DebugMenuState(
8 | val screenModal: Modal = Modal.None,
9 | val localDiffusionAllowCancel: Boolean = false,
10 | val localDiffusionSchedulerThread: SchedulersToken = SchedulersToken.COMPUTATION,
11 | ) : MviState
12 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/donate/DonateEffect.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.screen.donate
2 |
3 | import com.shifthackz.android.core.mvi.MviEffect
4 |
5 | sealed interface DonateEffect : MviEffect {
6 | data class OpenUrl(val url: String) : DonateEffect
7 | }
8 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/donate/DonateState.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.screen.donate
2 |
3 | import androidx.compose.runtime.Immutable
4 | import com.shifthackz.aisdv1.domain.entity.Supporter
5 | import com.shifthackz.android.core.mvi.MviState
6 |
7 | @Immutable
8 | data class DonateState(
9 | val loading: Boolean = true,
10 | val supporters: List = emptyList(),
11 | ) : MviState
12 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/drawer/DrawerIntent.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.screen.drawer
2 |
3 | import com.shifthackz.android.core.mvi.MviIntent
4 |
5 | sealed interface DrawerIntent : MviIntent {
6 |
7 | data object Open : DrawerIntent
8 |
9 | data object Close : DrawerIntent
10 | }
11 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailEffect.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.screen.gallery.detail
2 |
3 | import com.shifthackz.android.core.mvi.MviEffect
4 | import java.io.File
5 |
6 | sealed interface GalleryDetailEffect : MviEffect {
7 |
8 | data class ShareImageFile(val file: File) : GalleryDetailEffect
9 |
10 | data class ShareGenerationParams(val state: GalleryDetailState) : GalleryDetailEffect
11 |
12 | data class ShareClipBoard(val text: String) : GalleryDetailEffect
13 | }
14 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryEffect.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.screen.gallery.list
2 |
3 | import android.net.Uri
4 | import com.shifthackz.android.core.mvi.MviEffect
5 | import java.io.File
6 |
7 | sealed interface GalleryEffect : MviEffect {
8 |
9 | data object Refresh : GalleryEffect
10 |
11 | data class Share(val zipFile: File) : GalleryEffect
12 |
13 | data class OpenUri(val uri: Uri) : GalleryEffect
14 | }
15 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationIntent.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.screen.home
2 |
3 | import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute
4 | import com.shifthackz.android.core.mvi.MviIntent
5 |
6 | sealed interface HomeNavigationIntent : MviIntent {
7 |
8 | data class Route(val navRoute: NavigationRoute) : HomeNavigationIntent
9 |
10 | data class Update(val navRoute: NavigationRoute) : HomeNavigationIntent
11 | }
12 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationMappers.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.screen.home
2 |
3 | import com.shifthackz.aisdv1.domain.entity.AiGenerationResult
4 | import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute
5 |
6 | fun AiGenerationResult.Type.mapToRoute(): NavigationRoute = when (this) {
7 | AiGenerationResult.Type.TEXT_TO_IMAGE -> NavigationRoute.HomeNavigation.TxtToImg
8 | AiGenerationResult.Type.IMAGE_TO_IMAGE -> NavigationRoute.HomeNavigation.ImgToImg
9 | }
10 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageEffect.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.screen.img2img
2 |
3 | import com.shifthackz.android.core.mvi.MviEffect
4 |
5 | enum class ImageToImageEffect : MviEffect {
6 | GalleryPicker, CameraPicker;
7 | }
8 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/loader/ConfigurationLoaderState.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.screen.loader
2 |
3 | import androidx.compose.runtime.Immutable
4 | import com.shifthackz.aisdv1.core.model.UiText
5 | import com.shifthackz.android.core.mvi.MviState
6 |
7 | interface ConfigurationLoaderState : MviState {
8 |
9 | @Immutable
10 | data class StatusNotification(val statusNotification: UiText) : ConfigurationLoaderState
11 | }
12 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerIntent.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.screen.logger
2 |
3 | import com.shifthackz.android.core.mvi.MviIntent
4 |
5 | sealed interface LoggerIntent : MviIntent {
6 |
7 | data object ReadLogs : LoggerIntent
8 |
9 | data object NavigateBack : LoggerIntent
10 | }
11 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerState.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.screen.logger
2 |
3 | import androidx.compose.runtime.Immutable
4 | import com.shifthackz.android.core.mvi.MviState
5 |
6 | @Immutable
7 | data class LoggerState(
8 | val loading: Boolean = true,
9 | val text: String = "",
10 | ) : MviState
11 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingDensity.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.screen.onboarding
2 |
3 | import androidx.compose.animation.core.FastOutSlowInEasing
4 | import androidx.compose.animation.core.tween
5 | import androidx.compose.ui.unit.Density
6 |
7 | val onBoardingDensity = Density(2f, 1f)
8 | val onBoardingPhoneWidthFraction = 0.76f
9 | val onBoardingPhoneAspectRatio = 9.5f / 16f
10 | val onBoardingPageAnimation = tween(1200, easing = FastOutSlowInEasing)
11 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingIntent.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.screen.onboarding
2 |
3 | import com.shifthackz.android.core.mvi.MviIntent
4 |
5 | sealed interface OnBoardingIntent : MviIntent {
6 | data object Navigate : OnBoardingIntent
7 | }
8 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingPage.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.screen.onboarding
2 |
3 |
4 | enum class OnBoardingPage {
5 | Providers,
6 | Form,
7 | LocalDiffusion,
8 | LookAndFeel,
9 | }
10 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingState.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.screen.onboarding
2 |
3 | import com.shifthackz.aisdv1.domain.entity.DarkThemeToken
4 | import com.shifthackz.android.core.mvi.MviState
5 |
6 | data class OnBoardingState(
7 | val darkThemeToken: DarkThemeToken = DarkThemeToken.FRAPPE,
8 | val appVersion: String = "",
9 | ) : MviState
10 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/report/ReportIntent.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.screen.report
2 |
3 | import com.shifthackz.aisdv1.domain.entity.ReportReason
4 | import com.shifthackz.android.core.mvi.MviIntent
5 |
6 | sealed interface ReportIntent : MviIntent {
7 | data class UpdateText(val text: String) : ReportIntent
8 | data class UpdateReason(val reason: ReportReason) : ReportIntent
9 | data object Submit : ReportIntent
10 | data object NavigateBack : ReportIntent
11 | data object DismissError : ReportIntent
12 | }
13 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupEffect.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.screen.setup
2 |
3 | import com.shifthackz.android.core.mvi.MviEffect
4 |
5 | sealed interface ServerSetupEffect : MviEffect {
6 |
7 | data object HideKeyboard : ServerSetupEffect
8 |
9 | data object LaunchManageStoragePermission : ServerSetupEffect
10 |
11 | data class LaunchUrl(val url: String) : ServerSetupEffect
12 | }
13 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupScreenTags.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.screen.setup
2 |
3 | object ServerSetupScreenTags {
4 | const val MAIN_BUTTON = "ServerSetupMainButton"
5 | const val CUSTOM_MODEL_SWITCH = "CustomModelSwitch"
6 | }
7 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/mappers/ModesMapper.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.screen.setup.mappers
2 |
3 | import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider
4 | import com.shifthackz.aisdv1.domain.entity.ServerSource
5 |
6 | val BuildInfoProvider.allowedModes: List
7 | get() = ServerSource
8 | .entries
9 | .filter { it.allowedInBuilds.contains(type) }
10 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/web/webui/WebUiIntent.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.screen.web.webui
2 |
3 | import com.shifthackz.android.core.mvi.MviIntent
4 |
5 | sealed interface WebUiIntent : MviIntent {
6 | data object NavigateBack : WebUiIntent
7 | }
8 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/web/webui/WebUiState.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.screen.web.webui
2 |
3 | import com.shifthackz.aisdv1.domain.entity.ServerSource
4 | import com.shifthackz.android.core.mvi.MviState
5 |
6 | data class WebUiState(
7 | val loading: Boolean = true,
8 | val source: ServerSource = ServerSource.AUTOMATIC1111,
9 | val url: String = "",
10 | ) : MviState
11 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/theme/SliderTheme.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.theme
2 |
3 | import androidx.compose.material3.SliderColors
4 | import androidx.compose.material3.SliderDefaults
5 | import androidx.compose.runtime.Composable
6 | import androidx.compose.ui.graphics.Color
7 |
8 | val sliderColors: SliderColors
9 | @Composable get() = SliderDefaults.colors(
10 | activeTickColor = Color.Transparent,
11 | inactiveTickColor = Color.Transparent,
12 | )
13 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/engine/EngineSelectionIntent.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.widget.engine
2 |
3 | import com.shifthackz.android.core.mvi.MviIntent
4 |
5 | data class EngineSelectionIntent(val value: String) : MviIntent
6 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/work/BackgroundWorkIntent.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.widget.work
2 |
3 | import com.shifthackz.android.core.mvi.MviIntent
4 |
5 | sealed interface BackgroundWorkIntent : MviIntent {
6 | data object Dismiss : BackgroundWorkIntent
7 | }
8 |
--------------------------------------------------------------------------------
/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/work/BackgroundWorkState.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.widget.work
2 |
3 | import android.graphics.Bitmap
4 | import com.shifthackz.aisdv1.core.model.UiText
5 | import com.shifthackz.android.core.mvi.MviState
6 |
7 | data class BackgroundWorkState(
8 | val visible: Boolean = false,
9 | val title: UiText = UiText.empty,
10 | val subTitle: UiText = UiText.empty,
11 | val bitmap: Bitmap? = null,
12 | val isError: Boolean = false,
13 | ) : MviState
14 |
--------------------------------------------------------------------------------
/presentation/src/main/res/drawable/ic_bmc.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/presentation/src/main/res/drawable/ic_bmc.webp
--------------------------------------------------------------------------------
/presentation/src/main/res/drawable/ic_image.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/presentation/src/main/res/drawable/ic_sdai_logo.webp:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/presentation/src/main/res/drawable/ic_sdai_logo.webp
--------------------------------------------------------------------------------
/presentation/src/main/res/drawable/ic_share.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/presentation/src/main/res/drawable/ic_speaker_texture.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/presentation/src/main/res/drawable/ic_speaker_texture.jpg
--------------------------------------------------------------------------------
/presentation/src/main/res/drawable/ic_text.xml:
--------------------------------------------------------------------------------
1 |
6 |
9 |
10 |
--------------------------------------------------------------------------------
/presentation/src/test/java/com/shifthackz/aisdv1/presentation/core/CoreViewModelInitializeStrategy.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.core
2 |
3 | enum class CoreViewModelInitializeStrategy {
4 | InitializeOnce,
5 | InitializeEveryTime;
6 | }
7 |
--------------------------------------------------------------------------------
/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/HuggingFaceModelMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.mocks
2 |
3 | import com.shifthackz.aisdv1.domain.entity.HuggingFaceModel
4 |
5 | val mockHuggingFaceModels = listOf(
6 | HuggingFaceModel.default,
7 | HuggingFaceModel(
8 | "80974f2d-7ee0-48e5-97bc-448de3c1d634",
9 | "Analog Diffusion",
10 | "wavymulder/Analog-Diffusion",
11 | "https://huggingface.co/wavymulder/Analog-Diffusion",
12 | ),
13 | )
14 |
--------------------------------------------------------------------------------
/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/StabilityAiEngineMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.mocks
2 |
3 | import com.shifthackz.aisdv1.domain.entity.StabilityAiEngine
4 |
5 | val mockStabilityAiEngines = listOf(
6 | StabilityAiEngine(
7 | id = "5598",
8 | name = "engine_5598",
9 | ),
10 | )
11 |
--------------------------------------------------------------------------------
/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/StableDiffusionEmbeddingMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.mocks
2 |
3 | import com.shifthackz.aisdv1.domain.entity.Embedding
4 |
5 | val mockEmbeddings = listOf(
6 | Embedding("5598"),
7 | Embedding("151297"),
8 | )
9 |
--------------------------------------------------------------------------------
/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/StableDiffusionLoraMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.mocks
2 |
3 | import com.shifthackz.aisdv1.domain.entity.LoRA
4 |
5 | val mockStableDiffusionLoras = listOf(
6 | LoRA(
7 | name = "name_5598",
8 | alias = "alias_5598",
9 | path = "/unknown",
10 | ),
11 | LoRA(
12 | name = "name_151297",
13 | alias = "alias_151297",
14 | path = "/unknown",
15 | ),
16 | )
17 |
--------------------------------------------------------------------------------
/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/SupporterMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.mocks
2 |
3 | import com.shifthackz.aisdv1.domain.entity.Supporter
4 | import java.util.Date
5 |
6 | val mockSupporters = listOf(
7 | Supporter(
8 | id = 5598,
9 | name = "NZ",
10 | date = Date(5598L),
11 | message = "I always wanted support you ❤",
12 | ),
13 | )
14 |
--------------------------------------------------------------------------------
/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/SwarmUiModelMocks.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.mocks
2 |
3 | import com.shifthackz.aisdv1.domain.entity.SwarmUiModel
4 |
5 | val mockSwarmUiModels = listOf(
6 | SwarmUiModel(
7 | name = "5598",
8 | title = "5598",
9 | author = "ShiftHackZ",
10 | )
11 | )
12 |
--------------------------------------------------------------------------------
/presentation/src/test/java/com/shifthackz/aisdv1/presentation/stub/DispatchersProviderStub.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.presentation.stub
2 |
3 | import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider
4 | import kotlinx.coroutines.CoroutineDispatcher
5 | import kotlinx.coroutines.Dispatchers
6 |
7 | val stubDispatchersProvider = object : DispatchersProvider {
8 | override val io: CoroutineDispatcher = Dispatchers.Default
9 | override val ui: CoroutineDispatcher = Dispatchers.Default
10 | override val immediate: CoroutineDispatcher = Dispatchers.Default
11 | }
12 |
--------------------------------------------------------------------------------
/storage/.gitignore:
--------------------------------------------------------------------------------
1 | /build
--------------------------------------------------------------------------------
/storage/consumer-rules.pro:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ShiftHackZ/Stable-Diffusion-Android/e900b3a68170c3468e1834008709cb5051666cb1/storage/consumer-rules.pro
--------------------------------------------------------------------------------
/storage/src/main/AndroidManifest.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
--------------------------------------------------------------------------------
/storage/src/main/java/com/shifthackz/aisdv1/storage/converters/DateConverters.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.storage.converters
2 |
3 | import androidx.room.TypeConverter
4 | import java.util.*
5 |
6 | internal class DateConverters {
7 |
8 | @TypeConverter
9 | fun dateToLong(date: Date): Long = date.time
10 |
11 | @TypeConverter
12 | fun longToDate(ts: Long): Date = Date(ts)
13 | }
14 |
--------------------------------------------------------------------------------
/storage/src/main/java/com/shifthackz/aisdv1/storage/converters/ListConverters.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.storage.converters
2 |
3 | import androidx.room.TypeConverter
4 | import com.google.gson.Gson
5 | import com.google.gson.reflect.TypeToken
6 |
7 | internal class ListConverters {
8 |
9 | @TypeConverter
10 | fun listStringToString(value: List): String = Gson().toJson(value)
11 |
12 | @TypeConverter
13 | fun stringToListString(value: String): List = Gson().fromJson(
14 | value,
15 | object : TypeToken>() {}.type,
16 | )
17 | }
18 |
--------------------------------------------------------------------------------
/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/ServerConfigurationContract.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.storage.db.cache.contract
2 |
3 | internal object ServerConfigurationContract {
4 | const val TABLE = "server_config"
5 |
6 | const val SERVER_ID = "server_id"
7 | const val SD_MODEL_CHECKPOINT = "sd_model_checkpoint"
8 | }
9 |
--------------------------------------------------------------------------------
/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/StableDiffusionEmbeddingContract.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.storage.db.cache.contract
2 |
3 | object StableDiffusionEmbeddingContract {
4 | const val TABLE = "embeddings"
5 |
6 | const val ID = "id"
7 | const val KEYWORD = "keyword"
8 | }
9 |
--------------------------------------------------------------------------------
/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/StableDiffusionHyperNetworkContract.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.storage.db.cache.contract
2 |
3 | object StableDiffusionHyperNetworkContract {
4 | const val TABLE = "hyper_networks"
5 |
6 | const val ID = "id"
7 | const val NAME = "name"
8 | const val PATH = "path"
9 | }
10 |
--------------------------------------------------------------------------------
/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/StableDiffusionLoraContract.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.storage.db.cache.contract
2 |
3 | object StableDiffusionLoraContract {
4 | const val TABLE = "loras"
5 |
6 | const val ID = "id"
7 | const val NAME = "name"
8 | const val ALIAS = "alias"
9 | const val PATH = "path"
10 | }
11 |
--------------------------------------------------------------------------------
/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/StableDiffusionModelContract.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.storage.db.cache.contract
2 |
3 | internal object StableDiffusionModelContract {
4 | const val TABLE = "sd_models"
5 |
6 | const val ID = "id"
7 | const val TITLE = "title"
8 | const val NAME = "name"
9 | const val HASH = "hash"
10 | const val SHA256 = "sha256"
11 | const val FILENAME = "filename"
12 | const val CONFIG = "config"
13 | }
14 |
--------------------------------------------------------------------------------
/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/StableDiffusionSamplerContract.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.storage.db.cache.contract
2 |
3 | internal object StableDiffusionSamplerContract {
4 | const val TABLE = "sd_samplers"
5 |
6 | const val ID = "id"
7 | const val NAME = "name"
8 | const val ALIASES = "aliases"
9 | const val OPTIONS = "options"
10 | }
11 |
--------------------------------------------------------------------------------
/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/SwarmUiModelContract.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.storage.db.cache.contract
2 |
3 | internal object SwarmUiModelContract {
4 | const val TABLE = "swarm_models"
5 |
6 | const val ID = "id"
7 | const val NAME = "name"
8 | const val TITLE = "title"
9 | const val AUTHOR = "author"
10 | }
11 |
--------------------------------------------------------------------------------
/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/contract/HuggingFaceModelContract.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.storage.db.persistent.contract
2 |
3 | object HuggingFaceModelContract {
4 | const val TABLE = "hugging_face_models"
5 |
6 | const val ID = "id"
7 | const val NAME = "name"
8 | const val ALIAS = "alias"
9 | const val SOURCE = "source"
10 | }
11 |
--------------------------------------------------------------------------------
/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/contract/LocalModelContract.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.storage.db.persistent.contract
2 |
3 | object LocalModelContract {
4 | const val TABLE = "local_models"
5 |
6 | const val ID = "id"
7 | const val TYPE = "type"
8 | const val NAME = "name"
9 | const val SIZE = "size"
10 | const val SOURCES = "sources"
11 | }
12 |
--------------------------------------------------------------------------------
/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/contract/SupporterContract.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.storage.db.persistent.contract
2 |
3 | internal object SupporterContract {
4 | const val TABLE = "supporters"
5 |
6 | const val ID = "id"
7 | const val NAME = "name"
8 | const val DATE = "date"
9 | const val MESSAGE = "message"
10 | }
11 |
--------------------------------------------------------------------------------
/storage/src/main/java/com/shifthackz/aisdv1/storage/gateway/GatewayClearCacheDb.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.storage.gateway
2 |
3 | fun interface GatewayClearCacheDb {
4 | operator fun invoke()
5 | }
6 |
--------------------------------------------------------------------------------
/storage/src/main/java/com/shifthackz/aisdv1/storage/gateway/GatewayClearPersistentDb.kt:
--------------------------------------------------------------------------------
1 | package com.shifthackz.aisdv1.storage.gateway
2 |
3 | fun interface GatewayClearPersistentDb {
4 | operator fun invoke()
5 | }
6 |
--------------------------------------------------------------------------------