├── .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 | --------------------------------------------------------------------------------