From 1696cacfe95bd0997e416275341122f673a4f2b7 Mon Sep 17 00:00:00 2001 From: crim50n Date: Mon, 29 Dec 2025 21:31:16 +0300 Subject: [PATCH 01/42] feat(domain): add ADetailer, HiresConfig, ModelType, Scheduler, AspectRatio entities --- .../aisdv1/domain/entity/ADetailerConfig.kt | 74 ++++++++++++++++++ .../aisdv1/domain/entity/HiresConfig.kt | 49 ++++++++++++ .../aisdv1/domain/entity/ModelType.kt | 77 +++++++++++++++++++ .../aisdv1/domain/entity/Scheduler.kt | 39 ++++++++++ .../aisdv1/presentation/model/AspectRatio.kt | 40 ++++++++++ 5 files changed, 279 insertions(+) create mode 100644 domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ADetailerConfig.kt create mode 100644 domain/src/main/java/com/shifthackz/aisdv1/domain/entity/HiresConfig.kt create mode 100644 domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ModelType.kt create mode 100644 domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Scheduler.kt create mode 100644 presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/AspectRatio.kt diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ADetailerConfig.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ADetailerConfig.kt new file mode 100644 index 000000000..e39fe5d9d --- /dev/null +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ADetailerConfig.kt @@ -0,0 +1,74 @@ +package com.shifthackz.aisdv1.domain.entity + +import java.io.Serializable + +/** + * Configuration for the ADetailer extension in A1111/Forge. + * ADetailer automatically detects faces/hands and refines them with a second pass. + * + * @param enabled Whether ADetailer should be used for generation. + * @param model The detection model to use (e.g., "face_yolov8n.pt", "hand_yolov8n.pt"). + * @param prompt Optional prompt override for the detected regions. + * @param negativePrompt Optional negative prompt override for the detected regions. + * @param confidence Detection confidence threshold (0.0 to 1.0). + * @param maskBlur Blur amount for the detected mask. + * @param denoisingStrength Denoising strength for the second pass (0.0 to 1.0). + * @param inpaintOnlyMasked Whether to inpaint only the masked region. + * @param inpaintPadding Padding around detected regions in pixels. + */ +data class ADetailerConfig( + val enabled: Boolean = false, + val model: String = "face_yolov8s.pt", + val prompt: String = "", + val negativePrompt: String = "", + val confidence: Float = 0.3f, + val maskBlur: Int = 4, + val denoisingStrength: Float = 0.4f, + val inpaintOnlyMasked: Boolean = true, + val inpaintPadding: Int = 32, +) : Serializable { + + companion object { + val DISABLED = ADetailerConfig(enabled = false) + + val AVAILABLE_MODELS = listOf( + "face_yolov8n.pt", + "face_yolov8s.pt", + "hand_yolov8n.pt", + "person_yolov8n-seg.pt", + "person_yolov8s-seg.pt", + "yolov8x-worldv2.pt", + "mediapipe_face_full", + "mediapipe_face_short", + "mediapipe_face_mesh", + "mediapipe_face_mesh_eyes_only", + ) + } + + /** + * Converts this config to the alwayson_scripts format expected by A1111 API. + */ + fun toAlwaysOnScripts(): Map? { + if (!enabled) return null + + return mapOf( + "ADetailer" to mapOf( + "args" to listOf( + true, // enable + false, // skip_img2img + mapOf( + "ad_model" to model, + "ad_prompt" to prompt, + "ad_negative_prompt" to negativePrompt, + "ad_confidence" to confidence, + "ad_dilate_erode" to maskBlur, + "ad_denoising_strength" to denoisingStrength, + "ad_inpaint_only_masked" to inpaintOnlyMasked, + "ad_inpaint_only_masked_padding" to inpaintPadding, + "is_api" to true, + ) + ) + ) + ) + } +} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/HiresConfig.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/HiresConfig.kt new file mode 100644 index 000000000..1c16258de --- /dev/null +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/HiresConfig.kt @@ -0,0 +1,49 @@ +package com.shifthackz.aisdv1.domain.entity + +import java.io.Serializable + +/** + * Configuration for Hires. Fix (High Resolution Fix) in A1111/Forge. + * Allows upscaling generated images with additional refinement pass. + * + * @param enabled Whether Hires. Fix is enabled. + * @param upscaler The upscaler to use (e.g., "Latent", "R-ESRGAN 4x+"). + * @param scale The upscale factor (default: 2.0). + * @param steps The number of hires fix steps (0 = use same as first pass). + * @param denoisingStrength The denoising strength for the second pass. + * @param hrCfg CFG scale for hires pass (null = use server default based on model). + * @param hrDistilledCfg Distilled CFG scale for hires pass (null = use server default, used for Flux). + */ +data class HiresConfig( + val enabled: Boolean = false, + val upscaler: String = "None", + val scale: Float = 2.0f, + val steps: Int = 0, + val denoisingStrength: Float = 0.4f, + val hrCfg: Float? = null, + val hrDistilledCfg: Float? = null, +) : Serializable { + + companion object { + val DISABLED = HiresConfig(enabled = false) + + val AVAILABLE_UPSCALERS = listOf( + "Latent", + "Latent (antialiased)", + "Latent (bicubic)", + "Latent (bicubic antialiased)", + "Latent (nearest)", + "Latent (nearest-exact)", + "None", + "Lanczos", + "Nearest", + "ESRGAN_4x", + "LDSR", + "R-ESRGAN 4x+", + "R-ESRGAN 4x+ Anime6B", + "ScuNET GAN", + "ScuNET PSNR", + "SwinIR 4x", + ) + } +} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ModelType.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ModelType.kt new file mode 100644 index 000000000..2a48124c2 --- /dev/null +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ModelType.kt @@ -0,0 +1,77 @@ +package com.shifthackz.aisdv1.domain.entity + +/** + * Represents the type of Stable Diffusion model being used. + * Different model types have different generation parameters: + * - SD_1_5: Standard Stable Diffusion 1.x, uses CFG Scale and negative prompt + * - SDXL: Stable Diffusion XL, uses CFG Scale and negative prompt + * - FLUX: Flux models, uses Distilled CFG Scale, no negative prompt support + */ +enum class ModelType(val displayName: String) { + SD_1_5("SD 1.5"), + SDXL("SDXL"), + FLUX("Flux"); + + companion object { + /** + * Whether this model type supports negative prompts. + */ + fun ModelType.supportsNegativePrompt(): Boolean = this != FLUX + + /** + * Whether this model type uses distilled CFG scale instead of regular CFG. + */ + fun ModelType.usesDistilledCfg(): Boolean = this == FLUX + + /** + * Returns the default CFG Scale for this model type. + * Flux uses 1.0, SD/SDXL use 7.0. + */ + fun ModelType.defaultCfgScale(): Float = when (this) { + FLUX -> 1.0f + SD_1_5 -> 7.0f + SDXL -> 5.0f + } + + /** + * Returns the default Distilled CFG Scale for Flux models. + */ + fun ModelType.defaultDistilledCfgScale(): Float = 3.5f + + /** + * Returns the default sampler for this model type. + */ + fun ModelType.defaultSampler(): String = when (this) { + SD_1_5 -> "Euler a" + SDXL -> "DPM++ 2M SDE" + FLUX -> "Euler" + } + + /** + * Returns the default width for this model type. + */ + fun ModelType.defaultWidth(): Int = when (this) { + SD_1_5 -> 448 + SDXL -> 896 + FLUX -> 896 + } + + /** + * Returns the default height for this model type. + */ + fun ModelType.defaultHeight(): Int = when (this) { + SD_1_5 -> 576 + SDXL -> 1152 + FLUX -> 1152 + } + + /** + * Returns the default scheduler for this model type. + */ + fun ModelType.defaultScheduler(): Scheduler = when (this) { + SD_1_5 -> Scheduler.AUTOMATIC + SDXL -> Scheduler.KARRAS + FLUX -> Scheduler.SIMPLE + } + } +} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Scheduler.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Scheduler.kt new file mode 100644 index 000000000..2e109daf2 --- /dev/null +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Scheduler.kt @@ -0,0 +1,39 @@ +package com.shifthackz.aisdv1.domain.entity + +/** + * Scheduler types supported by Stable Diffusion and Flux models. + * Flux models typically use specific schedulers like "simple" or "normal". + * + * @param alias The API value sent to the server. + * @param displayName Human-readable name for UI. + */ +enum class Scheduler( + val alias: String, + val displayName: String, +) { + AUTOMATIC("automatic", "Automatic"), + UNIFORM("uniform", "Uniform"), + KARRAS("karras", "Karras"), + EXPONENTIAL("exponential", "Exponential"), + POLYEXPONENTIAL("polyexponential", "Polyexponential"), + SGM_UNIFORM("sgm_uniform", "SGM Uniform"), + KL_OPTIMAL("kl_optimal", "KL Optimal"), + ALIGN_YOUR_STEPS("align_your_steps", "Align Your Steps"), + SIMPLE("simple", "Simple"), + NORMAL("normal", "Normal"), + DDIM("ddim_uniform", "DDIM Uniform"), + BETA("beta", "Beta"); + + companion object { + /** + * Schedulers recommended for Flux models. + */ + val FLUX_RECOMMENDED = listOf(SIMPLE, NORMAL, BETA) + + /** + * Get scheduler by alias, defaulting to AUTOMATIC if not found. + */ + fun fromAlias(alias: String): Scheduler = + entries.find { it.alias.equals(alias, ignoreCase = true) } ?: AUTOMATIC + } +} diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/AspectRatio.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/AspectRatio.kt new file mode 100644 index 000000000..985c5bab3 --- /dev/null +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/AspectRatio.kt @@ -0,0 +1,40 @@ +package com.shifthackz.aisdv1.presentation.model + +enum class AspectRatio( + val widthRatio: Int, + val heightRatio: Int, + val label: String, +) { + RATIO_1_1(1, 1, "1:1"), + RATIO_4_3(4, 3, "4:3"), + RATIO_3_4(3, 4, "3:4"), + RATIO_16_9(16, 9, "16:9"), + RATIO_9_16(9, 16, "9:16"), + RATIO_3_2(3, 2, "3:2"), + RATIO_2_3(2, 3, "2:3"), + RATIO_21_9(21, 9, "21:9"), + RATIO_9_21(9, 21, "9:21"); + + fun calculateDimensions(baseSize: Int): Pair { + val gcd = gcd(widthRatio, heightRatio) + val normalizedWidth = widthRatio / gcd + val normalizedHeight = heightRatio / gcd + + return if (normalizedWidth >= normalizedHeight) { + val width = baseSize + val height = (baseSize * normalizedHeight) / normalizedWidth + // Round to nearest 8 for better compatibility + Pair(roundTo8(width), roundTo8(height)) + } else { + val height = baseSize + val width = (baseSize * normalizedWidth) / normalizedHeight + Pair(roundTo8(width), roundTo8(height)) + } + } + + private fun gcd(a: Int, b: Int): Int = if (b == 0) a else gcd(b, a % b) + + private fun roundTo8(value: Int): Int = ((value + 4) / 8) * 8 + + override fun toString(): String = label +} From 30dd4d3e77ec7e35679adc2e047eadfd770e076d Mon Sep 17 00:00:00 2001 From: crim50n Date: Mon, 29 Dec 2025 21:32:24 +0300 Subject: [PATCH 02/42] refactor(data): migrate media storage from Base64 to file-based storage --- .../data/core/CoreMediaStoreRepository.kt | 6 +- .../data/feature/MediaFileManagerImpl.kt | 140 +++++++ .../local/GenerationResultLocalDataSource.kt | 2 + .../data/mappers/AiGenerationResultMappers.kt | 7 + .../GenerationResultRepositoryImpl.kt | 137 ++++++- .../datasource/GenerationResultDataSource.kt | 1 + .../domain/entity/AiGenerationResult.kt | 3 + .../aisdv1/domain/entity/MediaType.kt | 20 + .../aisdv1/domain/feature/MediaFileManager.kt | 92 +++++ .../repository/GenerationResultRepository.kt | 8 + .../caching/DataPreLoaderUseCaseImpl.kt | 43 ++- .../8.json | 364 ++++++++++++++++++ .../contract/GenerationResultContract.kt | 3 + .../db/persistent/dao/GenerationResultDao.kt | 6 + .../entity/GenerationResultEntity.kt | 6 + 15 files changed, 823 insertions(+), 15 deletions(-) create mode 100644 data/src/main/java/com/shifthackz/aisdv1/data/feature/MediaFileManagerImpl.kt create mode 100644 domain/src/main/java/com/shifthackz/aisdv1/domain/entity/MediaType.kt create mode 100644 domain/src/main/java/com/shifthackz/aisdv1/domain/feature/MediaFileManager.kt create mode 100644 storage/schemas/com.shifthackz.aisdv1.storage.db.persistent.PersistentDatabase/8.json diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/core/CoreMediaStoreRepository.kt b/data/src/main/java/com/shifthackz/aisdv1/data/core/CoreMediaStoreRepository.kt index 281befdab..a88b8bd04 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/core/CoreMediaStoreRepository.kt +++ b/data/src/main/java/com/shifthackz/aisdv1/data/core/CoreMediaStoreRepository.kt @@ -18,8 +18,10 @@ internal abstract class CoreMediaStoreRepository( ) { protected fun exportToMediaStore(result: AiGenerationResult): Completable { - if (preferenceManager.saveToMediaStore) return export(result) - return Completable.complete() + if (!preferenceManager.saveToMediaStore) return Completable.complete() + // Skip export if there's no image data (e.g., FalAi uses mediaPath directly) + if (result.image.isEmpty()) return Completable.complete() + return export(result) } protected fun getInfo(): Single = Single.create { emitter -> diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/feature/MediaFileManagerImpl.kt b/data/src/main/java/com/shifthackz/aisdv1/data/feature/MediaFileManagerImpl.kt new file mode 100644 index 000000000..c070bece7 --- /dev/null +++ b/data/src/main/java/com/shifthackz/aisdv1/data/feature/MediaFileManagerImpl.kt @@ -0,0 +1,140 @@ +package com.shifthackz.aisdv1.data.feature + +import android.content.Context +import android.util.Base64 +import com.shifthackz.aisdv1.core.common.log.debugLog +import com.shifthackz.aisdv1.core.common.log.errorLog +import com.shifthackz.aisdv1.domain.entity.MediaType +import com.shifthackz.aisdv1.domain.feature.MediaFileManager +import okhttp3.OkHttpClient +import okhttp3.Request +import java.io.File +import java.io.FileOutputStream +import java.util.UUID + +internal class MediaFileManagerImpl( + private val context: Context, + private val httpClient: OkHttpClient, +) : MediaFileManager { + + private val filesDir: File + get() = context.filesDir + + override fun saveMedia(data: ByteArray, type: MediaType): String { + val dir = File(filesDir, MediaFileManager.MEDIA_DIR) + if (!dir.exists()) dir.mkdirs() + + val fileName = "${UUID.randomUUID()}.${type.extension}" + val file = File(dir, fileName) + + FileOutputStream(file).use { fos -> + fos.write(data) + } + + debugLog("MediaFileManager: Saved media to ${file.absolutePath}") + return "${MediaFileManager.MEDIA_DIR}/$fileName" + } + + override fun saveMediaFromUrl(url: String, type: MediaType): String { + val request = Request.Builder().url(url).build() + val response = httpClient.newCall(request).execute() + + if (!response.isSuccessful) { + throw IllegalStateException("Failed to download media: ${response.code}") + } + + val bytes = response.body?.bytes() + ?: throw IllegalStateException("Empty response body") + + return saveMedia(bytes, type) + } + + override fun saveInputMedia(data: ByteArray, type: MediaType): String { + val dir = File(filesDir, MediaFileManager.INPUT_DIR) + if (!dir.exists()) dir.mkdirs() + + val fileName = "${UUID.randomUUID()}.${type.extension}" + val file = File(dir, fileName) + + FileOutputStream(file).use { fos -> + fos.write(data) + } + + debugLog("MediaFileManager: Saved input media to ${file.absolutePath}") + return "${MediaFileManager.INPUT_DIR}/$fileName" + } + + override fun loadMedia(path: String): ByteArray? { + return try { + val file = getMediaFile(path) + if (file.exists()) { + file.readBytes() + } else { + errorLog("MediaFileManager: File not found: ${file.absolutePath}") + null + } + } catch (e: Exception) { + errorLog(e) + null + } + } + + override fun deleteMedia(path: String): Boolean { + return try { + val file = getMediaFile(path) + if (file.exists()) { + val deleted = file.delete() + debugLog("MediaFileManager: Deleted ${file.absolutePath}: $deleted") + deleted + } else { + true // Already doesn't exist + } + } catch (e: Exception) { + errorLog(e) + false + } + } + + override fun getMediaFile(path: String): File { + return File(filesDir, path) + } + + override fun migrateBase64ToFile(base64: String, type: MediaType): String { + // Handle VIDEO_URL: prefix - for videos, keep the URL format for now + if (isVideoUrl(base64)) { + return base64 + } + + // Skip if already a file path + if (isFilePath(base64)) { + return base64 + } + + // Decode base64 and save to file + return try { + val bytes = Base64.decode(base64, Base64.NO_WRAP) + saveMedia(bytes, type) + } catch (e: Exception) { + errorLog("MediaFileManager: Failed to migrate base64: ${e.message}") + // Return original on error - don't lose data + base64 + } + } + + override fun isFilePath(path: String): Boolean { + return path.startsWith(MediaFileManager.MEDIA_DIR) || + path.startsWith(MediaFileManager.INPUT_DIR) + } + + override fun isVideoUrl(path: String): Boolean { + return path.startsWith(MediaFileManager.VIDEO_URL_PREFIX) + } + + override fun extractVideoUrl(path: String): String? { + return if (isVideoUrl(path)) { + path.removePrefix(MediaFileManager.VIDEO_URL_PREFIX) + } else { + null + } + } +} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/local/GenerationResultLocalDataSource.kt b/data/src/main/java/com/shifthackz/aisdv1/data/local/GenerationResultLocalDataSource.kt index 90c7bd57e..8a441241e 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/local/GenerationResultLocalDataSource.kt +++ b/data/src/main/java/com/shifthackz/aisdv1/data/local/GenerationResultLocalDataSource.kt @@ -20,6 +20,8 @@ internal class GenerationResultLocalDataSource( .query() .map(List::mapEntityToDomain) + override fun queryAllIds(): Single> = dao.queryAllIds() + override fun queryPage(limit: Int, offset: Int) = dao .queryPage(limit, offset) .map(List::mapEntityToDomain) diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/AiGenerationResultMappers.kt b/data/src/main/java/com/shifthackz/aisdv1/data/mappers/AiGenerationResultMappers.kt index b1f6bf170..ded13f8a8 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/AiGenerationResultMappers.kt +++ b/data/src/main/java/com/shifthackz/aisdv1/data/mappers/AiGenerationResultMappers.kt @@ -1,6 +1,7 @@ package com.shifthackz.aisdv1.data.mappers import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import com.shifthackz.aisdv1.domain.entity.MediaType import com.shifthackz.aisdv1.storage.db.persistent.entity.GenerationResultEntity //region DOMAIN --> ENTITY @@ -27,6 +28,9 @@ fun AiGenerationResult.mapDomainToEntity(): GenerationResultEntity = with(this) subSeedStrength = subSeedStrength, denoisingStrength = denoisingStrength, hidden = hidden, + mediaPath = mediaPath, + inputMediaPath = inputMediaPath, + mediaType = mediaType.key, ) } //endregion @@ -55,6 +59,9 @@ fun GenerationResultEntity.mapEntityToDomain(): AiGenerationResult = with(this) subSeedStrength = subSeedStrength, denoisingStrength = denoisingStrength, hidden = hidden, + mediaPath = mediaPath, + inputMediaPath = inputMediaPath, + mediaType = MediaType.parse(mediaType), ) } //endregion diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/GenerationResultRepositoryImpl.kt b/data/src/main/java/com/shifthackz/aisdv1/data/repository/GenerationResultRepositoryImpl.kt index c4e8614a7..cc22abe26 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/GenerationResultRepositoryImpl.kt +++ b/data/src/main/java/com/shifthackz/aisdv1/data/repository/GenerationResultRepositoryImpl.kt @@ -1,12 +1,16 @@ package com.shifthackz.aisdv1.data.repository +import android.util.Base64 import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter import com.shifthackz.aisdv1.data.core.CoreMediaStoreRepository import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import com.shifthackz.aisdv1.domain.entity.MediaType +import com.shifthackz.aisdv1.domain.feature.MediaFileManager import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway import com.shifthackz.aisdv1.domain.preference.PreferenceManager import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single internal class GenerationResultRepositoryImpl( @@ -14,6 +18,7 @@ internal class GenerationResultRepositoryImpl( mediaStoreGateway: MediaStoreGateway, base64ToBitmapConverter: Base64ToBitmapConverter, private val localDataSource: GenerationResultDataSource.Local, + private val mediaFileManager: MediaFileManager, ) : CoreMediaStoreRepository( preferenceManager, mediaStoreGateway, @@ -21,24 +26,67 @@ internal class GenerationResultRepositoryImpl( ), GenerationResultRepository { override fun getAll() = localDataSource.queryAll() + .map { results -> results.map { it.loadMediaFromFiles() } } + + override fun getAllIds() = localDataSource.queryAllIds() override fun getPage(limit: Int, offset: Int) = localDataSource.queryPage(limit, offset) + .map { results -> results.map { it.loadMediaFromFiles() } } override fun getMediaStoreInfo() = getInfo() override fun getById(id: Long) = localDataSource.queryById(id) + .map { it.loadMediaFromFiles() } override fun getByIds(idList: List) = localDataSource.queryByIdList(idList) + .map { results -> results.map { it.loadMediaFromFiles() } } - override fun insert(result: AiGenerationResult) = localDataSource - .insert(result) - .flatMap { id -> exportToMediaStore(result).andThen(Single.just(id)) } + override fun insert(result: AiGenerationResult): Single { + val converted = result.saveMediaToFiles() + return localDataSource + .insert(converted) + .flatMap { id -> exportToMediaStore(result).andThen(Single.just(id)) } + } - override fun deleteById(id: Long) = localDataSource.deleteById(id) + override fun deleteById(id: Long) = localDataSource.queryById(id) + .doOnSuccess { result -> + // Delete media files when deleting from gallery + if (result.mediaPath.isNotEmpty()) { + mediaFileManager.deleteMedia(result.mediaPath) + } + if (result.inputMediaPath.isNotEmpty()) { + mediaFileManager.deleteMedia(result.inputMediaPath) + } + } + .flatMapCompletable { localDataSource.deleteById(id) } - override fun deleteByIdList(idList: List) = localDataSource.deleteByIdList(idList) + override fun deleteByIdList(idList: List) = localDataSource.queryByIdList(idList) + .doOnSuccess { results -> + // Delete media files when deleting from gallery + results.forEach { result -> + if (result.mediaPath.isNotEmpty()) { + mediaFileManager.deleteMedia(result.mediaPath) + } + if (result.inputMediaPath.isNotEmpty()) { + mediaFileManager.deleteMedia(result.inputMediaPath) + } + } + } + .flatMapCompletable { localDataSource.deleteByIdList(idList) } - override fun deleteAll() = localDataSource.deleteAll() + override fun deleteAll() = localDataSource.queryAll() + .doOnSuccess { results -> + // Delete all media files + results.forEach { result -> + if (result.mediaPath.isNotEmpty()) { + mediaFileManager.deleteMedia(result.mediaPath) + } + if (result.inputMediaPath.isNotEmpty()) { + mediaFileManager.deleteMedia(result.inputMediaPath) + } + } + } + .flatMapCompletable { localDataSource.deleteAll() } override fun toggleVisibility(id: Long): Single = localDataSource .queryById(id) @@ -46,4 +94,81 @@ internal class GenerationResultRepositoryImpl( .flatMap(localDataSource::insert) .flatMap { localDataSource.queryById(id) } .map(AiGenerationResult::hidden) + + override fun migrateBase64ToFiles(): Completable = localDataSource.queryAll() + .flatMapCompletable { results -> + val needsMigration = results.filter { result -> + // Needs migration if image has base64 data but mediaPath is empty + (result.image.isNotEmpty() && !mediaFileManager.isFilePath(result.image) && result.mediaPath.isEmpty()) || + (result.inputImage.isNotEmpty() && !mediaFileManager.isFilePath(result.inputImage) && result.inputMediaPath.isEmpty()) + } + if (needsMigration.isEmpty()) { + Completable.complete() + } else { + Completable.concat(needsMigration.map { result -> + val migrated = result.saveMediaToFiles() + localDataSource.insert(migrated).ignoreElement() + }) + } + } + + /** + * Converts base64 data to files before saving to database. + * After this, image/inputImage will be empty, mediaPath/inputMediaPath will contain file paths. + */ + private fun AiGenerationResult.saveMediaToFiles(): AiGenerationResult { + var mediaPath = this.mediaPath + var inputMediaPath = this.inputMediaPath + + // Convert main image base64 to file + if (image.isNotEmpty() && !mediaFileManager.isFilePath(image) && !mediaFileManager.isVideoUrl(image)) { + mediaPath = mediaFileManager.migrateBase64ToFile(image, mediaType) + } + + // Convert input image base64 to file + if (inputImage.isNotEmpty() && !mediaFileManager.isFilePath(inputImage)) { + inputMediaPath = mediaFileManager.migrateBase64ToFile(inputImage, MediaType.IMAGE) + } + + return copy( + image = "", // Clear base64 from database + inputImage = "", // Clear base64 from database + mediaPath = mediaPath, + inputMediaPath = inputMediaPath, + ) + } + + /** + * Loads media from files into base64 fields for UI consumption. + */ + private fun AiGenerationResult.loadMediaFromFiles(): AiGenerationResult { + var loadedImage = image + var loadedInputImage = inputImage + + // Load main media from file if path is set and image is empty + if (mediaPath.isNotEmpty() && image.isEmpty()) { + if (mediaFileManager.isVideoUrl(mediaPath)) { + // For videos, keep the VIDEO_URL: format + loadedImage = mediaPath + } else if (mediaFileManager.isFilePath(mediaPath)) { + mediaFileManager.loadMedia(mediaPath)?.let { bytes -> + loadedImage = Base64.encodeToString(bytes, Base64.NO_WRAP) + } + } + } + + // Load input media from file if path is set and inputImage is empty + if (inputMediaPath.isNotEmpty() && inputImage.isEmpty()) { + if (mediaFileManager.isFilePath(inputMediaPath)) { + mediaFileManager.loadMedia(inputMediaPath)?.let { bytes -> + loadedInputImage = Base64.encodeToString(bytes, Base64.NO_WRAP) + } + } + } + + return copy( + image = loadedImage, + inputImage = loadedInputImage, + ) + } } diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/GenerationResultDataSource.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/GenerationResultDataSource.kt index 8b28ef907..4ea640db3 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/GenerationResultDataSource.kt +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/GenerationResultDataSource.kt @@ -9,6 +9,7 @@ sealed interface GenerationResultDataSource { interface Local : GenerationResultDataSource { fun insert(result: AiGenerationResult): Single fun queryAll(): Single> + fun queryAllIds(): Single> fun queryPage(limit: Int, offset: Int): Single> fun queryById(id: Long): Single fun queryByIdList(idList: List): Single> diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/AiGenerationResult.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/AiGenerationResult.kt index 1c8b6a247..96e7e3dda 100755 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/AiGenerationResult.kt +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/AiGenerationResult.kt @@ -21,6 +21,9 @@ data class AiGenerationResult( val subSeedStrength: Float, val denoisingStrength: Float, val hidden: Boolean, + val mediaPath: String = "", + val inputMediaPath: String = "", + val mediaType: MediaType = MediaType.IMAGE, ) { enum class Type(val key: String) { TEXT_TO_IMAGE("txt2img"), diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/MediaType.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/MediaType.kt new file mode 100644 index 000000000..767691f9b --- /dev/null +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/MediaType.kt @@ -0,0 +1,20 @@ +package com.shifthackz.aisdv1.domain.entity + +enum class MediaType(val key: String, val extension: String, val mimeType: String) { + IMAGE("IMAGE", "png", "image/png"), + VIDEO("VIDEO", "mp4", "video/mp4"); + + companion object { + fun parse(key: String): MediaType = entries.find { it.key == key } ?: IMAGE + + fun fromExtension(ext: String): MediaType = when (ext.lowercase()) { + "mp4", "webm", "mov" -> VIDEO + else -> IMAGE + } + + fun fromUrl(url: String): MediaType { + val ext = url.substringAfterLast('.').substringBefore('?').lowercase() + return fromExtension(ext) + } + } +} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/feature/MediaFileManager.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/feature/MediaFileManager.kt new file mode 100644 index 000000000..64d2485e0 --- /dev/null +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/feature/MediaFileManager.kt @@ -0,0 +1,92 @@ +package com.shifthackz.aisdv1.domain.feature + +import com.shifthackz.aisdv1.domain.entity.MediaType +import java.io.File + +/** + * Manages media file storage for generated images and videos. + * All media is stored in context.filesDir/media/ directory. + */ +interface MediaFileManager { + + /** + * Saves media data to a file and returns the relative path. + * @param data The raw bytes of the media file + * @param type The type of media (IMAGE or VIDEO) + * @return Relative path to the saved file (e.g., "media/abc123.png") + */ + fun saveMedia(data: ByteArray, type: MediaType): String + + /** + * Saves media from a URL by downloading it. + * @param url The URL to download from + * @param type The type of media + * @return Relative path to the saved file + */ + fun saveMediaFromUrl(url: String, type: MediaType): String + + /** + * Saves input media (for img2img, inpainting) to the input directory. + * @param data The raw bytes of the media file + * @param type The type of media + * @return Relative path to the saved file (e.g., "input/xyz789.png") + */ + fun saveInputMedia(data: ByteArray, type: MediaType): String + + /** + * Loads media file contents. + * @param path Relative path to the file + * @return File contents as bytes, or null if not found + */ + fun loadMedia(path: String): ByteArray? + + /** + * Deletes a media file. + * @param path Relative path to the file + * @return true if deleted successfully + */ + fun deleteMedia(path: String): Boolean + + /** + * Gets the absolute File reference for a media path. + * @param path Relative path to the file + * @return File object + */ + fun getMediaFile(path: String): File + + /** + * Migrates base64-encoded data to a file. + * Used for database migration from base64 storage to file storage. + * @param base64 Base64-encoded data + * @param type The type of media + * @return Relative path to the saved file + */ + fun migrateBase64ToFile(base64: String, type: MediaType): String + + /** + * Checks if the path represents file storage (vs legacy base64 or URL). + * @param path The path or data string to check + * @return true if this is a file path + */ + fun isFilePath(path: String): Boolean + + /** + * Checks if the path represents a video URL (legacy format). + * @param path The path or data string to check + * @return true if this is a VIDEO_URL: prefixed string + */ + fun isVideoUrl(path: String): Boolean + + /** + * Extracts video URL from legacy VIDEO_URL: format. + * @param path The VIDEO_URL: prefixed string + * @return The actual URL, or null if not a video URL + */ + fun extractVideoUrl(path: String): String? + + companion object { + const val MEDIA_DIR = "media" + const val INPUT_DIR = "input" + const val VIDEO_URL_PREFIX = "VIDEO_URL:" + } +} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/GenerationResultRepository.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/GenerationResultRepository.kt index de3a1aec8..20911e84c 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/GenerationResultRepository.kt +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/GenerationResultRepository.kt @@ -9,6 +9,8 @@ interface GenerationResultRepository { fun getAll(): Single> + fun getAllIds(): Single> + fun getPage(limit: Int, offset: Int): Single> fun getMediaStoreInfo(): Single @@ -26,4 +28,10 @@ interface GenerationResultRepository { fun deleteAll(): Completable fun toggleVisibility(id: Long): Single + + /** + * Migrates existing gallery items from base64 storage to file-based storage. + * This runs in the background at app startup. + */ + fun migrateBase64ToFiles(): Completable } diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/DataPreLoaderUseCaseImpl.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/DataPreLoaderUseCaseImpl.kt index 84a5ffe89..da514dc99 100755 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/DataPreLoaderUseCaseImpl.kt +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/DataPreLoaderUseCaseImpl.kt @@ -1,26 +1,55 @@ package com.shifthackz.aisdv1.domain.usecase.caching +import com.shifthackz.aisdv1.core.common.log.debugLog +import com.shifthackz.aisdv1.core.common.log.errorLog +import com.shifthackz.aisdv1.domain.entity.FeatureTag +import com.shifthackz.aisdv1.domain.preference.PreferenceManager import com.shifthackz.aisdv1.domain.repository.EmbeddingsRepository +import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository import com.shifthackz.aisdv1.domain.repository.LorasRepository import com.shifthackz.aisdv1.domain.repository.ServerConfigurationRepository import com.shifthackz.aisdv1.domain.repository.StableDiffusionHyperNetworksRepository import com.shifthackz.aisdv1.domain.repository.StableDiffusionModelsRepository import com.shifthackz.aisdv1.domain.repository.StableDiffusionSamplersRepository +import io.reactivex.rxjava3.core.Completable internal class DataPreLoaderUseCaseImpl( + private val preferenceManager: PreferenceManager, private val serverConfigurationRepository: ServerConfigurationRepository, private val sdModelsRepository: StableDiffusionModelsRepository, private val sdSamplersRepository: StableDiffusionSamplersRepository, private val sdLorasRepository: LorasRepository, private val sdHyperNetworksRepository: StableDiffusionHyperNetworksRepository, private val sdEmbeddingsRepository: EmbeddingsRepository, + private val generationResultRepository: GenerationResultRepository, ) : DataPreLoaderUseCase { - override operator fun invoke() = serverConfigurationRepository - .fetchConfiguration() - .andThen(sdModelsRepository.fetchModels()) - .andThen(sdSamplersRepository.fetchSamplers()) - .andThen(sdLorasRepository.fetchLoras()) - .andThen(sdHyperNetworksRepository.fetchHyperNetworks()) - .andThen(sdEmbeddingsRepository.fetchEmbeddings()) + override operator fun invoke(): Completable { + // Always run migration first (will be no-op if already migrated) + val migrationCompletable = generationResultRepository + .migrateBase64ToFiles() + .doOnSubscribe { debugLog("Starting base64 to files migration...") } + .doOnComplete { debugLog("Base64 to files migration completed.") } + .onErrorComplete { t -> + errorLog(t, "Base64 to files migration failed") + true // Continue even if migration fails + } + + val source = preferenceManager.source + val requiresServerData = source.featureTags.contains(FeatureTag.OwnServer) + + // Skip server data fetching for sources that don't need it (Horde, HuggingFace, OpenAI, StabilityAI, FalAI, local) + if (!requiresServerData) { + return migrationCompletable + } + + // Only fetch server configuration and related data for A1111/SwarmUI + return migrationCompletable + .andThen(serverConfigurationRepository.fetchConfiguration()) + .andThen(sdModelsRepository.fetchModels()) + .andThen(sdSamplersRepository.fetchSamplers()) + .andThen(sdLorasRepository.fetchLoras()) + .andThen(sdHyperNetworksRepository.fetchHyperNetworks()) + .andThen(sdEmbeddingsRepository.fetchEmbeddings()) + } } diff --git a/storage/schemas/com.shifthackz.aisdv1.storage.db.persistent.PersistentDatabase/8.json b/storage/schemas/com.shifthackz.aisdv1.storage.db.persistent.PersistentDatabase/8.json new file mode 100644 index 000000000..9e839ddf3 --- /dev/null +++ b/storage/schemas/com.shifthackz.aisdv1.storage.db.persistent.PersistentDatabase/8.json @@ -0,0 +1,364 @@ +{ + "formatVersion": 1, + "database": { + "version": 8, + "identityHash": "b82abe60f453e0b87b11162f583f6aa7", + "entities": [ + { + "tableName": "generation_results", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `image_base_64` TEXT NOT NULL, `original_image_base_64` TEXT NOT NULL, `created_at` INTEGER NOT NULL, `generation_type` TEXT NOT NULL, `prompt` TEXT NOT NULL, `negative_prompt` TEXT NOT NULL, `width` INTEGER NOT NULL, `height` INTEGER NOT NULL, `sampling_steps` INTEGER NOT NULL, `cfg_scale` REAL NOT NULL, `restore_faces` INTEGER NOT NULL, `sampler` TEXT NOT NULL, `seed` TEXT NOT NULL, `sub_seed` TEXT NOT NULL DEFAULT '', `sub_seed_strength` REAL NOT NULL DEFAULT 0.0, `denoising_strength` REAL NOT NULL DEFAULT 0.0, `hidden` INTEGER NOT NULL DEFAULT 0, `media_path` TEXT NOT NULL DEFAULT '', `input_media_path` TEXT NOT NULL DEFAULT '', `media_type` TEXT NOT NULL DEFAULT 'IMAGE')", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "imageBase64", + "columnName": "image_base_64", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "originalImageBase64", + "columnName": "original_image_base_64", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "createdAt", + "columnName": "created_at", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "generationType", + "columnName": "generation_type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "prompt", + "columnName": "prompt", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "negativePrompt", + "columnName": "negative_prompt", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "width", + "columnName": "width", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "height", + "columnName": "height", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "samplingSteps", + "columnName": "sampling_steps", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "cfgScale", + "columnName": "cfg_scale", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "restoreFaces", + "columnName": "restore_faces", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "sampler", + "columnName": "sampler", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "seed", + "columnName": "seed", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subSeed", + "columnName": "sub_seed", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "subSeedStrength", + "columnName": "sub_seed_strength", + "affinity": "REAL", + "notNull": true, + "defaultValue": "0.0" + }, + { + "fieldPath": "denoisingStrength", + "columnName": "denoising_strength", + "affinity": "REAL", + "notNull": true, + "defaultValue": "0.0" + }, + { + "fieldPath": "hidden", + "columnName": "hidden", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "mediaPath", + "columnName": "media_path", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "inputMediaPath", + "columnName": "input_media_path", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "mediaType", + "columnName": "media_type", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'IMAGE'" + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "local_models", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `type` TEXT NOT NULL DEFAULT 'onnx', `name` TEXT NOT NULL, `size` TEXT NOT NULL, `sources` TEXT NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'onnx'" + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "size", + "columnName": "size", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "sources", + "columnName": "sources", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "hugging_face_models", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `alias` TEXT NOT NULL, `source` TEXT NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "alias", + "columnName": "alias", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "source", + "columnName": "source", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "supporters", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT NOT NULL, `date` INTEGER NOT NULL, `message` TEXT NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "message", + "columnName": "message", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "fal_ai_endpoints", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `endpoint_id` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `category` TEXT NOT NULL, `group_name` TEXT NOT NULL DEFAULT 'Custom', `thumbnail_url` TEXT NOT NULL, `playground_url` TEXT NOT NULL, `documentation_url` TEXT NOT NULL, `is_custom` INTEGER NOT NULL DEFAULT 1, `schema_json` TEXT NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "endpointId", + "columnName": "endpoint_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "category", + "columnName": "category", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group_name", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'Custom'" + }, + { + "fieldPath": "thumbnailUrl", + "columnName": "thumbnail_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "playgroundUrl", + "columnName": "playground_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "documentationUrl", + "columnName": "documentation_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isCustom", + "columnName": "is_custom", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "1" + }, + { + "fieldPath": "schemaJson", + "columnName": "schema_json", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, 'b82abe60f453e0b87b11162f583f6aa7')" + ] + } +} \ No newline at end of file diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/contract/GenerationResultContract.kt b/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/contract/GenerationResultContract.kt index 9bfed4a8f..62cff363e 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/contract/GenerationResultContract.kt +++ b/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/contract/GenerationResultContract.kt @@ -22,4 +22,7 @@ internal object GenerationResultContract { const val SUB_SEED_STRENGTH = "sub_seed_strength" const val DENOISING_STRENGTH = "denoising_strength" const val HIDDEN = "hidden" + const val MEDIA_PATH = "media_path" + const val INPUT_MEDIA_PATH = "input_media_path" + const val MEDIA_TYPE = "media_type" } diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/dao/GenerationResultDao.kt b/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/dao/GenerationResultDao.kt index 8b39a965d..70038c0ba 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/dao/GenerationResultDao.kt +++ b/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/dao/GenerationResultDao.kt @@ -15,6 +15,12 @@ interface GenerationResultDao { @Query("SELECT * FROM ${GenerationResultContract.TABLE} ORDER BY ${GenerationResultContract.CREATED_AT} DESC") fun query(): Single> + @Query("SELECT ${GenerationResultContract.ID} FROM ${GenerationResultContract.TABLE} ORDER BY ${GenerationResultContract.CREATED_AT} DESC") + fun queryAllIds(): Single> + + @Query("SELECT ${GenerationResultContract.ID} FROM ${GenerationResultContract.TABLE} ORDER BY ${GenerationResultContract.CREATED_AT} DESC LIMIT :limit OFFSET :offset") + fun queryPageIds(limit: Int, offset: Int): Single> + @Query("SELECT * FROM ${GenerationResultContract.TABLE} ORDER BY ${GenerationResultContract.CREATED_AT} DESC LIMIT :limit OFFSET :offset ") fun queryPage(limit: Int, offset: Int): Single> diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/entity/GenerationResultEntity.kt b/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/entity/GenerationResultEntity.kt index 80fca4c1b..583e98444 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/entity/GenerationResultEntity.kt +++ b/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/entity/GenerationResultEntity.kt @@ -45,4 +45,10 @@ data class GenerationResultEntity( val denoisingStrength: Float, @ColumnInfo(name = GenerationResultContract.HIDDEN, defaultValue = "0") val hidden: Boolean, + @ColumnInfo(name = GenerationResultContract.MEDIA_PATH, defaultValue = "") + val mediaPath: String, + @ColumnInfo(name = GenerationResultContract.INPUT_MEDIA_PATH, defaultValue = "") + val inputMediaPath: String, + @ColumnInfo(name = GenerationResultContract.MEDIA_TYPE, defaultValue = "IMAGE") + val mediaType: String, ) From 89cf7cb9d007367c9210293a8eb531adcf4a87fa Mon Sep 17 00:00:00 2001 From: crim50n Date: Mon, 29 Dec 2025 22:30:28 +0300 Subject: [PATCH 03/42] feat(a1111): add Forge modules, ADetailer, Hires.Fix and generation form enhancements --- .../data/mappers/ForgeModulesMappers.kt | 11 + .../mappers/ImageToImagePayloadMappers.kt | 3 + .../data/mappers/TextToImagePayloadMappers.kt | 16 + .../repository/ForgeModulesRepositoryImpl.kt | 21 ++ .../aisdv1/domain/entity/ForgeModule.kt | 8 + .../domain/entity/ImageToImagePayload.kt | 2 + .../domain/entity/TextToImagePayload.kt | 5 + .../repository/ForgeModulesRepository.kt | 8 + .../forgemodule/GetForgeModulesUseCase.kt | 8 + .../forgemodule/GetForgeModulesUseCaseImpl.kt | 12 + .../api/automatic1111/Automatic1111RestApi.kt | 10 + .../aisdv1/network/model/ExtensionRaw.kt | 10 + .../aisdv1/network/model/ForgeModuleRaw.kt | 10 + .../network/request/ImageToImageRequest.kt | 4 + .../network/request/OverrideSettings.kt | 8 + .../network/request/TextToImageRequest.kt | 24 ++ .../core/GenerationFormUpdateEvent.kt | 13 + .../presentation/core/GenerationMviIntent.kt | 26 ++ .../presentation/core/GenerationMviState.kt | 30 ++ .../core/GenerationMviViewModel.kt | 92 ++++- .../screen/img2img/ImageToImageScreen.kt | 34 +- .../screen/img2img/ImageToImageState.kt | 41 +++ .../screen/img2img/ImageToImageViewModel.kt | 3 + .../screen/txt2img/TextToImageState.kt | 46 ++- .../screen/txt2img/TextToImageViewModel.kt | 3 + .../widget/input/ADetailerSection.kt | 97 ++++++ .../widget/input/GenerationInputForm.kt | 313 ++++++++++++++---- .../presentation/widget/input/HiresSection.kt | 113 +++++++ .../widget/input/MultiSelectDropdownField.kt | 107 ++++++ 29 files changed, 1004 insertions(+), 74 deletions(-) create mode 100644 data/src/main/java/com/shifthackz/aisdv1/data/mappers/ForgeModulesMappers.kt create mode 100644 data/src/main/java/com/shifthackz/aisdv1/data/repository/ForgeModulesRepositoryImpl.kt create mode 100644 domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ForgeModule.kt create mode 100644 domain/src/main/java/com/shifthackz/aisdv1/domain/repository/ForgeModulesRepository.kt create mode 100644 domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/forgemodule/GetForgeModulesUseCase.kt create mode 100644 domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/forgemodule/GetForgeModulesUseCaseImpl.kt create mode 100644 network/src/main/java/com/shifthackz/aisdv1/network/model/ExtensionRaw.kt create mode 100644 network/src/main/java/com/shifthackz/aisdv1/network/model/ForgeModuleRaw.kt create mode 100644 network/src/main/java/com/shifthackz/aisdv1/network/request/OverrideSettings.kt create mode 100644 presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/ADetailerSection.kt create mode 100644 presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/HiresSection.kt create mode 100644 presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/MultiSelectDropdownField.kt diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/ForgeModulesMappers.kt b/data/src/main/java/com/shifthackz/aisdv1/data/mappers/ForgeModulesMappers.kt new file mode 100644 index 000000000..eb7ab8738 --- /dev/null +++ b/data/src/main/java/com/shifthackz/aisdv1/data/mappers/ForgeModulesMappers.kt @@ -0,0 +1,11 @@ +package com.shifthackz.aisdv1.data.mappers + +import com.shifthackz.aisdv1.domain.entity.ForgeModule +import com.shifthackz.aisdv1.network.model.ForgeModuleRaw + +fun List.mapRawToDomain(): List = map { it.mapRawToDomain() } + +fun ForgeModuleRaw.mapRawToDomain(): ForgeModule = ForgeModule( + name = modelName ?: "", + path = filename ?: "", +) diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/ImageToImagePayloadMappers.kt b/data/src/main/java/com/shifthackz/aisdv1/data/mappers/ImageToImagePayloadMappers.kt index 2863d6290..a70250692 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/ImageToImagePayloadMappers.kt +++ b/data/src/main/java/com/shifthackz/aisdv1/data/mappers/ImageToImagePayloadMappers.kt @@ -3,6 +3,7 @@ package com.shifthackz.aisdv1.data.mappers import com.shifthackz.aisdv1.core.common.math.roundTo import com.shifthackz.aisdv1.domain.entity.AiGenerationResult import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload +import com.shifthackz.aisdv1.domain.entity.Scheduler import com.shifthackz.aisdv1.domain.entity.StabilityAiClipGuidance import com.shifthackz.aisdv1.domain.entity.StabilityAiStylePreset import com.shifthackz.aisdv1.network.request.HordeGenerationAsyncRequest @@ -35,6 +36,8 @@ fun ImageToImagePayload.mapToRequest(): ImageToImageRequest = with(this) { subSeed = subSeed.trim().ifEmpty { null }, subSeedStrength = subSeedStrength, samplerIndex = sampler, + scheduler = scheduler.takeIf { it != Scheduler.AUTOMATIC }?.alias, + alwaysOnScripts = aDetailer.toAlwaysOnScripts(), ) } diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/TextToImagePayloadMappers.kt b/data/src/main/java/com/shifthackz/aisdv1/data/mappers/TextToImagePayloadMappers.kt index 5c4589bb6..dd26ee1f0 100755 --- a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/TextToImagePayloadMappers.kt +++ b/data/src/main/java/com/shifthackz/aisdv1/data/mappers/TextToImagePayloadMappers.kt @@ -2,6 +2,7 @@ package com.shifthackz.aisdv1.data.mappers import com.shifthackz.aisdv1.domain.entity.AiGenerationResult import com.shifthackz.aisdv1.domain.entity.OpenAiModel +import com.shifthackz.aisdv1.domain.entity.Scheduler import com.shifthackz.aisdv1.domain.entity.StabilityAiClipGuidance import com.shifthackz.aisdv1.domain.entity.StabilityAiSampler import com.shifthackz.aisdv1.domain.entity.StabilityAiStylePreset @@ -9,6 +10,7 @@ import com.shifthackz.aisdv1.domain.entity.TextToImagePayload import com.shifthackz.aisdv1.network.request.HordeGenerationAsyncRequest import com.shifthackz.aisdv1.network.request.HuggingFaceGenerationRequest import com.shifthackz.aisdv1.network.request.OpenAiRequest +import com.shifthackz.aisdv1.network.request.OverrideSettings import com.shifthackz.aisdv1.network.request.StabilityTextToImageRequest import com.shifthackz.aisdv1.network.request.SwarmUiGenerationRequest import com.shifthackz.aisdv1.network.request.TextToImageRequest @@ -22,6 +24,7 @@ fun TextToImagePayload.mapToRequest(): TextToImageRequest = with(this) { negativePrompt = negativePrompt, steps = samplingSteps, cfgScale = cfgScale, + distilledCfgScale = distilledCfgScale, width = width, height = height, restoreFaces = restoreFaces, @@ -29,6 +32,19 @@ fun TextToImagePayload.mapToRequest(): TextToImageRequest = with(this) { subSeed = subSeed.trim().ifEmpty { null }, subSeedStrength = subSeedStrength, samplerIndex = sampler, + scheduler = scheduler.takeIf { it != Scheduler.AUTOMATIC }?.alias, + alwaysOnScripts = aDetailer.toAlwaysOnScripts(), + enableHr = hires.enabled.takeIf { it }, + hrUpscaler = hires.upscaler.takeIf { hires.enabled }, + hrScale = hires.scale.takeIf { hires.enabled }, + hrSecondPassSteps = hires.steps.takeIf { hires.enabled && it > 0 }, + hrCfg = hires.hrCfg?.takeIf { hires.enabled }, + hrDistilledCfg = hires.hrDistilledCfg?.takeIf { hires.enabled }, + hrAdditionalModules = if (hires.enabled) emptyList() else null, + denoisingStrength = hires.denoisingStrength.takeIf { hires.enabled }, + overrideSettings = forgeModules.takeIf { it.isNotEmpty() }?.let { modules -> + OverrideSettings(forgeAdditionalModules = modules.map { it.path }) + }, ) } diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/ForgeModulesRepositoryImpl.kt b/data/src/main/java/com/shifthackz/aisdv1/data/repository/ForgeModulesRepositoryImpl.kt new file mode 100644 index 000000000..28aecd067 --- /dev/null +++ b/data/src/main/java/com/shifthackz/aisdv1/data/repository/ForgeModulesRepositoryImpl.kt @@ -0,0 +1,21 @@ +package com.shifthackz.aisdv1.data.repository + +import com.shifthackz.aisdv1.data.mappers.mapRawToDomain +import com.shifthackz.aisdv1.data.provider.ServerUrlProvider +import com.shifthackz.aisdv1.domain.entity.ForgeModule +import com.shifthackz.aisdv1.domain.repository.ForgeModulesRepository +import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi +import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi.Companion.PATH_SD_MODULES +import com.shifthackz.aisdv1.network.model.ForgeModuleRaw +import io.reactivex.rxjava3.core.Single + +internal class ForgeModulesRepositoryImpl( + private val serverUrlProvider: ServerUrlProvider, + private val api: Automatic1111RestApi, +) : ForgeModulesRepository { + + override fun fetchModules(): Single> = serverUrlProvider(PATH_SD_MODULES) + .flatMap(api::fetchForgeModules) + .map(List::mapRawToDomain) + .onErrorReturn { emptyList() } +} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ForgeModule.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ForgeModule.kt new file mode 100644 index 000000000..fd33ca237 --- /dev/null +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ForgeModule.kt @@ -0,0 +1,8 @@ +package com.shifthackz.aisdv1.domain.entity + +import java.io.Serializable + +data class ForgeModule( + val name: String, + val path: String, +) : Serializable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ImageToImagePayload.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ImageToImagePayload.kt index 6d44b612a..a66f1a44d 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ImageToImagePayload.kt +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ImageToImagePayload.kt @@ -17,6 +17,7 @@ data class ImageToImagePayload( val subSeed: String, val subSeedStrength: Float, val sampler: String, + val scheduler: Scheduler = Scheduler.AUTOMATIC, val nsfw: Boolean, val batchCount: Int, val inPaintingMaskInvert: Int, @@ -26,4 +27,5 @@ data class ImageToImagePayload( val maskBlur: Int, val stabilityAiClipGuidance: StabilityAiClipGuidance?, val stabilityAiStylePreset: StabilityAiStylePreset?, + val aDetailer: ADetailerConfig = ADetailerConfig.DISABLED, ) : Serializable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/TextToImagePayload.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/TextToImagePayload.kt index 7ffd0bab9..e11e3b8b2 100755 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/TextToImagePayload.kt +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/TextToImagePayload.kt @@ -7,6 +7,7 @@ data class TextToImagePayload( val negativePrompt: String, val samplingSteps: Int, val cfgScale: Float, + val distilledCfgScale: Float = 3.5f, val width: Int, val height: Int, val restoreFaces: Boolean, @@ -14,6 +15,7 @@ data class TextToImagePayload( val subSeed: String, val subSeedStrength: Float, val sampler: String, + val scheduler: Scheduler = Scheduler.AUTOMATIC, val nsfw: Boolean, val batchCount: Int, val style: String?, @@ -21,4 +23,7 @@ data class TextToImagePayload( val openAiModel: OpenAiModel?, val stabilityAiClipGuidance: StabilityAiClipGuidance?, val stabilityAiStylePreset: StabilityAiStylePreset?, + val aDetailer: ADetailerConfig = ADetailerConfig.DISABLED, + val hires: HiresConfig = HiresConfig.DISABLED, + val forgeModules: List = emptyList(), ) : Serializable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/ForgeModulesRepository.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/ForgeModulesRepository.kt new file mode 100644 index 000000000..7bb098388 --- /dev/null +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/ForgeModulesRepository.kt @@ -0,0 +1,8 @@ +package com.shifthackz.aisdv1.domain.repository + +import com.shifthackz.aisdv1.domain.entity.ForgeModule +import io.reactivex.rxjava3.core.Single + +interface ForgeModulesRepository { + fun fetchModules(): Single> +} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/forgemodule/GetForgeModulesUseCase.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/forgemodule/GetForgeModulesUseCase.kt new file mode 100644 index 000000000..299e31c9c --- /dev/null +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/forgemodule/GetForgeModulesUseCase.kt @@ -0,0 +1,8 @@ +package com.shifthackz.aisdv1.domain.usecase.forgemodule + +import com.shifthackz.aisdv1.domain.entity.ForgeModule +import io.reactivex.rxjava3.core.Single + +interface GetForgeModulesUseCase { + operator fun invoke(): Single> +} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/forgemodule/GetForgeModulesUseCaseImpl.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/forgemodule/GetForgeModulesUseCaseImpl.kt new file mode 100644 index 000000000..9dddde26d --- /dev/null +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/forgemodule/GetForgeModulesUseCaseImpl.kt @@ -0,0 +1,12 @@ +package com.shifthackz.aisdv1.domain.usecase.forgemodule + +import com.shifthackz.aisdv1.domain.entity.ForgeModule +import com.shifthackz.aisdv1.domain.repository.ForgeModulesRepository +import io.reactivex.rxjava3.core.Single + +internal class GetForgeModulesUseCaseImpl( + private val repository: ForgeModulesRepository, +) : GetForgeModulesUseCase { + + override operator fun invoke(): Single> = repository.fetchModules() +} diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/api/automatic1111/Automatic1111RestApi.kt b/network/src/main/java/com/shifthackz/aisdv1/network/api/automatic1111/Automatic1111RestApi.kt index 8c7a37588..9f121aa61 100755 --- a/network/src/main/java/com/shifthackz/aisdv1/network/api/automatic1111/Automatic1111RestApi.kt +++ b/network/src/main/java/com/shifthackz/aisdv1/network/api/automatic1111/Automatic1111RestApi.kt @@ -1,5 +1,7 @@ package com.shifthackz.aisdv1.network.api.automatic1111 +import com.shifthackz.aisdv1.network.model.ExtensionRaw +import com.shifthackz.aisdv1.network.model.ForgeModuleRaw import com.shifthackz.aisdv1.network.model.ServerConfigurationRaw import com.shifthackz.aisdv1.network.model.StableDiffusionHyperNetworkRaw import com.shifthackz.aisdv1.network.model.StableDiffusionLoraRaw @@ -65,6 +67,12 @@ interface Automatic1111RestApi { @POST fun interrupt(@Url url: String): Completable + @GET + fun fetchExtensions(@Url url: String): Single> + + @GET + fun fetchForgeModules(@Url url: String): Single> + companion object { const val PATH_SD_OPTIONS = "sdapi/v1/options" const val PATH_SD_MODELS = "sdapi/v1/sd-models" @@ -75,5 +83,7 @@ interface Automatic1111RestApi { const val PATH_HYPER_NETWORKS = "sdapi/v1/hypernetworks" const val PATH_EMBEDDINGS = "sdapi/v1/embeddings" const val PATH_INTERRUPT = "sdapi/v1/interrupt" + const val PATH_EXTENSIONS = "sdapi/v1/extensions" + const val PATH_SD_MODULES = "sdapi/v1/sd-modules" } } diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/model/ExtensionRaw.kt b/network/src/main/java/com/shifthackz/aisdv1/network/model/ExtensionRaw.kt new file mode 100644 index 000000000..908660cec --- /dev/null +++ b/network/src/main/java/com/shifthackz/aisdv1/network/model/ExtensionRaw.kt @@ -0,0 +1,10 @@ +package com.shifthackz.aisdv1.network.model + +import com.google.gson.annotations.SerializedName + +data class ExtensionRaw( + @SerializedName("name") + val name: String, + @SerializedName("enabled") + val enabled: Boolean, +) diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/model/ForgeModuleRaw.kt b/network/src/main/java/com/shifthackz/aisdv1/network/model/ForgeModuleRaw.kt new file mode 100644 index 000000000..487c1c891 --- /dev/null +++ b/network/src/main/java/com/shifthackz/aisdv1/network/model/ForgeModuleRaw.kt @@ -0,0 +1,10 @@ +package com.shifthackz.aisdv1.network.model + +import com.google.gson.annotations.SerializedName + +data class ForgeModuleRaw( + @SerializedName("model_name") + val modelName: String?, + @SerializedName("filename") + val filename: String?, +) diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/request/ImageToImageRequest.kt b/network/src/main/java/com/shifthackz/aisdv1/network/request/ImageToImageRequest.kt index f09f94551..b38b4d56c 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/request/ImageToImageRequest.kt +++ b/network/src/main/java/com/shifthackz/aisdv1/network/request/ImageToImageRequest.kt @@ -43,4 +43,8 @@ data class ImageToImageRequest( val subSeedStrength: Float?, @SerializedName("sampler_index") val samplerIndex: String, + @SerializedName("scheduler") + val scheduler: String? = null, + @SerializedName("alwayson_scripts") + val alwaysOnScripts: Map? = null, ) diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/request/OverrideSettings.kt b/network/src/main/java/com/shifthackz/aisdv1/network/request/OverrideSettings.kt new file mode 100644 index 000000000..1f2b15c6d --- /dev/null +++ b/network/src/main/java/com/shifthackz/aisdv1/network/request/OverrideSettings.kt @@ -0,0 +1,8 @@ +package com.shifthackz.aisdv1.network.request + +import com.google.gson.annotations.SerializedName + +data class OverrideSettings( + @SerializedName("forge_additional_modules") + val forgeAdditionalModules: List? = null, +) diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/request/TextToImageRequest.kt b/network/src/main/java/com/shifthackz/aisdv1/network/request/TextToImageRequest.kt index 7705b7c3e..97958679d 100755 --- a/network/src/main/java/com/shifthackz/aisdv1/network/request/TextToImageRequest.kt +++ b/network/src/main/java/com/shifthackz/aisdv1/network/request/TextToImageRequest.kt @@ -11,6 +11,8 @@ data class TextToImageRequest( val steps: Int, @SerializedName("cfg_scale") val cfgScale: Float, + @SerializedName("distilled_cfg_scale") + val distilledCfgScale: Float? = null, @SerializedName("width") val width: Int, @SerializedName("height") @@ -25,4 +27,26 @@ data class TextToImageRequest( val subSeedStrength: Float?, @SerializedName("sampler_index") val samplerIndex: String, + @SerializedName("scheduler") + val scheduler: String? = null, + @SerializedName("alwayson_scripts") + val alwaysOnScripts: Map? = null, + @SerializedName("enable_hr") + val enableHr: Boolean? = null, + @SerializedName("hr_upscaler") + val hrUpscaler: String? = null, + @SerializedName("hr_scale") + val hrScale: Float? = null, + @SerializedName("hr_second_pass_steps") + val hrSecondPassSteps: Int? = null, + @SerializedName("hr_cfg") + val hrCfg: Float? = null, + @SerializedName("hr_distilled_cfg") + val hrDistilledCfg: Float? = null, + @SerializedName("hr_additional_modules") + val hrAdditionalModules: List? = null, + @SerializedName("denoising_strength") + val denoisingStrength: Float? = null, + @SerializedName("override_settings") + val overrideSettings: OverrideSettings? = null, ) diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationFormUpdateEvent.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationFormUpdateEvent.kt index fa9ec3875..6ae21c0c8 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationFormUpdateEvent.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationFormUpdateEvent.kt @@ -8,8 +8,10 @@ import io.reactivex.rxjava3.subjects.PublishSubject class GenerationFormUpdateEvent { private val sRoute: PublishSubject = PublishSubject.create() + private val sFalAiRoute: PublishSubject = PublishSubject.create() private val sTxt2Img: BehaviorSubject = BehaviorSubject.createDefault(Payload.None) private val sImg2Img: BehaviorSubject = BehaviorSubject.createDefault(Payload.None) + private val sFalAi: BehaviorSubject = BehaviorSubject.createDefault(Payload.None) fun update( generation: AiGenerationResult, @@ -26,6 +28,7 @@ class GenerationFormUpdateEvent { fun clear() { sTxt2Img.onNext(Payload.None) sImg2Img.onNext(Payload.None) + sFalAi.onNext(Payload.None) } fun observeRoute() = sRoute.toFlowable(BackpressureStrategy.LATEST) @@ -34,9 +37,19 @@ class GenerationFormUpdateEvent { fun observeImg2ImgForm() = sImg2Img.toFlowable(BackpressureStrategy.LATEST) + fun updateFalAi(generation: AiGenerationResult) { + sFalAiRoute.onNext(Unit) + sFalAi.onNext(Payload.FalAiForm(generation)) + } + + fun observeFalAiRoute() = sFalAiRoute.toFlowable(BackpressureStrategy.LATEST) + + fun observeFalAiForm() = sFalAi.toFlowable(BackpressureStrategy.LATEST) + sealed interface Payload { data object None : Payload data class T2IForm(val ai: AiGenerationResult): Payload data class I2IForm(val ai: AiGenerationResult, val inputImage: Boolean): Payload + data class FalAiForm(val ai: AiGenerationResult): Payload } } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationMviIntent.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationMviIntent.kt index 8adef7d41..936731983 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationMviIntent.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationMviIntent.kt @@ -1,7 +1,11 @@ package com.shifthackz.aisdv1.presentation.core import android.graphics.Bitmap +import com.shifthackz.aisdv1.domain.entity.ADetailerConfig import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import com.shifthackz.aisdv1.domain.entity.ForgeModule +import com.shifthackz.aisdv1.domain.entity.HiresConfig +import com.shifthackz.aisdv1.domain.entity.ModelType import com.shifthackz.aisdv1.domain.entity.OpenAiModel import com.shifthackz.aisdv1.domain.entity.OpenAiQuality import com.shifthackz.aisdv1.domain.entity.OpenAiSize @@ -32,12 +36,20 @@ sealed interface GenerationMviIntent : MviIntent { data class Width(val value: String) : Size data class Height(val value: String) : Size + + data object Swap : Size + + data class AspectRatio(val ratio: com.shifthackz.aisdv1.presentation.model.AspectRatio) : Size } data class SamplingSteps(val value: Int) : Update data class CfgScale(val value: Float) : Update + data class DistilledCfgScale(val value: Float) : Update + + data class ModelTypeChange(val value: ModelType) : Update + data class RestoreFaces(val value: Boolean) : Update data class Seed(val value: String) : Update @@ -52,6 +64,14 @@ sealed interface GenerationMviIntent : MviIntent { data class Batch(val value: Int) : Update + data class Scheduler(val value: com.shifthackz.aisdv1.domain.entity.Scheduler) : Update + + data class ADetailer(val value: ADetailerConfig) : Update + + data class Hires(val value: HiresConfig) : Update + + data class ForgeModules(val value: List) : Update + sealed interface OpenAi : Update { data class Model(val value: OpenAiModel) : OpenAi @@ -68,6 +88,12 @@ sealed interface GenerationMviIntent : MviIntent { data class ClipGuidance(val value: StabilityAiClipGuidance) : StabilityAi } + + sealed interface FalAi : Update { + data class SelectEndpoint(val endpointId: String) : FalAi + data class UpdateProperty(val name: String, val value: Any?) : FalAi + data class ToggleAdvanced(val visible: Boolean) : FalAi + } } sealed interface Result : GenerationMviIntent { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationMviState.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationMviState.kt index 7e8f71304..96f250339 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationMviState.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationMviState.kt @@ -1,13 +1,19 @@ package com.shifthackz.aisdv1.presentation.core import com.shifthackz.aisdv1.core.model.UiText +import com.shifthackz.aisdv1.domain.entity.ADetailerConfig +import com.shifthackz.aisdv1.domain.entity.ForgeModule +import com.shifthackz.aisdv1.domain.entity.HiresConfig +import com.shifthackz.aisdv1.domain.entity.ModelType import com.shifthackz.aisdv1.domain.entity.OpenAiModel import com.shifthackz.aisdv1.domain.entity.OpenAiQuality import com.shifthackz.aisdv1.domain.entity.OpenAiSize import com.shifthackz.aisdv1.domain.entity.OpenAiStyle +import com.shifthackz.aisdv1.domain.entity.Scheduler import com.shifthackz.aisdv1.domain.entity.ServerSource import com.shifthackz.aisdv1.domain.entity.StabilityAiClipGuidance import com.shifthackz.aisdv1.domain.entity.StabilityAiStylePreset +import com.shifthackz.aisdv1.presentation.model.FalAiEndpointUi import com.shifthackz.aisdv1.presentation.model.Modal import com.shifthackz.android.core.mvi.MviState @@ -15,6 +21,7 @@ abstract class GenerationMviState : MviState { abstract val onBoardingDemo: Boolean abstract val screenModal: Modal abstract val mode: ServerSource + abstract val modelType: ModelType abstract val advancedToggleButtonVisible: Boolean abstract val advancedOptionsVisible: Boolean abstract val formPromptTaggedInput: Boolean @@ -24,12 +31,18 @@ abstract class GenerationMviState : MviState { abstract val height: String abstract val samplingSteps: Int abstract val cfgScale: Float + abstract val distilledCfgScale: Float abstract val restoreFaces: Boolean abstract val seed: String abstract val subSeed: String abstract val subSeedStrength: Float abstract val selectedSampler: String abstract val availableSamplers: List + abstract val selectedScheduler: Scheduler + abstract val availableForgeModules: List + abstract val selectedForgeModules: List + abstract val aDetailerConfig: ADetailerConfig + abstract val hiresConfig: HiresConfig abstract val selectedStylePreset: StabilityAiStylePreset abstract val selectedClipGuidancePreset: StabilityAiClipGuidance abstract val openAiModel: OpenAiModel @@ -42,6 +55,12 @@ abstract class GenerationMviState : MviState { abstract val batchCount: Int abstract val generateButtonEnabled: Boolean + // FalAi specific fields + abstract val falAiEndpoints: List + abstract val falAiSelectedEndpoint: FalAiEndpointUi? + abstract val falAiPropertyValues: Map + abstract val falAiAdvancedVisible: Boolean + open val promptKeywords: List get() = prompt.split(",") .map { it.trim() } @@ -59,6 +78,7 @@ abstract class GenerationMviState : MviState { onBoardingDemo: Boolean = this.onBoardingDemo, screenModal: Modal = this.screenModal, mode: ServerSource = this.mode, + modelType: ModelType = this.modelType, advancedToggleButtonVisible: Boolean = this.advancedToggleButtonVisible, advancedOptionsVisible: Boolean = this.advancedOptionsVisible, formPromptTaggedInput: Boolean = this.formPromptTaggedInput, @@ -68,12 +88,18 @@ abstract class GenerationMviState : MviState { height: String = this.height, samplingSteps: Int = this.samplingSteps, cfgScale: Float = this.cfgScale, + distilledCfgScale: Float = this.distilledCfgScale, restoreFaces: Boolean = this.restoreFaces, seed: String = this.seed, subSeed: String = this.subSeed, subSeedStrength: Float = this.subSeedStrength, selectedSampler: String = this.selectedSampler, availableSamplers: List = this.availableSamplers, + selectedScheduler: Scheduler = this.selectedScheduler, + availableForgeModules: List = this.availableForgeModules, + selectedForgeModules: List = this.selectedForgeModules, + aDetailerConfig: ADetailerConfig = this.aDetailerConfig, + hiresConfig: HiresConfig = this.hiresConfig, selectedStylePreset: StabilityAiStylePreset = this.selectedStylePreset, selectedClipGuidancePreset: StabilityAiClipGuidance = this.selectedClipGuidancePreset, openAiModel: OpenAiModel = this.openAiModel, @@ -85,5 +111,9 @@ abstract class GenerationMviState : MviState { nsfw: Boolean = this.nsfw, batchCount: Int = this.batchCount, generateButtonEnabled: Boolean = this.generateButtonEnabled, + falAiEndpoints: List = this.falAiEndpoints, + falAiSelectedEndpoint: FalAiEndpointUi? = this.falAiSelectedEndpoint, + falAiPropertyValues: Map = this.falAiPropertyValues, + falAiAdvancedVisible: Boolean = this.falAiAdvancedVisible, ): GenerationMviState = this } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationMviViewModel.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationMviViewModel.kt index 187aa780e..cd55dc9d5 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationMviViewModel.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationMviViewModel.kt @@ -10,6 +10,12 @@ import com.shifthackz.aisdv1.core.validation.dimension.DimensionValidator import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel import com.shifthackz.aisdv1.domain.entity.HordeProcessStatus import com.shifthackz.aisdv1.domain.entity.LocalDiffusionStatus +import com.shifthackz.aisdv1.domain.entity.ModelType +import com.shifthackz.aisdv1.domain.entity.ModelType.Companion.defaultCfgScale +import com.shifthackz.aisdv1.domain.entity.ModelType.Companion.defaultHeight +import com.shifthackz.aisdv1.domain.entity.ModelType.Companion.defaultSampler +import com.shifthackz.aisdv1.domain.entity.ModelType.Companion.defaultScheduler +import com.shifthackz.aisdv1.domain.entity.ModelType.Companion.defaultWidth import com.shifthackz.aisdv1.domain.entity.OpenAiSize import com.shifthackz.aisdv1.domain.entity.ServerSource import com.shifthackz.aisdv1.domain.entity.StabilityAiSampler @@ -17,6 +23,7 @@ import com.shifthackz.aisdv1.domain.entity.StableDiffusionSampler import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver import com.shifthackz.aisdv1.domain.preference.PreferenceManager import com.shifthackz.aisdv1.domain.usecase.caching.SaveLastResultToCacheUseCase +import com.shifthackz.aisdv1.domain.usecase.forgemodule.GetForgeModulesUseCase import com.shifthackz.aisdv1.domain.usecase.generation.InterruptGenerationUseCase import com.shifthackz.aisdv1.domain.usecase.generation.ObserveHordeProcessStatusUseCase import com.shifthackz.aisdv1.domain.usecase.generation.ObserveLocalDiffusionProcessStatusUseCase @@ -37,6 +44,7 @@ import java.util.concurrent.TimeUnit abstract class GenerationMviViewModel( private val preferenceManager: PreferenceManager, getStableDiffusionSamplersUseCase: GetStableDiffusionSamplersUseCase, + getForgeModulesUseCase: GetForgeModulesUseCase, observeHordeProcessStatusUseCase: ObserveHordeProcessStatusUseCase, observeLocalDiffusionProcessStatusUseCase: ObserveLocalDiffusionProcessStatusUseCase, private val saveLastResultToCacheUseCase: SaveLastResultToCacheUseCase, @@ -61,12 +69,25 @@ abstract class GenerationMviViewModel updateGenerationState { + val modelTypeChanged = it.modelType != settings.modelType it .copyState( mode = settings.source, + modelType = settings.modelType, advancedToggleButtonVisible = !settings.formAdvancedOptionsAlwaysShow, formPromptTaggedInput = settings.formPromptTaggedInput, ) + .let { state -> + if (modelTypeChanged) { + state.copyState( + cfgScale = settings.modelType.defaultCfgScale(), + selectedSampler = settings.modelType.defaultSampler(), + selectedScheduler = settings.modelType.defaultScheduler(), + width = settings.modelType.defaultWidth().toString(), + height = settings.modelType.defaultHeight().toString(), + ) + } else state + } .let { state -> if (!settings.formAdvancedOptionsAlwaysShow) state else state.copyState(advancedOptionsVisible = true) @@ -76,7 +97,6 @@ abstract class GenerationMviViewModel samplers.map(StableDiffusionSampler::name) } .subscribeOnMainThread(schedulersProvider) .subscribeBy( @@ -110,6 +130,17 @@ abstract class GenerationMviViewModel + updateGenerationState { state -> + state.copyState(availableForgeModules = modules) + } + } + ) } abstract fun generateDisposable(): Disposable @@ -163,6 +194,31 @@ abstract class GenerationMviViewModel updateGenerationState { + val newWidth = it.height + val newHeight = it.width + it.copyState( + width = newWidth, + height = newHeight, + widthValidationError = dimensionValidator(newWidth).mapToUi(), + heightValidationError = dimensionValidator(newHeight).mapToUi(), + ) + } + + is GenerationMviIntent.Update.Size.AspectRatio -> updateGenerationState { + val baseSize = maxOf( + it.width.toIntOrNull() ?: 512, + it.height.toIntOrNull() ?: 512 + ) + val (newWidth, newHeight) = intent.ratio.calculateDimensions(baseSize) + it.copyState( + width = newWidth.toString(), + height = newHeight.toString(), + widthValidationError = dimensionValidator(newWidth.toString()).mapToUi(), + heightValidationError = dimensionValidator(newHeight.toString()).mapToUi(), + ) + } + is GenerationMviIntent.Update.SamplingSteps -> updateGenerationState { it.copyState(samplingSteps = intent.value) } @@ -199,6 +255,40 @@ abstract class GenerationMviViewModel updateGenerationState { + it.copyState(selectedScheduler = intent.value) + } + + is GenerationMviIntent.Update.ADetailer -> updateGenerationState { + it.copyState(aDetailerConfig = intent.value) + } + + is GenerationMviIntent.Update.Hires -> updateGenerationState { + it.copyState(hiresConfig = intent.value) + } + + is GenerationMviIntent.Update.ForgeModules -> updateGenerationState { + it.copyState(selectedForgeModules = intent.value) + } + + is GenerationMviIntent.Update.DistilledCfgScale -> updateGenerationState { + it.copyState(distilledCfgScale = intent.value) + } + + is GenerationMviIntent.Update.ModelTypeChange -> { + preferenceManager.modelType = intent.value + updateGenerationState { + it.copyState( + modelType = intent.value, + cfgScale = intent.value.defaultCfgScale(), + selectedSampler = intent.value.defaultSampler(), + selectedScheduler = intent.value.defaultScheduler(), + width = intent.value.defaultWidth().toString(), + height = intent.value.defaultHeight().toString(), + ) + } + } + is GenerationMviIntent.Update.OpenAi.Model -> updateGenerationState { state -> val size = if (state.openAiSize.supportedModels.contains(intent.value)) { state.openAiSize diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageScreen.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageScreen.kt index a069c396b..717489ecb 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageScreen.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageScreen.kt @@ -5,7 +5,9 @@ package com.shifthackz.aisdv1.presentation.screen.img2img import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.PickVisualMediaRequest import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.Image import androidx.compose.foundation.background +import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -17,6 +19,7 @@ import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width @@ -50,6 +53,8 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.res.stringResource @@ -70,7 +75,6 @@ import com.shifthackz.aisdv1.presentation.core.ImageToImageIntent import com.shifthackz.aisdv1.presentation.modal.ModalRenderer import com.shifthackz.aisdv1.presentation.model.Modal import com.shifthackz.aisdv1.presentation.screen.drawer.DrawerIntent -import com.shifthackz.aisdv1.presentation.screen.inpaint.components.InPaintComponent import com.shifthackz.aisdv1.presentation.theme.sliderColors import com.shifthackz.aisdv1.presentation.utils.Constants.DENOISING_STRENGTH_MAX import com.shifthackz.aisdv1.presentation.utils.Constants.DENOISING_STRENGTH_MIN @@ -409,11 +413,29 @@ private fun InputImageState( is ImageToImageState.ImageState.Image -> Column( modifier = modifier, ) { - InPaintComponent( - drawMode = false, - bitmap = state.imageState.bitmap, - inPaint = state.inPaintModel, - ) + Box( + modifier = Modifier + .fillMaxWidth() + .heightIn(max = 300.dp) + .padding(horizontal = 16.dp) + .border( + width = 1.dp, + color = MaterialTheme.colorScheme.outline, + shape = RoundedCornerShape(8.dp) + ) + .clip(RoundedCornerShape(8.dp)) + .background(MaterialTheme.colorScheme.surfaceVariant), + contentAlignment = Alignment.Center, + ) { + state.imageState.bitmap?.asImageBitmap()?.let { imageBitmap -> + Image( + modifier = Modifier.fillMaxSize(), + bitmap = imageBitmap, + contentDescription = null, + contentScale = ContentScale.Fit, + ) + } + } Row( modifier = Modifier .padding(top = 8.dp) diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageState.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageState.kt index 3e301a66a..210ff52dd 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageState.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageState.kt @@ -3,15 +3,21 @@ package com.shifthackz.aisdv1.presentation.screen.img2img import android.graphics.Bitmap import androidx.compose.runtime.Immutable import com.shifthackz.aisdv1.core.model.UiText +import com.shifthackz.aisdv1.domain.entity.ADetailerConfig +import com.shifthackz.aisdv1.domain.entity.ForgeModule +import com.shifthackz.aisdv1.domain.entity.HiresConfig import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload +import com.shifthackz.aisdv1.domain.entity.ModelType import com.shifthackz.aisdv1.domain.entity.OpenAiModel import com.shifthackz.aisdv1.domain.entity.OpenAiQuality import com.shifthackz.aisdv1.domain.entity.OpenAiSize import com.shifthackz.aisdv1.domain.entity.OpenAiStyle +import com.shifthackz.aisdv1.domain.entity.Scheduler import com.shifthackz.aisdv1.domain.entity.ServerSource import com.shifthackz.aisdv1.domain.entity.StabilityAiClipGuidance import com.shifthackz.aisdv1.domain.entity.StabilityAiStylePreset import com.shifthackz.aisdv1.presentation.core.GenerationMviState +import com.shifthackz.aisdv1.presentation.model.FalAiEndpointUi import com.shifthackz.aisdv1.presentation.model.InPaintModel import com.shifthackz.aisdv1.presentation.model.Modal @@ -24,6 +30,7 @@ data class ImageToImageState( override val onBoardingDemo: Boolean = false, override val screenModal: Modal = Modal.None, override val mode: ServerSource = ServerSource.AUTOMATIC1111, + override val modelType: ModelType = ModelType.SD_1_5, override val advancedToggleButtonVisible: Boolean = true, override val advancedOptionsVisible: Boolean = false, override val formPromptTaggedInput: Boolean = false, @@ -33,12 +40,18 @@ data class ImageToImageState( override val height: String = 512.toString(), override val samplingSteps: Int = 20, override val cfgScale: Float = 7f, + override val distilledCfgScale: Float = 3.5f, override val restoreFaces: Boolean = false, override val seed: String = "", override val subSeed: String = "", override val subSeedStrength: Float = 0f, override val selectedSampler: String = "", override val availableSamplers: List = emptyList(), + override val selectedScheduler: Scheduler = Scheduler.AUTOMATIC, + override val availableForgeModules: List = emptyList(), + override val selectedForgeModules: List = emptyList(), + override val aDetailerConfig: ADetailerConfig = ADetailerConfig.DISABLED, + override val hiresConfig: HiresConfig = HiresConfig.DISABLED, override val selectedStylePreset: StabilityAiStylePreset = StabilityAiStylePreset.NONE, override val selectedClipGuidancePreset: StabilityAiClipGuidance = StabilityAiClipGuidance.NONE, override val openAiModel: OpenAiModel = OpenAiModel.DALL_E_2, @@ -50,6 +63,10 @@ data class ImageToImageState( override val nsfw: Boolean = false, override val batchCount: Int = 1, override val generateButtonEnabled: Boolean = true, + override val falAiEndpoints: List = emptyList(), + override val falAiSelectedEndpoint: FalAiEndpointUi? = null, + override val falAiPropertyValues: Map = emptyMap(), + override val falAiAdvancedVisible: Boolean = false, ) : GenerationMviState() { sealed interface ImageState { @@ -65,6 +82,7 @@ data class ImageToImageState( onBoardingDemo: Boolean, screenModal: Modal, mode: ServerSource, + modelType: ModelType, advancedToggleButtonVisible: Boolean, advancedOptionsVisible: Boolean, formPromptTaggedInput: Boolean, @@ -74,12 +92,18 @@ data class ImageToImageState( height: String, samplingSteps: Int, cfgScale: Float, + distilledCfgScale: Float, restoreFaces: Boolean, seed: String, subSeed: String, subSeedStrength: Float, selectedSampler: String, availableSamplers: List, + selectedScheduler: Scheduler, + availableForgeModules: List, + selectedForgeModules: List, + aDetailerConfig: ADetailerConfig, + hiresConfig: HiresConfig, selectedStylePreset: StabilityAiStylePreset, selectedClipGuidancePreset: StabilityAiClipGuidance, openAiModel: OpenAiModel, @@ -91,10 +115,15 @@ data class ImageToImageState( nsfw: Boolean, batchCount: Int, generateButtonEnabled: Boolean, + falAiEndpoints: List, + falAiSelectedEndpoint: FalAiEndpointUi?, + falAiPropertyValues: Map, + falAiAdvancedVisible: Boolean, ): GenerationMviState = copy( onBoardingDemo = onBoardingDemo, screenModal = screenModal, mode = mode, + modelType = modelType, advancedToggleButtonVisible = advancedToggleButtonVisible, advancedOptionsVisible = advancedOptionsVisible, formPromptTaggedInput = formPromptTaggedInput, @@ -104,12 +133,18 @@ data class ImageToImageState( height = height, samplingSteps = samplingSteps, cfgScale = cfgScale, + distilledCfgScale = distilledCfgScale, restoreFaces = restoreFaces, seed = seed, subSeed = subSeed, subSeedStrength = subSeedStrength, selectedSampler = selectedSampler, availableSamplers = availableSamplers, + selectedScheduler = selectedScheduler, + availableForgeModules = availableForgeModules, + selectedForgeModules = selectedForgeModules, + aDetailerConfig = aDetailerConfig, + hiresConfig = hiresConfig, selectedStylePreset = selectedStylePreset, selectedClipGuidancePreset = selectedClipGuidancePreset, openAiModel = openAiModel, @@ -121,6 +156,10 @@ data class ImageToImageState( nsfw = nsfw, batchCount = batchCount, generateButtonEnabled = generateButtonEnabled, + falAiEndpoints = falAiEndpoints, + falAiSelectedEndpoint = falAiSelectedEndpoint, + falAiPropertyValues = falAiPropertyValues, + falAiAdvancedVisible = falAiAdvancedVisible, ) fun preProcessed(pair: Pair): ImageToImageState = copy( @@ -149,6 +188,7 @@ fun ImageToImageState.mapToPayload(): ImageToImagePayload = with(this) { subSeed = subSeed.trim(), subSeedStrength = subSeedStrength, sampler = selectedSampler, + scheduler = selectedScheduler, nsfw = if (mode == ServerSource.HORDE) nsfw else false, batchCount = batchCount, inPaintingMaskInvert = inPaintModel.maskMode.inverse, @@ -158,5 +198,6 @@ fun ImageToImageState.mapToPayload(): ImageToImagePayload = with(this) { maskBlur = inPaintModel.maskBlur, stabilityAiClipGuidance = selectedClipGuidancePreset.takeIf { mode == ServerSource.STABILITY_AI }, stabilityAiStylePreset = selectedStylePreset.takeIf { mode == ServerSource.STABILITY_AI }, + aDetailer = aDetailerConfig.takeIf { mode == ServerSource.AUTOMATIC1111 } ?: ADetailerConfig.DISABLED, ) } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageViewModel.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageViewModel.kt index 3990116b1..5706e22cb 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageViewModel.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageViewModel.kt @@ -19,6 +19,7 @@ import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver import com.shifthackz.aisdv1.domain.interactor.wakelock.WakeLockInterActor import com.shifthackz.aisdv1.domain.preference.PreferenceManager import com.shifthackz.aisdv1.domain.usecase.caching.SaveLastResultToCacheUseCase +import com.shifthackz.aisdv1.domain.usecase.forgemodule.GetForgeModulesUseCase import com.shifthackz.aisdv1.domain.usecase.generation.GetRandomImageUseCase import com.shifthackz.aisdv1.domain.usecase.generation.ImageToImageUseCase import com.shifthackz.aisdv1.domain.usecase.generation.InterruptGenerationUseCase @@ -43,6 +44,7 @@ class ImageToImageViewModel( dispatchersProvider: DispatchersProvider, generationFormUpdateEvent: GenerationFormUpdateEvent, getStableDiffusionSamplersUseCase: GetStableDiffusionSamplersUseCase, + getForgeModulesUseCase: GetForgeModulesUseCase, observeHordeProcessStatusUseCase: ObserveHordeProcessStatusUseCase, observeLocalDiffusionProcessStatusUseCase: ObserveLocalDiffusionProcessStatusUseCase, saveLastResultToCacheUseCase: SaveLastResultToCacheUseCase, @@ -66,6 +68,7 @@ class ImageToImageViewModel( ) : GenerationMviViewModel( preferenceManager = preferenceManager, getStableDiffusionSamplersUseCase = getStableDiffusionSamplersUseCase, + getForgeModulesUseCase = getForgeModulesUseCase, observeHordeProcessStatusUseCase = observeHordeProcessStatusUseCase, observeLocalDiffusionProcessStatusUseCase = observeLocalDiffusionProcessStatusUseCase, saveLastResultToCacheUseCase = saveLastResultToCacheUseCase, diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/txt2img/TextToImageState.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/txt2img/TextToImageState.kt index 04466de67..43f6dde11 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/txt2img/TextToImageState.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/txt2img/TextToImageState.kt @@ -5,15 +5,21 @@ import com.shifthackz.aisdv1.core.model.UiText import com.shifthackz.aisdv1.core.model.asUiText import com.shifthackz.aisdv1.core.validation.ValidationResult import com.shifthackz.aisdv1.core.validation.dimension.DimensionValidator +import com.shifthackz.aisdv1.domain.entity.ADetailerConfig +import com.shifthackz.aisdv1.domain.entity.ForgeModule +import com.shifthackz.aisdv1.domain.entity.HiresConfig +import com.shifthackz.aisdv1.domain.entity.ModelType import com.shifthackz.aisdv1.domain.entity.OpenAiModel import com.shifthackz.aisdv1.domain.entity.OpenAiQuality import com.shifthackz.aisdv1.domain.entity.OpenAiSize import com.shifthackz.aisdv1.domain.entity.OpenAiStyle +import com.shifthackz.aisdv1.domain.entity.Scheduler import com.shifthackz.aisdv1.domain.entity.ServerSource import com.shifthackz.aisdv1.domain.entity.StabilityAiClipGuidance import com.shifthackz.aisdv1.domain.entity.StabilityAiStylePreset import com.shifthackz.aisdv1.domain.entity.TextToImagePayload import com.shifthackz.aisdv1.presentation.core.GenerationMviState +import com.shifthackz.aisdv1.presentation.model.FalAiEndpointUi import com.shifthackz.aisdv1.presentation.model.Modal import com.shifthackz.aisdv1.core.localization.R as LocalizationR @@ -22,6 +28,7 @@ data class TextToImageState( override val onBoardingDemo: Boolean = false, override val screenModal: Modal = Modal.None, override val mode: ServerSource = ServerSource.AUTOMATIC1111, + override val modelType: ModelType = ModelType.SD_1_5, override val advancedToggleButtonVisible: Boolean = true, override val advancedOptionsVisible: Boolean = false, override val formPromptTaggedInput: Boolean = false, @@ -31,11 +38,17 @@ data class TextToImageState( override val height: String = 512.toString(), override val samplingSteps: Int = 20, override val cfgScale: Float = 7f, + override val distilledCfgScale: Float = 3.5f, override val restoreFaces: Boolean = false, override val seed: String = "", override val subSeed: String = "", override val subSeedStrength: Float = 0f, override val selectedSampler: String = "", + override val selectedScheduler: Scheduler = Scheduler.AUTOMATIC, + override val availableForgeModules: List = emptyList(), + override val selectedForgeModules: List = emptyList(), + override val aDetailerConfig: ADetailerConfig = ADetailerConfig.DISABLED, + override val hiresConfig: HiresConfig = HiresConfig.DISABLED, override val selectedStylePreset: StabilityAiStylePreset = StabilityAiStylePreset.NONE, override val selectedClipGuidancePreset: StabilityAiClipGuidance = StabilityAiClipGuidance.NONE, override val openAiModel: OpenAiModel = OpenAiModel.DALL_E_2, @@ -48,12 +61,17 @@ data class TextToImageState( override val nsfw: Boolean = false, override val batchCount: Int = 1, override val generateButtonEnabled: Boolean = true, + override val falAiEndpoints: List = emptyList(), + override val falAiSelectedEndpoint: FalAiEndpointUi? = null, + override val falAiPropertyValues: Map = emptyMap(), + override val falAiAdvancedVisible: Boolean = false, ) : GenerationMviState() { override fun copyState( onBoardingDemo: Boolean, screenModal: Modal, mode: ServerSource, + modelType: ModelType, advancedToggleButtonVisible: Boolean, advancedOptionsVisible: Boolean, formPromptTaggedInput: Boolean, @@ -63,12 +81,18 @@ data class TextToImageState( height: String, samplingSteps: Int, cfgScale: Float, + distilledCfgScale: Float, restoreFaces: Boolean, seed: String, subSeed: String, subSeedStrength: Float, selectedSampler: String, availableSamplers: List, + selectedScheduler: Scheduler, + availableForgeModules: List, + selectedForgeModules: List, + aDetailerConfig: ADetailerConfig, + hiresConfig: HiresConfig, selectedStylePreset: StabilityAiStylePreset, selectedClipGuidancePreset: StabilityAiClipGuidance, openAiModel: OpenAiModel, @@ -79,11 +103,16 @@ data class TextToImageState( heightValidationError: UiText?, nsfw: Boolean, batchCount: Int, - generateButtonEnabled: Boolean + generateButtonEnabled: Boolean, + falAiEndpoints: List, + falAiSelectedEndpoint: FalAiEndpointUi?, + falAiPropertyValues: Map, + falAiAdvancedVisible: Boolean, ): GenerationMviState = copy( onBoardingDemo = onBoardingDemo, screenModal = screenModal, mode = mode, + modelType = modelType, advancedToggleButtonVisible = advancedToggleButtonVisible, advancedOptionsVisible = advancedOptionsVisible, formPromptTaggedInput = formPromptTaggedInput, @@ -93,12 +122,18 @@ data class TextToImageState( height = height, samplingSteps = samplingSteps, cfgScale = cfgScale, + distilledCfgScale = distilledCfgScale, restoreFaces = restoreFaces, seed = seed, subSeed = subSeed, subSeedStrength = subSeedStrength, selectedSampler = selectedSampler, availableSamplers = availableSamplers, + selectedScheduler = selectedScheduler, + availableForgeModules = availableForgeModules, + selectedForgeModules = selectedForgeModules, + aDetailerConfig = aDetailerConfig, + hiresConfig = hiresConfig, selectedStylePreset = selectedStylePreset, selectedClipGuidancePreset = selectedClipGuidancePreset, openAiModel = openAiModel, @@ -110,6 +145,10 @@ data class TextToImageState( nsfw = nsfw, batchCount = batchCount, generateButtonEnabled = generateButtonEnabled, + falAiEndpoints = falAiEndpoints, + falAiSelectedEndpoint = falAiSelectedEndpoint, + falAiPropertyValues = falAiPropertyValues, + falAiAdvancedVisible = falAiAdvancedVisible, ) } @@ -119,6 +158,7 @@ fun TextToImageState.mapToPayload(): TextToImagePayload = with(this) { negativePrompt = negativePrompt.trim(), samplingSteps = samplingSteps, cfgScale = cfgScale, + distilledCfgScale = distilledCfgScale, width = when (mode) { ServerSource.OPEN_AI -> openAiSize.width else -> width.toIntOrNull() ?: 64 @@ -132,6 +172,7 @@ fun TextToImageState.mapToPayload(): TextToImagePayload = with(this) { subSeed = subSeed.trim(), subSeedStrength = subSeedStrength, sampler = selectedSampler, + scheduler = selectedScheduler, nsfw = if (mode == ServerSource.HORDE) nsfw else false, batchCount = if (mode == ServerSource.LOCAL_MICROSOFT_ONNX) 1 else batchCount, style = openAiStyle.key.takeIf { @@ -143,6 +184,9 @@ fun TextToImageState.mapToPayload(): TextToImagePayload = with(this) { openAiModel = openAiModel.takeIf { mode == ServerSource.OPEN_AI }, stabilityAiClipGuidance = selectedClipGuidancePreset.takeIf { mode == ServerSource.STABILITY_AI }, stabilityAiStylePreset = selectedStylePreset.takeIf { mode == ServerSource.STABILITY_AI }, + aDetailer = aDetailerConfig.takeIf { mode == ServerSource.AUTOMATIC1111 } ?: ADetailerConfig.DISABLED, + hires = hiresConfig.takeIf { mode == ServerSource.AUTOMATIC1111 } ?: HiresConfig.DISABLED, + forgeModules = selectedForgeModules.takeIf { mode == ServerSource.AUTOMATIC1111 } ?: emptyList(), ) } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/txt2img/TextToImageViewModel.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/txt2img/TextToImageViewModel.kt index 06b3520fc..33fca1ddf 100755 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/txt2img/TextToImageViewModel.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/txt2img/TextToImageViewModel.kt @@ -18,6 +18,7 @@ import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver import com.shifthackz.aisdv1.domain.interactor.wakelock.WakeLockInterActor import com.shifthackz.aisdv1.domain.preference.PreferenceManager import com.shifthackz.aisdv1.domain.usecase.caching.SaveLastResultToCacheUseCase +import com.shifthackz.aisdv1.domain.usecase.forgemodule.GetForgeModulesUseCase import com.shifthackz.aisdv1.domain.usecase.generation.InterruptGenerationUseCase import com.shifthackz.aisdv1.domain.usecase.generation.ObserveHordeProcessStatusUseCase import com.shifthackz.aisdv1.domain.usecase.generation.ObserveLocalDiffusionProcessStatusUseCase @@ -38,6 +39,7 @@ class TextToImageViewModel( dispatchersProvider: DispatchersProvider, generationFormUpdateEvent: GenerationFormUpdateEvent, getStableDiffusionSamplersUseCase: GetStableDiffusionSamplersUseCase, + getForgeModulesUseCase: GetForgeModulesUseCase, observeHordeProcessStatusUseCase: ObserveHordeProcessStatusUseCase, observeLocalDiffusionProcessStatusUseCase: ObserveLocalDiffusionProcessStatusUseCase, saveLastResultToCacheUseCase: SaveLastResultToCacheUseCase, @@ -57,6 +59,7 @@ class TextToImageViewModel( ) : GenerationMviViewModel( preferenceManager = preferenceManager, getStableDiffusionSamplersUseCase = getStableDiffusionSamplersUseCase, + getForgeModulesUseCase = getForgeModulesUseCase, observeHordeProcessStatusUseCase = observeHordeProcessStatusUseCase, observeLocalDiffusionProcessStatusUseCase = observeLocalDiffusionProcessStatusUseCase, saveLastResultToCacheUseCase = saveLastResultToCacheUseCase, diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/ADetailerSection.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/ADetailerSection.kt new file mode 100644 index 000000000..f0063e4e2 --- /dev/null +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/ADetailerSection.kt @@ -0,0 +1,97 @@ +package com.shifthackz.aisdv1.presentation.widget.input + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Slider +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.shifthackz.aisdv1.core.common.math.roundTo +import com.shifthackz.aisdv1.core.model.asUiText +import com.shifthackz.aisdv1.domain.entity.ADetailerConfig +import com.shifthackz.aisdv1.presentation.theme.sliderColors +import com.shifthackz.aisdv1.core.localization.R as LocalizationR + +/** + * Composable for configuring ADetailer extension settings. + * ADetailer automatically detects faces/hands and refines them. + */ +@Composable +fun ADetailerSection( + modifier: Modifier = Modifier, + config: ADetailerConfig, + onConfigChange: (ADetailerConfig) -> Unit, +) { + Column(modifier = modifier) { + // Enable/Disable toggle + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + ) { + Text( + text = stringResource(id = LocalizationR.string.hint_adetailer_enabled), + style = MaterialTheme.typography.bodyLarge, + ) + Switch( + checked = config.enabled, + onCheckedChange = { onConfigChange(config.copy(enabled = it)) }, + ) + } + + // Expanded settings when enabled + AnimatedVisibility(visible = config.enabled) { + Column(modifier = Modifier.padding(top = 8.dp)) { + // Model selection + DropdownTextField( + modifier = Modifier.fillMaxWidth(), + label = LocalizationR.string.hint_adetailer_model.asUiText(), + value = config.model, + items = ADetailerConfig.AVAILABLE_MODELS, + onItemSelected = { onConfigChange(config.copy(model = it)) }, + displayDelegate = { it.asUiText() }, + ) + + // Confidence slider + Text( + modifier = Modifier.padding(top = 8.dp), + text = stringResource( + id = LocalizationR.string.hint_adetailer_confidence, + config.confidence.roundTo(2).toString() + ), + style = MaterialTheme.typography.bodyMedium, + ) + Slider( + value = config.confidence, + onValueChange = { onConfigChange(config.copy(confidence = it.roundTo(2))) }, + valueRange = 0.1f..1.0f, + colors = sliderColors, + ) + + // Denoising strength slider + Text( + text = stringResource( + id = LocalizationR.string.hint_adetailer_denoising, + config.denoisingStrength.roundTo(2).toString() + ), + style = MaterialTheme.typography.bodyMedium, + ) + Slider( + value = config.denoisingStrength, + onValueChange = { onConfigChange(config.copy(denoisingStrength = it.roundTo(2))) }, + valueRange = 0.0f..1.0f, + colors = sliderColors, + ) + } + } + } +} diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/GenerationInputForm.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/GenerationInputForm.kt index ec49f4ec2..1cf33b5b9 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/GenerationInputForm.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/GenerationInputForm.kt @@ -1,6 +1,8 @@ package com.shifthackz.aisdv1.presentation.widget.input import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.RowScope @@ -10,7 +12,12 @@ import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.ArrowDropDown import androidx.compose.material.icons.filled.ArrowDropUp +import androidx.compose.material.icons.filled.AspectRatio import androidx.compose.material.icons.filled.Casino +import androidx.compose.material.icons.filled.Clear +import androidx.compose.material.icons.filled.SwapHoriz +import androidx.compose.material3.DropdownMenu +import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme @@ -21,6 +28,10 @@ import androidx.compose.material3.TextField import androidx.compose.material3.TextFieldDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.MutableState +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource @@ -30,16 +41,21 @@ import androidx.compose.ui.unit.dp import com.shifthackz.aisdv1.core.common.math.roundTo import com.shifthackz.aisdv1.core.model.asString import com.shifthackz.aisdv1.core.model.asUiText +import com.shifthackz.aisdv1.domain.entity.ADetailerConfig +import com.shifthackz.aisdv1.domain.entity.ForgeModule +import com.shifthackz.aisdv1.domain.entity.ModelType import com.shifthackz.aisdv1.domain.entity.OpenAiModel import com.shifthackz.aisdv1.domain.entity.OpenAiQuality import com.shifthackz.aisdv1.domain.entity.OpenAiSize import com.shifthackz.aisdv1.domain.entity.OpenAiStyle +import com.shifthackz.aisdv1.domain.entity.Scheduler import com.shifthackz.aisdv1.domain.entity.ServerSource import com.shifthackz.aisdv1.domain.entity.StabilityAiClipGuidance import com.shifthackz.aisdv1.domain.entity.StabilityAiSampler import com.shifthackz.aisdv1.domain.entity.StabilityAiStylePreset import com.shifthackz.aisdv1.presentation.core.GenerationMviIntent import com.shifthackz.aisdv1.presentation.core.GenerationMviState +import com.shifthackz.aisdv1.presentation.model.AspectRatio import com.shifthackz.aisdv1.presentation.model.Modal import com.shifthackz.aisdv1.presentation.theme.sliderColors import com.shifthackz.aisdv1.presentation.theme.textFieldColors @@ -145,6 +161,46 @@ fun GenerationInputForm( ) } + @Composable + fun sizeButtonsComponent() { + var aspectRatioMenuExpanded by remember { mutableStateOf(false) } + + IconButton( + onClick = { processIntent(GenerationMviIntent.Update.Size.Swap) }, + ) { + Icon( + imageVector = Icons.Default.SwapHoriz, + contentDescription = stringResource(id = LocalizationR.string.swap_dimensions), + ) + } + + Box { + IconButton( + onClick = { aspectRatioMenuExpanded = true }, + ) { + Icon( + imageVector = Icons.Default.AspectRatio, + contentDescription = stringResource(id = LocalizationR.string.aspect_ratio), + ) + } + DropdownMenu( + expanded = aspectRatioMenuExpanded, + onDismissRequest = { aspectRatioMenuExpanded = false }, + containerColor = MaterialTheme.colorScheme.surface, + ) { + AspectRatio.entries.forEach { ratio -> + DropdownMenuItem( + text = { Text(ratio.label) }, + onClick = { + aspectRatioMenuExpanded = false + processIntent(GenerationMviIntent.Update.Size.AspectRatio(ratio)) + }, + ) + } + } + } + } + Column(modifier = modifier) { if (!state.onBoardingDemo) { when (state.mode) { @@ -168,6 +224,34 @@ fun GenerationInputForm( else -> Unit } + // Model type selection (SD/SDXL/Flux) for A1111 + if (state.mode == ServerSource.AUTOMATIC1111) { + DropdownTextField( + modifier = Modifier + .fillMaxWidth() + .padding(top = 8.dp), + label = LocalizationR.string.hint_model_type.asUiText(), + value = state.modelType, + items = ModelType.entries, + onItemSelected = { processIntent(GenerationMviIntent.Update.ModelTypeChange(it)) }, + displayDelegate = { it.displayName.asUiText() }, + ) + // VAE / Text Encoder multi-select (Forge only) + if (state.availableForgeModules.isNotEmpty()) { + MultiSelectDropdownField( + modifier = Modifier + .fillMaxWidth() + .padding(top = 8.dp), + label = LocalizationR.string.hint_vae_text_encoder.asUiText(), + selectedItems = state.selectedForgeModules, + availableItems = state.availableForgeModules, + onSelectionChanged = { modules -> + processIntent(GenerationMviIntent.Update.ForgeModules(modules)) + }, + displayDelegate = { it.name.asUiText() }, + ) + } + } } if (state.formPromptTaggedInput) { ChipTextFieldWithItem( @@ -205,73 +289,73 @@ fun GenerationInputForm( ) } - // Horde does not support "negative prompt" - when (state.mode) { - ServerSource.AUTOMATIC1111, + // Horde does not support "negative prompt", Flux models also don't support it + // Show negative prompt only for non-Flux model types + val showNegativePrompt = when (state.mode) { + ServerSource.AUTOMATIC1111 -> state.modelType != ModelType.FLUX ServerSource.SWARM_UI, ServerSource.HUGGING_FACE, ServerSource.STABILITY_AI, - ServerSource.LOCAL_MICROSOFT_ONNX -> { - if (state.formPromptTaggedInput) { - ChipTextFieldWithItem( - modifier = Modifier - .fillMaxWidth() - .padding(top = 8.dp), - textFieldValueState = negativePromptChipTextFieldState, - label = LocalizationR.string.hint_prompt_negative, - list = state.negativePromptKeywords, - onItemClick = { _, tag -> - processIntent( - GenerationMviIntent.SetModal( - Modal.EditTag( - prompt = state.prompt, - negativePrompt = state.negativePrompt, - tag = tag, - isNegative = true, - ) + ServerSource.LOCAL_MICROSOFT_ONNX -> true + else -> false + } + if (showNegativePrompt) { + if (state.formPromptTaggedInput) { + ChipTextFieldWithItem( + modifier = Modifier + .fillMaxWidth() + .padding(top = 8.dp), + textFieldValueState = negativePromptChipTextFieldState, + label = LocalizationR.string.hint_prompt_negative, + list = state.negativePromptKeywords, + onItemClick = { _, tag -> + processIntent( + GenerationMviIntent.SetModal( + Modal.EditTag( + prompt = state.prompt, + negativePrompt = state.negativePrompt, + tag = tag, + isNegative = true, ) ) - }, - ) { event -> - val prompt = processTaggedPrompt(state.negativePromptKeywords, event) - processIntent(GenerationMviIntent.Update.NegativePrompt(prompt)) - } - } else { - TextField( - modifier = Modifier - .fillMaxWidth() - .padding(top = 8.dp), - value = state.negativePrompt, - onValueChange = { processIntent(GenerationMviIntent.Update.NegativePrompt(it)) }, - label = { Text(stringResource(id = LocalizationR.string.hint_prompt_negative)) }, - colors = textFieldColors, - ) + ) + }, + ) { event -> + val prompt = processTaggedPrompt(state.negativePromptKeywords, event) + processIntent(GenerationMviIntent.Update.NegativePrompt(prompt)) } + } else { + TextField( + modifier = Modifier + .fillMaxWidth() + .padding(top = 8.dp), + value = state.negativePrompt, + onValueChange = { processIntent(GenerationMviIntent.Update.NegativePrompt(it)) }, + label = { Text(stringResource(id = LocalizationR.string.hint_prompt_negative)) }, + colors = textFieldColors, + ) } - - else -> Unit } - // Size input fields + // Size input fields with control buttons Row( modifier = Modifier .fillMaxWidth() .padding(top = 8.dp), + verticalAlignment = Alignment.CenterVertically, ) { - val localModifier = Modifier.weight(1f) - when (state.mode) { ServerSource.HORDE, ServerSource.LOCAL_MICROSOFT_ONNX -> { DropdownTextField( - modifier = localModifier.padding(end = 4.dp), + modifier = Modifier.weight(1f).padding(end = 4.dp), label = LocalizationR.string.width.asUiText(), value = state.width, items = Constants.sizes, onItemSelected = { processIntent(GenerationMviIntent.Update.Size.Width(it)) }, ) DropdownTextField( - modifier = localModifier.padding(start = 4.dp), + modifier = Modifier.weight(1f).padding(start = 4.dp), label = LocalizationR.string.height.asUiText(), value = state.height, items = Constants.sizes, @@ -282,12 +366,15 @@ fun GenerationInputForm( ServerSource.AUTOMATIC1111, ServerSource.SWARM_UI, ServerSource.HUGGING_FACE -> { - sizeTextFieldsComponent(localModifier) + sizeTextFieldsComponent(Modifier.weight(1f)) + sizeButtonsComponent() } ServerSource.STABILITY_AI -> { - if (isImg2Img) Unit - else sizeTextFieldsComponent(localModifier) + if (!isImg2Img) { + sizeTextFieldsComponent(Modifier.weight(1f)) + sizeButtonsComponent() + } } ServerSource.OPEN_AI -> { @@ -351,7 +438,7 @@ fun GenerationInputForm( AnimatedVisibility( visible = state.advancedOptionsVisible && state.mode != ServerSource.OPEN_AI, ) { - Column { + Column(modifier = Modifier.fillMaxWidth()) { // Sampler selection only supported for A1111, STABILITY AI when (state.mode) { ServerSource.STABILITY_AI, @@ -374,6 +461,20 @@ fun GenerationInputForm( else -> Unit } + // Scheduler selection only for A1111 (Flux models need specific schedulers) + if (state.mode == ServerSource.AUTOMATIC1111) { + DropdownTextField( + modifier = Modifier + .fillMaxWidth() + .padding(top = 8.dp), + label = LocalizationR.string.hint_scheduler.asUiText(), + value = state.selectedScheduler, + items = Scheduler.entries, + onItemSelected = { processIntent(GenerationMviIntent.Update.Scheduler(it)) }, + displayDelegate = { value -> value.displayName.asUiText() }, + ) + } + // Style-preset only for Stablity AI if (state.mode == ServerSource.STABILITY_AI) { DropdownTextField( @@ -419,13 +520,25 @@ fun GenerationInputForm( label = { Text(stringResource(id = LocalizationR.string.hint_seed)) }, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), trailingIcon = { - IconButton(onClick = { - processIntent(GenerationMviIntent.Update.Seed("${Random.nextLong().absoluteValue}")) - }) { - Icon( - imageVector = Icons.Default.Casino, - contentDescription = "Random", - ) + Row { + if (state.seed.isNotEmpty()) { + IconButton(onClick = { + processIntent(GenerationMviIntent.Update.Seed("")) + }) { + Icon( + imageVector = Icons.Default.Clear, + contentDescription = "Clear", + ) + } + } + IconButton(onClick = { + processIntent(GenerationMviIntent.Update.Seed("${Random.nextLong().absoluteValue}")) + }) { + Icon( + imageVector = Icons.Default.Casino, + contentDescription = "Random", + ) + } } }, colors = textFieldColors, @@ -466,13 +579,25 @@ fun GenerationInputForm( label = { Text(stringResource(id = LocalizationR.string.hint_sub_seed)) }, keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), trailingIcon = { - IconButton(onClick = { - processIntent(GenerationMviIntent.Update.SubSeed("${Random.nextLong().absoluteValue}")) - }) { - Icon( - imageVector = Icons.Default.Casino, - contentDescription = "Random", - ) + Row { + if (state.subSeed.isNotEmpty()) { + IconButton(onClick = { + processIntent(GenerationMviIntent.Update.SubSeed("")) + }) { + Icon( + imageVector = Icons.Default.Clear, + contentDescription = "Clear", + ) + } + } + IconButton(onClick = { + processIntent(GenerationMviIntent.Update.SubSeed("${Random.nextLong().absoluteValue}")) + }) { + Icon( + imageVector = Icons.Default.Casino, + contentDescription = "Random", + ) + } } }, colors = textFieldColors, @@ -533,9 +658,50 @@ fun GenerationInputForm( } // CFG scale not available on open ai and google media pipe + // For Flux models, show Distilled CFG Scale instead when (state.mode) { ServerSource.OPEN_AI, ServerSource.LOCAL_GOOGLE_MEDIA_PIPE -> Unit + ServerSource.AUTOMATIC1111 -> { + // CFG Scale for all model types + Text( + modifier = Modifier.padding(top = 8.dp), + text = stringResource( + LocalizationR.string.hint_cfg_scale, + "${state.cfgScale.roundTo(2)}", + ), + ) + SliderTextInputField( + value = state.cfgScale, + valueRange = (CFG_SCALE_RANGE_MIN * 1f)..(CFG_SCALE_RANGE_MAX * 1f), + valueDiff = 0.5f, + steps = abs(CFG_SCALE_RANGE_MAX - CFG_SCALE_RANGE_MIN) * 2 - 1, + sliderColors = sliderColors, + onValueChange = { + processIntent(GenerationMviIntent.Update.CfgScale(it)) + }, + ) + // Flux also needs Distilled CFG Scale + if (state.modelType == ModelType.FLUX) { + Text( + modifier = Modifier.padding(top = 8.dp), + text = stringResource( + LocalizationR.string.hint_distilled_cfg_scale, + "${state.distilledCfgScale.roundTo(2)}", + ), + ) + SliderTextInputField( + value = state.distilledCfgScale, + valueRange = 1f..10f, + valueDiff = 0.5f, + steps = 17, + sliderColors = sliderColors, + onValueChange = { + processIntent(GenerationMviIntent.Update.DistilledCfgScale(it)) + }, + ) + } + } else -> { Text( modifier = Modifier.padding(top = 8.dp), @@ -571,24 +737,39 @@ fun GenerationInputForm( ServerSource.LOCAL_GOOGLE_MEDIA_PIPE, ServerSource.LOCAL_MICROSOFT_ONNX -> Unit else -> batchComponent() } - //Restore faces available only for A1111 + // Hires, ADetailer, Restore faces - only for A1111 if (state.mode == ServerSource.AUTOMATIC1111) { + HiresSection( + modifier = Modifier + .fillMaxWidth() + .padding(top = 8.dp), + config = state.hiresConfig, + onConfigChange = { processIntent(GenerationMviIntent.Update.Hires(it)) }, + ) + ADetailerSection( + modifier = Modifier + .fillMaxWidth() + .padding(top = 8.dp), + config = state.aDetailerConfig, + onConfigChange = { processIntent(GenerationMviIntent.Update.ADetailer(it)) }, + ) Row( modifier = Modifier .fillMaxWidth() .padding(top = 8.dp), verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, ) { + Text( + text = stringResource(id = LocalizationR.string.hint_restore_faces), + style = MaterialTheme.typography.bodyLarge, + ) Switch( checked = state.restoreFaces, onCheckedChange = { processIntent(GenerationMviIntent.Update.RestoreFaces(it)) }, ) - Text( - modifier = Modifier.padding(horizontal = 8.dp), - text = stringResource(id = LocalizationR.string.hint_restore_faces), - ) } } } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/HiresSection.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/HiresSection.kt new file mode 100644 index 000000000..9919cc085 --- /dev/null +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/HiresSection.kt @@ -0,0 +1,113 @@ +package com.shifthackz.aisdv1.presentation.widget.input + +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Slider +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.shifthackz.aisdv1.core.common.math.roundTo +import com.shifthackz.aisdv1.core.model.asUiText +import com.shifthackz.aisdv1.domain.entity.HiresConfig +import com.shifthackz.aisdv1.presentation.theme.sliderColors +import com.shifthackz.aisdv1.core.localization.R as LocalizationR + +/** + * Composable for configuring Hires. Fix settings. + * Hires. Fix upscales and refines images using a second pass. + */ +@Composable +fun HiresSection( + modifier: Modifier = Modifier, + config: HiresConfig, + onConfigChange: (HiresConfig) -> Unit, +) { + Column(modifier = modifier) { + // Enable/Disable toggle + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween, + ) { + Text( + text = stringResource(id = LocalizationR.string.hint_hires_enabled), + style = MaterialTheme.typography.bodyLarge, + ) + Switch( + checked = config.enabled, + onCheckedChange = { onConfigChange(config.copy(enabled = it)) }, + ) + } + + // Expanded settings when enabled + AnimatedVisibility(visible = config.enabled) { + Column(modifier = Modifier.padding(top = 8.dp)) { + // Upscaler selection + DropdownTextField( + modifier = Modifier.fillMaxWidth(), + label = LocalizationR.string.hint_hires_upscaler.asUiText(), + value = config.upscaler, + items = HiresConfig.AVAILABLE_UPSCALERS, + onItemSelected = { onConfigChange(config.copy(upscaler = it)) }, + displayDelegate = { it.asUiText() }, + ) + + // Scale slider (1.0 - 4.0) + Text( + modifier = Modifier.padding(top = 8.dp), + text = stringResource( + id = LocalizationR.string.hint_hires_scale, + config.scale.roundTo(1).toString() + ), + style = MaterialTheme.typography.bodyMedium, + ) + Slider( + value = config.scale, + onValueChange = { onConfigChange(config.copy(scale = it.roundTo(1))) }, + valueRange = 1.0f..4.0f, + colors = sliderColors, + ) + + // Steps slider (0 = use same as first pass, 1-150) + Text( + text = stringResource( + id = LocalizationR.string.hint_hires_steps, + config.steps.toString() + ), + style = MaterialTheme.typography.bodyMedium, + ) + Slider( + value = config.steps.toFloat(), + onValueChange = { onConfigChange(config.copy(steps = it.toInt())) }, + valueRange = 0f..150f, + steps = 150, + colors = sliderColors, + ) + + // Denoising strength slider (0.0 - 1.0) + Text( + text = stringResource( + id = LocalizationR.string.hint_hires_denoising, + config.denoisingStrength.roundTo(2).toString() + ), + style = MaterialTheme.typography.bodyMedium, + ) + Slider( + value = config.denoisingStrength, + onValueChange = { onConfigChange(config.copy(denoisingStrength = it.roundTo(2))) }, + valueRange = 0.0f..1.0f, + colors = sliderColors, + ) + } + } + } +} diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/MultiSelectDropdownField.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/MultiSelectDropdownField.kt new file mode 100644 index 000000000..500b45387 --- /dev/null +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/MultiSelectDropdownField.kt @@ -0,0 +1,107 @@ +@file:OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class) + +package com.shifthackz.aisdv1.presentation.widget.input + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ExperimentalLayoutApi +import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Close +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExposedDropdownMenuBox +import androidx.compose.material3.ExposedDropdownMenuDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.InputChip +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.MenuAnchorType +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import com.shifthackz.aisdv1.core.model.UiText +import com.shifthackz.aisdv1.core.model.asString +import com.shifthackz.aisdv1.core.model.asUiText +import com.shifthackz.aisdv1.presentation.theme.textFieldColors + +@Composable +fun MultiSelectDropdownField( + modifier: Modifier = Modifier, + label: UiText = UiText.empty, + selectedItems: List = emptyList(), + availableItems: List = emptyList(), + onSelectionChanged: (List) -> Unit = {}, + displayDelegate: (T) -> UiText = { t -> t.toString().asUiText() }, +) { + var expanded by remember { mutableStateOf(false) } + val unselectedItems = availableItems.filter { it !in selectedItems } + + Column(modifier = modifier) { + ExposedDropdownMenuBox( + expanded = expanded, + onExpandedChange = { expanded = !expanded }, + ) { + TextField( + modifier = Modifier + .fillMaxWidth() + .menuAnchor(MenuAnchorType.PrimaryNotEditable), + value = if (selectedItems.isEmpty()) "" else "${selectedItems.size} selected", + onValueChange = {}, + readOnly = true, + label = { Text(label.asString()) }, + trailingIcon = { + ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) + }, + colors = textFieldColors, + ) + + if (unselectedItems.isNotEmpty()) { + ExposedDropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false }, + containerColor = MaterialTheme.colorScheme.background, + ) { + unselectedItems.forEach { item -> + DropdownMenuItem( + text = { Text(displayDelegate(item).asString()) }, + onClick = { + onSelectionChanged(selectedItems + item) + }, + ) + } + } + } + } + + if (selectedItems.isNotEmpty()) { + FlowRow( + modifier = Modifier + .fillMaxWidth() + .padding(top = 4.dp), + ) { + selectedItems.forEach { item -> + InputChip( + modifier = Modifier.padding(end = 4.dp), + selected = false, + onClick = { onSelectionChanged(selectedItems - item) }, + label = { Text(displayDelegate(item).asString()) }, + trailingIcon = { + Icon( + imageVector = Icons.Default.Close, + contentDescription = "Remove", + ) + }, + ) + } + } + } + } +} From 9ebbe972f78327a328c5b4475eb2c4692c40a161 Mon Sep 17 00:00:00 2001 From: crim50n Date: Mon, 29 Dec 2025 22:31:25 +0300 Subject: [PATCH 04/42] feat(ui): improve ZoomableImage, InPaint zoom/pan, Gallery navigation and Logger export --- .../gallery/GetGalleryPagedIdsUseCase.kt | 11 + .../gallery/GetGalleryPagedIdsUseCaseImpl.kt | 11 + .../presentation/modal/crop/CropImageModal.kt | 16 - .../aisdv1/presentation/model/InPaintModel.kt | 4 +- .../gallery/detail/GalleryDetailEffect.kt | 2 + .../gallery/detail/GalleryDetailIntent.kt | 8 +- .../gallery/detail/GalleryDetailScreen.kt | 499 ++++++++++++------ .../gallery/detail/GalleryDetailState.kt | 55 +- .../gallery/detail/GalleryDetailViewModel.kt | 174 +++++- .../screen/gallery/list/GalleryEffect.kt | 2 + .../screen/gallery/list/GalleryIntent.kt | 10 +- .../gallery/list/GalleryPagingSource.kt | 41 +- .../screen/gallery/list/GalleryScreen.kt | 206 ++++++-- .../screen/gallery/list/GalleryState.kt | 13 +- .../screen/gallery/list/GalleryViewModel.kt | 57 +- .../screen/inpaint/InPaintIntent.kt | 6 +- .../screen/inpaint/InPaintState.kt | 7 + .../screen/inpaint/InPaintViewModel.kt | 16 + .../inpaint/components/InPaintComponent.kt | 69 ++- .../screen/inpaint/forms/ImageDrawForm.kt | 87 ++- .../screen/logger/LoggerEffect.kt | 8 + .../screen/logger/LoggerIntent.kt | 4 + .../screen/logger/LoggerScreen.kt | 69 ++- .../screen/logger/LoggerViewModel.kt | 5 +- .../widget/image/ZoomableImage.kt | 145 ++++- 25 files changed, 1212 insertions(+), 313 deletions(-) create mode 100644 domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryPagedIdsUseCase.kt create mode 100644 domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryPagedIdsUseCaseImpl.kt create mode 100644 presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerEffect.kt diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryPagedIdsUseCase.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryPagedIdsUseCase.kt new file mode 100644 index 000000000..a70baf40d --- /dev/null +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryPagedIdsUseCase.kt @@ -0,0 +1,11 @@ +package com.shifthackz.aisdv1.domain.usecase.gallery + +import io.reactivex.rxjava3.core.Single + +/** + * Returns all gallery item IDs sorted by creation date (newest first). + * This is a lightweight operation that only fetches IDs, not full items. + */ +interface GetGalleryPagedIdsUseCase { + operator fun invoke(): Single> +} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryPagedIdsUseCaseImpl.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryPagedIdsUseCaseImpl.kt new file mode 100644 index 000000000..e0ba464bf --- /dev/null +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryPagedIdsUseCaseImpl.kt @@ -0,0 +1,11 @@ +package com.shifthackz.aisdv1.domain.usecase.gallery + +import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import io.reactivex.rxjava3.core.Single + +class GetGalleryPagedIdsUseCaseImpl( + private val repository: GenerationResultRepository, +) : GetGalleryPagedIdsUseCase { + + override fun invoke(): Single> = repository.getAllIds() +} diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/crop/CropImageModal.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/crop/CropImageModal.kt index f16ac561c..7cedf4a0a 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/crop/CropImageModal.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/crop/CropImageModal.kt @@ -7,7 +7,6 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.ui.graphics.asAndroidBitmap import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.platform.LocalContext -import com.mr0xf00.easycrop.AspectRatio import com.mr0xf00.easycrop.CropError import com.mr0xf00.easycrop.CropResult import com.mr0xf00.easycrop.CropperStyle @@ -27,20 +26,6 @@ fun CropImageModal( val imageCropper = rememberImageCropper() val state = imageCropper.cropState state?.let { - LaunchedEffect(Unit) { - it.region = when { - it.region.height > it.region.width -> it.region.copy( - bottom = it.region.width, - ) - - it.region.width > it.region.height -> it.region.copy( - right = it.region.height - ) - - else -> it.region - } - it.aspectLock = true - } ImageCropperDialog( state = it, style = CropperStyle( @@ -48,7 +33,6 @@ fun CropImageModal( overlay = MaterialTheme.colorScheme.surface, guidelines = CropperStyleGuidelines(), shapes = listOf(RectCropShape), - aspects = listOf(AspectRatio(1, 1)), ), ) } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/InPaintModel.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/InPaintModel.kt index f6bd2ab5a..b515c3a07 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/InPaintModel.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/InPaintModel.kt @@ -29,8 +29,8 @@ data class InPaintModel( } enum class Area(val fullRes: Boolean) { - WholePicture(true), - OnlyMasked(false); + WholePicture(false), + OnlyMasked(true); } fun clear(): InPaintModel = copy( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailEffect.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailEffect.kt index 3668910f7..a2b7d94b9 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailEffect.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailEffect.kt @@ -10,4 +10,6 @@ sealed interface GalleryDetailEffect : MviEffect { data class ShareGenerationParams(val state: GalleryDetailState) : GalleryDetailEffect data class ShareClipBoard(val text: String) : GalleryDetailEffect + + data object ImageSavedToGallery : GalleryDetailEffect } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailIntent.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailIntent.kt index a7e03168f..759bc6446 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailIntent.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailIntent.kt @@ -11,7 +11,7 @@ sealed interface GalleryDetailIntent : MviIntent { data class CopyToClipboard(val content: CharSequence) : GalleryDetailIntent enum class SendTo : GalleryDetailIntent { - Img2Img, Txt2Img; + Img2Img, Txt2Img, FalAi; } enum class Export : GalleryDetailIntent { @@ -24,7 +24,13 @@ sealed interface GalleryDetailIntent : MviIntent { data object ToggleVisibility : GalleryDetailIntent + data object ToggleControlsVisibility : GalleryDetailIntent + + data object SaveToGallery : GalleryDetailIntent + data object Report : GalleryDetailIntent data object DismissDialog : GalleryDetailIntent + + data class PageChanged(val index: Int) : GalleryDetailIntent } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailScreen.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailScreen.kt index 16a0224c2..76418647d 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailScreen.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailScreen.kt @@ -1,10 +1,15 @@ -@file:OptIn(ExperimentalMaterial3Api::class) +@file:OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class) package com.shifthackz.aisdv1.presentation.screen.gallery.detail +import android.widget.Toast import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut +import androidx.compose.animation.slideInVertically +import androidx.compose.animation.slideOutVertically +import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -15,6 +20,9 @@ import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.statusBarsPadding +import androidx.compose.foundation.pager.HorizontalPager +import androidx.compose.foundation.pager.rememberPagerState import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material.icons.Icons @@ -22,10 +30,12 @@ import androidx.compose.material.icons.automirrored.outlined.ArrowBack import androidx.compose.material.icons.filled.ContentCopy import androidx.compose.material.icons.filled.Delete import androidx.compose.material.icons.filled.Report +import androidx.compose.material.icons.filled.Save import androidx.compose.material.icons.filled.Share import androidx.compose.material.icons.filled.Visibility import androidx.compose.material.icons.filled.VisibilityOff import androidx.compose.material3.CenterAlignedTopAppBar +import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon import androidx.compose.material3.IconButton @@ -36,8 +46,12 @@ import androidx.compose.material3.NavigationBarItem import androidx.compose.material3.NavigationBarItemDefaults import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Scaffold +import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.key +import androidx.compose.runtime.snapshotFlow import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -56,6 +70,7 @@ import com.shifthackz.aisdv1.core.model.asUiText import com.shifthackz.aisdv1.core.sharing.shareFile import com.shifthackz.android.core.mvi.MviComponent import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import com.shifthackz.aisdv1.domain.entity.ServerSource import com.shifthackz.aisdv1.presentation.modal.ModalRenderer import com.shifthackz.aisdv1.presentation.theme.colors import com.shifthackz.aisdv1.presentation.utils.Constants @@ -94,6 +109,14 @@ fun GalleryDetailScreen(itemId: Long) { is GalleryDetailEffect.ShareClipBoard -> { clipboardManager.setText(AnnotatedString(effect.text)) } + + GalleryDetailEffect.ImageSavedToGallery -> { + Toast.makeText( + context, + context.getString(LocalizationR.string.gallery_save_success), + Toast.LENGTH_SHORT, + ).show() + } } }, ) { state, intentHandler -> @@ -111,33 +134,75 @@ private fun ScreenContent( state: GalleryDetailState, processIntent: (GalleryDetailIntent) -> Unit = {}, ) { - Box(modifier = modifier) { - Scaffold( - modifier = Modifier.fillMaxSize(), - topBar = { - CenterAlignedTopAppBar( - title = { - Text(stringResource(id = LocalizationR.string.title_gallery_details)) - }, - navigationIcon = { - IconButton( - onClick = { - processIntent(GalleryDetailIntent.NavigateBack) - }, - content = { - Icon( - Icons.AutoMirrored.Outlined.ArrowBack, - contentDescription = "Back button", - ) - }, - ) - }, - actions = { - AnimatedVisibility( - visible = state.selectedTab != GalleryDetailState.Tab.INFO, - enter = fadeIn(), - exit = fadeOut(), - ) { + val isImageTab = state.selectedTab == GalleryDetailState.Tab.IMAGE || + state.selectedTab == GalleryDetailState.Tab.ORIGINAL + val showControls = state.controlsVisible || !isImageTab + + Box( + modifier = modifier.background(MaterialTheme.colorScheme.background), + ) { + // Image content - fills entire screen when controls hidden + when (state) { + is GalleryDetailState.Content -> GalleryDetailContentState( + modifier = Modifier.fillMaxSize(), + state = state, + onCopyTextClick = { + processIntent(GalleryDetailIntent.CopyToClipboard(it)) + }, + onPageChanged = { page -> + processIntent(GalleryDetailIntent.PageChanged(page)) + }, + onImageTap = { + if (isImageTab) { + processIntent(GalleryDetailIntent.ToggleControlsVisibility) + } + }, + ) + + is GalleryDetailState.Loading -> Unit + } + + // Top bar overlay + AnimatedVisibility( + visible = showControls, + enter = fadeIn(animationSpec = tween(200)) + + slideInVertically(animationSpec = tween(200)) { -it }, + exit = fadeOut(animationSpec = tween(200)) + + slideOutVertically(animationSpec = tween(200)) { -it }, + modifier = Modifier.align(Alignment.TopCenter), + ) { + CenterAlignedTopAppBar( + title = {}, + modifier = Modifier.statusBarsPadding(), + navigationIcon = { + IconButton( + onClick = { + processIntent(GalleryDetailIntent.NavigateBack) + }, + content = { + Icon( + Icons.AutoMirrored.Outlined.ArrowBack, + contentDescription = "Back button", + ) + }, + ) + }, + actions = { + AnimatedVisibility( + visible = state.selectedTab != GalleryDetailState.Tab.INFO, + enter = fadeIn(), + exit = fadeOut(), + ) { + Row { + IconButton( + onClick = { processIntent(GalleryDetailIntent.SaveToGallery) }, + content = { + Icon( + imageVector = Icons.Default.Save, + contentDescription = "Save", + ) + }, + ) IconButton( onClick = { processIntent(GalleryDetailIntent.Export.Image) }, content = { @@ -151,32 +216,25 @@ private fun ScreenContent( ) } } - ) - }, - content = { paddingValues -> - val contentModifier = Modifier - .fillMaxSize() - .padding(paddingValues) + } + ) + } - when (state) { - is GalleryDetailState.Content -> GalleryDetailContentState( - modifier = contentModifier, - state = state, - onCopyTextClick = { - processIntent(GalleryDetailIntent.CopyToClipboard(it)) - }, - ) + // Bottom bar overlay + AnimatedVisibility( + visible = showControls, + enter = fadeIn(animationSpec = tween(200)) + + slideInVertically(animationSpec = tween(200)) { it }, + exit = fadeOut(animationSpec = tween(200)) + + slideOutVertically(animationSpec = tween(200)) { it }, + modifier = Modifier.align(Alignment.BottomCenter), + ) { + GalleryDetailNavigationBar( + state = state, + processIntent = processIntent, + ) + } - is GalleryDetailState.Loading -> Unit - } - }, - bottomBar = { - GalleryDetailNavigationBar( - state = state, - processIntent = processIntent, - ) - }, - ) ModalRenderer(screenModal = state.screenModal) { (it as? GalleryDetailIntent)?.let(processIntent::invoke) } @@ -188,56 +246,70 @@ private fun GalleryDetailNavigationBar( state: GalleryDetailState, processIntent: (GalleryDetailIntent) -> Unit = {}, ) { - Column( - modifier = Modifier - .background(color = MaterialTheme.colorScheme.surface), + Surface( + color = MaterialTheme.colorScheme.surface, ) { - if (state is GalleryDetailState.Content) { - if (state.showReportButton) { - OutlinedButton( + Column { + if (state is GalleryDetailState.Content) { + if (state.showReportButton) { + OutlinedButton( + modifier = Modifier + .padding(horizontal = 24.dp, vertical = 4.dp) + .fillMaxWidth() + .align(Alignment.CenterHorizontally), + onClick = { processIntent(GalleryDetailIntent.Report) }, + ) { + Icon( + modifier = Modifier.padding(end = 8.dp), + imageVector = Icons.Default.Report, + contentDescription = "Report", + ) + Text( + text = stringResource(LocalizationR.string.report_title), + color = LocalContentColor.current + ) + } + } + Row( modifier = Modifier - .padding(horizontal = 24.dp, vertical = 4.dp) .fillMaxWidth() - .align(Alignment.CenterHorizontally), - onClick = { processIntent(GalleryDetailIntent.Report) }, + .padding(horizontal = 16.dp, vertical = 2.dp), + horizontalArrangement = Arrangement.SpaceBetween, ) { - Icon( - modifier = Modifier.padding(end = 8.dp), - imageVector = Icons.Default.Report, - contentDescription = "Report", - ) - Text( - text = stringResource(LocalizationR.string.report_title), - color = LocalContentColor.current - ) - } - } - Row( - modifier = Modifier - .background(color = MaterialTheme.colorScheme.surface) - .fillMaxWidth() - .padding(horizontal = 16.dp, vertical = 2.dp), - horizontalArrangement = Arrangement.SpaceBetween, - ) { - IconButton( - onClick = { processIntent(GalleryDetailIntent.SendTo.Txt2Img) }, - ) { - Icon( - modifier = Modifier.size(24.dp), - painter = painterResource(id = PresentationR.drawable.ic_text), - contentDescription = "txt2img", - tint = LocalContentColor.current, - ) - } - IconButton( - onClick = { processIntent(GalleryDetailIntent.SendTo.Img2Img) }, - ) { - Icon( - modifier = Modifier.size(24.dp), - painter = painterResource(id = PresentationR.drawable.ic_image), - contentDescription = "img2img", - tint = LocalContentColor.current, - ) + if (state.currentSource == ServerSource.FAL_AI) { + // Fal AI button - show for all images when Fal AI is active source + IconButton( + onClick = { processIntent(GalleryDetailIntent.SendTo.FalAi) }, + ) { + Icon( + modifier = Modifier.size(24.dp), + painter = painterResource(id = PresentationR.drawable.ic_text), + contentDescription = "Fal AI", + tint = LocalContentColor.current, + ) + } + } else { + // Standard txt2img/img2img buttons for all other sources + IconButton( + onClick = { processIntent(GalleryDetailIntent.SendTo.Txt2Img) }, + ) { + Icon( + modifier = Modifier.size(24.dp), + painter = painterResource(id = PresentationR.drawable.ic_text), + contentDescription = "txt2img", + tint = LocalContentColor.current, + ) + } + IconButton( + onClick = { processIntent(GalleryDetailIntent.SendTo.Img2Img) }, + ) { + Icon( + modifier = Modifier.size(24.dp), + painter = painterResource(id = PresentationR.drawable.ic_image), + contentDescription = "img2img", + tint = LocalContentColor.current, + ) + } } IconButton( onClick = { processIntent(GalleryDetailIntent.ToggleVisibility) }, @@ -296,6 +368,7 @@ private fun GalleryDetailNavigationBar( ) } } + } } } @@ -305,26 +378,97 @@ private fun GalleryDetailContentState( modifier: Modifier = Modifier, state: GalleryDetailState.Content, onCopyTextClick: (CharSequence) -> Unit = {}, + onPageChanged: (Int) -> Unit = {}, + onImageTap: () -> Unit = {}, ) { Column( modifier = modifier, ) { when (state.selectedTab) { - GalleryDetailState.Tab.IMAGE -> ZoomableImage( - modifier = Modifier.fillMaxSize(), - source = ZoomableImageSource.Bmp(state.bitmap), - hideImage = state.hidden, - ) + GalleryDetailState.Tab.IMAGE -> { + if (state.galleryIds.size > 1) { + // key() ensures pager is recreated with correct initialPage after deletion + key(state.galleryIds) { + val pagerState = rememberPagerState( + initialPage = state.currentIndex, + pageCount = { state.galleryIds.size } + ) + + LaunchedEffect(pagerState) { + snapshotFlow { pagerState.settledPage } + .collect { page -> + if (page != state.currentIndex) { + onPageChanged(page) + } + } + } + + // Animate to target page (swipe effect for deletion) + LaunchedEffect(state.animateToPage) { + state.animateToPage?.let { targetPage -> + if (targetPage in 0 until pagerState.pageCount && + pagerState.currentPage != targetPage) { + pagerState.animateScrollToPage(targetPage) + } + } + } + + HorizontalPager( + state = pagerState, + modifier = Modifier.fillMaxSize(), + beyondViewportPageCount = 1, + ) { page -> + // Get bitmap from cache, or use current bitmap for current page + val pageBitmap = state.getBitmapForPage(page) + ?: if (page == state.currentIndex) state.bitmap else null + + if (pageBitmap != null) { + ZoomableImage( + modifier = Modifier.fillMaxSize(), + source = ZoomableImageSource.Bmp(pageBitmap), + hideImage = page == state.currentIndex && state.hidden, + consumeGesturesWhenNotZoomed = false, + onTap = onImageTap, + ) + } else { + // Show loading indicator while bitmap is being loaded + Box( + modifier = Modifier + .fillMaxSize() + .background(MaterialTheme.colorScheme.background), + contentAlignment = Alignment.Center, + ) { + CircularProgressIndicator( + modifier = Modifier.size(48.dp), + color = MaterialTheme.colorScheme.primary, + ) + } + } + } + } + } else { + ZoomableImage( + modifier = Modifier.fillMaxSize(), + source = ZoomableImageSource.Bmp(state.bitmap), + hideImage = state.hidden, + onTap = onImageTap, + ) + } + } GalleryDetailState.Tab.ORIGINAL -> state.inputBitmap?.let { bmp -> ZoomableImage( modifier = Modifier.fillMaxSize(), source = ZoomableImageSource.Bmp(bmp), + onTap = onImageTap, ) } GalleryDetailState.Tab.INFO -> GalleryDetailsTable( - modifier = Modifier.fillMaxSize(), + modifier = Modifier + .fillMaxSize() + .statusBarsPadding() + .padding(top = 64.dp), state = state, onCopyTextClick = onCopyTextClick, ) @@ -363,20 +507,32 @@ private fun GalleryDetailsTable( color = colorOddText, onCopyTextClick = onCopyTextClick, ) + if (state.isFalAi) { + // Fal AI specific fields + GalleryDetailRow( + modifier = Modifier.background(color = colorOddBg), + name = "Endpoint".asUiText(), + value = state.sampler, + color = colorOddText, + onCopyTextClick = onCopyTextClick, + ) + } GalleryDetailRow( - modifier = Modifier.background(color = colorOddBg), + modifier = Modifier.background(color = if (state.isFalAi) colorEvenBg else colorOddBg), name = LocalizationR.string.gallery_info_field_prompt.asUiText(), value = state.prompt, color = colorOddText, onCopyTextClick = onCopyTextClick, ) - GalleryDetailRow( - modifier = Modifier.background(color = colorEvenBg), - name = LocalizationR.string.gallery_info_field_negative_prompt.asUiText(), - value = state.negativePrompt, - color = colorOddText, - onCopyTextClick = onCopyTextClick, - ) + if (!state.isFalAi || state.negativePrompt.asString().isNotBlank()) { + GalleryDetailRow( + modifier = Modifier.background(color = if (state.isFalAi) colorOddBg else colorEvenBg), + name = LocalizationR.string.gallery_info_field_negative_prompt.asUiText(), + value = state.negativePrompt, + color = colorOddText, + onCopyTextClick = onCopyTextClick, + ) + } GalleryDetailRow( modifier = Modifier.background(color = colorOddBg), name = LocalizationR.string.gallery_info_field_size.asUiText(), @@ -384,62 +540,69 @@ private fun GalleryDetailsTable( color = colorOddText, onCopyTextClick = onCopyTextClick, ) - GalleryDetailRow( - modifier = Modifier.background(color = colorEvenBg), - name = LocalizationR.string.gallery_info_field_sampling_steps.asUiText(), - value = state.samplingSteps, - color = colorOddText, - onCopyTextClick = onCopyTextClick, - ) - GalleryDetailRow( - modifier = Modifier.background(color = colorOddBg), - name = LocalizationR.string.gallery_info_field_cfg.asUiText(), - value = state.cfgScale, - color = colorOddText, - onCopyTextClick = onCopyTextClick, - ) - GalleryDetailRow( - modifier = Modifier.background(color = colorEvenBg), - name = LocalizationR.string.gallery_info_field_restore_faces.asUiText(), - value = state.restoreFaces, - color = colorOddText, - onCopyTextClick = onCopyTextClick, - ) - GalleryDetailRow( - modifier = Modifier.background(color = colorOddBg), - name = LocalizationR.string.gallery_info_field_sampler.asUiText(), - value = state.sampler, - color = colorOddText, - onCopyTextClick = onCopyTextClick, - ) - GalleryDetailRow( - modifier = Modifier.background(color = colorEvenBg), - name = LocalizationR.string.gallery_info_field_seed.asUiText(), - value = state.seed, - color = colorOddText, - onCopyTextClick = onCopyTextClick, - ) - GalleryDetailRow( - modifier = Modifier.background(color = colorOddBg), - name = LocalizationR.string.gallery_info_field_sub_seed.asUiText(), - value = state.subSeed, - color = colorOddText, - onCopyTextClick = onCopyTextClick, - ) - GalleryDetailRow( - modifier = Modifier.background(color = colorEvenBg), - name = LocalizationR.string.gallery_info_field_sub_seed_strength.asUiText(), - value = state.subSeedStrength, - color = colorOddText, - onCopyTextClick = onCopyTextClick, - ) - if (state.generationType == AiGenerationResult.Type.IMAGE_TO_IMAGE) GalleryDetailRow( - modifier = Modifier.background(color = colorOddBg), - name = LocalizationR.string.gallery_info_field_denoising_strength.asUiText(), - value = state.denoisingStrength, - color = colorOddText, - onCopyTextClick = onCopyTextClick, - ) + if (!state.isFalAi) { + // SD specific fields - hide for Fal AI + GalleryDetailRow( + modifier = Modifier.background(color = colorEvenBg), + name = LocalizationR.string.gallery_info_field_sampling_steps.asUiText(), + value = state.samplingSteps, + color = colorOddText, + onCopyTextClick = onCopyTextClick, + ) + GalleryDetailRow( + modifier = Modifier.background(color = colorOddBg), + name = LocalizationR.string.gallery_info_field_cfg.asUiText(), + value = state.cfgScale, + color = colorOddText, + onCopyTextClick = onCopyTextClick, + ) + GalleryDetailRow( + modifier = Modifier.background(color = colorEvenBg), + name = LocalizationR.string.gallery_info_field_restore_faces.asUiText(), + value = state.restoreFaces, + color = colorOddText, + onCopyTextClick = onCopyTextClick, + ) + GalleryDetailRow( + modifier = Modifier.background(color = colorOddBg), + name = LocalizationR.string.gallery_info_field_sampler.asUiText(), + value = state.sampler, + color = colorOddText, + onCopyTextClick = onCopyTextClick, + ) + } + if (state.seed.asString().isNotBlank()) { + GalleryDetailRow( + modifier = Modifier.background(color = colorEvenBg), + name = LocalizationR.string.gallery_info_field_seed.asUiText(), + value = state.seed, + color = colorOddText, + onCopyTextClick = onCopyTextClick, + ) + } + if (!state.isFalAi) { + GalleryDetailRow( + modifier = Modifier.background(color = colorOddBg), + name = LocalizationR.string.gallery_info_field_sub_seed.asUiText(), + value = state.subSeed, + color = colorOddText, + onCopyTextClick = onCopyTextClick, + ) + GalleryDetailRow( + modifier = Modifier.background(color = colorEvenBg), + name = LocalizationR.string.gallery_info_field_sub_seed_strength.asUiText(), + value = state.subSeedStrength, + color = colorOddText, + onCopyTextClick = onCopyTextClick, + ) + if (state.generationType == AiGenerationResult.Type.IMAGE_TO_IMAGE) GalleryDetailRow( + modifier = Modifier.background(color = colorOddBg), + name = LocalizationR.string.gallery_info_field_denoising_strength.asUiText(), + value = state.denoisingStrength, + color = colorOddText, + onCopyTextClick = onCopyTextClick, + ) + } } } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailState.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailState.kt index 9db5c925b..0dfc9e0c6 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailState.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailState.kt @@ -8,6 +8,7 @@ import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter import com.shifthackz.aisdv1.core.model.UiText import com.shifthackz.aisdv1.core.model.asUiText import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import com.shifthackz.aisdv1.domain.entity.ServerSource import com.shifthackz.aisdv1.presentation.extensions.mapToUi import com.shifthackz.aisdv1.presentation.model.Modal import com.shifthackz.android.core.mvi.MviState @@ -18,12 +19,24 @@ sealed interface GalleryDetailState : MviState { val tabs: List val selectedTab: Tab val screenModal: Modal + val galleryIds: List + val currentIndex: Int + val bitmapCache: Map + val controlsVisible: Boolean + val currentSource: ServerSource + val animateToPage: Int? @Immutable data class Loading( override val tabs: List = emptyList(), override val selectedTab: Tab = Tab.IMAGE, override val screenModal: Modal = Modal.None, + override val galleryIds: List = emptyList(), + override val currentIndex: Int = 0, + override val bitmapCache: Map = emptyMap(), + override val controlsVisible: Boolean = true, + override val currentSource: ServerSource = ServerSource.AUTOMATIC1111, + override val animateToPage: Int? = null, ) : GalleryDetailState @Immutable @@ -31,6 +44,12 @@ sealed interface GalleryDetailState : MviState { override val tabs: List = emptyList(), override val selectedTab: Tab = Tab.IMAGE, override val screenModal: Modal = Modal.None, + override val galleryIds: List = emptyList(), + override val currentIndex: Int = 0, + override val bitmapCache: Map = emptyMap(), + override val controlsVisible: Boolean = true, + override val currentSource: ServerSource = ServerSource.AUTOMATIC1111, + override val animateToPage: Int? = null, val showReportButton: Boolean = false, val generationType: AiGenerationResult.Type, val id: Long, @@ -50,6 +69,8 @@ sealed interface GalleryDetailState : MviState { val subSeedStrength: UiText, val denoisingStrength: UiText, val hidden: Boolean, + val isFalAi: Boolean = false, + val falAiEndpointId: String = "", ) : GalleryDetailState fun withTab(tab: Tab): GalleryDetailState = when (this) { @@ -67,6 +88,27 @@ sealed interface GalleryDetailState : MviState { is Loading -> this } + fun withControlsVisible(value: Boolean) = when (this) { + is Content -> copy(controlsVisible = value) + is Loading -> copy(controlsVisible = value) + } + + fun withGalleryIds(ids: List, index: Int) = when (this) { + is Content -> copy(galleryIds = ids, currentIndex = index) + is Loading -> copy(galleryIds = ids, currentIndex = index) + } + + fun withBitmapCache(id: Long, bitmap: Bitmap) = when (this) { + is Content -> copy(bitmapCache = bitmapCache + (id to bitmap)) + is Loading -> copy(bitmapCache = bitmapCache + (id to bitmap)) + } + + fun getBitmapForPage(pageIndex: Int): Bitmap? { + if (pageIndex !in galleryIds.indices) return null + val id = galleryIds[pageIndex] + return bitmapCache[id] + } + enum class Tab( @StringRes val label: Int, @DrawableRes val iconRes: Int, @@ -87,27 +129,34 @@ sealed interface GalleryDetailState : MviState { } } -fun Triple.mapToUi(): GalleryDetailState.Content = +fun Triple.mapToUi( + currentSource: ServerSource = ServerSource.AUTOMATIC1111, +): GalleryDetailState.Content = let { (ai, out, original) -> + val isFalAi = ai.sampler.startsWith("fal.ai/") + val falAiEndpointId = if (isFalAi) ai.sampler.removePrefix("fal.ai/") else "" GalleryDetailState.Content( tabs = GalleryDetailState.Tab.consume(ai.type), + currentSource = currentSource, generationType = ai.type, id = ai.id, bitmap = out.bitmap, inputBitmap = original?.bitmap, createdAt = ai.createdAt.toString().asUiText(), - type = ai.type.key.asUiText(), + type = if (isFalAi) "Fal AI".asUiText() else ai.type.key.asUiText(), prompt = ai.prompt.asUiText(), negativePrompt = ai.negativePrompt.asUiText(), size = "${ai.width} X ${ai.height}".asUiText(), samplingSteps = ai.samplingSteps.toString().asUiText(), cfgScale = ai.cfgScale.toString().asUiText(), restoreFaces = ai.restoreFaces.mapToUi(), - sampler = ai.sampler.asUiText(), + sampler = if (isFalAi) falAiEndpointId.asUiText() else ai.sampler.asUiText(), seed = ai.seed.asUiText(), subSeed = ai.subSeed.asUiText(), subSeedStrength = ai.subSeedStrength.toString().asUiText(), denoisingStrength = ai.denoisingStrength.toString().asUiText(), hidden = ai.hidden, + isFalAi = isFalAi, + falAiEndpointId = falAiEndpointId, ) } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailViewModel.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailViewModel.kt index bf4d9cbe9..6b2d1f2d7 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailViewModel.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailViewModel.kt @@ -1,5 +1,6 @@ package com.shifthackz.aisdv1.presentation.screen.gallery.detail +import android.graphics.Bitmap import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider import com.shifthackz.aisdv1.core.common.appbuild.BuildType import com.shifthackz.aisdv1.core.common.log.errorLog @@ -10,22 +11,31 @@ import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter.Input import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import com.shifthackz.aisdv1.domain.entity.ServerSource +import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway +import com.shifthackz.aisdv1.domain.preference.PreferenceManager import com.shifthackz.aisdv1.domain.usecase.caching.GetLastResultFromCacheUseCase import com.shifthackz.aisdv1.domain.usecase.gallery.DeleteGalleryItemUseCase +import com.shifthackz.aisdv1.domain.usecase.gallery.GetGalleryPagedIdsUseCase import com.shifthackz.aisdv1.domain.usecase.gallery.ToggleImageVisibilityUseCase import com.shifthackz.aisdv1.domain.usecase.generation.GetGenerationResultUseCase import com.shifthackz.aisdv1.presentation.core.GenerationFormUpdateEvent import com.shifthackz.aisdv1.presentation.model.Modal import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter +import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.kotlin.subscribeBy +import java.io.ByteArrayOutputStream +import java.util.concurrent.TimeUnit class GalleryDetailViewModel( private val itemId: Long, dispatchersProvider: DispatchersProvider, private val buildInfoProvider: BuildInfoProvider, + private val preferenceManager: PreferenceManager, private val getGenerationResultUseCase: GetGenerationResultUseCase, private val getLastResultFromCacheUseCase: GetLastResultFromCacheUseCase, + private val getGalleryPagedIdsUseCase: GetGalleryPagedIdsUseCase, private val deleteGalleryItemUseCase: DeleteGalleryItemUseCase, private val toggleImageVisibilityUseCase: ToggleImageVisibilityUseCase, private val galleryDetailBitmapExporter: GalleryDetailBitmapExporter, @@ -33,25 +43,81 @@ class GalleryDetailViewModel( private val schedulersProvider: SchedulersProvider, private val generationFormUpdateEvent: GenerationFormUpdateEvent, private val mainRouter: MainRouter, + private val mediaStoreGateway: MediaStoreGateway, ) : MviRxViewModel() { - override val initialState = GalleryDetailState.Loading() + override val initialState = GalleryDetailState.Loading(currentSource = preferenceManager.source) override val effectDispatcher = dispatchersProvider.immediate + private var currentItemId: Long = itemId + init { - !getGenerationResult(itemId) + // Load all gallery IDs first, then load the current item + !getGalleryPagedIdsUseCase() + .subscribeOnMainThread(schedulersProvider) + .subscribeBy(::errorLog) { ids -> + val index = ids.indexOf(itemId).coerceAtLeast(0) + updateState { it.withGalleryIds(ids, index) } + loadItem(itemId) + } + } + + private fun loadItem(id: Long) { + currentItemId = id + !getGenerationResult(id) .subscribeOnMainThread(schedulersProvider) .postProcess() .subscribeBy(::errorLog) { ai -> - updateState { - ai.mapToUi() - .copy(showReportButton = buildInfoProvider.type != BuildType.FOSS) - .withTab(currentState.selectedTab) + updateState { state -> + val newIndex = state.galleryIds.indexOf(id).coerceAtLeast(0) + ai.mapToUi(preferenceManager.source) + .copy( + showReportButton = buildInfoProvider.type != BuildType.FOSS, + galleryIds = state.galleryIds, + currentIndex = newIndex, + bitmapCache = state.bitmapCache + (id to ai.second.bitmap), + controlsVisible = state.controlsVisible, + ) + .withTab(state.selectedTab) } + // Preload adjacent images + preloadAdjacentImages(id) } } + private fun preloadAdjacentImages(currentId: Long) { + val ids = currentState.galleryIds + val currentIndex = ids.indexOf(currentId) + if (currentIndex < 0) return + + // Preload previous and next images + listOf(currentIndex - 1, currentIndex + 1) + .filter { it in ids.indices } + .map { ids[it] } + .filter { it !in currentState.bitmapCache } + .forEach { adjacentId -> + preloadBitmap(adjacentId) + } + } + + private fun preloadBitmap(id: Long) { + !getGenerationResult(id) + .subscribeOn(schedulersProvider.io) + .flatMap { ai -> + base64ToBitmapConverter(Input(ai.image)).map { bmp -> id to bmp.bitmap } + } + .subscribeOnMainThread(schedulersProvider) + .subscribeBy( + onError = { /* Ignore preload errors */ }, + onSuccess = { (loadedId, bitmap) -> + updateState { state -> + state.withBitmapCache(loadedId, bitmap) + } + } + ) + } + override fun processIntent(intent: GalleryDetailIntent) { when (intent) { is GalleryDetailIntent.CopyToClipboard -> { @@ -87,6 +153,8 @@ class GalleryDetailViewModel( AiGenerationResult.Type.IMAGE_TO_IMAGE, ) + GalleryDetailIntent.SendTo.FalAi -> sendPromptToFalAi() + GalleryDetailIntent.DismissDialog -> setActiveModal(Modal.None) GalleryDetailIntent.Report -> (currentState as? GalleryDetailState.Content) @@ -94,7 +162,41 @@ class GalleryDetailViewModel( ?.let(mainRouter::navigateToReportImage) GalleryDetailIntent.ToggleVisibility -> toggleVisibility() + + GalleryDetailIntent.ToggleControlsVisibility -> updateState { + it.withControlsVisible(!it.controlsVisible) + } + + GalleryDetailIntent.SaveToGallery -> saveToGallery() + + is GalleryDetailIntent.PageChanged -> { + val ids = currentState.galleryIds + if (intent.index in ids.indices) { + val newId = ids[intent.index] + if (newId != currentItemId) { + loadItem(newId) + } + } + } + } + } + + private fun saveToGallery() { + val state = currentState as? GalleryDetailState.Content ?: return + val bitmap = state.bitmap + !Completable.fromAction { + val stream = ByteArrayOutputStream() + bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream) + mediaStoreGateway.exportToFile( + fileName = "sdai_${System.currentTimeMillis()}", + content = stream.toByteArray(), + ) } + .subscribeOn(schedulersProvider.io) + .subscribeOnMainThread(schedulersProvider) + .subscribeBy(::errorLog) { + emitEffect(GalleryDetailEffect.ImageSavedToGallery) + } } private fun share() { @@ -117,9 +219,50 @@ class GalleryDetailViewModel( private fun delete() { val state = currentState as? GalleryDetailState.Content ?: return - !deleteGalleryItemUseCase(state.id) - .subscribeOnMainThread(schedulersProvider) - .subscribeBy(::errorLog) { mainRouter.navigateBack() } + val deletedId = state.id + val ids = state.galleryIds + val currentIndex = ids.indexOf(deletedId) + + val newIds = ids.filter { it != deletedId } + + if (newIds.isEmpty()) { + // No more images after deletion, just delete and go back + !deleteGalleryItemUseCase(deletedId) + .subscribeOnMainThread(schedulersProvider) + .subscribeBy(::errorLog) { + mainRouter.navigateBack() + } + } else { + // Determine target page for swipe animation (next or previous) + val targetPage = if (currentIndex < ids.size - 1) { + currentIndex + 1 + } else { + currentIndex - 1 + } + + // Trigger swipe animation to next/previous page + updateState { + (it as? GalleryDetailState.Content)?.copy(animateToPage = targetPage) ?: it + } + + // After animation completes, delete and update state + !deleteGalleryItemUseCase(deletedId) + .delay(350, TimeUnit.MILLISECONDS) + .subscribeOnMainThread(schedulersProvider) + .subscribeBy(::errorLog) { + val nextIndex = currentIndex.coerceAtMost(newIds.size - 1) + val nextId = newIds[nextIndex] + + updateState { + (it as? GalleryDetailState.Content)?.copy( + galleryIds = newIds, + currentIndex = nextIndex, + animateToPage = null + ) ?: it.withGalleryIds(newIds, nextIndex) + } + loadItem(nextId) + } + } } private fun setActiveModal(dialog: Modal) = updateState { @@ -142,7 +285,7 @@ class GalleryDetailViewModel( private fun sendPromptToGenerationScreen(screenType: AiGenerationResult.Type) { val state = (currentState as? GalleryDetailState.Content) ?: return - !getGenerationResult(itemId) + !getGenerationResult(currentItemId) .subscribeOnMainThread(schedulersProvider) .doFinally { mainRouter.navigateBack() } .subscribeBy(::errorLog) { ai -> @@ -155,7 +298,16 @@ class GalleryDetailViewModel( } - private fun toggleVisibility() = !toggleImageVisibilityUseCase(itemId) + private fun sendPromptToFalAi() { + !getGenerationResult(currentItemId) + .subscribeOnMainThread(schedulersProvider) + .doFinally { mainRouter.navigateBack() } + .subscribeBy(::errorLog) { ai -> + generationFormUpdateEvent.updateFalAi(ai) + } + } + + private fun toggleVisibility() = !toggleImageVisibilityUseCase(currentItemId) .subscribeOnMainThread(schedulersProvider) .subscribeBy(::errorLog) { hidden -> updateState { it.withHiddenState(hidden) } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryEffect.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryEffect.kt index b3cacb1fb..a67ae1207 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryEffect.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryEffect.kt @@ -11,4 +11,6 @@ sealed interface GalleryEffect : MviEffect { data class Share(val zipFile: File) : GalleryEffect data class OpenUri(val uri: Uri) : GalleryEffect + + data object AllImagesSavedToGallery : GalleryEffect } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryIntent.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryIntent.kt index 449a0b19c..51d3b7abd 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryIntent.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryIntent.kt @@ -34,10 +34,18 @@ sealed interface GalleryIntent : MviIntent { data object DismissDialog : GalleryIntent - data class OpenItem(val item: GalleryGridItemUi) : GalleryIntent + data class OpenItem(val item: GalleryGridItemUi, val index: Int) : GalleryIntent + + data object ClearScrollPosition : GalleryIntent data class OpenMediaStoreFolder(val uri: Uri) : GalleryIntent + sealed interface SaveToGallery : GalleryIntent { + enum class All : SaveToGallery { + Request, Confirm; + } + } + data class Drawer(val intent: DrawerIntent) : GalleryIntent data class ChangeSelectionMode(val flag: Boolean) : GalleryIntent diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryPagingSource.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryPagingSource.kt index ffcc80124..c2a2fa3ac 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryPagingSource.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryPagingSource.kt @@ -33,37 +33,48 @@ class GalleryPagingSource( offset = pageNext * Constants.PAGINATION_PAYLOAD_SIZE, ) .subscribeOn(schedulersProvider.computation) - .flatMapObservable { Observable.fromIterable(it) } + .flatMapObservable { list -> Observable.fromIterable(list) } .map { ai -> Triple(ai.id, ai.hidden, ai.image) } - .map { (id, hidden, base64) -> Triple(id, hidden, Input(base64)) } - .concatMapSingle { (id, hidden, input) -> - base64ToBitmapConverter(input).map { out -> Triple(id, hidden, out) } - } - .map(::mapOutputToUi) + .map { triple -> Triple(triple.first, triple.second, Input(triple.third)) } + // Use flatMap with maxConcurrency for parallel file loading + .flatMap( + { triple: Triple -> + base64ToBitmapConverter(triple.third) + .map { out -> Triple(triple.first, triple.second, out) } + .toObservable() + }, + MAX_CONCURRENT_LOADS, // maxConcurrency - load multiple images in parallel + ) + .map { triple -> mapOutputToUi(triple) } .toList() + // Sort by id descending to maintain order after parallel loading + .map { payload -> payload.sortedByDescending { item -> item.id } } .map { payload -> - LoadResult.Page( - data = payload, - prevKey = if (pageNext == FIRST_KEY) null else pageNext - 1, - nextKey = if (payload.isEmpty()) null else pageNext + 1, - ).let(GalleryPagingSource::Wrapper) + Wrapper( + LoadResult.Page( + data = payload, + prevKey = if (pageNext == FIRST_KEY) null else pageNext - 1, + nextKey = if (payload.isEmpty()) null else pageNext + 1, + ) + ) } - .onErrorReturn { t -> + .onErrorReturn { t: Throwable -> errorLog(t) Wrapper(LoadResult.Error(t)) } - .map(Wrapper::loadResult) + .map { wrapper -> wrapper.loadResult } } + private data class Wrapper(val loadResult: GalleryPagedResult) + private fun mapOutputToUi(output: Triple) = GalleryGridItemUi( output.first, output.third.bitmap, output.second, ) - private data class Wrapper(val loadResult: GalleryPagedResult) - companion object { const val FIRST_KEY = 0 + const val MAX_CONCURRENT_LOADS = 8 // Parallel image loading for smoother scrolling } } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryScreen.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryScreen.kt index ce4161914..fd45b0a00 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryScreen.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryScreen.kt @@ -7,6 +7,7 @@ package com.shifthackz.aisdv1.presentation.screen.gallery.list import android.content.Intent import android.provider.DocumentsContract +import android.widget.Toast import androidx.activity.compose.BackHandler import androidx.compose.animation.AnimatedContent import androidx.compose.animation.AnimatedVisibility @@ -14,6 +15,8 @@ import androidx.compose.animation.animateColorAsState import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut +import androidx.compose.animation.slideInVertically +import androidx.compose.animation.slideOutVertically import androidx.compose.animation.togetherWith import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.Image @@ -44,6 +47,7 @@ import androidx.compose.material.icons.filled.Delete import androidx.compose.material.icons.filled.FileOpen import androidx.compose.material.icons.filled.Menu import androidx.compose.material.icons.filled.MoreVert +import androidx.compose.material.icons.filled.Save import androidx.compose.material.icons.filled.VisibilityOff import androidx.compose.material3.CenterAlignedTopAppBar import androidx.compose.material3.Checkbox @@ -61,14 +65,20 @@ import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import kotlinx.coroutines.delay import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.BlurEffect import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.ColorFilter -import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext @@ -98,7 +108,6 @@ import com.shifthackz.aisdv1.presentation.widget.work.BackgroundWorkWidget import com.shifthackz.android.core.mvi.MviComponent import org.koin.androidx.compose.koinViewModel import org.koin.compose.koinInject -import kotlin.random.Random import com.shifthackz.aisdv1.core.localization.R as LocalizationR @Composable @@ -128,6 +137,14 @@ fun GalleryScreen() { GalleryEffect.Refresh -> { lazyGalleryItems.refresh() } + + GalleryEffect.AllImagesSavedToGallery -> { + Toast.makeText( + context, + context.getString(LocalizationR.string.gallery_save_all_success), + Toast.LENGTH_SHORT, + ).show() + } } }, ) { state, intentHandler -> @@ -151,6 +168,47 @@ fun GalleryScreenContent( ) { val listState = rememberLazyGridState() + // Check if we have a scroll target on first composition (returning from detail) + val hasScrollTarget = state.scrollToItemIndex != null + var isRestoringScroll by remember { mutableStateOf(hasScrollTarget) } + + android.util.Log.d("GalleryScroll", "Composition: hasScrollTarget=$hasScrollTarget, isRestoringScroll=$isRestoringScroll, scrollToItemIndex=${state.scrollToItemIndex}") + + // Scroll to saved position + LaunchedEffect(Unit) { + android.util.Log.d("GalleryScroll", "LaunchedEffect started, scrollToItemIndex=${state.scrollToItemIndex}") + val targetIndex = state.scrollToItemIndex + if (targetIndex == null) { + android.util.Log.d("GalleryScroll", "No target, clearing isRestoringScroll") + isRestoringScroll = false + return@LaunchedEffect + } + + android.util.Log.d("GalleryScroll", "Waiting for items, target=$targetIndex") + // Wait for initial load + while (lazyGalleryItems.itemCount == 0) { + delay(50) + } + + // Keep loading pages until we have enough items + while (lazyGalleryItems.itemCount <= targetIndex) { + if (lazyGalleryItems.itemCount > 0) { + lazyGalleryItems[lazyGalleryItems.itemCount - 1] + } + delay(100) + } + + // Scroll to target position + android.util.Log.d("GalleryScroll", "Scrolling to $targetIndex") + listState.scrollToItem(targetIndex) + android.util.Log.d("GalleryScroll", "Scroll done, clearing flags") + isRestoringScroll = false + processIntent(GalleryIntent.ClearScrollPosition) + } + + // Show shimmer while restoring + val showShimmerForScrollRestore = isRestoringScroll + val emptyStatePredicate: () -> Boolean = { lazyGalleryItems.loadState.refresh is LoadState.NotLoading && lazyGalleryItems.itemCount == 0 @@ -316,6 +374,23 @@ fun GalleryScreenContent( processIntent(GalleryIntent.Export.All.Request) }, ) + DropdownMenuItem( + leadingIcon = { + Icon( + imageVector = Icons.Default.Save, + contentDescription = "Save to Gallery", + ) + }, + text = { + Text( + text = stringResource(id = LocalizationR.string.gallery_menu_save_all) + ) + }, + onClick = { + processIntent(GalleryIntent.Dropdown.Close) + processIntent(GalleryIntent.SaveToGallery.All.Request) + }, + ) DropdownMenuItem( leadingIcon = { Icon( @@ -350,47 +425,47 @@ fun GalleryScreenContent( enter = fadeIn(), exit = fadeOut(), ) { - Row( - modifier = Modifier - .fillMaxWidth() - .background(MaterialTheme.colorScheme.surfaceTint), - verticalAlignment = Alignment.CenterVertically, - ) { - Text( + Row( modifier = Modifier - .padding(start = 16.dp), - text = stringResource( - id = LocalizationR.string.gallery_menu_selected, - "${state.selection.size}", - ), - style = MaterialTheme.typography.bodyLarge, - lineHeight = 17.sp, - fontWeight = FontWeight.W400, - ) - Spacer(modifier = Modifier.weight(1f)) - TextButton( - modifier = Modifier.padding(end = 16.dp), - onClick = { - if (state.selection.isNotEmpty()) { - processIntent(GalleryIntent.UnselectAll) - } else { - processIntent(GalleryIntent.ChangeSelectionMode(false)) - } - }, + .fillMaxWidth() + .background(MaterialTheme.colorScheme.surfaceTint), + verticalAlignment = Alignment.CenterVertically, ) { - val resId = if (state.selection.isNotEmpty()) { - LocalizationR.string.gallery_menu_unselect_all - } else { - LocalizationR.string.cancel - } Text( - text = stringResource(resId).toUpperCase(Locale.current), - textAlign = TextAlign.Center, - color = LocalContentColor.current, + modifier = Modifier + .padding(start = 16.dp), + text = stringResource( + id = LocalizationR.string.gallery_menu_selected, + "${state.selection.size}", + ), + style = MaterialTheme.typography.bodyLarge, + lineHeight = 17.sp, + fontWeight = FontWeight.W400, ) + Spacer(modifier = Modifier.weight(1f)) + TextButton( + modifier = Modifier.padding(end = 16.dp), + onClick = { + if (state.selection.isNotEmpty()) { + processIntent(GalleryIntent.UnselectAll) + } else { + processIntent(GalleryIntent.ChangeSelectionMode(false)) + } + }, + ) { + val resId = if (state.selection.isNotEmpty()) { + LocalizationR.string.gallery_menu_unselect_all + } else { + LocalizationR.string.cancel + } + Text( + text = stringResource(resId).toUpperCase(Locale.current), + textAlign = TextAlign.Center, + color = LocalContentColor.current, + ) + } } } - } AnimatedVisibility( visible = state.mediaStoreInfo.isNotEmpty && !state.selectionMode, enter = fadeIn(), @@ -458,7 +533,8 @@ fun GalleryScreenContent( } } - else -> LazyVerticalGrid( + else -> Box(modifier = Modifier.fillMaxSize()) { + LazyVerticalGrid( modifier = Modifier .fillMaxSize() .padding(top = paddingValues.calculateTopPadding()), @@ -468,16 +544,24 @@ fun GalleryScreenContent( verticalArrangement = Arrangement.spacedBy(16.dp), state = listState, ) { - items(lazyGalleryItems) { item -> + items( + count = lazyGalleryItems.itemCount, + key = { index -> "${lazyGalleryItems.peek(index)?.id ?: "null"}_$index" }, + ) { index -> + val item = lazyGalleryItems[index] if (item != null) { val selected = state.selection.contains(item.id) GalleryUiItem( modifier = Modifier - .animateItem(tween(500)) - .shake( - enabled = state.selectionMode && !selected, - animationDurationMillis = 188, - animationStartOffset = Random.nextInt(0, 320), + .animateItem(tween(300)) + .then( + if (state.selectionMode && !selected) { + Modifier.shake( + enabled = true, + animationDurationMillis = 188, + animationStartOffset = (item.id % 320).toInt(), + ) + } else Modifier ), item = item, selectionMode = state.selectionMode, @@ -490,7 +574,7 @@ fun GalleryScreenContent( processIntent(GalleryIntent.ToggleItemSelection(item.id)) }, onClick = { - processIntent(GalleryIntent.OpenItem(it)) + processIntent(GalleryIntent.OpenItem(it, index)) }, ) } else { @@ -499,6 +583,36 @@ fun GalleryScreenContent( } items(2) { Spacer(modifier = Modifier.height(32.dp)) } } + // Shimmer overlay while restoring scroll position + AnimatedVisibility( + visible = showShimmerForScrollRestore, + enter = fadeIn(), + exit = fadeOut(), + ) { + LazyVerticalGrid( + modifier = Modifier + .fillMaxSize() + .background(MaterialTheme.colorScheme.background) + .padding(top = paddingValues.calculateTopPadding()), + columns = GridCells.Fixed(state.grid.size), + contentPadding = PaddingValues(16.dp), + horizontalArrangement = Arrangement.spacedBy(16.dp), + verticalArrangement = Arrangement.spacedBy(16.dp), + ) { + val max = when (state.grid) { + Grid.Fixed2 -> 6 + Grid.Fixed3 -> 12 + Grid.Fixed4 -> 20 + Grid.Fixed5 -> 30 + } + repeat(max) { + item(it) { + GalleryUiItemShimmer() + } + } + } + } + } } } ModalRenderer(screenModal = state.screenModal) { @@ -557,7 +671,7 @@ fun GalleryUiItem( } }, ), - bitmap = item.bitmap.asImageBitmap(), + bitmap = item.imageBitmap, // Use cached ImageBitmap contentScale = ContentScale.Crop, contentDescription = "gallery_item", ) diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryState.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryState.kt index 98420bb0b..cfa13b1a2 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryState.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryState.kt @@ -2,6 +2,8 @@ package com.shifthackz.aisdv1.presentation.screen.gallery.list import android.graphics.Bitmap import androidx.compose.runtime.Immutable +import androidx.compose.ui.graphics.ImageBitmap +import androidx.compose.ui.graphics.asImageBitmap import com.shifthackz.aisdv1.domain.entity.Grid import com.shifthackz.aisdv1.domain.entity.MediaStoreInfo import com.shifthackz.aisdv1.presentation.model.Modal @@ -15,10 +17,19 @@ data class GalleryState( val selectionMode: Boolean = false, val selection: List = emptyList(), val grid: Grid = Grid.Fixed2, + val scrollToItemIndex: Int? = null, ) : MviState +@Immutable data class GalleryGridItemUi( val id: Long, val bitmap: Bitmap, val hidden: Boolean, -) +) { + // Cache ImageBitmap to avoid recreation on each recomposition + @Transient + private var _imageBitmap: ImageBitmap? = null + + val imageBitmap: ImageBitmap + get() = _imageBitmap ?: bitmap.asImageBitmap().also { _imageBitmap = it } +} diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryViewModel.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryViewModel.kt index d7b41b262..4101269a7 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryViewModel.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryViewModel.kt @@ -16,7 +16,9 @@ import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver import com.shifthackz.aisdv1.domain.preference.PreferenceManager import com.shifthackz.aisdv1.domain.usecase.gallery.DeleteAllGalleryUseCase import com.shifthackz.aisdv1.domain.usecase.gallery.DeleteGalleryItemsUseCase +import com.shifthackz.aisdv1.domain.usecase.gallery.GetAllGalleryUseCase import com.shifthackz.aisdv1.domain.usecase.gallery.GetMediaStoreInfoUseCase +import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway import com.shifthackz.aisdv1.domain.usecase.generation.GetGenerationResultPagedUseCase import com.shifthackz.aisdv1.presentation.model.Modal import com.shifthackz.aisdv1.presentation.navigation.router.drawer.DrawerRouter @@ -40,6 +42,8 @@ class GalleryViewModel( private val schedulersProvider: SchedulersProvider, private val mainRouter: MainRouter, private val drawerRouter: DrawerRouter, + private val mediaStoreGateway: MediaStoreGateway, + private val getAllGalleryUseCase: GetAllGalleryUseCase, ) : MviRxViewModel() { override val initialState = GalleryState() @@ -99,7 +103,16 @@ class GalleryViewModel( GalleryIntent.Export.Selection.Confirm -> launchGalleryExport(false) - is GalleryIntent.OpenItem -> mainRouter.navigateToGalleryDetails(intent.item.id) + is GalleryIntent.OpenItem -> { + android.util.Log.d("GalleryScroll", "OpenItem: saving index ${intent.index}") + updateState { it.copy(scrollToItemIndex = intent.index) } + mainRouter.navigateToGalleryDetails(intent.item.id) + } + + GalleryIntent.ClearScrollPosition -> { + android.util.Log.d("GalleryScroll", "ClearScrollPosition called") + updateState { it.copy(scrollToItemIndex = null) } + } is GalleryIntent.OpenMediaStoreFolder -> emitEffect(GalleryEffect.OpenUri(intent.uri)) @@ -156,6 +169,12 @@ class GalleryViewModel( GalleryIntent.Dropdown.Close -> updateState { it.copy(dropdownMenuShow = false) } + + GalleryIntent.SaveToGallery.All.Request -> setActiveModal( + Modal.ConfirmSaveToGallery(saveAll = true) + ) + + GalleryIntent.SaveToGallery.All.Confirm -> saveAllToGallery() } } @@ -194,4 +213,40 @@ class GalleryViewModel( private fun setActiveModal(dialog: Modal) = updateState { it.copy(screenModal = dialog, dropdownMenuShow = false) } + + private fun saveAllToGallery() { + !getAllGalleryUseCase() + .doOnSubscribe { setActiveModal(Modal.ExportInProgress) } + .flatMapObservable { io.reactivex.rxjava3.core.Observable.fromIterable(it) } + .flatMapSingle { item -> + base64ToBitmapConverter(Base64ToBitmapConverter.Input(item.image)) + .map { output -> item to output } + } + .flatMapCompletable { (item, output) -> + Completable.fromAction { + val stream = java.io.ByteArrayOutputStream() + output.bitmap.compress(android.graphics.Bitmap.CompressFormat.PNG, 100, stream) + mediaStoreGateway.exportToFile( + fileName = "sdai_${item.id}_${System.currentTimeMillis()}", + content = stream.toByteArray(), + ) + } + } + .subscribeOn(schedulersProvider.io) + .subscribeOnMainThread(schedulersProvider) + .subscribeBy( + onError = { t -> + setActiveModal( + Modal.Error( + (t.localizedMessage ?: "Something went wrong").asUiText() + ) + ) + errorLog(t) + }, + onComplete = { + setActiveModal(Modal.None) + emitEffect(GalleryEffect.AllImagesSavedToGallery) + } + ) + } } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintIntent.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintIntent.kt index 684266a43..a14c811cf 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintIntent.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintIntent.kt @@ -19,9 +19,13 @@ sealed interface InPaintIntent : MviIntent { data class DrawPathBmp(val bitmap: Bitmap?) : InPaintIntent enum class Action : InPaintIntent { - Undo, Clear; + Undo, Clear, ToggleDrawing, ResetZoom; } + data class UpdateZoomScale(val scale: Float) : InPaintIntent + + data class UpdateZoomOffset(val offsetX: Float, val offsetY: Float) : InPaintIntent + sealed interface Update : InPaintIntent { data class MaskBlur(val value: Int) : Update diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintState.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintState.kt index 211609497..31dccd25b 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintState.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintState.kt @@ -17,8 +17,15 @@ data class InPaintState( val selectedTab: Tab = Tab.IMAGE, val size: Int = 16, val model: InPaintModel = InPaintModel(), + val zoomScale: Float = 1f, + val zoomOffsetX: Float = 0f, + val zoomOffsetY: Float = 0f, + val isDrawing: Boolean = false, ) : MviState { + val isZoomed: Boolean + get() = zoomScale > 1.05f + enum class Tab( @StringRes val label: Int, @DrawableRes val iconRes: Int, diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintViewModel.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintViewModel.kt index 9fdaa7585..bbfda2154 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintViewModel.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintViewModel.kt @@ -120,6 +120,22 @@ class InPaintViewModel( model = state.model.copy(maskMode = intent.value) ) } + + InPaintIntent.Action.ToggleDrawing -> updateState { state -> + state.copy(isDrawing = !state.isDrawing) + } + + InPaintIntent.Action.ResetZoom -> updateState { state -> + state.copy(zoomScale = 1f, zoomOffsetX = 0f, zoomOffsetY = 0f) + } + + is InPaintIntent.UpdateZoomScale -> updateState { state -> + state.copy(zoomScale = intent.scale) + } + + is InPaintIntent.UpdateZoomOffset -> updateState { state -> + state.copy(zoomOffsetX = intent.offsetX, zoomOffsetY = intent.offsetY) + } } } } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/components/InPaintComponent.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/components/InPaintComponent.kt index 98c45cbd1..185fea0eb 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/components/InPaintComponent.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/components/InPaintComponent.kt @@ -4,6 +4,7 @@ import android.graphics.Bitmap import android.graphics.Picture import androidx.compose.foundation.Canvas import androidx.compose.foundation.Image +import androidx.compose.foundation.gestures.detectTransformGestures import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize @@ -11,12 +12,15 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha +import androidx.compose.ui.draw.clipToBounds import androidx.compose.ui.draw.drawWithCache import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Color @@ -27,8 +31,10 @@ import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.graphics.drawscope.draw import androidx.compose.ui.graphics.drawscope.drawIntoCanvas +import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.graphics.nativeCanvas import androidx.compose.ui.input.pointer.PointerInputChange +import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.unit.dp import com.shifthackz.aisdv1.presentation.model.InPaintModel @@ -44,21 +50,77 @@ fun InPaintComponent( inPaint: InPaintModel = InPaintModel(), bitmap: Bitmap? = null, capWidth: Int = 16, + scale: Float = 1f, + offsetX: Float = 0f, + offsetY: Float = 0f, + onScaleChanged: (Float) -> Unit = {}, + onOffsetChanged: (Float, Float) -> Unit = { _, _ -> }, onPathDrawn: (Path) -> Unit = {}, onPathBitmapDrawn: (Bitmap?) -> Unit = {}, ) { val scope = rememberCoroutineScope() + val aspectRatio = bitmap?.let { + if (it.width > 0 && it.height > 0) it.width.toFloat() / it.height.toFloat() + else 1f + } ?: 1f + + // Local zoom state for smooth gestures + var localScale by remember { mutableFloatStateOf(scale) } + var localOffsetX by remember { mutableFloatStateOf(offsetX) } + var localOffsetY by remember { mutableFloatStateOf(offsetY) } + + // Sync with external state + LaunchedEffect(scale, offsetX, offsetY) { + localScale = scale + localOffsetX = offsetX + localOffsetY = offsetY + } + Box( modifier = modifier .fillMaxWidth() - .aspectRatio(1f), + .aspectRatio(aspectRatio) + .clipToBounds() + .let { + if (!drawMode) { + it.pointerInput(Unit) { + detectTransformGestures { _, pan, zoom, _ -> + val newScale = (localScale * zoom).coerceIn(1f, 5f) + localScale = newScale + onScaleChanged(newScale) + if (newScale > 1f) { + localOffsetX += pan.x + localOffsetY += pan.y + onOffsetChanged(localOffsetX, localOffsetY) + } else { + localOffsetX = 0f + localOffsetY = 0f + onOffsetChanged(0f, 0f) + } + } + } + } else { + it + } + }, + contentAlignment = Alignment.Center, ) { + Box( + modifier = Modifier + .fillMaxSize() + .graphicsLayer( + scaleX = localScale, + scaleY = localScale, + translationX = localOffsetX, + translationY = localOffsetY, + ), + ) { bitmap?.takeIf { it.width != 0 && it.height != 0 }?.asImageBitmap()?.let { Image( modifier = Modifier.fillMaxSize(), bitmap = it, contentDescription = null, - contentScale = ContentScale.FillBounds, + contentScale = ContentScale.Fit, ) } inPaint.bitmap?.takeIf { it.width != 0 && it.height != 0 }?.asImageBitmap()?.let { @@ -67,7 +129,7 @@ fun InPaintComponent( .fillMaxSize(), bitmap = it, contentDescription = null, - contentScale = ContentScale.FillBounds, + contentScale = ContentScale.Fit, ) } var motionEvent by remember { mutableStateOf(MotionEvent.Idle) } @@ -173,6 +235,7 @@ fun InPaintComponent( inPaint.paths.forEach { (p, c) -> draw(p, c) } draw(currentPath, capWidth) } + } } } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/forms/ImageDrawForm.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/forms/ImageDrawForm.kt index ee730e5af..75f40c0bc 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/forms/ImageDrawForm.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/forms/ImageDrawForm.kt @@ -2,12 +2,25 @@ package com.shifthackz.aisdv1.presentation.screen.inpaint.forms import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Draw +import androidx.compose.material.icons.filled.ZoomOutMap +import androidx.compose.material.icons.outlined.Draw +import androidx.compose.material3.FilledIconButton +import androidx.compose.material3.FilledTonalIconButton +import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp import com.shifthackz.aisdv1.presentation.screen.inpaint.InPaintIntent import com.shifthackz.aisdv1.presentation.screen.inpaint.InPaintState import com.shifthackz.aisdv1.presentation.screen.inpaint.components.InPaintComponent @@ -18,18 +31,70 @@ fun ImageDrawForm( state: InPaintState = InPaintState(), processIntent: (InPaintIntent) -> Unit = {}, ) { - Column( + Box( modifier = modifier.fillMaxSize().background(MaterialTheme.colorScheme.surface), - verticalArrangement = Arrangement.Center, - horizontalAlignment = Alignment.CenterHorizontally, ) { - InPaintComponent( - drawMode = true, - inPaint = state.model, - bitmap = state.bitmap, - capWidth = state.size, - onPathDrawn = { processIntent(InPaintIntent.DrawPath(it)) }, - onPathBitmapDrawn = { processIntent(InPaintIntent.DrawPathBmp(it)) }, - ) + Column( + modifier = Modifier.fillMaxSize(), + verticalArrangement = Arrangement.Center, + horizontalAlignment = Alignment.CenterHorizontally, + ) { + InPaintComponent( + drawMode = state.isDrawing, + inPaint = state.model, + bitmap = state.bitmap, + capWidth = state.size, + scale = state.zoomScale, + offsetX = state.zoomOffsetX, + offsetY = state.zoomOffsetY, + onScaleChanged = { processIntent(InPaintIntent.UpdateZoomScale(it)) }, + onOffsetChanged = { x, y -> processIntent(InPaintIntent.UpdateZoomOffset(x, y)) }, + onPathDrawn = { processIntent(InPaintIntent.DrawPath(it)) }, + onPathBitmapDrawn = { processIntent(InPaintIntent.DrawPathBmp(it)) }, + ) + } + + // Control buttons overlay + Row( + modifier = Modifier + .align(Alignment.BottomEnd) + .padding(8.dp), + horizontalArrangement = Arrangement.spacedBy(4.dp), + ) { + FilledTonalIconButton( + onClick = { processIntent(InPaintIntent.Action.ResetZoom) }, + modifier = Modifier.size(40.dp), + shape = CircleShape, + enabled = state.isZoomed, + ) { + Icon( + imageVector = Icons.Default.ZoomOutMap, + contentDescription = "Reset Zoom", + ) + } + if (state.isDrawing) { + FilledIconButton( + onClick = { processIntent(InPaintIntent.Action.ToggleDrawing) }, + modifier = Modifier.size(40.dp), + shape = CircleShape, + ) { + Icon( + imageVector = Icons.Default.Draw, + contentDescription = "Drawing Mode", + ) + } + } else { + FilledTonalIconButton( + onClick = { processIntent(InPaintIntent.Action.ToggleDrawing) }, + modifier = Modifier.size(40.dp), + shape = CircleShape, + ) { + Icon( + imageVector = Icons.Outlined.Draw, + contentDescription = "Drawing Mode", + ) + } + } + } } } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerEffect.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerEffect.kt new file mode 100644 index 000000000..ef816c6c5 --- /dev/null +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerEffect.kt @@ -0,0 +1,8 @@ +package com.shifthackz.aisdv1.presentation.screen.logger + +import com.shifthackz.android.core.mvi.MviEffect + +sealed interface LoggerEffect : MviEffect { + data class CopyToClipboard(val text: String) : LoggerEffect + data class ShareLog(val text: String) : LoggerEffect +} diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerIntent.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerIntent.kt index a1fc441c1..d5ec6f147 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerIntent.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerIntent.kt @@ -6,5 +6,9 @@ sealed interface LoggerIntent : MviIntent { data object ReadLogs : LoggerIntent + data object CopyLogs : LoggerIntent + + data object ShareLogs : LoggerIntent + data object NavigateBack : LoggerIntent } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerScreen.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerScreen.kt index 5544f4809..e52513d3e 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerScreen.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerScreen.kt @@ -22,7 +22,10 @@ import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.outlined.ArrowBack import androidx.compose.material.icons.filled.ArrowDownward import androidx.compose.material.icons.filled.ArrowUpward +import androidx.compose.material.icons.filled.ContentCopy +import androidx.compose.material.icons.filled.Delete import androidx.compose.material.icons.filled.Refresh +import androidx.compose.material.icons.filled.Save import androidx.compose.material3.CenterAlignedTopAppBar import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.ExperimentalMaterial3Api @@ -36,21 +39,41 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp +import com.shifthackz.aisdv1.core.common.extensions.copyToClipboard import com.shifthackz.android.core.mvi.MviComponent import kotlinx.coroutines.launch import org.koin.androidx.compose.koinViewModel +import android.content.Intent import com.shifthackz.aisdv1.core.localization.R as LocalizationR @Composable fun LoggerScreen() { + val context = LocalContext.current MviComponent( viewModel = koinViewModel(), + processEffect = { effect -> + when (effect) { + is LoggerEffect.CopyToClipboard -> { + context.copyToClipboard(effect.text) + } + is LoggerEffect.ShareLog -> { + val sendIntent: Intent = Intent().apply { + action = Intent.ACTION_SEND + putExtra(Intent.EXTRA_TEXT, effect.text) + type = "text/plain" + } + val shareIntent = Intent.createChooser(sendIntent, null) + context.startActivity(shareIntent) + } + } + } ) { state, processIntent -> LoggerScreenContent( state = state, @@ -93,17 +116,41 @@ private fun LoggerScreenContent( enter = fadeIn(), exit = fadeOut(), ) { - IconButton( - onClick = { - processIntent(LoggerIntent.ReadLogs) - }, - content = { - Icon( - Icons.Default.Refresh, - contentDescription = "Refresh", - ) - }, - ) + Row { + IconButton( + onClick = { + processIntent(LoggerIntent.CopyLogs) + }, + content = { + Icon( + Icons.Default.ContentCopy, + contentDescription = "Copy", + ) + }, + ) + IconButton( + onClick = { + processIntent(LoggerIntent.ShareLogs) + }, + content = { + Icon( + Icons.Default.Save, + contentDescription = "Save", + ) + }, + ) + IconButton( + onClick = { + processIntent(LoggerIntent.ReadLogs) + }, + content = { + Icon( + Icons.Default.Refresh, + contentDescription = "Refresh", + ) + }, + ) + } } } ) diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerViewModel.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerViewModel.kt index 400d6a44a..1e8db3aa7 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerViewModel.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerViewModel.kt @@ -5,14 +5,13 @@ import com.shifthackz.aisdv1.core.common.log.FileLoggingTree import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter -import com.shifthackz.android.core.mvi.EmptyEffect import java.io.File class LoggerViewModel( dispatchersProvider: DispatchersProvider, private val fileProviderDescriptor: FileProviderDescriptor, private val mainRouter: MainRouter, -) : MviRxViewModel() { +) : MviRxViewModel() { override val initialState = LoggerState() @@ -25,6 +24,8 @@ class LoggerViewModel( override fun processIntent(intent: LoggerIntent) { when (intent) { LoggerIntent.ReadLogs -> readLogs() + LoggerIntent.CopyLogs -> emitEffect(LoggerEffect.CopyToClipboard(state.value.text)) + LoggerIntent.ShareLogs -> emitEffect(LoggerEffect.ShareLog(state.value.text)) LoggerIntent.NavigateBack -> mainRouter.navigateBack() } } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/image/ZoomableImage.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/image/ZoomableImage.kt index bb955d1d3..29d8b8d01 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/image/ZoomableImage.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/image/ZoomableImage.kt @@ -2,29 +2,41 @@ package com.shifthackz.aisdv1.presentation.widget.image import android.graphics.Bitmap import androidx.annotation.DrawableRes +import androidx.compose.animation.core.Animatable +import androidx.compose.animation.core.VectorConverter +import androidx.compose.animation.core.tween import androidx.compose.foundation.Image import androidx.compose.foundation.background -import androidx.compose.foundation.gestures.detectTransformGestures +import androidx.compose.foundation.gestures.awaitEachGesture +import androidx.compose.foundation.gestures.awaitFirstDown +import androidx.compose.foundation.gestures.calculatePan +import androidx.compose.foundation.gestures.calculateZoom +import androidx.compose.foundation.gestures.waitForUpOrCancellation import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.material3.MaterialTheme import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableFloatStateOf +import androidx.compose.runtime.mutableLongStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.BlurEffect import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.graphics.graphicsLayer import androidx.compose.ui.input.pointer.pointerInput +import androidx.compose.ui.input.pointer.positionChanged import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview +import kotlinx.coroutines.launch import com.shifthackz.aisdv1.presentation.R as PresentationR sealed interface ZoomableImageSource { @@ -46,38 +58,130 @@ fun ZoomableImage( maxScale: Float = 6f, hideImage: Boolean = false, hideBlurRadius: Float = 69f, + consumeGesturesWhenNotZoomed: Boolean = true, + onTap: () -> Unit = {}, ) { val configuration = LocalConfiguration.current + val density = LocalDensity.current.density val width = configuration.screenWidthDp + val scope = rememberCoroutineScope() - val scale = remember { mutableFloatStateOf(calculateInitialScale(source, width)) } -// val rotationState = remember { mutableStateOf(1f) } + val initialScale = remember(source, density) { calculateInitialScale(source, width, density) } + val scale = remember { Animatable(initialScale) } + val offset = remember { Animatable(Offset.Zero, Offset.VectorConverter) } - var offsetX by remember { mutableFloatStateOf(0f) } - var offsetY by remember { mutableFloatStateOf(0f) } + // Threshold to consider image as "zoomed" - slightly above initial scale + val zoomThreshold = initialScale * 1.05f + + // Target scale for double-tap zoom (2x from initial) + val doubleTapScale = initialScale * 2f + + // For double-tap detection + var lastTapTime by remember { mutableLongStateOf(0L) } + val doubleTapTimeout = 300L + val tapMovementThreshold = 50f Box( modifier = modifier .clip(RectangleShape) .fillMaxSize() .background(backgroundColor) - .pointerInput(Unit) { - detectTransformGestures { _, pan, zoom, _ -> - scale.value *= zoom - //rotationState.value += rotation - offsetX += pan.x * zoom - offsetY += pan.y * zoom + .pointerInput(initialScale, doubleTapScale, zoomThreshold, consumeGesturesWhenNotZoomed) { + awaitEachGesture { + val down = awaitFirstDown(requireUnconsumed = false) + val downTime = System.currentTimeMillis() + val downPosition = down.position + var totalMovement = Offset.Zero + var wasPinch = false + var wasMovement = false + + do { + val event = awaitPointerEvent() + val zoom = event.calculateZoom() + val pan = event.calculatePan() + + // Check if this is a pinch gesture (2+ fingers) + val isPinch = event.changes.size >= 2 + if (isPinch) wasPinch = true + + totalMovement += pan + val movedSignificantly = totalMovement.getDistance() > tapMovementThreshold + if (movedSignificantly) wasMovement = true + + // Calculate new scale + val newScale = scale.value * zoom + val isZoomed = scale.value > zoomThreshold + + // Apply zoom (always allow pinch-to-zoom) + if (isPinch) { + scope.launch { + scale.snapTo(newScale.coerceIn(minScale, maxScale)) + offset.snapTo( + Offset( + offset.value.x + pan.x * zoom, + offset.value.y + pan.y * zoom + ) + ) + } + event.changes.forEach { if (it.positionChanged()) it.consume() } + } else if (movedSignificantly && (isZoomed || consumeGesturesWhenNotZoomed)) { + // Single finger pan - only consume if zoomed or explicitly allowed + scope.launch { + offset.snapTo( + Offset( + offset.value.x + pan.x, + offset.value.y + pan.y + ) + ) + } + event.changes.forEach { if (it.positionChanged()) it.consume() } + } + // If not zoomed and consumeGesturesWhenNotZoomed=false, + // don't consume - let parent (HorizontalPager) handle it + } while (event.changes.any { it.pressed }) + + // Handle taps only if no significant movement or pinch occurred + if (!wasPinch && !wasMovement) { + val currentTime = System.currentTimeMillis() + val timeSinceLastTap = currentTime - lastTapTime + + if (timeSinceLastTap < doubleTapTimeout) { + // Double tap detected + lastTapTime = 0L + scope.launch { + if (scale.value > zoomThreshold) { + // Already zoomed - reset to initial scale with animation + launch { scale.animateTo(initialScale, tween(300)) } + launch { offset.animateTo(Offset.Zero, tween(300)) } + } else { + // Not zoomed - zoom to 2x with animation + scale.animateTo(doubleTapScale.coerceAtMost(maxScale), tween(300)) + } + } + } else { + // Single tap - wait a bit to see if it's a double tap + lastTapTime = currentTime + scope.launch { + kotlinx.coroutines.delay(doubleTapTimeout) + if (lastTapTime == currentTime) { + // No second tap came, it's a single tap + onTap() + } + } + } + } } }, ) { + val effectiveMinScale = maxOf(minScale, initialScale) + val currentScale = scale.value val imageModifier = Modifier .align(Alignment.Center) .graphicsLayer( - scaleX = maxOf(minScale, minOf(maxScale, scale.floatValue)), - scaleY = maxOf(minScale, minOf(maxScale, scale.floatValue)), - //rotationZ = rotationState.value, - translationX = offsetX, - translationY = offsetY, + scaleX = maxOf(effectiveMinScale, minOf(maxScale, currentScale)), + scaleY = maxOf(effectiveMinScale, minOf(maxScale, currentScale)), + translationX = offset.value.x, + translationY = offset.value.y, ) .then( if (!hideImage) Modifier @@ -117,11 +221,12 @@ fun ZoomableImage( private fun calculateInitialScale( source: ZoomableImageSource, - width: Int, + screenWidthDp: Int, + density: Float, ): Float { if (source is ZoomableImageSource.Bmp) { - val initialScale = (width.toFloat() / source.bitmap.width.toFloat()) - return initialScale + 1f + val screenWidthPx = screenWidthDp * density + return screenWidthPx / source.bitmap.width.toFloat() } return 1f } From 509fae69bc2d86d10604ed68168921a067d89460 Mon Sep 17 00:00:00 2001 From: crim50n Date: Mon, 29 Dec 2025 22:48:24 +0300 Subject: [PATCH 05/42] feat: add Fal.AI as new generation backend with FLUX models support --- app/build.gradle.kts | 2 + .../falai-endpoints/flux-2/edit/openapi.json | 1 + .../flux-2/flash/edit/openapi.json | 1 + .../falai-endpoints/flux-2/flash/openapi.json | 1 + .../falai-endpoints/flux-2/openapi.json | 1 + .../flux-kontext/dev/openapi.json | 441 ++++++++ .../flux-lora/image-to-image/openapi.json | 1 + .../flux-lora/inpainting/openapi.json | 1 + .../falai-endpoints/flux-lora/openapi.json | 458 +++++++++ .../flux/dev/image-to-image/openapi.json | 1 + .../falai-endpoints/flux/dev/openapi.json | 1 + .../flux/dev/redux/openapi.json | 1 + .../falai-endpoints/flux/schnell/openapi.json | 1 + .../flux/schnell/redux/openapi.json | 1 + .../aisdv1/app/di/ProvidersModule.kt | 7 + .../aisdv1/core/common/links/LinksProvider.kt | 1 + .../data/core/CoreGenerationRepository.kt | 32 +- .../aisdv1/data/di/LocalDataSourceModule.kt | 8 + .../aisdv1/data/di/RemoteDataSourceModule.kt | 8 +- .../aisdv1/data/di/RepositoryModule.kt | 9 + .../local/FalAiEndpointBuiltInDataSource.kt | 54 + .../local/FalAiEndpointLocalDataSource.kt | 37 + .../data/mappers/FalAiEndpointMappers.kt | 103 ++ .../aisdv1/data/mappers/FalAiOpenApiParser.kt | 337 ++++++ .../data/preference/PreferenceManagerImpl.kt | 47 +- .../remote/FalAiEndpointRemoteDataSource.kt | 34 + .../remote/FalAiGenerationRemoteDataSource.kt | 488 +++++++++ .../repository/FalAiEndpointRepositoryImpl.kt | 72 ++ .../FalAiGenerationRepositoryImpl.kt | 27 + .../HordeGenerationRepositoryImpl.kt | 3 + .../HuggingFaceGenerationRepositoryImpl.kt | 3 + .../LocalDiffusionGenerationRepositoryImpl.kt | 3 + .../MediaPipeGenerationRepositoryImpl.kt | 3 + .../OpenAiGenerationRepositoryImpl.kt | 3 + .../StabilityAiGenerationRepositoryImpl.kt | 3 + ...StableDiffusionGenerationRepositoryImpl.kt | 3 + .../SwarmUiGenerationRepositoryImpl.kt | 3 + .../datasource/FalAiEndpointDataSource.kt | 34 + .../datasource/FalAiGenerationDataSource.kt | 21 + .../aisdv1/domain/di/DomainModule.kt | 15 + .../aisdv1/domain/entity/Configuration.kt | 1 + .../aisdv1/domain/entity/FalAiEndpoint.kt | 97 ++ .../aisdv1/domain/entity/FalAiPayload.kt | 6 + .../aisdv1/domain/entity/ServerSource.kt | 8 + .../aisdv1/domain/entity/Settings.kt | 1 + .../feature/work/BackgroundTaskManager.kt | 3 + .../settings/SetupConnectionInterActor.kt | 2 + .../settings/SetupConnectionInterActorImpl.kt | 2 + .../domain/preference/PreferenceManager.kt | 7 + .../repository/FalAiEndpointRepository.kt | 49 + .../repository/FalAiGenerationRepository.kt | 12 + .../connectivity/TestFalAiApiKeyUseCase.kt | 7 + .../TestFalAiApiKeyUseCaseImpl.kt | 10 + .../generation/FalAiGenerationUseCase.kt | 9 + .../generation/FalAiGenerationUseCaseImpl.kt | 30 + .../generation/TextToImageUseCaseImpl.kt | 3 + .../usecase/settings/ConnectToFalAiUseCase.kt | 7 + .../settings/ConnectToFalAiUseCaseImpl.kt | 45 + .../settings/GetConfigurationUseCaseImpl.kt | 1 + .../SetServerConfigurationUseCaseImpl.kt | 1 + feature/work/build.gradle.kts | 1 + .../aisdv1/work/BackgroundTaskManagerImpl.kt | 18 + .../com/shifthackz/aisdv1/work/Constants.kt | 3 + .../aisdv1/work/core/NotificationWorker.kt | 30 + .../shifthackz/aisdv1/work/core/Rx3Worker.kt | 2 +- .../aisdv1/work/di/SdaiWorkerFactory.kt | 17 + .../work/mappers/FalAiPayloadMappers.kt | 36 + .../shifthackz/aisdv1/work/task/FalAiTask.kt | 114 ++ .../aisdv1/network/api/falai/FalAiApi.kt | 55 + .../aisdv1/network/di/NetworkModule.kt | 7 + .../network/qualifiers/ApiUrlProvider.kt | 1 + .../network/qualifiers/NetworkPrefixes.kt | 1 + .../request/FalAiTextToImageRequest.kt | 43 + .../aisdv1/network/response/FalAiResponses.kt | 96 ++ .../aisdv1/presentation/di/ViewModelModule.kt | 7 + .../presentation/modal/ModalRenderer.kt | 12 + .../aisdv1/presentation/model/FalAiState.kt | 92 ++ .../aisdv1/presentation/model/Modal.kt | 2 + .../navigation/NavigationRoute.kt | 3 + .../navigation/graph/DrawerNavGraph.kt | 8 +- .../navigation/graph/HomeNavGraph.kt | 53 +- .../screen/falai/FalAiGenerationEffect.kt | 5 + .../screen/falai/FalAiGenerationIntent.kt | 26 + .../screen/falai/FalAiGenerationScreen.kt | 192 ++++ .../screen/falai/FalAiGenerationState.kt | 28 + .../screen/falai/FalAiGenerationViewModel.kt | 439 ++++++++ .../screen/home/HomeNavigationScreen.kt | 4 + .../screen/home/HomeNavigationViewModel.kt | 8 + .../screen/settings/SettingsScreen.kt | 1 + .../screen/setup/ServerSetupIntent.kt | 9 + .../screen/setup/ServerSetupState.kt | 12 + .../screen/setup/ServerSetupViewModel.kt | 48 + .../components/ConfigurationModeButton.kt | 2 + .../screen/setup/forms/FalAiForm.kt | 73 ++ .../screen/setup/steps/ConfigurationStep.kt | 6 + .../aisdv1/presentation/utils/Constants.kt | 3 +- .../dialog/GenerationImageResultDialog.kt | 2 +- .../widget/engine/EngineSelectionComponent.kt | 1 + .../widget/falai/FalAiDynamicForm.kt | 249 +++++ .../widget/falai/FalAiInpaintField.kt | 249 +++++ .../widget/falai/FalAiPropertyField.kt | 973 ++++++++++++++++++ .../widget/source/ServerSourceLabel.kt | 1 + .../db/persistent/PersistentDatabase.kt | 13 +- .../contract/FalAiEndpointContract.kt | 16 + .../db/persistent/dao/FalAiEndpointDao.kt | 33 + .../persistent/entity/FalAiEndpointEntity.kt | 43 + .../aisdv1/storage/di/DatabaseModule.kt | 1 + 107 files changed, 5596 insertions(+), 13 deletions(-) create mode 100644 app/src/main/assets/falai-endpoints/flux-2/edit/openapi.json create mode 100644 app/src/main/assets/falai-endpoints/flux-2/flash/edit/openapi.json create mode 100644 app/src/main/assets/falai-endpoints/flux-2/flash/openapi.json create mode 100644 app/src/main/assets/falai-endpoints/flux-2/openapi.json create mode 100644 app/src/main/assets/falai-endpoints/flux-kontext/dev/openapi.json create mode 100644 app/src/main/assets/falai-endpoints/flux-lora/image-to-image/openapi.json create mode 100644 app/src/main/assets/falai-endpoints/flux-lora/inpainting/openapi.json create mode 100644 app/src/main/assets/falai-endpoints/flux-lora/openapi.json create mode 100644 app/src/main/assets/falai-endpoints/flux/dev/image-to-image/openapi.json create mode 100644 app/src/main/assets/falai-endpoints/flux/dev/openapi.json create mode 100644 app/src/main/assets/falai-endpoints/flux/dev/redux/openapi.json create mode 100644 app/src/main/assets/falai-endpoints/flux/schnell/openapi.json create mode 100644 app/src/main/assets/falai-endpoints/flux/schnell/redux/openapi.json create mode 100644 data/src/main/java/com/shifthackz/aisdv1/data/local/FalAiEndpointBuiltInDataSource.kt create mode 100644 data/src/main/java/com/shifthackz/aisdv1/data/local/FalAiEndpointLocalDataSource.kt create mode 100644 data/src/main/java/com/shifthackz/aisdv1/data/mappers/FalAiEndpointMappers.kt create mode 100644 data/src/main/java/com/shifthackz/aisdv1/data/mappers/FalAiOpenApiParser.kt create mode 100644 data/src/main/java/com/shifthackz/aisdv1/data/remote/FalAiEndpointRemoteDataSource.kt create mode 100644 data/src/main/java/com/shifthackz/aisdv1/data/remote/FalAiGenerationRemoteDataSource.kt create mode 100644 data/src/main/java/com/shifthackz/aisdv1/data/repository/FalAiEndpointRepositoryImpl.kt create mode 100644 data/src/main/java/com/shifthackz/aisdv1/data/repository/FalAiGenerationRepositoryImpl.kt create mode 100644 domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/FalAiEndpointDataSource.kt create mode 100644 domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/FalAiGenerationDataSource.kt create mode 100644 domain/src/main/java/com/shifthackz/aisdv1/domain/entity/FalAiEndpoint.kt create mode 100644 domain/src/main/java/com/shifthackz/aisdv1/domain/entity/FalAiPayload.kt create mode 100644 domain/src/main/java/com/shifthackz/aisdv1/domain/repository/FalAiEndpointRepository.kt create mode 100644 domain/src/main/java/com/shifthackz/aisdv1/domain/repository/FalAiGenerationRepository.kt create mode 100644 domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestFalAiApiKeyUseCase.kt create mode 100644 domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestFalAiApiKeyUseCaseImpl.kt create mode 100644 domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/FalAiGenerationUseCase.kt create mode 100644 domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/FalAiGenerationUseCaseImpl.kt create mode 100644 domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToFalAiUseCase.kt create mode 100644 domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToFalAiUseCaseImpl.kt create mode 100644 feature/work/src/main/java/com/shifthackz/aisdv1/work/mappers/FalAiPayloadMappers.kt create mode 100644 feature/work/src/main/java/com/shifthackz/aisdv1/work/task/FalAiTask.kt create mode 100644 network/src/main/java/com/shifthackz/aisdv1/network/api/falai/FalAiApi.kt create mode 100644 network/src/main/java/com/shifthackz/aisdv1/network/request/FalAiTextToImageRequest.kt create mode 100644 network/src/main/java/com/shifthackz/aisdv1/network/response/FalAiResponses.kt create mode 100644 presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/FalAiState.kt create mode 100644 presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationEffect.kt create mode 100644 presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationIntent.kt create mode 100644 presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationScreen.kt create mode 100644 presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationState.kt create mode 100644 presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationViewModel.kt create mode 100644 presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/FalAiForm.kt create mode 100644 presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/falai/FalAiDynamicForm.kt create mode 100644 presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/falai/FalAiInpaintField.kt create mode 100644 presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/falai/FalAiPropertyField.kt create mode 100644 storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/contract/FalAiEndpointContract.kt create mode 100644 storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/dao/FalAiEndpointDao.kt create mode 100644 storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/entity/FalAiEndpointEntity.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 0a04367b9..69a2547ab 100755 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -26,11 +26,13 @@ android { buildConfigField("String", "HORDE_AI_URL", "\"https://stablehorde.net/\"") buildConfigField("String", "OPEN_AI_URL", "\"https://api.openai.com/\"") buildConfigField("String", "STABILITY_AI_URL", "\"https://api.stability.ai/\"") + buildConfigField("String", "FAL_AI_URL", "\"https://queue.fal.run/\"") buildConfigField("String", "HORDE_AI_SIGN_UP_URL", "\"https://stablehorde.net/register\"") buildConfigField("String", "HUGGING_FACE_INFO_URL", "\"https://huggingface.co/docs/api-inference/index\"") buildConfigField("String", "OPEN_AI_INFO_URL", "\"https://platform.openai.com/api-keys\"") buildConfigField("String", "STABILITY_AI_INFO_URL", "\"https://platform.stability.ai/\"") + buildConfigField("String", "FAL_AI_INFO_URL", "\"https://fal.ai/dashboard/keys\"") buildConfigField("String", "UPDATE_API_URL", "\"https://sdai.moroz.cc\"") buildConfigField("String", "REPORT_API_URL", "\"https://sdai-report.moroz.cc\"") buildConfigField("String", "DEMO_MODE_API_URL", "\"https://sdai.moroz.cc\"") diff --git a/app/src/main/assets/falai-endpoints/flux-2/edit/openapi.json b/app/src/main/assets/falai-endpoints/flux-2/edit/openapi.json new file mode 100644 index 000000000..eed0aaf07 --- /dev/null +++ b/app/src/main/assets/falai-endpoints/flux-2/edit/openapi.json @@ -0,0 +1 @@ +{"openapi":"3.0.4","info":{"title":"Queue OpenAPI for fal-ai/flux-2/edit","version":"1.0.0","description":"The OpenAPI schema for the fal-ai/flux-2/edit queue.","x-fal-metadata":{"endpointId":"fal-ai/flux-2/edit","category":"image-to-image","thumbnailUrl":"https://v3b.fal.media/files/b/panda/zYjw3YqOcfDQymX7cvMBl_3d76809c48f74eb9abe3e17e1bdd5d2d.jpg","playgroundUrl":"https://fal.ai/models/fal-ai/flux-2/edit","documentationUrl":"https://fal.ai/models/fal-ai/flux-2/edit/api"}},"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Fal Key"}},"schemas":{"QueueStatus":{"type":"object","properties":{"status":{"type":"string","enum":["IN_QUEUE","IN_PROGRESS","COMPLETED"]},"request_id":{"type":"string","description":"The request id."},"response_url":{"type":"string","description":"The response url."},"status_url":{"type":"string","description":"The status url."},"cancel_url":{"type":"string","description":"The cancel url."},"logs":{"type":"object","description":"The logs.","additionalProperties":true},"metrics":{"type":"object","description":"The metrics.","additionalProperties":true},"queue_position":{"type":"integer","description":"The queue position."}},"required":["status","request_id"]},"Flux2EditInput":{"x-fal-order-properties":["prompt","guidance_scale","seed","num_inference_steps","image_size","num_images","acceleration","enable_prompt_expansion","sync_mode","enable_safety_checker","output_format","image_urls"],"type":"object","properties":{"prompt":{"examples":["Change his clothes to casual suit and tie"],"description":"The prompt to edit the image.","type":"string","title":"Prompt"},"num_images":{"minimum":1,"description":"The number of images to generate.","type":"integer","title":"Number of Images","maximum":4,"default":1},"image_size":{"anyOf":[{"$ref":"#/components/schemas/ImageSize"},{"enum":["square_hd","square","portrait_4_3","portrait_16_9","landscape_4_3","landscape_16_9"],"type":"string"}],"description":"The size of the image to generate. The width and height must be between 512 and 2048 pixels.","title":"Image Size","examples":[{"height":1152,"width":2016}]},"acceleration":{"enum":["none","regular","high"],"description":"The acceleration level to use for the image generation.","type":"string","title":"Acceleration","examples":["regular"],"default":"regular"},"enable_safety_checker":{"description":"If set to true, the safety checker will be enabled.","type":"boolean","title":"Enable Safety Checker","default":true},"output_format":{"enum":["jpeg","png","webp"],"description":"The format of the generated image.","type":"string","title":"Output Format","default":"png"},"sync_mode":{"description":"If `True`, the media will be returned as a data URI and the output data won't be available in the request history.","type":"boolean","title":"Sync Mode","default":false},"guidance_scale":{"minimum":0,"description":"Guidance Scale is a measure of how close you want the model to stick to your prompt when looking for a related image to show you.","type":"number","title":"Guidance Scale","maximum":20,"default":2.5},"seed":{"description":"The seed to use for the generation. If not provided, a random seed will be used.","type":"integer","title":"Seed"},"image_urls":{"examples":[["https://storage.googleapis.com/falserverless/example_inputs/flux2_dev_edit_input.png"]],"description":"The URLs of the images for editing. A maximum of 4 images are allowed, if more are provided, only the first 4 will be used.","type":"array","title":"Image URLs","items":{"type":"string"}},"enable_prompt_expansion":{"description":"If set to true, the prompt will be expanded for better results.","type":"boolean","title":"Enable Prompt Expansion","default":false},"num_inference_steps":{"minimum":4,"description":"The number of inference steps to perform.","type":"integer","title":"Number of Inference Steps","maximum":50,"default":28}},"title":"Flux2EditImageInput","required":["prompt","image_urls"]},"Flux2EditOutput":{"x-fal-order-properties":["images","timings","seed","has_nsfw_concepts","prompt"],"type":"object","properties":{"prompt":{"description":"The prompt used for generating the image.","type":"string","title":"Prompt"},"images":{"examples":[[{"url":"https://storage.googleapis.com/falserverless/example_outputs/flux2_dev_edit_output.png"}]],"description":"The edited images","type":"array","title":"Images","items":{"$ref":"#/components/schemas/ImageFile"}},"seed":{"description":"\n Seed of the generated Image. It will be the same value of the one passed in the\n input or the randomly generated that was used in case none was passed.\n ","type":"integer","title":"Seed"},"has_nsfw_concepts":{"description":"Whether the generated images contain NSFW concepts.","type":"array","title":"Has Nsfw Concepts","items":{"type":"boolean"}},"timings":{"title":"Timings","type":"object","additionalProperties":{"type":"number"}}},"title":"Flux2EditImageOutput","required":["images","timings","seed","has_nsfw_concepts","prompt"]},"ImageSize":{"x-fal-order-properties":["width","height"],"type":"object","properties":{"height":{"description":"The height of the generated image.","type":"integer","title":"Height","maximum":14142,"exclusiveMinimum":0,"default":512},"width":{"description":"The width of the generated image.","type":"integer","title":"Width","maximum":14142,"exclusiveMinimum":0,"default":512}},"title":"ImageSize"},"ImageFile":{"x-fal-order-properties":["url","content_type","file_name","file_size","file_data","width","height"],"type":"object","properties":{"file_size":{"examples":[4404019],"description":"The size of the file in bytes.","type":"integer","title":"File Size"},"height":{"description":"The height of the image","type":"integer","title":"Height"},"url":{"description":"The URL where the file can be downloaded from.","type":"string","title":"Url"},"width":{"description":"The width of the image","type":"integer","title":"Width"},"file_name":{"examples":["z9RV14K95DvU.png"],"description":"The name of the file. It will be auto-generated if not provided.","type":"string","title":"File Name"},"content_type":{"examples":["image/png"],"description":"The mime type of the file.","type":"string","title":"Content Type"},"file_data":{"format":"binary","title":"File Data","type":"string","description":"File data"}},"title":"ImageFile","required":["url"]}}},"paths":{"/fal-ai/flux-2/edit/requests/{request_id}/status":{"get":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}},{"name":"logs","in":"query","required":false,"schema":{"type":"number","description":"Whether to include logs (`1`) in the response or not (`0`)."}}],"responses":{"200":{"description":"The request status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueStatus"}}}}}}},"/fal-ai/flux-2/edit/requests/{request_id}/cancel":{"put":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}}],"responses":{"200":{"description":"The request was cancelled.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether the request was cancelled successfully."}}}}}}}}},"/fal-ai/flux-2/edit":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Flux2EditInput"}}}},"responses":{"200":{"description":"The request status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueStatus"}}}}}}},"/fal-ai/flux-2/edit/requests/{request_id}":{"get":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}}],"responses":{"200":{"description":"Result of the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Flux2EditOutput"}}}}}}}},"servers":[{"url":"https://queue.fal.run"}],"security":[{"apiKeyAuth":[]}]} \ No newline at end of file diff --git a/app/src/main/assets/falai-endpoints/flux-2/flash/edit/openapi.json b/app/src/main/assets/falai-endpoints/flux-2/flash/edit/openapi.json new file mode 100644 index 000000000..ba20195f4 --- /dev/null +++ b/app/src/main/assets/falai-endpoints/flux-2/flash/edit/openapi.json @@ -0,0 +1 @@ +{"openapi":"3.0.4","info":{"title":"Queue OpenAPI for fal-ai/flux-2/flash/edit","version":"1.0.0","description":"The OpenAPI schema for the fal-ai/flux-2/flash/edit queue.","x-fal-metadata":{"endpointId":"fal-ai/flux-2/flash/edit","category":"image-to-image","thumbnailUrl":"https://v3b.fal.media/files/b/0a871484/fjLSktGKoWIGQWm-GRaUM_87cd94bbbff7400b830e73b8f6f075d4.jpg","playgroundUrl":"https://fal.ai/models/fal-ai/flux-2/flash/edit","documentationUrl":"https://fal.ai/models/fal-ai/flux-2/flash/edit/api"}},"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Fal Key"}},"schemas":{"QueueStatus":{"type":"object","properties":{"status":{"type":"string","enum":["IN_QUEUE","IN_PROGRESS","COMPLETED"]},"request_id":{"type":"string","description":"The request id."},"response_url":{"type":"string","description":"The response url."},"status_url":{"type":"string","description":"The status url."},"cancel_url":{"type":"string","description":"The cancel url."},"logs":{"type":"object","description":"The logs.","additionalProperties":true},"metrics":{"type":"object","description":"The metrics.","additionalProperties":true},"queue_position":{"type":"integer","description":"The queue position."}},"required":["status","request_id"]},"Flux2FlashEditInput":{"x-fal-order-properties":["prompt","guidance_scale","seed","image_size","num_images","enable_prompt_expansion","sync_mode","enable_safety_checker","output_format","image_urls"],"type":"object","properties":{"prompt":{"examples":["Remove the meat from the hamburger"],"description":"The prompt to edit the image.","type":"string","title":"Prompt"},"num_images":{"minimum":1,"description":"The number of images to generate.","type":"integer","title":"Number of Images","maximum":4,"default":1},"image_size":{"anyOf":[{"$ref":"#/components/schemas/ImageSize"},{"enum":["square_hd","square","portrait_4_3","portrait_16_9","landscape_4_3","landscape_16_9"],"type":"string"}],"description":"The size of the image to generate. The width and height must be between 512 and 2048 pixels.","title":"Image Size","default":"square_hd"},"output_format":{"enum":["jpeg","png","webp"],"description":"The format of the generated image.","type":"string","title":"Output Format","default":"png"},"sync_mode":{"description":"If `True`, the media will be returned as a data URI and the output data won't be available in the request history.","type":"boolean","title":"Sync Mode","default":false},"guidance_scale":{"minimum":0,"description":"Guidance Scale is a measure of how close you want the model to stick to your prompt when looking for a related image to show you.","type":"number","title":"Guidance Scale","maximum":20,"default":2.5},"seed":{"description":"The seed to use for the generation. If not provided, a random seed will be used.","type":"integer","title":"Seed"},"image_urls":{"examples":[["https://storage.googleapis.com/falserverless/example_outputs/flux-2-flash-edit-input.png"]],"description":"The URLs of the images for editing. A maximum of 4 images are allowed, if more are provided, only the first 4 will be used.","type":"array","title":"Image URLs","items":{"type":"string"}},"enable_prompt_expansion":{"description":"If set to true, the prompt will be expanded for better results.","type":"boolean","title":"Enable Prompt Expansion","default":false},"enable_safety_checker":{"description":"If set to true, the safety checker will be enabled.","type":"boolean","title":"Enable Safety Checker","default":true}},"title":"Flux2FlashEditImageInput","required":["prompt","image_urls"]},"Flux2FlashEditOutput":{"x-fal-order-properties":["images","timings","seed","has_nsfw_concepts","prompt"],"type":"object","properties":{"prompt":{"description":"The prompt used for generating the image.","type":"string","title":"Prompt"},"images":{"examples":[[{"url":"https://storage.googleapis.com/falserverless/example_outputs/flux-2-flash-edit.png"}]],"description":"The edited images","type":"array","title":"Images","items":{"$ref":"#/components/schemas/ImageFile"}},"seed":{"description":"\n Seed of the generated Image. It will be the same value of the one passed in the\n input or the randomly generated that was used in case none was passed.\n ","type":"integer","title":"Seed"},"has_nsfw_concepts":{"description":"Whether the generated images contain NSFW concepts.","type":"array","title":"Has Nsfw Concepts","items":{"type":"boolean"}},"timings":{"title":"Timings","type":"object","additionalProperties":{"type":"number"}}},"title":"Flux2FlashEditImageOutput","required":["images","timings","seed","has_nsfw_concepts","prompt"]},"ImageSize":{"x-fal-order-properties":["width","height"],"type":"object","properties":{"height":{"description":"The height of the generated image.","type":"integer","title":"Height","maximum":14142,"exclusiveMinimum":0,"default":512},"width":{"description":"The width of the generated image.","type":"integer","title":"Width","maximum":14142,"exclusiveMinimum":0,"default":512}},"title":"ImageSize"},"ImageFile":{"x-fal-order-properties":["url","content_type","file_name","file_size","file_data","width","height"],"type":"object","properties":{"file_size":{"examples":[4404019],"description":"The size of the file in bytes.","type":"integer","title":"File Size"},"height":{"description":"The height of the image","type":"integer","title":"Height"},"url":{"description":"The URL where the file can be downloaded from.","type":"string","title":"Url"},"width":{"description":"The width of the image","type":"integer","title":"Width"},"file_name":{"examples":["z9RV14K95DvU.png"],"description":"The name of the file. It will be auto-generated if not provided.","type":"string","title":"File Name"},"content_type":{"examples":["image/png"],"description":"The mime type of the file.","type":"string","title":"Content Type"},"file_data":{"format":"binary","title":"File Data","type":"string","description":"File data"}},"title":"ImageFile","required":["url"]}}},"paths":{"/fal-ai/flux-2/flash/edit/requests/{request_id}/status":{"get":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}},{"name":"logs","in":"query","required":false,"schema":{"type":"number","description":"Whether to include logs (`1`) in the response or not (`0`)."}}],"responses":{"200":{"description":"The request status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueStatus"}}}}}}},"/fal-ai/flux-2/flash/edit/requests/{request_id}/cancel":{"put":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}}],"responses":{"200":{"description":"The request was cancelled.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether the request was cancelled successfully."}}}}}}}}},"/fal-ai/flux-2/flash/edit":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Flux2FlashEditInput"}}}},"responses":{"200":{"description":"The request status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueStatus"}}}}}}},"/fal-ai/flux-2/flash/edit/requests/{request_id}":{"get":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}}],"responses":{"200":{"description":"Result of the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Flux2FlashEditOutput"}}}}}}}},"servers":[{"url":"https://queue.fal.run"}],"security":[{"apiKeyAuth":[]}]} \ No newline at end of file diff --git a/app/src/main/assets/falai-endpoints/flux-2/flash/openapi.json b/app/src/main/assets/falai-endpoints/flux-2/flash/openapi.json new file mode 100644 index 000000000..a562cf4d5 --- /dev/null +++ b/app/src/main/assets/falai-endpoints/flux-2/flash/openapi.json @@ -0,0 +1 @@ +{"openapi":"3.0.4","info":{"title":"Queue OpenAPI for fal-ai/flux-2/flash","version":"1.0.0","description":"The OpenAPI schema for the fal-ai/flux-2/flash queue.","x-fal-metadata":{"endpointId":"fal-ai/flux-2/flash","category":"text-to-image","thumbnailUrl":"https://v3b.fal.media/files/b/0a871486/tX7YdfQViGtCE7ZjxOCph_5f5262a21e9e426e8981ea9513d11999.jpg","playgroundUrl":"https://fal.ai/models/fal-ai/flux-2/flash","documentationUrl":"https://fal.ai/models/fal-ai/flux-2/flash/api"}},"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Fal Key"}},"schemas":{"QueueStatus":{"type":"object","properties":{"status":{"type":"string","enum":["IN_QUEUE","IN_PROGRESS","COMPLETED"]},"request_id":{"type":"string","description":"The request id."},"response_url":{"type":"string","description":"The response url."},"status_url":{"type":"string","description":"The status url."},"cancel_url":{"type":"string","description":"The cancel url."},"logs":{"type":"object","description":"The logs.","additionalProperties":true},"metrics":{"type":"object","description":"The metrics.","additionalProperties":true},"queue_position":{"type":"integer","description":"The queue position."}},"required":["status","request_id"]},"Flux2FlashInput":{"x-fal-order-properties":["prompt","guidance_scale","seed","image_size","num_images","enable_prompt_expansion","sync_mode","enable_safety_checker","output_format"],"type":"object","properties":{"prompt":{"examples":["An army of ants battles for a sugar cube in a giant sandbox, with tiny plastic soldier toys caught in the melee. Ant bodies shine against gritty beige sand and the glossy, crystalline cube. Fiery sunrise spills golden highlights, throwing dramatic shadows, amplifying the excitement. Shot macro (100mm), aperture f/2.8 for soft background, centered composition with ground-level POV, mixing organic and manufactured textures."],"description":"The prompt to generate an image from.","type":"string","title":"Prompt"},"num_images":{"minimum":1,"description":"The number of images to generate.","type":"integer","title":"Number of Images","maximum":4,"default":1},"image_size":{"anyOf":[{"$ref":"#/components/schemas/ImageSize"},{"enum":["square_hd","square","portrait_4_3","portrait_16_9","landscape_4_3","landscape_16_9"],"type":"string"}],"description":"The size of the image to generate. The width and height must be between 512 and 2048 pixels.","title":"Image Size","default":"landscape_4_3"},"output_format":{"enum":["jpeg","png","webp"],"description":"The format of the generated image.","type":"string","title":"Output Format","default":"png"},"sync_mode":{"description":"If `True`, the media will be returned as a data URI and the output data won't be available in the request history.","type":"boolean","title":"Sync Mode","default":false},"guidance_scale":{"minimum":0,"description":"Guidance Scale is a measure of how close you want the model to stick to your prompt when looking for a related image to show you.","type":"number","title":"Guidance Scale","maximum":20,"default":2.5},"seed":{"description":"The seed to use for the generation. If not provided, a random seed will be used.","type":"integer","title":"Seed"},"enable_prompt_expansion":{"description":"If set to true, the prompt will be expanded for better results.","type":"boolean","title":"Enable Prompt Expansion","default":false},"enable_safety_checker":{"description":"If set to true, the safety checker will be enabled.","type":"boolean","title":"Enable Safety Checker","default":true}},"title":"Flux2FlashTextToImageInput","required":["prompt"]},"Flux2FlashOutput":{"x-fal-order-properties":["images","timings","seed","has_nsfw_concepts","prompt"],"type":"object","properties":{"prompt":{"description":"The prompt used for generating the image.","type":"string","title":"Prompt"},"images":{"examples":[[{"url":"https://storage.googleapis.com/falserverless/example_outputs/flux-2-flash-t2i.png"}]],"description":"The generated images","type":"array","title":"Images","items":{"$ref":"#/components/schemas/ImageFile"}},"seed":{"description":"\n Seed of the generated Image. It will be the same value of the one passed in the\n input or the randomly generated that was used in case none was passed.\n ","type":"integer","title":"Seed"},"has_nsfw_concepts":{"description":"Whether the generated images contain NSFW concepts.","type":"array","title":"Has Nsfw Concepts","items":{"type":"boolean"}},"timings":{"title":"Timings","type":"object","additionalProperties":{"type":"number"}}},"title":"Flux2FlashT2IOutput","required":["images","timings","seed","has_nsfw_concepts","prompt"]},"ImageSize":{"x-fal-order-properties":["width","height"],"type":"object","properties":{"height":{"description":"The height of the generated image.","type":"integer","title":"Height","maximum":14142,"exclusiveMinimum":0,"default":512},"width":{"description":"The width of the generated image.","type":"integer","title":"Width","maximum":14142,"exclusiveMinimum":0,"default":512}},"title":"ImageSize"},"ImageFile":{"x-fal-order-properties":["url","content_type","file_name","file_size","file_data","width","height"],"type":"object","properties":{"file_size":{"examples":[4404019],"description":"The size of the file in bytes.","type":"integer","title":"File Size"},"height":{"description":"The height of the image","type":"integer","title":"Height"},"url":{"description":"The URL where the file can be downloaded from.","type":"string","title":"Url"},"width":{"description":"The width of the image","type":"integer","title":"Width"},"file_name":{"examples":["z9RV14K95DvU.png"],"description":"The name of the file. It will be auto-generated if not provided.","type":"string","title":"File Name"},"content_type":{"examples":["image/png"],"description":"The mime type of the file.","type":"string","title":"Content Type"},"file_data":{"format":"binary","title":"File Data","type":"string","description":"File data"}},"title":"ImageFile","required":["url"]}}},"paths":{"/fal-ai/flux-2/flash/requests/{request_id}/status":{"get":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}},{"name":"logs","in":"query","required":false,"schema":{"type":"number","description":"Whether to include logs (`1`) in the response or not (`0`)."}}],"responses":{"200":{"description":"The request status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueStatus"}}}}}}},"/fal-ai/flux-2/flash/requests/{request_id}/cancel":{"put":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}}],"responses":{"200":{"description":"The request was cancelled.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether the request was cancelled successfully."}}}}}}}}},"/fal-ai/flux-2/flash":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Flux2FlashInput"}}}},"responses":{"200":{"description":"The request status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueStatus"}}}}}}},"/fal-ai/flux-2/flash/requests/{request_id}":{"get":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}}],"responses":{"200":{"description":"Result of the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Flux2FlashOutput"}}}}}}}},"servers":[{"url":"https://queue.fal.run"}],"security":[{"apiKeyAuth":[]}]} \ No newline at end of file diff --git a/app/src/main/assets/falai-endpoints/flux-2/openapi.json b/app/src/main/assets/falai-endpoints/flux-2/openapi.json new file mode 100644 index 000000000..d429bb109 --- /dev/null +++ b/app/src/main/assets/falai-endpoints/flux-2/openapi.json @@ -0,0 +1 @@ +{"openapi":"3.0.4","info":{"title":"Queue OpenAPI for fal-ai/flux-2","version":"1.0.0","description":"The OpenAPI schema for the fal-ai/flux-2 queue.","x-fal-metadata":{"endpointId":"fal-ai/flux-2","category":"text-to-image","thumbnailUrl":"https://v3b.fal.media/files/b/penguin/zSBCJtPpeIQwR5AC_IamX_b1e1137961754e4d851907c21f8c20cd.jpg","playgroundUrl":"https://fal.ai/models/fal-ai/flux-2","documentationUrl":"https://fal.ai/models/fal-ai/flux-2/api"}},"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Fal Key"}},"schemas":{"QueueStatus":{"type":"object","properties":{"status":{"type":"string","enum":["IN_QUEUE","IN_PROGRESS","COMPLETED"]},"request_id":{"type":"string","description":"The request id."},"response_url":{"type":"string","description":"The response url."},"status_url":{"type":"string","description":"The status url."},"cancel_url":{"type":"string","description":"The cancel url."},"logs":{"type":"object","description":"The logs.","additionalProperties":true},"metrics":{"type":"object","description":"The metrics.","additionalProperties":true},"queue_position":{"type":"integer","description":"The queue position."}},"required":["status","request_id"]},"Flux2Input":{"x-fal-order-properties":["prompt","guidance_scale","seed","num_inference_steps","image_size","num_images","acceleration","enable_prompt_expansion","sync_mode","enable_safety_checker","output_format"],"type":"object","properties":{"prompt":{"examples":["Dutch angle close-up of a survivor in post-apocalyptic setting, dust-covered face, dramatic harsh sunlight creating deep shadows, happy expression, desaturated dystopian color palette, gritty realism"],"description":"The prompt to generate an image from.","type":"string","title":"Prompt"},"num_images":{"minimum":1,"description":"The number of images to generate.","type":"integer","title":"Number of Images","maximum":4,"default":1},"image_size":{"anyOf":[{"$ref":"#/components/schemas/ImageSize"},{"enum":["square_hd","square","portrait_4_3","portrait_16_9","landscape_4_3","landscape_16_9"],"type":"string"}],"description":"The size of the image to generate. The width and height must be between 512 and 2048 pixels.","title":"Image Size","default":"landscape_4_3"},"acceleration":{"enum":["none","regular","high"],"description":"The acceleration level to use for the image generation.","type":"string","title":"Acceleration","examples":["regular"],"default":"regular"},"output_format":{"enum":["jpeg","png","webp"],"description":"The format of the generated image.","type":"string","title":"Output Format","default":"png"},"sync_mode":{"description":"If `True`, the media will be returned as a data URI and the output data won't be available in the request history.","type":"boolean","title":"Sync Mode","default":false},"guidance_scale":{"minimum":0,"description":"Guidance Scale is a measure of how close you want the model to stick to your prompt when looking for a related image to show you.","type":"number","title":"Guidance Scale","maximum":20,"default":2.5},"seed":{"description":"The seed to use for the generation. If not provided, a random seed will be used.","type":"integer","title":"Seed"},"enable_prompt_expansion":{"description":"If set to true, the prompt will be expanded for better results.","type":"boolean","title":"Enable Prompt Expansion","default":false},"num_inference_steps":{"minimum":4,"description":"The number of inference steps to perform.","type":"integer","title":"Number of Inference Steps","maximum":50,"default":28},"enable_safety_checker":{"description":"If set to true, the safety checker will be enabled.","type":"boolean","title":"Enable Safety Checker","default":true}},"title":"Flux2TextToImageInput","required":["prompt"]},"Flux2Output":{"x-fal-order-properties":["images","timings","seed","has_nsfw_concepts","prompt"],"type":"object","properties":{"prompt":{"description":"The prompt used for generating the image.","type":"string","title":"Prompt"},"images":{"examples":[[{"url":"https://storage.googleapis.com/falserverless/example_outputs/flux2_dev_t2i_output.png"}]],"description":"The generated images","type":"array","title":"Images","items":{"$ref":"#/components/schemas/ImageFile"}},"seed":{"description":"\n Seed of the generated Image. It will be the same value of the one passed in the\n input or the randomly generated that was used in case none was passed.\n ","type":"integer","title":"Seed"},"has_nsfw_concepts":{"description":"Whether the generated images contain NSFW concepts.","type":"array","title":"Has Nsfw Concepts","items":{"type":"boolean"}},"timings":{"title":"Timings","type":"object","additionalProperties":{"type":"number"}}},"title":"Flux2T2IOutput","required":["images","timings","seed","has_nsfw_concepts","prompt"]},"ImageSize":{"x-fal-order-properties":["width","height"],"type":"object","properties":{"height":{"description":"The height of the generated image.","type":"integer","title":"Height","maximum":14142,"exclusiveMinimum":0,"default":512},"width":{"description":"The width of the generated image.","type":"integer","title":"Width","maximum":14142,"exclusiveMinimum":0,"default":512}},"title":"ImageSize"},"ImageFile":{"x-fal-order-properties":["url","content_type","file_name","file_size","file_data","width","height"],"type":"object","properties":{"file_size":{"examples":[4404019],"description":"The size of the file in bytes.","type":"integer","title":"File Size"},"height":{"description":"The height of the image","type":"integer","title":"Height"},"url":{"description":"The URL where the file can be downloaded from.","type":"string","title":"Url"},"width":{"description":"The width of the image","type":"integer","title":"Width"},"file_name":{"examples":["z9RV14K95DvU.png"],"description":"The name of the file. It will be auto-generated if not provided.","type":"string","title":"File Name"},"content_type":{"examples":["image/png"],"description":"The mime type of the file.","type":"string","title":"Content Type"},"file_data":{"format":"binary","title":"File Data","type":"string","description":"File data"}},"title":"ImageFile","required":["url"]}}},"paths":{"/fal-ai/flux-2/requests/{request_id}/status":{"get":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}},{"name":"logs","in":"query","required":false,"schema":{"type":"number","description":"Whether to include logs (`1`) in the response or not (`0`)."}}],"responses":{"200":{"description":"The request status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueStatus"}}}}}}},"/fal-ai/flux-2/requests/{request_id}/cancel":{"put":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}}],"responses":{"200":{"description":"The request was cancelled.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether the request was cancelled successfully."}}}}}}}}},"/fal-ai/flux-2":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Flux2Input"}}}},"responses":{"200":{"description":"The request status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueStatus"}}}}}}},"/fal-ai/flux-2/requests/{request_id}":{"get":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}}],"responses":{"200":{"description":"Result of the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Flux2Output"}}}}}}}},"servers":[{"url":"https://queue.fal.run"}],"security":[{"apiKeyAuth":[]}]} \ No newline at end of file diff --git a/app/src/main/assets/falai-endpoints/flux-kontext/dev/openapi.json b/app/src/main/assets/falai-endpoints/flux-kontext/dev/openapi.json new file mode 100644 index 000000000..e96ab3d34 --- /dev/null +++ b/app/src/main/assets/falai-endpoints/flux-kontext/dev/openapi.json @@ -0,0 +1,441 @@ +{ + "openapi": "3.0.4", + "info": { + "title": "Queue OpenAPI for fal-ai/flux-kontext/dev", + "version": "1.0.0", + "description": "The OpenAPI schema for the fal-ai/flux-kontext/dev queue.", + "x-fal-metadata": { + "endpointId": "fal-ai/flux-kontext/dev", + "category": "image-to-image", + "thumbnailUrl": "https://storage.googleapis.com/fal_cdn/fal/Sound-3.jpg", + "playgroundUrl": "https://fal.ai/models/fal-ai/flux-kontext/dev", + "documentationUrl": "https://fal.ai/models/fal-ai/flux-kontext/dev/api" + } + }, + "components": { + "securitySchemes": { + "apiKeyAuth": { + "type": "apiKey", + "in": "header", + "name": "Authorization", + "description": "Fal Key" + } + }, + "schemas": { + "QueueStatus": { + "type": "object", + "properties": { + "status": { + "type": "string", + "enum": [ + "IN_QUEUE", + "IN_PROGRESS", + "COMPLETED" + ] + }, + "request_id": { + "type": "string", + "description": "The request id." + }, + "response_url": { + "type": "string", + "description": "The response url." + }, + "status_url": { + "type": "string", + "description": "The status url." + }, + "cancel_url": { + "type": "string", + "description": "The cancel url." + }, + "logs": { + "type": "object", + "description": "The logs.", + "additionalProperties": true + }, + "metrics": { + "type": "object", + "description": "The metrics.", + "additionalProperties": true + }, + "queue_position": { + "type": "integer", + "description": "The queue position." + } + }, + "required": [ + "status", + "request_id" + ] + }, + "FluxKontextDevInput": { + "x-fal-order-properties": [ + "prompt", + "image_url", + "num_inference_steps", + "seed", + "guidance_scale", + "sync_mode", + "num_images", + "enable_safety_checker", + "output_format", + "acceleration", + "enhance_prompt", + "resolution_mode" + ], + "type": "object", + "properties": { + "prompt": { + "examples": [ + "Change the setting to a day time, add a lot of people walking the sidewalk while maintaining the same style of the painting" + ], + "title": "Prompt", + "type": "string", + "description": "The prompt to edit the image." + }, + "resolution_mode": { + "enum": [ + "auto", + "match_input", + "1:1", + "16:9", + "21:9", + "3:2", + "2:3", + "4:5", + "5:4", + "3:4", + "4:3", + "9:16", + "9:21" + ], + "title": "Resolution Mode", + "type": "string", + "description": "\n Determines how the output resolution is set for image editing.\n - `auto`: The model selects an optimal resolution from a predefined set that best matches the input image's aspect ratio. This is the recommended setting for most use cases as it's what the model was trained on.\n - `match_input`: The model will attempt to use the same resolution as the input image. The resolution will be adjusted to be compatible with the model's requirements (e.g. dimensions must be multiples of 16 and within supported limits).\n Apart from these, a few aspect ratios are also supported.\n ", + "default": "match_input" + }, + "acceleration": { + "enum": [ + "none", + "regular", + "high" + ], + "title": "Acceleration", + "type": "string", + "description": "The speed of the generation. The higher the speed, the faster the generation.", + "default": "none" + }, + "num_images": { + "minimum": 1, + "title": "Num Images", + "type": "integer", + "maximum": 4, + "description": "The number of images to generate.", + "default": 1 + }, + "output_format": { + "enum": [ + "jpeg", + "png" + ], + "title": "Output Format", + "type": "string", + "description": "Output format", + "default": "jpeg" + }, + "image_url": { + "examples": [ + "https://storage.googleapis.com/falserverless/example_inputs/kontext_example_input.webp" + ], + "title": "Image URL", + "type": "string", + "description": "The URL of the image to edit." + }, + "sync_mode": { + "title": "Sync Mode", + "type": "boolean", + "description": "\n If set to true, the function will wait for the image to be generated and uploaded\n before returning the response. This will increase the latency of the function but\n it allows you to get the image directly in the response without going through the CDN.\n ", + "default": false + }, + "enable_safety_checker": { + "title": "Enable Safety Checker", + "type": "boolean", + "description": "If set to true, the safety checker will be enabled.", + "default": true + }, + "num_inference_steps": { + "minimum": 10, + "title": "Num Inference Steps", + "type": "integer", + "maximum": 50, + "description": "The number of inference steps to perform.", + "default": 28 + }, + "guidance_scale": { + "minimum": 1, + "title": "Guidance scale (CFG)", + "type": "number", + "maximum": 20, + "description": "\n The CFG (Classifier Free Guidance) scale is a measure of how close you want\n the model to stick to your prompt when looking for a related image to show you.\n ", + "default": 2.5 + }, + "seed": { + "anyOf": [ + { + "type": "integer" + }, + { + "type": "null" + } + ], + "title": "Seed", + "description": "\n The same seed and the same prompt given to the same version of the model\n will output the same image every time.\n " + }, + "enhance_prompt": { + "title": "Enhance Prompt", + "type": "boolean", + "description": "Whether to enhance the prompt for better results.", + "default": false + } + }, + "title": "BaseKontextEditInput", + "required": [ + "prompt", + "image_url" + ] + }, + "FluxKontextDevOutput": { + "x-fal-order-properties": [ + "images", + "timings", + "seed", + "has_nsfw_concepts", + "prompt" + ], + "type": "object", + "properties": { + "prompt": { + "title": "Prompt", + "type": "string", + "description": "The prompt used for generating the image." + }, + "images": { + "examples": [ + [ + { + "height": 768, + "content_type": "image/jpeg", + "url": "https://storage.googleapis.com/falserverless/example_outputs/kontext_example_output.jpeg", + "width": 1024 + } + ] + ], + "title": "Images", + "type": "array", + "description": "The generated image files info.", + "items": { + "$ref": "#/components/schemas/Image" + } + }, + "timings": { + "additionalProperties": { + "type": "number" + }, + "type": "object", + "title": "Timings" + }, + "has_nsfw_concepts": { + "title": "Has Nsfw Concepts", + "type": "array", + "description": "Whether the generated images contain NSFW concepts.", + "items": { + "type": "boolean" + } + }, + "seed": { + "title": "Seed", + "type": "integer", + "description": "\n Seed of the generated Image. It will be the same value of the one passed in the\n input or the randomly generated that was used in case none was passed.\n " + } + }, + "title": "KontextEditOutput", + "required": [ + "images", + "timings", + "seed", + "has_nsfw_concepts", + "prompt" + ] + }, + "Image": { + "x-fal-order-properties": [ + "url", + "width", + "height", + "content_type" + ], + "type": "object", + "properties": { + "height": { + "title": "Height", + "type": "integer" + }, + "content_type": { + "title": "Content Type", + "type": "string", + "default": "image/jpeg" + }, + "url": { + "title": "Url", + "type": "string" + }, + "width": { + "title": "Width", + "type": "integer" + } + }, + "title": "Image", + "required": [ + "url", + "width", + "height" + ] + } + } + }, + "paths": { + "/fal-ai/flux-kontext/dev/requests/{request_id}/status": { + "get": { + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "Request ID" + } + }, + { + "name": "logs", + "in": "query", + "required": false, + "schema": { + "type": "number", + "description": "Whether to include logs (`1`) in the response or not (`0`)." + } + } + ], + "responses": { + "200": { + "description": "The request status.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueueStatus" + } + } + } + } + } + } + }, + "/fal-ai/flux-kontext/dev/requests/{request_id}/cancel": { + "put": { + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "Request ID" + } + } + ], + "responses": { + "200": { + "description": "The request was cancelled.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean", + "description": "Whether the request was cancelled successfully." + } + } + } + } + } + } + } + } + }, + "/fal-ai/flux-kontext/dev": { + "post": { + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FluxKontextDevInput" + } + } + } + }, + "responses": { + "200": { + "description": "The request status.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueueStatus" + } + } + } + } + } + } + }, + "/fal-ai/flux-kontext/dev/requests/{request_id}": { + "get": { + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "Request ID" + } + } + ], + "responses": { + "200": { + "description": "Result of the request.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FluxKontextDevOutput" + } + } + } + } + } + } + } + }, + "servers": [ + { + "url": "https://queue.fal.run" + } + ], + "security": [ + { + "apiKeyAuth": [] + } + ] +} \ No newline at end of file diff --git a/app/src/main/assets/falai-endpoints/flux-lora/image-to-image/openapi.json b/app/src/main/assets/falai-endpoints/flux-lora/image-to-image/openapi.json new file mode 100644 index 000000000..f25c307b8 --- /dev/null +++ b/app/src/main/assets/falai-endpoints/flux-lora/image-to-image/openapi.json @@ -0,0 +1 @@ +{"openapi":"3.0.4","info":{"title":"Queue OpenAPI for fal-ai/flux-lora/image-to-image","version":"1.0.0","description":"The OpenAPI schema for the fal-ai/flux-lora/image-to-image queue.","x-fal-metadata":{"endpointId":"fal-ai/flux-lora/image-to-image","category":"image-to-image","thumbnailUrl":"https://storage.googleapis.com/falserverless/gallery/h2glDvCl5RvtgjNx_-5qY.jpeg","playgroundUrl":"https://fal.ai/models/fal-ai/flux-lora/image-to-image","documentationUrl":"https://fal.ai/models/fal-ai/flux-lora/image-to-image/api"}},"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Fal Key"}},"schemas":{"QueueStatus":{"type":"object","properties":{"status":{"type":"string","enum":["IN_QUEUE","IN_PROGRESS","COMPLETED"]},"request_id":{"type":"string","description":"The request id."},"response_url":{"type":"string","description":"The response url."},"status_url":{"type":"string","description":"The status url."},"cancel_url":{"type":"string","description":"The cancel url."},"logs":{"type":"object","description":"The logs.","additionalProperties":true},"metrics":{"type":"object","description":"The metrics.","additionalProperties":true},"queue_position":{"type":"integer","description":"The queue position."}},"required":["status","request_id"]},"FluxLoraImageToImageInput":{"title":"ImageToImageInput","type":"object","properties":{"prompt":{"examples":["A photo of a lion sitting on a stone bench"],"title":"Prompt","type":"string","description":"The prompt to generate an image from."},"num_images":{"minimum":1,"maximum":4,"type":"integer","title":"Num Images","description":"The number of images to generate. This is always set to 1 for streaming output.","default":1},"image_size":{"anyOf":[{"$ref":"#/components/schemas/ImageSize"},{"enum":["square_hd","square","portrait_4_3","portrait_16_9","landscape_4_3","landscape_16_9"],"type":"string"}],"title":"Image Size","description":"The size of the generated image."},"output_format":{"enum":["jpeg","png"],"title":"Output Format","type":"string","description":"The format of the generated image.","default":"jpeg"},"image_url":{"examples":["https://storage.googleapis.com/falserverless/example_inputs/dog.png"],"title":"Image Url","type":"string","description":"URL of image to use for inpainting. or img2img"},"loras":{"description":"\n The LoRAs to use for the image generation. You can use any number of LoRAs\n and they will be merged together to generate the final image.\n ","type":"array","items":{"$ref":"#/components/schemas/LoraWeight"},"examples":[],"title":"Loras","default":[]},"sync_mode":{"title":"Sync Mode","type":"boolean","description":"If `True`, the media will be returned as a data URI and the output data won't be available in the request history.","default":false},"strength":{"minimum":0.01,"maximum":1,"type":"number","title":"Strength","description":"The strength to use for inpainting/image-to-image. Only used if the image_url is provided. 1.0 is completely remakes the image while 0.0 preserves the original.","default":0.85},"guidance_scale":{"minimum":0,"maximum":35,"type":"number","title":"Guidance scale (CFG)","description":"\n The CFG (Classifier Free Guidance) scale is a measure of how close you want\n the model to stick to your prompt when looking for a related image to show you.\n ","default":3.5},"num_inference_steps":{"minimum":1,"maximum":50,"type":"integer","title":"Num Inference Steps","description":"The number of inference steps to perform.","default":28},"seed":{"title":"Seed","type":"integer","description":"\n The same seed and the same prompt given to the same version of the model\n will output the same image every time.\n "},"enable_safety_checker":{"title":"Enable Safety Checker","type":"boolean","description":"If set to true, the safety checker will be enabled.","default":true}},"x-fal-order-properties":["prompt","image_size","num_inference_steps","seed","loras","guidance_scale","sync_mode","num_images","enable_safety_checker","output_format","image_url","strength"],"required":["prompt","image_url"]},"FluxLoraImageToImageOutput":{"title":"Output","type":"object","properties":{"prompt":{"title":"Prompt","type":"string","description":"The prompt used for generating the image."},"images":{"title":"Images","type":"array","description":"The generated image files info.","items":{"$ref":"#/components/schemas/Image"}},"timings":{"additionalProperties":{"type":"number"},"type":"object","title":"Timings"},"has_nsfw_concepts":{"title":"Has Nsfw Concepts","type":"array","description":"Whether the generated images contain NSFW concepts.","items":{"type":"boolean"}},"seed":{"title":"Seed","type":"integer","description":"\n Seed of the generated Image. It will be the same value of the one passed in the\n input or the randomly generated that was used in case none was passed.\n "}},"x-fal-order-properties":["images","timings","seed","has_nsfw_concepts","prompt"],"required":["images","timings","seed","has_nsfw_concepts","prompt"]},"ImageSize":{"title":"ImageSize","type":"object","properties":{"height":{"maximum":14142,"type":"integer","title":"Height","description":"The height of the generated image.","exclusiveMinimum":0,"default":512},"width":{"maximum":14142,"type":"integer","title":"Width","description":"The width of the generated image.","exclusiveMinimum":0,"default":512}},"x-fal-order-properties":["width","height"]},"LoraWeight":{"title":"LoraWeight","type":"object","properties":{"path":{"title":"Path","type":"string","description":"URL or the path to the LoRA weights."},"scale":{"minimum":0,"maximum":4,"type":"number","title":"Scale","description":"\n The scale of the LoRA weight. This is used to scale the LoRA weight\n before merging it with the base model.\n ","default":1}},"x-fal-order-properties":["path","scale"],"required":["path"]},"Image":{"title":"Image","type":"object","properties":{"height":{"title":"Height","type":"integer"},"content_type":{"title":"Content Type","type":"string","default":"image/jpeg"},"url":{"title":"Url","type":"string"},"width":{"title":"Width","type":"integer"}},"x-fal-order-properties":["url","width","height","content_type"],"required":["url","width","height"]}}},"paths":{"/fal-ai/flux-lora/image-to-image/requests/{request_id}/status":{"get":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}},{"name":"logs","in":"query","required":false,"schema":{"type":"number","description":"Whether to include logs (`1`) in the response or not (`0`)."}}],"responses":{"200":{"description":"The request status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueStatus"}}}}}}},"/fal-ai/flux-lora/image-to-image/requests/{request_id}/cancel":{"put":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}}],"responses":{"200":{"description":"The request was cancelled.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether the request was cancelled successfully."}}}}}}}}},"/fal-ai/flux-lora/image-to-image":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FluxLoraImageToImageInput"}}}},"responses":{"200":{"description":"The request status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueStatus"}}}}}}},"/fal-ai/flux-lora/image-to-image/requests/{request_id}":{"get":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}}],"responses":{"200":{"description":"Result of the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FluxLoraImageToImageOutput"}}}}}}}},"servers":[{"url":"https://queue.fal.run"}],"security":[{"apiKeyAuth":[]}]} \ No newline at end of file diff --git a/app/src/main/assets/falai-endpoints/flux-lora/inpainting/openapi.json b/app/src/main/assets/falai-endpoints/flux-lora/inpainting/openapi.json new file mode 100644 index 000000000..d94dfdfbc --- /dev/null +++ b/app/src/main/assets/falai-endpoints/flux-lora/inpainting/openapi.json @@ -0,0 +1 @@ +{"openapi":"3.0.4","info":{"title":"Queue OpenAPI for fal-ai/flux-lora/inpainting","version":"1.0.0","description":"The OpenAPI schema for the fal-ai/flux-lora/inpainting queue.","x-fal-metadata":{"endpointId":"fal-ai/flux-lora/inpainting","category":"text-to-image","thumbnailUrl":"https://storage.googleapis.com/falserverless/gallery/flux_lora.jpg","playgroundUrl":"https://fal.ai/models/fal-ai/flux-lora/inpainting","documentationUrl":"https://fal.ai/models/fal-ai/flux-lora/inpainting/api"}},"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Fal Key"}},"schemas":{"QueueStatus":{"type":"object","properties":{"status":{"type":"string","enum":["IN_QUEUE","IN_PROGRESS","COMPLETED"]},"request_id":{"type":"string","description":"The request id."},"response_url":{"type":"string","description":"The response url."},"status_url":{"type":"string","description":"The status url."},"cancel_url":{"type":"string","description":"The cancel url."},"logs":{"type":"object","description":"The logs.","additionalProperties":true},"metrics":{"type":"object","description":"The metrics.","additionalProperties":true},"queue_position":{"type":"integer","description":"The queue position."}},"required":["status","request_id"]},"FluxLoraInpaintingInput":{"title":"InpaintInput","type":"object","properties":{"prompt":{"examples":["A photo of a lion sitting on a stone bench"],"title":"Prompt","type":"string","description":"The prompt to generate an image from."},"num_images":{"minimum":1,"maximum":4,"type":"integer","title":"Num Images","description":"The number of images to generate. This is always set to 1 for streaming output.","default":1},"image_size":{"anyOf":[{"$ref":"#/components/schemas/ImageSize"},{"enum":["square_hd","square","portrait_4_3","portrait_16_9","landscape_4_3","landscape_16_9"],"type":"string"}],"title":"Image Size","description":"The size of the generated image."},"output_format":{"enum":["jpeg","png"],"title":"Output Format","type":"string","description":"The format of the generated image.","default":"jpeg"},"image_url":{"examples":["https://storage.googleapis.com/falserverless/example_inputs/dog.png"],"title":"Image Url","type":"string","description":"URL of image to use for inpainting. or img2img"},"loras":{"description":"\n The LoRAs to use for the image generation. You can use any number of LoRAs\n and they will be merged together to generate the final image.\n ","type":"array","items":{"$ref":"#/components/schemas/LoraWeight"},"examples":[],"title":"Loras","default":[]},"sync_mode":{"title":"Sync Mode","type":"boolean","description":"If `True`, the media will be returned as a data URI and the output data won't be available in the request history.","default":false},"strength":{"minimum":0.01,"maximum":1,"type":"number","title":"Strength","description":"The strength to use for inpainting/image-to-image. Only used if the image_url is provided. 1.0 is completely remakes the image while 0.0 preserves the original.","default":0.85},"guidance_scale":{"minimum":0,"maximum":35,"type":"number","title":"Guidance scale (CFG)","description":"\n The CFG (Classifier Free Guidance) scale is a measure of how close you want\n the model to stick to your prompt when looking for a related image to show you.\n ","default":3.5},"num_inference_steps":{"minimum":1,"maximum":50,"type":"integer","title":"Num Inference Steps","description":"The number of inference steps to perform.","default":28},"mask_url":{"examples":["https://storage.googleapis.com/falserverless/example_inputs/dog_mask.png"],"title":"Mask Url","type":"string","description":"\n The mask to area to Inpaint in.\n "},"seed":{"title":"Seed","type":"integer","description":"\n The same seed and the same prompt given to the same version of the model\n will output the same image every time.\n "},"enable_safety_checker":{"title":"Enable Safety Checker","type":"boolean","description":"If set to true, the safety checker will be enabled.","default":true}},"x-fal-order-properties":["prompt","image_size","num_inference_steps","seed","loras","guidance_scale","sync_mode","num_images","enable_safety_checker","output_format","image_url","strength","mask_url"],"required":["prompt","image_url","mask_url"]},"FluxLoraInpaintingOutput":{"title":"Output","type":"object","properties":{"prompt":{"title":"Prompt","type":"string","description":"The prompt used for generating the image."},"images":{"title":"Images","type":"array","description":"The generated image files info.","items":{"$ref":"#/components/schemas/Image"}},"timings":{"additionalProperties":{"type":"number"},"type":"object","title":"Timings"},"has_nsfw_concepts":{"title":"Has Nsfw Concepts","type":"array","description":"Whether the generated images contain NSFW concepts.","items":{"type":"boolean"}},"seed":{"title":"Seed","type":"integer","description":"\n Seed of the generated Image. It will be the same value of the one passed in the\n input or the randomly generated that was used in case none was passed.\n "}},"x-fal-order-properties":["images","timings","seed","has_nsfw_concepts","prompt"],"required":["images","timings","seed","has_nsfw_concepts","prompt"]},"ImageSize":{"title":"ImageSize","type":"object","properties":{"height":{"maximum":14142,"type":"integer","title":"Height","description":"The height of the generated image.","exclusiveMinimum":0,"default":512},"width":{"maximum":14142,"type":"integer","title":"Width","description":"The width of the generated image.","exclusiveMinimum":0,"default":512}},"x-fal-order-properties":["width","height"]},"LoraWeight":{"title":"LoraWeight","type":"object","properties":{"path":{"title":"Path","type":"string","description":"URL or the path to the LoRA weights."},"scale":{"minimum":0,"maximum":4,"type":"number","title":"Scale","description":"\n The scale of the LoRA weight. This is used to scale the LoRA weight\n before merging it with the base model.\n ","default":1}},"x-fal-order-properties":["path","scale"],"required":["path"]},"Image":{"title":"Image","type":"object","properties":{"height":{"title":"Height","type":"integer"},"content_type":{"title":"Content Type","type":"string","default":"image/jpeg"},"url":{"title":"Url","type":"string"},"width":{"title":"Width","type":"integer"}},"x-fal-order-properties":["url","width","height","content_type"],"required":["url","width","height"]}}},"paths":{"/fal-ai/flux-lora/inpainting/requests/{request_id}/status":{"get":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}},{"name":"logs","in":"query","required":false,"schema":{"type":"number","description":"Whether to include logs (`1`) in the response or not (`0`)."}}],"responses":{"200":{"description":"The request status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueStatus"}}}}}}},"/fal-ai/flux-lora/inpainting/requests/{request_id}/cancel":{"put":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}}],"responses":{"200":{"description":"The request was cancelled.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether the request was cancelled successfully."}}}}}}}}},"/fal-ai/flux-lora/inpainting":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FluxLoraInpaintingInput"}}}},"responses":{"200":{"description":"The request status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueStatus"}}}}}}},"/fal-ai/flux-lora/inpainting/requests/{request_id}":{"get":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}}],"responses":{"200":{"description":"Result of the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FluxLoraInpaintingOutput"}}}}}}}},"servers":[{"url":"https://queue.fal.run"}],"security":[{"apiKeyAuth":[]}]} \ No newline at end of file diff --git a/app/src/main/assets/falai-endpoints/flux-lora/openapi.json b/app/src/main/assets/falai-endpoints/flux-lora/openapi.json new file mode 100644 index 000000000..b934adf3d --- /dev/null +++ b/app/src/main/assets/falai-endpoints/flux-lora/openapi.json @@ -0,0 +1,458 @@ +{ + "openapi": "3.0.4", + "info": { + "title": "Queue OpenAPI for fal-ai/flux-lora", + "version": "1.0.0", + "description": "The OpenAPI schema for the fal-ai/flux-lora queue.", + "x-fal-metadata": { + "endpointId": "fal-ai/flux-lora", + "category": "text-to-image", + "thumbnailUrl": "https://fal.media/files/elephant/RqIQsOY3cgQMMtCedJKlf_c2fc262516d24b94afdc17a747292710.jpg", + "playgroundUrl": "https://fal.ai/models/fal-ai/flux-lora", + "documentationUrl": "https://fal.ai/models/fal-ai/flux-lora/api" + } + }, + "components": { + "securitySchemes": { + "apiKeyAuth": { + "type": "apiKey", + "in": "header", + "name": "Authorization", + "description": "Fal Key" + } + }, + "schemas": { + "QueueStatus": { + "type": "object", + "properties": { + "status": { + "type": "string", + "enum": [ + "IN_QUEUE", + "IN_PROGRESS", + "COMPLETED" + ] + }, + "request_id": { + "type": "string", + "description": "The request id." + }, + "response_url": { + "type": "string", + "description": "The response url." + }, + "status_url": { + "type": "string", + "description": "The status url." + }, + "cancel_url": { + "type": "string", + "description": "The cancel url." + }, + "logs": { + "type": "object", + "description": "The logs.", + "additionalProperties": true + }, + "metrics": { + "type": "object", + "description": "The metrics.", + "additionalProperties": true + }, + "queue_position": { + "type": "integer", + "description": "The queue position." + } + }, + "required": [ + "status", + "request_id" + ] + }, + "FluxLoraInput": { + "title": "TextToImageInput", + "type": "object", + "properties": { + "prompt": { + "examples": [ + "Extreme close-up of a single tiger eye, direct frontal view. Detailed iris and pupil. Sharp focus on eye texture and color. Natural lighting to capture authentic eye shine and depth. The word \"FLUX\" is painted over it in big, white brush strokes with visible texture." + ], + "title": "Prompt", + "type": "string", + "description": "The prompt to generate an image from." + }, + "num_images": { + "minimum": 1, + "maximum": 4, + "type": "integer", + "title": "Num Images", + "description": "The number of images to generate. This is always set to 1 for streaming output.", + "default": 1 + }, + "image_size": { + "anyOf": [ + { + "$ref": "#/components/schemas/ImageSize" + }, + { + "enum": [ + "square_hd", + "square", + "portrait_4_3", + "portrait_16_9", + "landscape_4_3", + "landscape_16_9" + ], + "type": "string" + } + ], + "title": "Image Size", + "description": "The size of the generated image.", + "default": "landscape_4_3" + }, + "output_format": { + "enum": [ + "jpeg", + "png" + ], + "title": "Output Format", + "type": "string", + "description": "The format of the generated image.", + "default": "jpeg" + }, + "loras": { + "description": "\n The LoRAs to use for the image generation. You can use any number of LoRAs\n and they will be merged together to generate the final image.\n ", + "type": "array", + "items": { + "$ref": "#/components/schemas/LoraWeight" + }, + "examples": [], + "title": "Loras", + "default": [] + }, + "sync_mode": { + "title": "Sync Mode", + "type": "boolean", + "description": "\n If set to true, the function will wait for the image to be generated and uploaded\n before returning the response. This will increase the latency of the function but\n it allows you to get the image directly in the response without going through the CDN.\n ", + "default": false + }, + "guidance_scale": { + "minimum": 0, + "maximum": 35, + "type": "number", + "title": "Guidance scale (CFG)", + "description": "\n The CFG (Classifier Free Guidance) scale is a measure of how close you want\n the model to stick to your prompt when looking for a related image to show you.\n ", + "default": 3.5 + }, + "num_inference_steps": { + "minimum": 1, + "maximum": 50, + "type": "integer", + "title": "Num Inference Steps", + "description": "The number of inference steps to perform.", + "default": 28 + }, + "seed": { + "title": "Seed", + "type": "integer", + "description": "\n The same seed and the same prompt given to the same version of the model\n will output the same image every time.\n " + }, + "enable_safety_checker": { + "title": "Enable Safety Checker", + "type": "boolean", + "description": "If set to true, the safety checker will be enabled.", + "default": true + } + }, + "x-fal-order-properties": [ + "prompt", + "image_size", + "num_inference_steps", + "seed", + "loras", + "guidance_scale", + "sync_mode", + "num_images", + "enable_safety_checker", + "output_format" + ], + "required": [ + "prompt" + ] + }, + "FluxLoraOutput": { + "title": "Output", + "type": "object", + "properties": { + "prompt": { + "title": "Prompt", + "type": "string", + "description": "The prompt used for generating the image." + }, + "images": { + "title": "Images", + "type": "array", + "description": "The generated image files info.", + "items": { + "$ref": "#/components/schemas/Image" + } + }, + "timings": { + "additionalProperties": { + "type": "number" + }, + "type": "object", + "title": "Timings" + }, + "has_nsfw_concepts": { + "title": "Has Nsfw Concepts", + "type": "array", + "description": "Whether the generated images contain NSFW concepts.", + "items": { + "type": "boolean" + } + }, + "seed": { + "title": "Seed", + "type": "integer", + "description": "\n Seed of the generated Image. It will be the same value of the one passed in the\n input or the randomly generated that was used in case none was passed.\n " + } + }, + "x-fal-order-properties": [ + "images", + "timings", + "seed", + "has_nsfw_concepts", + "prompt" + ], + "required": [ + "images", + "timings", + "seed", + "has_nsfw_concepts", + "prompt" + ] + }, + "ImageSize": { + "title": "ImageSize", + "type": "object", + "properties": { + "height": { + "maximum": 14142, + "type": "integer", + "title": "Height", + "description": "The height of the generated image.", + "exclusiveMinimum": 0, + "default": 512 + }, + "width": { + "maximum": 14142, + "type": "integer", + "title": "Width", + "description": "The width of the generated image.", + "exclusiveMinimum": 0, + "default": 512 + } + }, + "x-fal-order-properties": [ + "width", + "height" + ] + }, + "LoraWeight": { + "title": "LoraWeight", + "type": "object", + "properties": { + "path": { + "title": "Path", + "type": "string", + "description": "URL or the path to the LoRA weights." + }, + "scale": { + "minimum": 0, + "maximum": 4, + "type": "number", + "title": "Scale", + "description": "\n The scale of the LoRA weight. This is used to scale the LoRA weight\n before merging it with the base model.\n ", + "default": 1 + } + }, + "x-fal-order-properties": [ + "path", + "scale" + ], + "required": [ + "path" + ] + }, + "Image": { + "title": "Image", + "type": "object", + "properties": { + "height": { + "title": "Height", + "type": "integer" + }, + "content_type": { + "title": "Content Type", + "type": "string", + "default": "image/jpeg" + }, + "url": { + "title": "Url", + "type": "string" + }, + "width": { + "title": "Width", + "type": "integer" + } + }, + "x-fal-order-properties": [ + "url", + "width", + "height", + "content_type" + ], + "required": [ + "url", + "width", + "height" + ] + } + } + }, + "paths": { + "/fal-ai/flux-lora/requests/{request_id}/status": { + "get": { + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "Request ID" + } + }, + { + "name": "logs", + "in": "query", + "required": false, + "schema": { + "type": "number", + "description": "Whether to include logs (`1`) in the response or not (`0`)." + } + } + ], + "responses": { + "200": { + "description": "The request status.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueueStatus" + } + } + } + } + } + } + }, + "/fal-ai/flux-lora/requests/{request_id}/cancel": { + "put": { + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "Request ID" + } + } + ], + "responses": { + "200": { + "description": "The request was cancelled.", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "success": { + "type": "boolean", + "description": "Whether the request was cancelled successfully." + } + } + } + } + } + } + } + } + }, + "/fal-ai/flux-lora": { + "post": { + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FluxLoraInput" + } + } + } + }, + "responses": { + "200": { + "description": "The request status.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/QueueStatus" + } + } + } + } + } + } + }, + "/fal-ai/flux-lora/requests/{request_id}": { + "get": { + "parameters": [ + { + "name": "request_id", + "in": "path", + "required": true, + "schema": { + "type": "string", + "description": "Request ID" + } + } + ], + "responses": { + "200": { + "description": "Result of the request.", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/FluxLoraOutput" + } + } + } + } + } + } + } + }, + "servers": [ + { + "url": "https://queue.fal.run" + } + ], + "security": [ + { + "apiKeyAuth": [] + } + ] +} \ No newline at end of file diff --git a/app/src/main/assets/falai-endpoints/flux/dev/image-to-image/openapi.json b/app/src/main/assets/falai-endpoints/flux/dev/image-to-image/openapi.json new file mode 100644 index 000000000..f248645fe --- /dev/null +++ b/app/src/main/assets/falai-endpoints/flux/dev/image-to-image/openapi.json @@ -0,0 +1 @@ +{"openapi":"3.0.4","info":{"title":"Queue OpenAPI for fal-ai/flux/dev/image-to-image","version":"1.0.0","description":"The OpenAPI schema for the fal-ai/flux/dev/image-to-image queue.","x-fal-metadata":{"endpointId":"fal-ai/flux/dev/image-to-image","category":"image-to-image","thumbnailUrl":"https://fal.media/files/panda/jJ3ZxKTV6ulhHV6GKi9nZ_68430b557ef64f68bf6f0fed0e78c6f9.jpg","playgroundUrl":"https://fal.ai/models/fal-ai/flux/dev/image-to-image","documentationUrl":"https://fal.ai/models/fal-ai/flux/dev/image-to-image/api"}},"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Fal Key"}},"schemas":{"QueueStatus":{"type":"object","properties":{"status":{"type":"string","enum":["IN_QUEUE","IN_PROGRESS","COMPLETED"]},"request_id":{"type":"string","description":"The request id."},"response_url":{"type":"string","description":"The response url."},"status_url":{"type":"string","description":"The status url."},"cancel_url":{"type":"string","description":"The cancel url."},"logs":{"type":"object","description":"The logs.","additionalProperties":true},"metrics":{"type":"object","description":"The metrics.","additionalProperties":true},"queue_position":{"type":"integer","description":"The queue position."}},"required":["status","request_id"]},"FluxDevImageToImageInput":{"title":"BaseImageToInput","type":"object","properties":{"prompt":{"examples":["A cat dressed as a wizard with a background of a mystic forest."],"description":"The prompt to generate an image from.","type":"string","title":"Prompt"},"num_images":{"minimum":1,"description":"The number of images to generate.","type":"integer","title":"Num Images","maximum":4,"default":1},"acceleration":{"enum":["none","regular","high"],"description":"The speed of the generation. The higher the speed, the faster the generation.","type":"string","title":"Acceleration","default":"none"},"output_format":{"enum":["jpeg","png"],"description":"The format of the generated image.","type":"string","title":"Output Format","default":"jpeg"},"image_url":{"examples":["https://fal.media/files/koala/Chls9L2ZnvuipUTEwlnJC.png"],"description":"The URL of the image to generate an image from.","type":"string","title":"Image URL"},"sync_mode":{"description":"If `True`, the media will be returned as a data URI and the output data won't be available in the request history.","type":"boolean","title":"Sync Mode","default":false},"strength":{"minimum":0.01,"description":"The strength of the initial image. Higher strength values are better for this model.","type":"number","title":"Strength","maximum":1,"default":0.95},"enable_safety_checker":{"description":"If set to true, the safety checker will be enabled.","type":"boolean","title":"Enable Safety Checker","default":true},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"\n The same seed and the same prompt given to the same version of the model\n will output the same image every time.\n ","title":"Seed"},"guidance_scale":{"minimum":1,"description":"\n The CFG (Classifier Free Guidance) scale is a measure of how close you want\n the model to stick to your prompt when looking for a related image to show you.\n ","type":"number","title":"Guidance scale (CFG)","maximum":20,"default":3.5},"num_inference_steps":{"minimum":10,"description":"The number of inference steps to perform.","type":"integer","title":"Num Inference Steps","maximum":50,"default":40}},"x-fal-order-properties":["image_url","strength","num_inference_steps","prompt","seed","guidance_scale","sync_mode","num_images","enable_safety_checker","output_format","acceleration"],"required":["image_url","prompt"]},"FluxDevImageToImageOutput":{"title":"Output","type":"object","properties":{"prompt":{"description":"The prompt used for generating the image.","type":"string","title":"Prompt"},"images":{"description":"The generated image files info.","type":"array","title":"Images","items":{"$ref":"#/components/schemas/Image"}},"timings":{"additionalProperties":{"type":"number"},"type":"object","title":"Timings"},"has_nsfw_concepts":{"description":"Whether the generated images contain NSFW concepts.","type":"array","title":"Has Nsfw Concepts","items":{"type":"boolean"}},"seed":{"description":"\n Seed of the generated Image. It will be the same value of the one passed in the\n input or the randomly generated that was used in case none was passed.\n ","type":"integer","title":"Seed"}},"x-fal-order-properties":["images","timings","seed","has_nsfw_concepts","prompt"],"required":["images","timings","seed","has_nsfw_concepts","prompt"]},"Image":{"title":"Image","type":"object","properties":{"height":{"title":"Height","type":"integer"},"content_type":{"title":"Content Type","type":"string","default":"image/jpeg"},"url":{"title":"Url","type":"string"},"width":{"title":"Width","type":"integer"}},"x-fal-order-properties":["url","width","height","content_type"],"required":["url","width","height"]}}},"paths":{"/fal-ai/flux/dev/image-to-image/requests/{request_id}/status":{"get":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}},{"name":"logs","in":"query","required":false,"schema":{"type":"number","description":"Whether to include logs (`1`) in the response or not (`0`)."}}],"responses":{"200":{"description":"The request status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueStatus"}}}}}}},"/fal-ai/flux/dev/image-to-image/requests/{request_id}/cancel":{"put":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}}],"responses":{"200":{"description":"The request was cancelled.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether the request was cancelled successfully."}}}}}}}}},"/fal-ai/flux/dev/image-to-image":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FluxDevImageToImageInput"}}}},"responses":{"200":{"description":"The request status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueStatus"}}}}}}},"/fal-ai/flux/dev/image-to-image/requests/{request_id}":{"get":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}}],"responses":{"200":{"description":"Result of the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FluxDevImageToImageOutput"}}}}}}}},"servers":[{"url":"https://queue.fal.run"}],"security":[{"apiKeyAuth":[]}]} \ No newline at end of file diff --git a/app/src/main/assets/falai-endpoints/flux/dev/openapi.json b/app/src/main/assets/falai-endpoints/flux/dev/openapi.json new file mode 100644 index 000000000..051ea2f5f --- /dev/null +++ b/app/src/main/assets/falai-endpoints/flux/dev/openapi.json @@ -0,0 +1 @@ +{"openapi":"3.0.4","info":{"title":"Queue OpenAPI for fal-ai/flux/dev","version":"1.0.0","description":"The OpenAPI schema for the fal-ai/flux/dev queue.","x-fal-metadata":{"endpointId":"fal-ai/flux/dev","category":"text-to-image","thumbnailUrl":"https://storage.googleapis.com/fal_cdn/fal/Upscale-1.jpeg","playgroundUrl":"https://fal.ai/models/fal-ai/flux/dev","documentationUrl":"https://fal.ai/models/fal-ai/flux/dev/api"}},"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Fal Key"}},"schemas":{"QueueStatus":{"type":"object","properties":{"status":{"type":"string","enum":["IN_QUEUE","IN_PROGRESS","COMPLETED"]},"request_id":{"type":"string","description":"The request id."},"response_url":{"type":"string","description":"The response url."},"status_url":{"type":"string","description":"The status url."},"cancel_url":{"type":"string","description":"The cancel url."},"logs":{"type":"object","description":"The logs.","additionalProperties":true},"metrics":{"type":"object","description":"The metrics.","additionalProperties":true},"queue_position":{"type":"integer","description":"The queue position."}},"required":["status","request_id"]},"FluxDevInput":{"title":"BaseInput","type":"object","properties":{"prompt":{"examples":["Extreme close-up of a single tiger eye, direct frontal view. Detailed iris and pupil. Sharp focus on eye texture and color. Natural lighting to capture authentic eye shine and depth. The word \"FLUX\" is painted over it in big, white brush strokes with visible texture."],"description":"The prompt to generate an image from.","type":"string","title":"Prompt"},"num_images":{"minimum":1,"description":"The number of images to generate.","type":"integer","title":"Num Images","maximum":4,"default":1},"image_size":{"anyOf":[{"$ref":"#/components/schemas/ImageSize"},{"enum":["square_hd","square","portrait_4_3","portrait_16_9","landscape_4_3","landscape_16_9"],"type":"string"}],"description":"The size of the generated image.","title":"Image Size","default":"landscape_4_3"},"acceleration":{"enum":["none","regular","high"],"description":"The speed of the generation. The higher the speed, the faster the generation.","type":"string","title":"Acceleration","default":"none"},"output_format":{"enum":["jpeg","png"],"description":"The format of the generated image.","type":"string","title":"Output Format","default":"jpeg"},"sync_mode":{"description":"If `True`, the media will be returned as a data URI and the output data won't be available in the request history.","type":"boolean","title":"Sync Mode","default":false},"enable_safety_checker":{"description":"If set to true, the safety checker will be enabled.","type":"boolean","title":"Enable Safety Checker","default":true},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"\n The same seed and the same prompt given to the same version of the model\n will output the same image every time.\n ","title":"Seed"},"guidance_scale":{"minimum":1,"description":"\n The CFG (Classifier Free Guidance) scale is a measure of how close you want\n the model to stick to your prompt when looking for a related image to show you.\n ","type":"number","title":"Guidance scale (CFG)","maximum":20,"default":3.5},"num_inference_steps":{"minimum":1,"description":"The number of inference steps to perform.","type":"integer","title":"Num Inference Steps","maximum":50,"default":28}},"x-fal-order-properties":["prompt","image_size","num_inference_steps","seed","guidance_scale","sync_mode","num_images","enable_safety_checker","output_format","acceleration"],"required":["prompt"]},"FluxDevOutput":{"title":"Output","type":"object","properties":{"prompt":{"description":"The prompt used for generating the image.","type":"string","title":"Prompt"},"images":{"description":"The generated image files info.","type":"array","title":"Images","items":{"$ref":"#/components/schemas/Image"}},"timings":{"additionalProperties":{"type":"number"},"type":"object","title":"Timings"},"has_nsfw_concepts":{"description":"Whether the generated images contain NSFW concepts.","type":"array","title":"Has Nsfw Concepts","items":{"type":"boolean"}},"seed":{"description":"\n Seed of the generated Image. It will be the same value of the one passed in the\n input or the randomly generated that was used in case none was passed.\n ","type":"integer","title":"Seed"}},"x-fal-order-properties":["images","timings","seed","has_nsfw_concepts","prompt"],"required":["images","timings","seed","has_nsfw_concepts","prompt"]},"ImageSize":{"title":"ImageSize","type":"object","properties":{"height":{"description":"The height of the generated image.","type":"integer","title":"Height","maximum":14142,"exclusiveMinimum":0,"default":512},"width":{"description":"The width of the generated image.","type":"integer","title":"Width","maximum":14142,"exclusiveMinimum":0,"default":512}},"x-fal-order-properties":["width","height"]},"Image":{"title":"Image","type":"object","properties":{"height":{"title":"Height","type":"integer"},"content_type":{"title":"Content Type","type":"string","default":"image/jpeg"},"url":{"title":"Url","type":"string"},"width":{"title":"Width","type":"integer"}},"x-fal-order-properties":["url","width","height","content_type"],"required":["url","width","height"]}}},"paths":{"/fal-ai/flux/dev/requests/{request_id}/status":{"get":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}},{"name":"logs","in":"query","required":false,"schema":{"type":"number","description":"Whether to include logs (`1`) in the response or not (`0`)."}}],"responses":{"200":{"description":"The request status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueStatus"}}}}}}},"/fal-ai/flux/dev/requests/{request_id}/cancel":{"put":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}}],"responses":{"200":{"description":"The request was cancelled.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether the request was cancelled successfully."}}}}}}}}},"/fal-ai/flux/dev":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FluxDevInput"}}}},"responses":{"200":{"description":"The request status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueStatus"}}}}}}},"/fal-ai/flux/dev/requests/{request_id}":{"get":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}}],"responses":{"200":{"description":"Result of the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FluxDevOutput"}}}}}}}},"servers":[{"url":"https://queue.fal.run"}],"security":[{"apiKeyAuth":[]}]} \ No newline at end of file diff --git a/app/src/main/assets/falai-endpoints/flux/dev/redux/openapi.json b/app/src/main/assets/falai-endpoints/flux/dev/redux/openapi.json new file mode 100644 index 000000000..de260c360 --- /dev/null +++ b/app/src/main/assets/falai-endpoints/flux/dev/redux/openapi.json @@ -0,0 +1 @@ +{"openapi":"3.0.4","info":{"title":"Queue OpenAPI for fal-ai/flux/dev/redux","version":"1.0.0","description":"The OpenAPI schema for the fal-ai/flux/dev/redux queue.","x-fal-metadata":{"endpointId":"fal-ai/flux/dev/redux","category":"image-to-image","thumbnailUrl":"https://storage.googleapis.com/falserverless/gallery/flux-dev-thumb.webp","playgroundUrl":"https://fal.ai/models/fal-ai/flux/dev/redux","documentationUrl":"https://fal.ai/models/fal-ai/flux/dev/redux/api"}},"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Fal Key"}},"schemas":{"QueueStatus":{"type":"object","properties":{"status":{"type":"string","enum":["IN_QUEUE","IN_PROGRESS","COMPLETED"]},"request_id":{"type":"string","description":"The request id."},"response_url":{"type":"string","description":"The response url."},"status_url":{"type":"string","description":"The status url."},"cancel_url":{"type":"string","description":"The cancel url."},"logs":{"type":"object","description":"The logs.","additionalProperties":true},"metrics":{"type":"object","description":"The metrics.","additionalProperties":true},"queue_position":{"type":"integer","description":"The queue position."}},"required":["status","request_id"]},"FluxDevReduxInput":{"title":"BaseReduxInput","type":"object","properties":{"num_images":{"minimum":1,"description":"The number of images to generate.","type":"integer","title":"Num Images","maximum":4,"default":1},"image_size":{"anyOf":[{"$ref":"#/components/schemas/ImageSize"},{"enum":["square_hd","square","portrait_4_3","portrait_16_9","landscape_4_3","landscape_16_9"],"type":"string"}],"description":"The size of the generated image.","title":"Image Size","default":"landscape_4_3"},"acceleration":{"enum":["none","regular","high"],"description":"The speed of the generation. The higher the speed, the faster the generation.","type":"string","title":"Acceleration","default":"none"},"output_format":{"enum":["jpeg","png"],"description":"The format of the generated image.","type":"string","title":"Output Format","default":"jpeg"},"image_url":{"examples":["https://fal.media/files/kangaroo/acQvq-Kmo2lajkgvcEHdv.png"],"description":"The URL of the image to generate an image from.","type":"string","title":"Image URL"},"sync_mode":{"description":"If `True`, the media will be returned as a data URI and the output data won't be available in the request history.","type":"boolean","title":"Sync Mode","default":false},"enable_safety_checker":{"description":"If set to true, the safety checker will be enabled.","type":"boolean","title":"Enable Safety Checker","default":true},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"\n The same seed and the same prompt given to the same version of the model\n will output the same image every time.\n ","title":"Seed"},"guidance_scale":{"minimum":1,"description":"\n The CFG (Classifier Free Guidance) scale is a measure of how close you want\n the model to stick to your prompt when looking for a related image to show you.\n ","type":"number","title":"Guidance scale (CFG)","maximum":20,"default":3.5},"num_inference_steps":{"minimum":1,"description":"The number of inference steps to perform.","type":"integer","title":"Num Inference Steps","maximum":50,"default":28}},"x-fal-order-properties":["image_url","image_size","num_inference_steps","seed","guidance_scale","sync_mode","num_images","enable_safety_checker","output_format","acceleration"],"required":["image_url"]},"FluxDevReduxOutput":{"title":"Output","type":"object","properties":{"prompt":{"description":"The prompt used for generating the image.","type":"string","title":"Prompt"},"images":{"description":"The generated image files info.","type":"array","title":"Images","items":{"$ref":"#/components/schemas/Image"}},"timings":{"additionalProperties":{"type":"number"},"type":"object","title":"Timings"},"has_nsfw_concepts":{"description":"Whether the generated images contain NSFW concepts.","type":"array","title":"Has Nsfw Concepts","items":{"type":"boolean"}},"seed":{"description":"\n Seed of the generated Image. It will be the same value of the one passed in the\n input or the randomly generated that was used in case none was passed.\n ","type":"integer","title":"Seed"}},"x-fal-order-properties":["images","timings","seed","has_nsfw_concepts","prompt"],"required":["images","timings","seed","has_nsfw_concepts","prompt"]},"ImageSize":{"title":"ImageSize","type":"object","properties":{"height":{"description":"The height of the generated image.","type":"integer","title":"Height","maximum":14142,"exclusiveMinimum":0,"default":512},"width":{"description":"The width of the generated image.","type":"integer","title":"Width","maximum":14142,"exclusiveMinimum":0,"default":512}},"x-fal-order-properties":["width","height"]},"Image":{"title":"Image","type":"object","properties":{"height":{"title":"Height","type":"integer"},"content_type":{"title":"Content Type","type":"string","default":"image/jpeg"},"url":{"title":"Url","type":"string"},"width":{"title":"Width","type":"integer"}},"x-fal-order-properties":["url","width","height","content_type"],"required":["url","width","height"]}}},"paths":{"/fal-ai/flux/dev/redux/requests/{request_id}/status":{"get":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}},{"name":"logs","in":"query","required":false,"schema":{"type":"number","description":"Whether to include logs (`1`) in the response or not (`0`)."}}],"responses":{"200":{"description":"The request status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueStatus"}}}}}}},"/fal-ai/flux/dev/redux/requests/{request_id}/cancel":{"put":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}}],"responses":{"200":{"description":"The request was cancelled.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether the request was cancelled successfully."}}}}}}}}},"/fal-ai/flux/dev/redux":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FluxDevReduxInput"}}}},"responses":{"200":{"description":"The request status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueStatus"}}}}}}},"/fal-ai/flux/dev/redux/requests/{request_id}":{"get":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}}],"responses":{"200":{"description":"Result of the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FluxDevReduxOutput"}}}}}}}},"servers":[{"url":"https://queue.fal.run"}],"security":[{"apiKeyAuth":[]}]} \ No newline at end of file diff --git a/app/src/main/assets/falai-endpoints/flux/schnell/openapi.json b/app/src/main/assets/falai-endpoints/flux/schnell/openapi.json new file mode 100644 index 000000000..479414464 --- /dev/null +++ b/app/src/main/assets/falai-endpoints/flux/schnell/openapi.json @@ -0,0 +1 @@ +{"openapi":"3.0.4","info":{"title":"Queue OpenAPI for fal-ai/flux/schnell","version":"1.0.0","description":"The OpenAPI schema for the fal-ai/flux/schnell queue.","x-fal-metadata":{"endpointId":"fal-ai/flux/schnell","category":"text-to-image","thumbnailUrl":"https://storage.googleapis.com/falserverless/gallery/flux-schnell-thumb.webp","playgroundUrl":"https://fal.ai/models/fal-ai/flux/schnell","documentationUrl":"https://fal.ai/models/fal-ai/flux/schnell/api"}},"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Fal Key"}},"schemas":{"QueueStatus":{"type":"object","properties":{"status":{"type":"string","enum":["IN_QUEUE","IN_PROGRESS","COMPLETED"]},"request_id":{"type":"string","description":"The request id."},"response_url":{"type":"string","description":"The response url."},"status_url":{"type":"string","description":"The status url."},"cancel_url":{"type":"string","description":"The cancel url."},"logs":{"type":"object","description":"The logs.","additionalProperties":true},"metrics":{"type":"object","description":"The metrics.","additionalProperties":true},"queue_position":{"type":"integer","description":"The queue position."}},"required":["status","request_id"]},"FluxSchnellInput":{"title":"SchnellTextToImageInput","type":"object","properties":{"prompt":{"examples":["Extreme close-up of a single tiger eye, direct frontal view. Detailed iris and pupil. Sharp focus on eye texture and color. Natural lighting to capture authentic eye shine and depth. The word \"FLUX\" is painted over it in big, white brush strokes with visible texture."],"description":"The prompt to generate an image from.","type":"string","title":"Prompt"},"num_images":{"minimum":1,"description":"The number of images to generate.","type":"integer","title":"Num Images","maximum":4,"default":1},"image_size":{"anyOf":[{"$ref":"#/components/schemas/ImageSize"},{"enum":["square_hd","square","portrait_4_3","portrait_16_9","landscape_4_3","landscape_16_9"],"type":"string"}],"description":"The size of the generated image.","title":"Image Size","default":"landscape_4_3"},"acceleration":{"enum":["none","regular","high"],"description":"The speed of the generation. The higher the speed, the faster the generation.","type":"string","title":"Acceleration","default":"none"},"output_format":{"enum":["jpeg","png"],"description":"The format of the generated image.","type":"string","title":"Output Format","default":"jpeg"},"sync_mode":{"description":"If `True`, the media will be returned as a data URI and the output data won't be available in the request history.","type":"boolean","title":"Sync Mode","default":false},"enable_safety_checker":{"description":"If set to true, the safety checker will be enabled.","type":"boolean","title":"Enable Safety Checker","default":true},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"\n The same seed and the same prompt given to the same version of the model\n will output the same image every time.\n ","title":"Seed"},"guidance_scale":{"minimum":1,"description":"\n The CFG (Classifier Free Guidance) scale is a measure of how close you want\n the model to stick to your prompt when looking for a related image to show you.\n ","type":"number","title":"Guidance scale (CFG)","maximum":20,"default":3.5},"num_inference_steps":{"minimum":1,"description":"The number of inference steps to perform.","type":"integer","title":"Num Inference Steps","maximum":12,"default":4}},"x-fal-order-properties":["num_inference_steps","prompt","image_size","seed","guidance_scale","sync_mode","num_images","enable_safety_checker","output_format","acceleration"],"required":["prompt"]},"FluxSchnellOutput":{"title":"Output","type":"object","properties":{"prompt":{"description":"The prompt used for generating the image.","type":"string","title":"Prompt"},"images":{"description":"The generated image files info.","type":"array","title":"Images","items":{"$ref":"#/components/schemas/Image"}},"timings":{"additionalProperties":{"type":"number"},"type":"object","title":"Timings"},"has_nsfw_concepts":{"description":"Whether the generated images contain NSFW concepts.","type":"array","title":"Has Nsfw Concepts","items":{"type":"boolean"}},"seed":{"description":"\n Seed of the generated Image. It will be the same value of the one passed in the\n input or the randomly generated that was used in case none was passed.\n ","type":"integer","title":"Seed"}},"x-fal-order-properties":["images","timings","seed","has_nsfw_concepts","prompt"],"required":["images","timings","seed","has_nsfw_concepts","prompt"]},"ImageSize":{"title":"ImageSize","type":"object","properties":{"height":{"description":"The height of the generated image.","type":"integer","title":"Height","maximum":14142,"exclusiveMinimum":0,"default":512},"width":{"description":"The width of the generated image.","type":"integer","title":"Width","maximum":14142,"exclusiveMinimum":0,"default":512}},"x-fal-order-properties":["width","height"]},"Image":{"title":"Image","type":"object","properties":{"height":{"title":"Height","type":"integer"},"content_type":{"title":"Content Type","type":"string","default":"image/jpeg"},"url":{"title":"Url","type":"string"},"width":{"title":"Width","type":"integer"}},"x-fal-order-properties":["url","width","height","content_type"],"required":["url","width","height"]}}},"paths":{"/fal-ai/flux/schnell/requests/{request_id}/status":{"get":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}},{"name":"logs","in":"query","required":false,"schema":{"type":"number","description":"Whether to include logs (`1`) in the response or not (`0`)."}}],"responses":{"200":{"description":"The request status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueStatus"}}}}}}},"/fal-ai/flux/schnell/requests/{request_id}/cancel":{"put":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}}],"responses":{"200":{"description":"The request was cancelled.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether the request was cancelled successfully."}}}}}}}}},"/fal-ai/flux/schnell":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FluxSchnellInput"}}}},"responses":{"200":{"description":"The request status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueStatus"}}}}}}},"/fal-ai/flux/schnell/requests/{request_id}":{"get":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}}],"responses":{"200":{"description":"Result of the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FluxSchnellOutput"}}}}}}}},"servers":[{"url":"https://queue.fal.run"}],"security":[{"apiKeyAuth":[]}]} \ No newline at end of file diff --git a/app/src/main/assets/falai-endpoints/flux/schnell/redux/openapi.json b/app/src/main/assets/falai-endpoints/flux/schnell/redux/openapi.json new file mode 100644 index 000000000..03a708e58 --- /dev/null +++ b/app/src/main/assets/falai-endpoints/flux/schnell/redux/openapi.json @@ -0,0 +1 @@ +{"openapi":"3.0.4","info":{"title":"Queue OpenAPI for fal-ai/flux/schnell/redux","version":"1.0.0","description":"The OpenAPI schema for the fal-ai/flux/schnell/redux queue.","x-fal-metadata":{"endpointId":"fal-ai/flux/schnell/redux","category":"image-to-image","thumbnailUrl":"https://storage.googleapis.com/falserverless/gallery/flux-schnell-thumb.webp","playgroundUrl":"https://fal.ai/models/fal-ai/flux/schnell/redux","documentationUrl":"https://fal.ai/models/fal-ai/flux/schnell/redux/api"}},"components":{"securitySchemes":{"apiKeyAuth":{"type":"apiKey","in":"header","name":"Authorization","description":"Fal Key"}},"schemas":{"QueueStatus":{"type":"object","properties":{"status":{"type":"string","enum":["IN_QUEUE","IN_PROGRESS","COMPLETED"]},"request_id":{"type":"string","description":"The request id."},"response_url":{"type":"string","description":"The response url."},"status_url":{"type":"string","description":"The status url."},"cancel_url":{"type":"string","description":"The cancel url."},"logs":{"type":"object","description":"The logs.","additionalProperties":true},"metrics":{"type":"object","description":"The metrics.","additionalProperties":true},"queue_position":{"type":"integer","description":"The queue position."}},"required":["status","request_id"]},"FluxSchnellReduxInput":{"title":"SchnellReduxInput","type":"object","properties":{"num_images":{"minimum":1,"description":"The number of images to generate.","type":"integer","title":"Num Images","maximum":4,"default":1},"image_size":{"anyOf":[{"$ref":"#/components/schemas/ImageSize"},{"enum":["square_hd","square","portrait_4_3","portrait_16_9","landscape_4_3","landscape_16_9"],"type":"string"}],"description":"The size of the generated image.","title":"Image Size","default":"landscape_4_3"},"acceleration":{"enum":["none","regular","high"],"description":"The speed of the generation. The higher the speed, the faster the generation.","type":"string","title":"Acceleration","default":"none"},"output_format":{"enum":["jpeg","png"],"description":"The format of the generated image.","type":"string","title":"Output Format","default":"jpeg"},"image_url":{"examples":["https://fal.media/files/kangaroo/acQvq-Kmo2lajkgvcEHdv.png"],"description":"The URL of the image to generate an image from.","type":"string","title":"Image URL"},"sync_mode":{"description":"If `True`, the media will be returned as a data URI and the output data won't be available in the request history.","type":"boolean","title":"Sync Mode","default":false},"enable_safety_checker":{"description":"If set to true, the safety checker will be enabled.","type":"boolean","title":"Enable Safety Checker","default":true},"seed":{"anyOf":[{"type":"integer"},{"type":"null"}],"description":"\n The same seed and the same prompt given to the same version of the model\n will output the same image every time.\n ","title":"Seed"},"num_inference_steps":{"minimum":1,"description":"The number of inference steps to perform.","type":"integer","title":"Num Inference Steps","maximum":12,"default":4}},"x-fal-order-properties":["image_url","num_inference_steps","image_size","seed","sync_mode","num_images","enable_safety_checker","output_format","acceleration"],"required":["image_url"]},"FluxSchnellReduxOutput":{"title":"Output","type":"object","properties":{"prompt":{"description":"The prompt used for generating the image.","type":"string","title":"Prompt"},"images":{"description":"The generated image files info.","type":"array","title":"Images","items":{"$ref":"#/components/schemas/Image"}},"timings":{"additionalProperties":{"type":"number"},"type":"object","title":"Timings"},"has_nsfw_concepts":{"description":"Whether the generated images contain NSFW concepts.","type":"array","title":"Has Nsfw Concepts","items":{"type":"boolean"}},"seed":{"description":"\n Seed of the generated Image. It will be the same value of the one passed in the\n input or the randomly generated that was used in case none was passed.\n ","type":"integer","title":"Seed"}},"x-fal-order-properties":["images","timings","seed","has_nsfw_concepts","prompt"],"required":["images","timings","seed","has_nsfw_concepts","prompt"]},"ImageSize":{"title":"ImageSize","type":"object","properties":{"height":{"description":"The height of the generated image.","type":"integer","title":"Height","maximum":14142,"exclusiveMinimum":0,"default":512},"width":{"description":"The width of the generated image.","type":"integer","title":"Width","maximum":14142,"exclusiveMinimum":0,"default":512}},"x-fal-order-properties":["width","height"]},"Image":{"title":"Image","type":"object","properties":{"height":{"title":"Height","type":"integer"},"content_type":{"title":"Content Type","type":"string","default":"image/jpeg"},"url":{"title":"Url","type":"string"},"width":{"title":"Width","type":"integer"}},"x-fal-order-properties":["url","width","height","content_type"],"required":["url","width","height"]}}},"paths":{"/fal-ai/flux/schnell/redux/requests/{request_id}/status":{"get":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}},{"name":"logs","in":"query","required":false,"schema":{"type":"number","description":"Whether to include logs (`1`) in the response or not (`0`)."}}],"responses":{"200":{"description":"The request status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueStatus"}}}}}}},"/fal-ai/flux/schnell/redux/requests/{request_id}/cancel":{"put":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}}],"responses":{"200":{"description":"The request was cancelled.","content":{"application/json":{"schema":{"type":"object","properties":{"success":{"type":"boolean","description":"Whether the request was cancelled successfully."}}}}}}}}},"/fal-ai/flux/schnell/redux":{"post":{"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/FluxSchnellReduxInput"}}}},"responses":{"200":{"description":"The request status.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/QueueStatus"}}}}}}},"/fal-ai/flux/schnell/redux/requests/{request_id}":{"get":{"parameters":[{"name":"request_id","in":"path","required":true,"schema":{"type":"string","description":"Request ID"}}],"responses":{"200":{"description":"Result of the request.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/FluxSchnellReduxOutput"}}}}}}}},"servers":[{"url":"https://queue.fal.run"}],"security":[{"apiKeyAuth":[]}]} \ No newline at end of file diff --git a/app/src/main/java/com/shifthackz/aisdv1/app/di/ProvidersModule.kt b/app/src/main/java/com/shifthackz/aisdv1/app/di/ProvidersModule.kt index 5aaa0ea2f..710777c7c 100755 --- a/app/src/main/java/com/shifthackz/aisdv1/app/di/ProvidersModule.kt +++ b/app/src/main/java/com/shifthackz/aisdv1/app/di/ProvidersModule.kt @@ -55,6 +55,7 @@ val providersModule = module { override val huggingFaceInferenceApiUrl = BuildConfig.HUGGING_FACE_INFERENCE_URL override val openAiApiUrl: String = BuildConfig.OPEN_AI_URL override val stabilityAiApiUrl = BuildConfig.STABILITY_AI_URL + override val falAiApiUrl: String = BuildConfig.FAL_AI_URL } } @@ -83,6 +84,11 @@ val providersModule = module { NetworkHeaders.AUTHORIZATION to key } + ServerSource.FAL_AI -> { + val key = "${NetworkPrefixes.KEY} ${preference.falAiApiKey}" + NetworkHeaders.AUTHORIZATION to key + } + else -> null } } @@ -111,6 +117,7 @@ val providersModule = module { override val huggingFaceUrl: String = BuildConfig.HUGGING_FACE_INFO_URL override val openAiInfoUrl: String = BuildConfig.OPEN_AI_INFO_URL override val stabilityAiInfoUrl: String = BuildConfig.STABILITY_AI_INFO_URL + override val falAiInfoUrl: String = BuildConfig.FAL_AI_INFO_URL override val privacyPolicyUrl: String = BuildConfig.POLICY_URL override val donateUrl: String = BuildConfig.DONATE_URL override val gitHubSourceUrl: String = BuildConfig.GITHUB_SOURCE_URL diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/links/LinksProvider.kt b/core/common/src/main/java/com/shifthackz/aisdv1/core/common/links/LinksProvider.kt index ac6670be1..487693148 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/links/LinksProvider.kt +++ b/core/common/src/main/java/com/shifthackz/aisdv1/core/common/links/LinksProvider.kt @@ -6,6 +6,7 @@ interface LinksProvider { val huggingFaceUrl: String val openAiInfoUrl: String val stabilityAiInfoUrl: String + val falAiInfoUrl: String val privacyPolicyUrl: String val donateUrl: String val gitHubSourceUrl: String diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/core/CoreGenerationRepository.kt b/data/src/main/java/com/shifthackz/aisdv1/data/core/CoreGenerationRepository.kt index afe41de0d..43fa6535b 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/core/CoreGenerationRepository.kt +++ b/data/src/main/java/com/shifthackz/aisdv1/data/core/CoreGenerationRepository.kt @@ -3,6 +3,8 @@ package com.shifthackz.aisdv1.data.core import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import com.shifthackz.aisdv1.domain.entity.MediaType +import com.shifthackz.aisdv1.domain.feature.MediaFileManager import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway import com.shifthackz.aisdv1.domain.preference.PreferenceManager @@ -14,14 +16,42 @@ internal abstract class CoreGenerationRepository( private val localDataSource: GenerationResultDataSource.Local, private val preferenceManager: PreferenceManager, private val backgroundWorkObserver: BackgroundWorkObserver, + private val mediaFileManager: MediaFileManager, ) : CoreMediaStoreRepository(preferenceManager, mediaStoreGateway, base64ToBitmapConverter) { protected fun insertGenerationResult(ai: AiGenerationResult): Single { if (backgroundWorkObserver.hasActiveTasks() || preferenceManager.autoSaveAiResults) { + val converted = ai.saveMediaToFiles() return localDataSource - .insert(ai) + .insert(converted) .flatMap { id -> exportToMediaStore(ai).andThen(Single.just(ai.copy(id))) } } return Single.just(ai) } + + /** + * Converts base64 data to files before saving to database. + * This prevents SQLiteBlobTooBigException for large images. + */ + private fun AiGenerationResult.saveMediaToFiles(): AiGenerationResult { + var mediaPath = this.mediaPath + var inputMediaPath = this.inputMediaPath + + // Convert main image base64 to file + if (image.isNotEmpty() && !mediaFileManager.isFilePath(image) && !mediaFileManager.isVideoUrl(image)) { + mediaPath = mediaFileManager.migrateBase64ToFile(image, mediaType) + } + + // Convert input image base64 to file + if (inputImage.isNotEmpty() && !mediaFileManager.isFilePath(inputImage)) { + inputMediaPath = mediaFileManager.migrateBase64ToFile(inputImage, MediaType.IMAGE) + } + + return copy( + image = "", // Clear base64 from database + inputImage = "", // Clear base64 from database + mediaPath = mediaPath, + inputMediaPath = inputMediaPath, + ) + } } diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/di/LocalDataSourceModule.kt b/data/src/main/java/com/shifthackz/aisdv1/data/di/LocalDataSourceModule.kt index 7c8748cbc..4fde3b3a5 100755 --- a/data/src/main/java/com/shifthackz/aisdv1/data/di/LocalDataSourceModule.kt +++ b/data/src/main/java/com/shifthackz/aisdv1/data/di/LocalDataSourceModule.kt @@ -1,9 +1,12 @@ package com.shifthackz.aisdv1.data.di +import com.shifthackz.aisdv1.data.feature.MediaFileManagerImpl import com.shifthackz.aisdv1.data.gateway.DatabaseClearGatewayImpl import com.shifthackz.aisdv1.data.gateway.mediastore.MediaStoreGatewayFactory import com.shifthackz.aisdv1.data.local.DownloadableModelLocalDataSource import com.shifthackz.aisdv1.data.local.EmbeddingsLocalDataSource +import com.shifthackz.aisdv1.data.local.FalAiEndpointBuiltInDataSource +import com.shifthackz.aisdv1.data.local.FalAiEndpointLocalDataSource import com.shifthackz.aisdv1.data.local.GenerationResultLocalDataSource import com.shifthackz.aisdv1.data.local.HuggingFaceModelsLocalDataSource import com.shifthackz.aisdv1.data.local.LorasLocalDataSource @@ -16,6 +19,7 @@ import com.shifthackz.aisdv1.data.local.SupportersLocalDataSource import com.shifthackz.aisdv1.data.local.SwarmUiModelsLocalDataSource import com.shifthackz.aisdv1.domain.datasource.DownloadableModelDataSource import com.shifthackz.aisdv1.domain.datasource.EmbeddingsDataSource +import com.shifthackz.aisdv1.domain.datasource.FalAiEndpointDataSource import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource import com.shifthackz.aisdv1.domain.datasource.HuggingFaceModelsDataSource import com.shifthackz.aisdv1.domain.datasource.LorasDataSource @@ -26,6 +30,7 @@ import com.shifthackz.aisdv1.domain.datasource.StableDiffusionModelsDataSource import com.shifthackz.aisdv1.domain.datasource.StableDiffusionSamplersDataSource import com.shifthackz.aisdv1.domain.datasource.SupportersDataSource import com.shifthackz.aisdv1.domain.datasource.SwarmUiModelsDataSource +import com.shifthackz.aisdv1.domain.feature.MediaFileManager import com.shifthackz.aisdv1.domain.gateway.DatabaseClearGateway import org.koin.android.ext.koin.androidContext import org.koin.core.module.dsl.factoryOf @@ -35,6 +40,7 @@ import org.koin.dsl.module val localDataSourceModule = module { singleOf(::DatabaseClearGatewayImpl) bind DatabaseClearGateway::class + single { MediaFileManagerImpl(androidContext(), get()) } // !!! Do not use [factoryOf] for StabilityAiCreditsLocalDataSource, it has default constructor single { StabilityAiCreditsLocalDataSource() } factoryOf(::StableDiffusionModelsLocalDataSource) bind StableDiffusionModelsDataSource.Local::class @@ -48,5 +54,7 @@ val localDataSourceModule = module { factoryOf(::DownloadableModelLocalDataSource) bind DownloadableModelDataSource.Local::class factoryOf(::HuggingFaceModelsLocalDataSource) bind HuggingFaceModelsDataSource.Local::class factoryOf(::SupportersLocalDataSource) bind SupportersDataSource.Local::class + factoryOf(::FalAiEndpointLocalDataSource) bind FalAiEndpointDataSource.Local::class + factoryOf(::FalAiEndpointBuiltInDataSource) bind FalAiEndpointDataSource.BuiltIn::class factory { MediaStoreGatewayFactory(androidContext(), get()).invoke() } } diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/di/RemoteDataSourceModule.kt b/data/src/main/java/com/shifthackz/aisdv1/data/di/RemoteDataSourceModule.kt index 29912afd1..8800bd415 100755 --- a/data/src/main/java/com/shifthackz/aisdv1/data/di/RemoteDataSourceModule.kt +++ b/data/src/main/java/com/shifthackz/aisdv1/data/di/RemoteDataSourceModule.kt @@ -4,6 +4,8 @@ import com.shifthackz.aisdv1.core.common.extensions.fixUrlSlashes import com.shifthackz.aisdv1.data.gateway.ServerConnectivityGatewayImpl import com.shifthackz.aisdv1.data.provider.ServerUrlProvider import com.shifthackz.aisdv1.data.remote.DownloadableModelRemoteDataSource +import com.shifthackz.aisdv1.data.remote.FalAiEndpointRemoteDataSource +import com.shifthackz.aisdv1.data.remote.FalAiGenerationRemoteDataSource import com.shifthackz.aisdv1.data.remote.HordeGenerationRemoteDataSource import com.shifthackz.aisdv1.data.remote.HordeStatusSource import com.shifthackz.aisdv1.data.remote.HuggingFaceGenerationRemoteDataSource @@ -29,6 +31,8 @@ import com.shifthackz.aisdv1.data.remote.SwarmUiModelsRemoteDataSource import com.shifthackz.aisdv1.data.remote.SwarmUiSessionDataSourceImpl import com.shifthackz.aisdv1.domain.datasource.DownloadableModelDataSource import com.shifthackz.aisdv1.domain.datasource.EmbeddingsDataSource +import com.shifthackz.aisdv1.domain.datasource.FalAiEndpointDataSource +import com.shifthackz.aisdv1.domain.datasource.FalAiGenerationDataSource import com.shifthackz.aisdv1.domain.datasource.HordeGenerationDataSource import com.shifthackz.aisdv1.domain.datasource.HuggingFaceGenerationDataSource import com.shifthackz.aisdv1.domain.datasource.HuggingFaceModelsDataSource @@ -96,12 +100,14 @@ val remoteDataSourceModule = module { factoryOf(::StabilityAiGenerationRemoteDataSource) bind StabilityAiGenerationDataSource.Remote::class factoryOf(::StabilityAiCreditsRemoteDataSource) bind StabilityAiCreditsDataSource.Remote::class factoryOf(::StabilityAiEnginesRemoteDataSource) bind StabilityAiEnginesDataSource.Remote::class + factoryOf(::FalAiGenerationRemoteDataSource) bind FalAiGenerationDataSource.Remote::class + factoryOf(::FalAiEndpointRemoteDataSource) bind FalAiEndpointDataSource.Remote::class factoryOf(::ReportRemoteDataSource) bind ReportDataSource.Remote::class factory { val lambda: () -> Boolean = { val prefs = get() - prefs.source == ServerSource.AUTOMATIC1111 || prefs.source == ServerSource.SWARM_UI + prefs.source != ServerSource.AUTOMATIC1111 && prefs.source != ServerSource.SWARM_UI } val monitor = get { parametersOf(lambda) } ServerConnectivityGatewayImpl(monitor, get()) diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/di/RepositoryModule.kt b/data/src/main/java/com/shifthackz/aisdv1/data/di/RepositoryModule.kt index 1358c8a9f..b8ee99c78 100755 --- a/data/src/main/java/com/shifthackz/aisdv1/data/di/RepositoryModule.kt +++ b/data/src/main/java/com/shifthackz/aisdv1/data/di/RepositoryModule.kt @@ -4,6 +4,9 @@ import android.content.Context import android.os.PowerManager import com.shifthackz.aisdv1.data.repository.DownloadableModelRepositoryImpl import com.shifthackz.aisdv1.data.repository.EmbeddingsRepositoryImpl +import com.shifthackz.aisdv1.data.repository.FalAiEndpointRepositoryImpl +import com.shifthackz.aisdv1.data.repository.FalAiGenerationRepositoryImpl +import com.shifthackz.aisdv1.data.repository.ForgeModulesRepositoryImpl import com.shifthackz.aisdv1.data.repository.GenerationResultRepositoryImpl import com.shifthackz.aisdv1.data.repository.HordeGenerationRepositoryImpl import com.shifthackz.aisdv1.data.repository.HuggingFaceGenerationRepositoryImpl @@ -29,6 +32,9 @@ import com.shifthackz.aisdv1.data.repository.TemporaryGenerationResultRepository import com.shifthackz.aisdv1.data.repository.WakeLockRepositoryImpl import com.shifthackz.aisdv1.domain.repository.DownloadableModelRepository import com.shifthackz.aisdv1.domain.repository.EmbeddingsRepository +import com.shifthackz.aisdv1.domain.repository.FalAiEndpointRepository +import com.shifthackz.aisdv1.domain.repository.FalAiGenerationRepository +import com.shifthackz.aisdv1.domain.repository.ForgeModulesRepository import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository import com.shifthackz.aisdv1.domain.repository.HordeGenerationRepository import com.shifthackz.aisdv1.domain.repository.HuggingFaceGenerationRepository @@ -76,12 +82,15 @@ val repositoryModule = module { factoryOf(::StabilityAiGenerationRepositoryImpl) bind StabilityAiGenerationRepository::class factoryOf(::StabilityAiCreditsRepositoryImpl) bind StabilityAiCreditsRepository::class factoryOf(::StabilityAiEnginesRepositoryImpl) bind StabilityAiEnginesRepository::class + factoryOf(::FalAiGenerationRepositoryImpl) bind FalAiGenerationRepository::class + factoryOf(::FalAiEndpointRepositoryImpl) bind FalAiEndpointRepository::class factoryOf(::StableDiffusionGenerationRepositoryImpl) bind StableDiffusionGenerationRepository::class factoryOf(::StableDiffusionModelsRepositoryImpl) bind StableDiffusionModelsRepository::class factoryOf(::StableDiffusionSamplersRepositoryImpl) bind StableDiffusionSamplersRepository::class factoryOf(::LorasRepositoryImpl) bind LorasRepository::class factoryOf(::StableDiffusionHyperNetworksRepositoryImpl) bind StableDiffusionHyperNetworksRepository::class factoryOf(::EmbeddingsRepositoryImpl) bind EmbeddingsRepository::class + factoryOf(::ForgeModulesRepositoryImpl) bind ForgeModulesRepository::class factoryOf(::ServerConfigurationRepositoryImpl) bind ServerConfigurationRepository::class factoryOf(::GenerationResultRepositoryImpl) bind GenerationResultRepository::class factoryOf(::RandomImageRepositoryImpl) bind RandomImageRepository::class diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/local/FalAiEndpointBuiltInDataSource.kt b/data/src/main/java/com/shifthackz/aisdv1/data/local/FalAiEndpointBuiltInDataSource.kt new file mode 100644 index 000000000..47da570f0 --- /dev/null +++ b/data/src/main/java/com/shifthackz/aisdv1/data/local/FalAiEndpointBuiltInDataSource.kt @@ -0,0 +1,54 @@ +package com.shifthackz.aisdv1.data.local + +import android.content.Context +import com.shifthackz.aisdv1.data.mappers.FalAiOpenApiParser +import com.shifthackz.aisdv1.domain.datasource.FalAiEndpointDataSource +import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint +import io.reactivex.rxjava3.core.Single + +/** + * Provides built-in fal.ai endpoints from app assets. + * Supports nested folder structure like fal-ai/flux-lora/inpainting.json + */ +internal class FalAiEndpointBuiltInDataSource( + private val context: Context, +) : FalAiEndpointDataSource.BuiltIn { + + override fun getAll(): Single> = Single.fromCallable { + findAllJsonFiles(ASSETS_DIR).mapNotNull { path -> + runCatching { + val json = context.assets + .open(path) + .bufferedReader() + .use { it.readText() } + FalAiOpenApiParser.parse(json, isCustom = false, assetPath = path) + }.getOrNull() + } + } + + /** + * Recursively finds all .json files in the given assets directory. + */ + private fun findAllJsonFiles(dir: String): List { + val result = mutableListOf() + val items = context.assets.list(dir) ?: return emptyList() + + for (item in items) { + val path = "$dir/$item" + if (item.endsWith(".json")) { + result.add(path) + } else { + // Check if it's a directory by trying to list it + val subItems = context.assets.list(path) + if (!subItems.isNullOrEmpty()) { + result.addAll(findAllJsonFiles(path)) + } + } + } + return result + } + + companion object { + private const val ASSETS_DIR = "falai-endpoints" + } +} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/local/FalAiEndpointLocalDataSource.kt b/data/src/main/java/com/shifthackz/aisdv1/data/local/FalAiEndpointLocalDataSource.kt new file mode 100644 index 000000000..7624f492c --- /dev/null +++ b/data/src/main/java/com/shifthackz/aisdv1/data/local/FalAiEndpointLocalDataSource.kt @@ -0,0 +1,37 @@ +package com.shifthackz.aisdv1.data.local + +import com.shifthackz.aisdv1.data.mappers.toDomain +import com.shifthackz.aisdv1.data.mappers.toEntity +import com.shifthackz.aisdv1.domain.datasource.FalAiEndpointDataSource +import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint +import com.shifthackz.aisdv1.storage.db.persistent.dao.FalAiEndpointDao +import io.reactivex.rxjava3.core.Completable +import io.reactivex.rxjava3.core.Observable +import io.reactivex.rxjava3.core.Single + +/** + * Local storage for custom fal.ai endpoints. + */ +internal class FalAiEndpointLocalDataSource( + private val dao: FalAiEndpointDao, +) : FalAiEndpointDataSource.Local { + + override fun observeAll(): Observable> = dao + .observeAll() + .map { entities -> entities.map { it.toDomain() } } + .toObservable() + + override fun getAll(): Single> = dao + .queryAll() + .map { entities -> entities.map { it.toDomain() } } + + override fun getById(id: String): Single = dao + .queryById(id) + .map { it.toDomain() } + + override fun save(endpoint: FalAiEndpoint): Completable = dao + .insert(endpoint.toEntity()) + + override fun delete(id: String): Completable = dao + .deleteById(id) +} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/FalAiEndpointMappers.kt b/data/src/main/java/com/shifthackz/aisdv1/data/mappers/FalAiEndpointMappers.kt new file mode 100644 index 000000000..cdb982646 --- /dev/null +++ b/data/src/main/java/com/shifthackz/aisdv1/data/mappers/FalAiEndpointMappers.kt @@ -0,0 +1,103 @@ +package com.shifthackz.aisdv1.data.mappers + +import com.google.gson.Gson +import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint +import com.shifthackz.aisdv1.domain.entity.FalAiEndpointCategory +import com.shifthackz.aisdv1.domain.entity.FalAiEndpointSchema +import com.shifthackz.aisdv1.domain.entity.FalAiInputProperty +import com.shifthackz.aisdv1.domain.entity.FalAiPropertyType +import com.shifthackz.aisdv1.storage.db.persistent.entity.FalAiEndpointEntity + +private val gson = Gson() + +fun FalAiEndpointEntity.toDomain(): FalAiEndpoint = FalAiEndpoint( + id = id, + endpointId = endpointId, + title = title, + description = description, + category = FalAiEndpointCategory.fromKey(category), + group = group, + thumbnailUrl = thumbnailUrl, + playgroundUrl = playgroundUrl, + documentationUrl = documentationUrl, + isCustom = isCustom, + schema = gson.fromJson(schemaJson, FalAiEndpointSchemaDto::class.java).toDomain(), +) + +fun FalAiEndpoint.toEntity(): FalAiEndpointEntity = FalAiEndpointEntity( + id = id, + endpointId = endpointId, + title = title, + description = description, + category = category.key, + group = group, + thumbnailUrl = thumbnailUrl, + playgroundUrl = playgroundUrl, + documentationUrl = documentationUrl, + isCustom = isCustom, + schemaJson = gson.toJson(schema.toDto()), +) + +// DTOs for JSON serialization +private data class FalAiEndpointSchemaDto( + val baseUrl: String, + val submissionPath: String, + val inputProperties: List, + val requiredProperties: List, + val propertyOrder: List, +) + +private data class FalAiInputPropertyDto( + val name: String, + val title: String, + val description: String, + val type: String, + val default: Any?, + val minimum: Double?, + val maximum: Double?, + val enumValues: List?, + val isRequired: Boolean, + val isImageInput: Boolean, +) + +private fun FalAiEndpointSchemaDto.toDomain() = FalAiEndpointSchema( + baseUrl = baseUrl, + submissionPath = submissionPath, + inputProperties = inputProperties.map { it.toDomain() }, + requiredProperties = requiredProperties, + propertyOrder = propertyOrder, +) + +private fun FalAiInputPropertyDto.toDomain() = FalAiInputProperty( + name = name, + title = title, + description = description, + type = FalAiPropertyType.valueOf(type), + default = default, + minimum = minimum, + maximum = maximum, + enumValues = enumValues, + isRequired = isRequired, + isImageInput = isImageInput, +) + +private fun FalAiEndpointSchema.toDto() = FalAiEndpointSchemaDto( + baseUrl = baseUrl, + submissionPath = submissionPath, + inputProperties = inputProperties.map { it.toDto() }, + requiredProperties = requiredProperties, + propertyOrder = propertyOrder, +) + +private fun FalAiInputProperty.toDto() = FalAiInputPropertyDto( + name = name, + title = title, + description = description, + type = type.name, + default = default, + minimum = minimum?.toDouble(), + maximum = maximum?.toDouble(), + enumValues = enumValues, + isRequired = isRequired, + isImageInput = isImageInput, +) diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/FalAiOpenApiParser.kt b/data/src/main/java/com/shifthackz/aisdv1/data/mappers/FalAiOpenApiParser.kt new file mode 100644 index 000000000..a657501d0 --- /dev/null +++ b/data/src/main/java/com/shifthackz/aisdv1/data/mappers/FalAiOpenApiParser.kt @@ -0,0 +1,337 @@ +package com.shifthackz.aisdv1.data.mappers + +import com.google.gson.Gson +import com.google.gson.JsonObject +import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint +import com.shifthackz.aisdv1.domain.entity.FalAiEndpointCategory +import com.shifthackz.aisdv1.domain.entity.FalAiEndpointSchema +import com.shifthackz.aisdv1.domain.entity.FalAiInputProperty +import com.shifthackz.aisdv1.domain.entity.FalAiPropertyType +import java.util.UUID + +/** + * Parses OpenAPI JSON schema into FalAiEndpoint domain entity. + */ +object FalAiOpenApiParser { + + private val gson = Gson() + + /** + * Parses an OpenAPI JSON schema into FalAiEndpoint. + * @param json The OpenAPI JSON content + * @param isCustom Whether this is a user-imported endpoint + * @param assetPath Optional asset path for built-in endpoints, used to extract group name + */ + fun parse(json: String, isCustom: Boolean = true, assetPath: String? = null): FalAiEndpoint { + val root = gson.fromJson(json, JsonObject::class.java) + + val info = root.getAsJsonObject("info") + val metadata = info.getAsJsonObject("x-fal-metadata") + + val endpointId = metadata.get("endpointId").asString + val id = if (isCustom) "custom-${UUID.randomUUID()}" else endpointId + + val category = FalAiEndpointCategory.fromKey( + metadata.get("category")?.asString ?: "other" + ) + + val schema = parseSchema(root) + + // Use endpointId as title, removing "fal-ai/" prefix + val title = endpointId.removePrefix("fal-ai/") + + // Extract group from asset path or use category as fallback + val group = extractGroupFromPath(assetPath) ?: category.displayName + + return FalAiEndpoint( + id = id, + endpointId = endpointId, + title = title, + description = info.get("description")?.asString ?: "", + category = category, + group = group, + thumbnailUrl = metadata.get("thumbnailUrl")?.asString ?: "", + playgroundUrl = metadata.get("playgroundUrl")?.asString ?: "", + documentationUrl = metadata.get("documentationUrl")?.asString ?: "", + isCustom = isCustom, + schema = schema, + ) + } + + private fun parseSchema(root: JsonObject): FalAiEndpointSchema { + val servers = root.getAsJsonArray("servers") + val baseUrl = servers?.get(0)?.asJsonObject?.get("url")?.asString + ?: "https://queue.fal.run" + + val paths = root.getAsJsonObject("paths") + val (submissionPath, inputSchemaRef) = findSubmissionEndpoint(paths) + + val components = root.getAsJsonObject("components") + val schemas = components?.getAsJsonObject("schemas") + + val inputSchema = resolveSchema(inputSchemaRef, schemas) + val (properties, required, order) = parseInputProperties(inputSchema, schemas) + + return FalAiEndpointSchema( + baseUrl = baseUrl, + submissionPath = submissionPath, + inputProperties = properties, + requiredProperties = required, + propertyOrder = order, + ) + } + + private fun findSubmissionEndpoint(paths: JsonObject): Pair { + for ((path, methods) in paths.entrySet()) { + val methodsObj = methods.asJsonObject + val post = methodsObj.getAsJsonObject("post") + if (post != null) { + val requestBody = post.getAsJsonObject("requestBody") + if (requestBody != null) { + val content = requestBody.getAsJsonObject("content") + val appJson = content?.getAsJsonObject("application/json") + val schema = appJson?.getAsJsonObject("schema") + return path to schema + } + } + } + throw IllegalArgumentException("No POST endpoint with requestBody found in OpenAPI schema") + } + + private fun resolveSchema(schemaRef: JsonObject?, schemas: JsonObject?): JsonObject? { + if (schemaRef == null) return null + + val ref = schemaRef.get("\$ref")?.asString + if (ref != null && schemas != null) { + val refName = ref.split("/").last() + return schemas.getAsJsonObject(refName) + } + return schemaRef + } + + private fun parseInputProperties( + inputSchema: JsonObject?, + schemas: JsonObject?, + ): Triple, List, List> { + if (inputSchema == null) return Triple(emptyList(), emptyList(), emptyList()) + + val properties = inputSchema.getAsJsonObject("properties") ?: return Triple(emptyList(), emptyList(), emptyList()) + val required = inputSchema.getAsJsonArray("required") + ?.map { it.asString } ?: emptyList() + val order = inputSchema.getAsJsonArray("x-fal-order-properties") + ?.map { it.asString } ?: properties.keySet().toList() + + // Check if this is an inpainting endpoint (has both image_url and mask_url in required) + val hasMaskUrl = properties.has("mask_url") + val hasImageUrl = properties.has("image_url") + val isInpaintingEndpoint = hasMaskUrl && hasImageUrl + + val parsedProperties = mutableListOf() + + for ((name, propElement) in properties.entrySet()) { + // Skip mask_url if this is an inpainting endpoint - it will be handled by image_url's INPAINT type + if (isInpaintingEndpoint && name == "mask_url") { + continue + } + + var prop = propElement.asJsonObject + val originalProp = prop // Keep original for default value extraction + + // Check if this is an image_size field with anyOf (ImageSize object + presets) + val anyOf = prop.getAsJsonArray("anyOf") + val isImageSizeField = name == "image_size" && anyOf != null && anyOf.any { element -> + val refStr = element.asJsonObject?.get("\$ref")?.asString + refStr?.contains("ImageSize") == true + } + + var imageSizePresets: List? = null + + if (isImageSizeField && anyOf != null) { + // Extract presets from enum option + val enumOption = anyOf.find { it.asJsonObject.has("enum") }?.asJsonObject + imageSizePresets = enumOption?.getAsJsonArray("enum")?.map { it.asString } + } else if (anyOf != null && anyOf.size() > 0) { + // Handle other anyOf - pick enum option or first option + val enumOption = anyOf.find { + it.asJsonObject.has("enum") + }?.asJsonObject + prop = enumOption ?: anyOf.get(0).asJsonObject + } + + // Resolve $ref if present (skip for image_size as we handle it specially) + if (!isImageSizeField) { + val ref = prop.get("\$ref")?.asString + if (ref != null && schemas != null) { + val refName = ref.split("/").last() + prop = schemas.getAsJsonObject(refName) ?: prop + } + } + + val isImageField = name.contains("image", ignoreCase = true) || + name.contains("mask", ignoreCase = true) + val hasEnum = prop.has("enum") + val typeStr = prop.get("type")?.asString + + // Check if this is an array of image URLs + val isImageArray = typeStr == "array" && isImageField && + originalProp.getAsJsonObject("items")?.get("type")?.asString == "string" + + val enumValues = when { + isImageSizeField -> imageSizePresets + hasEnum -> prop.getAsJsonArray("enum")?.map { it.asString } + else -> null + } + + // Determine if this is an inpainting image field (image_url with linked mask_url) + val isInpaintImageField = isInpaintingEndpoint && name == "image_url" + + val propertyType = when { + isInpaintImageField -> FalAiPropertyType.INPAINT + isImageSizeField -> FalAiPropertyType.IMAGE_SIZE + isImageArray -> FalAiPropertyType.IMAGE_URL_ARRAY + else -> FalAiPropertyType.fromString(typeStr, hasEnum, isImageField && typeStr == "string") + } + + // Parse array item properties if this is an array type + val arrayItemProperties = if (typeStr == "array") { + parseArrayItemProperties(originalProp, schemas) + } else null + + parsedProperties.add( + FalAiInputProperty( + name = name, + title = if (isInpaintImageField) "Image & Mask" else (prop.get("title")?.asString ?: name), + description = if (isInpaintImageField) { + "Select an image and draw a mask on the area to inpaint" + } else { + prop.get("description")?.asString ?: "" + }, + type = propertyType, + default = parseDefault(originalProp), + minimum = prop.get("minimum")?.asNumber, + maximum = prop.get("maximum")?.asNumber, + enumValues = enumValues, + isRequired = required.contains(name), + isImageInput = isImageField && (typeStr == "string" || prop.has("format")), + arrayItemProperties = arrayItemProperties, + linkedMaskProperty = if (isInpaintImageField) "mask_url" else null, + ) + ) + } + + return Triple(parsedProperties, required, order) + } + + private fun parseDefault(prop: JsonObject): Any? { + val default = prop.get("default") ?: return null + return when { + default.isJsonPrimitive -> { + val primitive = default.asJsonPrimitive + when { + primitive.isBoolean -> primitive.asBoolean + primitive.isNumber -> primitive.asNumber + primitive.isString -> primitive.asString + else -> primitive.asString + } + } + default.isJsonArray -> default.asJsonArray.map { it.asString } + else -> null + } + } + + /** + * Parses array item properties from the "items" field. + * Handles $ref resolution for object schemas like LoraWeight. + */ + private fun parseArrayItemProperties( + arrayProp: JsonObject, + schemas: JsonObject?, + ): List? { + val items = arrayProp.getAsJsonObject("items") ?: return null + + // Resolve $ref if present + var itemSchema = items + val ref = items.get("\$ref")?.asString + if (ref != null && schemas != null) { + val refName = ref.split("/").last() + itemSchema = schemas.getAsJsonObject(refName) ?: return null + } + + // Only parse if it's an object type with properties + if (itemSchema.get("type")?.asString != "object") return null + val properties = itemSchema.getAsJsonObject("properties") ?: return null + val required = itemSchema.getAsJsonArray("required")?.map { it.asString } ?: emptyList() + val order = itemSchema.getAsJsonArray("x-fal-order-properties")?.map { it.asString } + ?: properties.keySet().toList() + + val parsedProperties = mutableListOf() + + for (propName in order) { + val propElement = properties.get(propName) ?: continue + val prop = propElement.asJsonObject + + val hasEnum = prop.has("enum") + val typeStr = prop.get("type")?.asString + + val enumValues = if (hasEnum) { + prop.getAsJsonArray("enum")?.map { it.asString } + } else null + + parsedProperties.add( + FalAiInputProperty( + name = propName, + title = prop.get("title")?.asString ?: propName, + description = prop.get("description")?.asString ?: "", + type = FalAiPropertyType.fromString(typeStr, hasEnum, false), + default = parseDefault(prop), + minimum = prop.get("minimum")?.asNumber, + maximum = prop.get("maximum")?.asNumber, + enumValues = enumValues, + isRequired = required.contains(propName), + isImageInput = false, + ) + ) + } + + return parsedProperties.takeIf { it.isNotEmpty() } + } + + /** + * Extracts group name from asset path. + * E.g., "falai-endpoints/flux-2/edit/openapi.json" -> "FLUX 2" + */ + private fun extractGroupFromPath(assetPath: String?): String? { + if (assetPath == null) return null + + // Remove base directory prefix + val relativePath = assetPath + .removePrefix("falai-endpoints/") + .removePrefix("falai-endpoints\\") + + // Get the first directory segment + val firstSegment = relativePath.split("/", "\\").firstOrNull() + ?: return null + + // Format the segment into a readable group name + return formatGroupName(firstSegment) + } + + /** + * Formats a directory name like "flux-2" into a readable group name like "FLUX 2". + */ + private fun formatGroupName(dirName: String): String { + return dirName.split("-") + .filter { it.isNotBlank() } + .joinToString(" ") { word -> + when (word.lowercase()) { + "flux" -> "FLUX" + "lora" -> "LoRA" + "kontext" -> "Kontext" + "krea" -> "Krea" + "pro" -> "Pro" + "dev" -> "Dev" + else -> word.replaceFirstChar { it.uppercase() } + } + } + } +} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/preference/PreferenceManagerImpl.kt b/data/src/main/java/com/shifthackz/aisdv1/data/preference/PreferenceManagerImpl.kt index 56191be31..87877ea8c 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/preference/PreferenceManagerImpl.kt +++ b/data/src/main/java/com/shifthackz/aisdv1/data/preference/PreferenceManagerImpl.kt @@ -1,6 +1,8 @@ package com.shifthackz.aisdv1.data.preference import android.content.SharedPreferences +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken import com.shifthackz.aisdv1.core.common.extensions.fixUrlSlashes import com.shifthackz.aisdv1.core.common.extensions.shouldUseNewMediaStore import com.shifthackz.aisdv1.core.common.file.LOCAL_DIFFUSION_CUSTOM_PATH @@ -10,6 +12,7 @@ import com.shifthackz.aisdv1.domain.entity.DarkThemeToken import com.shifthackz.aisdv1.domain.entity.FeatureTag import com.shifthackz.aisdv1.domain.entity.Grid import com.shifthackz.aisdv1.domain.entity.HuggingFaceModel +import com.shifthackz.aisdv1.domain.entity.ModelType import com.shifthackz.aisdv1.domain.entity.ServerSource import com.shifthackz.aisdv1.domain.entity.Settings import com.shifthackz.aisdv1.domain.preference.PreferenceManager @@ -20,9 +23,11 @@ import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.subjects.BehaviorSubject class PreferenceManagerImpl( - preferences: SharedPreferences, + private val preferences: SharedPreferences, ) : PreferenceManager { + private val gson = Gson() + private val preferencesChangedSubject: BehaviorSubject = BehaviorSubject.createDefault(Unit) @@ -124,6 +129,14 @@ class PreferenceManagerImpl( onChanged = ::onPreferencesChanged, ) + override var modelType: ModelType by preferences.delegates.complexString( + key = KEY_MODEL_TYPE, + default = ModelType.SD_1_5, + serialize = { type -> type.name }, + deserialize = { name -> ModelType.entries.find { it.name == name } ?: ModelType.SD_1_5 }, + onChanged = ::onPreferencesChanged, + ) + override var hordeApiKey: String by preferences.delegates.string( key = KEY_HORDE_API_KEY, onChanged = ::onPreferencesChanged, @@ -155,6 +168,16 @@ class PreferenceManagerImpl( onChanged = ::onPreferencesChanged, ) + override var falAiApiKey: String by preferences.delegates.string( + key = KEY_FAL_AI_API_KEY, + onChanged = ::onPreferencesChanged, + ) + + override var falAiSelectedEndpointId: String by preferences.delegates.string( + key = KEY_FAL_AI_SELECTED_ENDPOINT_ID, + onChanged = ::onPreferencesChanged, + ) + override var onBoardingComplete: Boolean by preferences.delegates.boolean( key = KEY_ON_BOARDING_COMPLETE, ) @@ -232,6 +255,7 @@ class PreferenceManagerImpl( Settings( serverUrl = automatic1111ServerUrl, sdModel = sdModel, + modelType = modelType, demoMode = demoMode, developerMode = developerMode, localDiffusionAllowCancel = localOnnxAllowCancel, @@ -260,6 +284,23 @@ class PreferenceManagerImpl( private fun onPreferencesChanged(value: T) = preferencesChangedSubject.onNext(value) + override fun saveFalAiEndpointParams(endpointId: String, params: Map) { + val key = "${KEY_FAL_AI_ENDPOINT_PARAMS_PREFIX}$endpointId" + val json = gson.toJson(params) + preferences.edit().putString(key, json).apply() + } + + override fun getFalAiEndpointParams(endpointId: String): Map { + val key = "${KEY_FAL_AI_ENDPOINT_PARAMS_PREFIX}$endpointId" + val json = preferences.getString(key, null) ?: return emptyMap() + return try { + val type = object : TypeToken>() {}.type + gson.fromJson(json, type) ?: emptyMap() + } catch (e: Exception) { + emptyMap() + } + } + companion object { const val KEY_SERVER_URL = "key_server_url" const val KEY_SWARM_SERVER_URL = "key_swarm_server_url" @@ -277,12 +318,16 @@ class PreferenceManagerImpl( const val KEY_FORM_PROMPT_TAGGED_INPUT = "key_prompt_tagged_input_kb" const val KEY_SERVER_SOURCE = "key_server_source" const val KEY_SD_MODEL = "key_sd_model" + const val KEY_MODEL_TYPE = "key_model_type" const val KEY_HORDE_API_KEY = "key_horde_api_key" const val KEY_OPEN_AI_API_KEY = "key_open_ai_api_key" const val KEY_HUGGING_FACE_API_KEY = "key_hugging_face_api_key" const val KEY_HUGGING_FACE_MODEL_KEY = "key_hugging_face_model_key" const val KEY_STABILITY_AI_API_KEY = "key_stability_ai_api_key" const val KEY_STABILITY_AI_ENGINE_ID_KEY = "key_stability_ai_engine_id_key" + const val KEY_FAL_AI_API_KEY = "key_fal_ai_api_key" + const val KEY_FAL_AI_SELECTED_ENDPOINT_ID = "key_fal_ai_selected_endpoint_id" + const val KEY_FAL_AI_ENDPOINT_PARAMS_PREFIX = "key_fal_ai_endpoint_params_" const val KEY_ON_BOARDING_COMPLETE = "key_on_boarding_complete" const val KEY_FORCE_SETUP_AFTER_UPDATE = "force_upd_setup_v0.x.x-v0.6.2" const val KEY_MEDIA_PIPE_MODEL_ID = "key_mediapipe_model_id" diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/FalAiEndpointRemoteDataSource.kt b/data/src/main/java/com/shifthackz/aisdv1/data/remote/FalAiEndpointRemoteDataSource.kt new file mode 100644 index 000000000..3cf9460e3 --- /dev/null +++ b/data/src/main/java/com/shifthackz/aisdv1/data/remote/FalAiEndpointRemoteDataSource.kt @@ -0,0 +1,34 @@ +package com.shifthackz.aisdv1.data.remote + +import com.shifthackz.aisdv1.data.mappers.FalAiOpenApiParser +import com.shifthackz.aisdv1.domain.datasource.FalAiEndpointDataSource +import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint +import io.reactivex.rxjava3.core.Single +import okhttp3.OkHttpClient +import okhttp3.Request + +/** + * Fetches fal.ai endpoint schemas from remote URLs. + */ +internal class FalAiEndpointRemoteDataSource( + private val httpClient: OkHttpClient, +) : FalAiEndpointDataSource.Remote { + + override fun fetchFromUrl(url: String): Single = Single.fromCallable { + val request = Request.Builder() + .url(url) + .get() + .build() + + val response = httpClient.newCall(request).execute() + + if (!response.isSuccessful) { + throw IllegalStateException("Failed to fetch OpenAPI schema: ${response.code}") + } + + val json = response.body?.string() + ?: throw IllegalStateException("Empty response body") + + FalAiOpenApiParser.parse(json, isCustom = true) + } +} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/FalAiGenerationRemoteDataSource.kt b/data/src/main/java/com/shifthackz/aisdv1/data/remote/FalAiGenerationRemoteDataSource.kt new file mode 100644 index 000000000..1511f1557 --- /dev/null +++ b/data/src/main/java/com/shifthackz/aisdv1/data/remote/FalAiGenerationRemoteDataSource.kt @@ -0,0 +1,488 @@ +package com.shifthackz.aisdv1.data.remote + +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.util.Base64 +import com.shifthackz.aisdv1.core.common.log.debugLog +import com.shifthackz.aisdv1.core.common.log.errorLog +import com.shifthackz.aisdv1.domain.datasource.FalAiGenerationDataSource +import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint +import com.shifthackz.aisdv1.domain.entity.FalAiEndpointCategory +import com.shifthackz.aisdv1.domain.entity.MediaType +import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import com.shifthackz.aisdv1.domain.feature.MediaFileManager +import com.shifthackz.aisdv1.network.api.falai.FalAiApi +import com.shifthackz.aisdv1.network.request.FalAiImageSize +import com.shifthackz.aisdv1.network.request.FalAiTextToImageRequest +import com.shifthackz.aisdv1.network.response.FalAiGenerationResponse +import com.shifthackz.aisdv1.network.response.FalAiImage +import com.shifthackz.aisdv1.network.response.FalAiQueueResponse +import io.reactivex.rxjava3.core.Single +import okhttp3.OkHttpClient +import okhttp3.Request +import java.io.ByteArrayOutputStream +import java.util.Date +import java.util.concurrent.TimeUnit + +internal class FalAiGenerationRemoteDataSource( + private val api: FalAiApi, + private val httpClient: OkHttpClient, + private val mediaFileManager: MediaFileManager, +) : FalAiGenerationDataSource.Remote { + + override fun validateApiKey(): Single = api + .listModels(limit = 1) + .map { true } + .onErrorResumeNext { t -> + errorLog(t) + Single.just(false) + } + + override fun textToImage(model: String, payload: TextToImagePayload): Single { + val request = payload.toFalAiRequest() + val url = "$BASE_URL$model" + debugLog("FalAi textToImage: url=$url, request=$request") + + return api.submitToQueue(url, request) + .doOnError { t -> errorLog("FalAi submitToQueue error: ${t.message}") } + .flatMap { queueResponse -> handleQueueResponse(queueResponse, payload) } + } + + private fun handleQueueResponse( + response: FalAiQueueResponse, + payload: TextToImagePayload, + ): Single { + // If response already contains images (sync mode or fast completion) + response.images?.firstOrNull()?.let { image -> + return downloadAndConvertToBase64(image.url) + .map { base64 -> createResult(payload, base64) } + } + + // Otherwise, poll for completion + val statusUrl = response.statusUrl + ?: return Single.error(IllegalStateException("No status URL returned from fal.ai")) + val resultUrl = response.responseUrl + ?: return Single.error(IllegalStateException("No response URL returned from fal.ai")) + + return pollForCompletion(statusUrl, resultUrl, payload) + } + + private fun pollForCompletion( + statusUrl: String, + resultUrl: String, + payload: TextToImagePayload, + ): Single { + debugLog("FalAi pollForCompletion: checking status at $statusUrl") + return api.checkStatus(statusUrl) + .doOnSuccess { status -> debugLog("FalAi status response: ${status.status}") } + .doOnError { t -> errorLog("FalAi checkStatus error: ${t.message}") } + .flatMap { status -> + when (status.status) { + "COMPLETED" -> { + debugLog("FalAi generation completed, fetching result from $resultUrl") + fetchAndProcessResult(resultUrl, payload) + } + "FAILED" -> Single.error(IllegalStateException("fal.ai generation failed")) + "IN_QUEUE", "IN_PROGRESS" -> { + debugLog("FalAi status: ${status.status}, queue position: ${status.queuePosition}") + // Wait and retry + Single.timer(POLL_INTERVAL_MS, TimeUnit.MILLISECONDS) + .flatMap { pollForCompletion(statusUrl, resultUrl, payload) } + } + else -> Single.error(IllegalStateException("Unknown status: ${status.status}")) + } + } + } + + private fun fetchAndProcessResult( + resultUrl: String, + payload: TextToImagePayload, + ): Single { + debugLog("FalAi fetchResult: fetching from $resultUrl") + return api.fetchResult(resultUrl) + .doOnSuccess { result -> debugLog("FalAi fetchResult response: images=${result.images?.size}, video=${result.video != null}") } + .doOnError { t -> errorLog("FalAi fetchResult error: ${t.message}") } + .flatMap { result -> + val imageUrl = result.images?.firstOrNull()?.url + ?: return@flatMap Single.error( + IllegalStateException("No images in fal.ai response") + ) + downloadAndConvertToBase64(imageUrl) + .map { base64 -> createResult(payload, base64) } + } + } + + private fun downloadAndSaveMedia(url: String, mediaType: MediaType): Single { + return Single.fromCallable { + val request = Request.Builder().url(url).build() + val response = httpClient.newCall(request).execute() + + if (!response.isSuccessful) { + throw IllegalStateException("Failed to download media: ${response.code}") + } + + val bytes = response.body?.bytes() + ?: throw IllegalStateException("Empty response body") + + when (mediaType) { + MediaType.IMAGE -> { + // Decode to bitmap and re-encode to ensure proper PNG format + val bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size) + ?: throw IllegalStateException("Failed to decode image") + + val outputStream = ByteArrayOutputStream() + bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream) + mediaFileManager.saveMedia(outputStream.toByteArray(), MediaType.IMAGE) + } + MediaType.VIDEO -> { + // Save video bytes directly + mediaFileManager.saveMedia(bytes, MediaType.VIDEO) + } + } + } + } + + @Deprecated("Use downloadAndSaveMedia instead", replaceWith = ReplaceWith("downloadAndSaveMedia(imageUrl, MediaType.IMAGE)")) + private fun downloadAndConvertToBase64(imageUrl: String): Single { + return Single.fromCallable { + val request = Request.Builder().url(imageUrl).build() + val response = httpClient.newCall(request).execute() + + if (!response.isSuccessful) { + throw IllegalStateException("Failed to download image: ${response.code}") + } + + val bytes = response.body?.bytes() + ?: throw IllegalStateException("Empty response body") + + // Decode to bitmap and re-encode to ensure proper format + val bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.size) + ?: throw IllegalStateException("Failed to decode image") + + val outputStream = ByteArrayOutputStream() + bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream) + Base64.encodeToString(outputStream.toByteArray(), Base64.NO_WRAP) + } + } + + private fun createResult(payload: TextToImagePayload, base64: String): AiGenerationResult { + return AiGenerationResult( + id = 0L, + image = base64, + inputImage = "", + createdAt = Date(), + type = AiGenerationResult.Type.TEXT_TO_IMAGE, + prompt = payload.prompt, + negativePrompt = payload.negativePrompt, + width = payload.width, + height = payload.height, + samplingSteps = payload.samplingSteps, + cfgScale = payload.cfgScale, + restoreFaces = false, + sampler = payload.sampler, + seed = payload.seed, + subSeed = "", + subSeedStrength = 0f, + denoisingStrength = 0f, + hidden = false, + ) + } + + private fun TextToImagePayload.toFalAiRequest(): FalAiTextToImageRequest { + return FalAiTextToImageRequest( + prompt = prompt, + negativePrompt = negativePrompt.takeIf { it.isNotBlank() }, + imageSize = FalAiImageSize(width = width, height = height), + numInferenceSteps = samplingSteps, + guidanceScale = cfgScale, + seed = seed.toLongOrNull(), + numImages = 1, + enableSafetyChecker = false, + syncMode = false, + ) + } + + override fun generateDynamic( + endpoint: FalAiEndpoint, + parameters: Map, + ): Single> { + val url = "$BASE_URL${endpoint.endpointId}" + + // Filter out null values and add sync_mode = false + val requestBody = parameters + .filterValues { it != null } + .toMutableMap() + .apply { put("sync_mode", false) } + + debugLog("FalAi generateDynamic: url=$url, params=$requestBody") + + return api.submitDynamicToQueue(url, requestBody) + .doOnError { t -> errorLog("FalAi submitDynamicToQueue error: ${t.message}") } + .flatMap { queueResponse -> handleDynamicQueueResponse(queueResponse, endpoint, parameters) } + } + + private fun handleDynamicQueueResponse( + response: FalAiQueueResponse, + endpoint: FalAiEndpoint, + parameters: Map, + ): Single> { + // If response already contains images (sync mode or fast completion) + val images = response.images + if (!images.isNullOrEmpty()) { + return processImages(images, endpoint, parameters, response.seed, response.prompt) + } + + // If response contains video (for video generation endpoints) + response.video?.let { video -> + return processVideo(video, endpoint, parameters, response.seed, response.prompt) + } + + // Otherwise, poll for completion + val statusUrl = response.statusUrl + ?: return Single.error(IllegalStateException("No status URL returned from fal.ai")) + val resultUrl = response.responseUrl + ?: return Single.error(IllegalStateException("No response URL returned from fal.ai")) + + return pollForDynamicCompletion(statusUrl, resultUrl, endpoint, parameters) + } + + private fun pollForDynamicCompletion( + statusUrl: String, + resultUrl: String, + endpoint: FalAiEndpoint, + parameters: Map, + ): Single> { + debugLog("FalAi pollForDynamicCompletion: checking status at $statusUrl") + return api.checkStatus(statusUrl) + .doOnSuccess { status -> debugLog("FalAi dynamic status response: ${status.status}") } + .doOnError { t -> errorLog("FalAi dynamic checkStatus error: ${t.message}") } + .flatMap { status -> + when (status.status) { + "COMPLETED" -> { + debugLog("FalAi dynamic generation completed, fetching result from $resultUrl") + fetchAndProcessDynamicResult(resultUrl, endpoint, parameters) + } + "FAILED" -> Single.error(IllegalStateException("fal.ai generation failed")) + "IN_QUEUE", "IN_PROGRESS" -> { + debugLog("FalAi dynamic status: ${status.status}, queue position: ${status.queuePosition}") + Single.timer(POLL_INTERVAL_MS, TimeUnit.MILLISECONDS) + .flatMap { pollForDynamicCompletion(statusUrl, resultUrl, endpoint, parameters) } + } + else -> Single.error(IllegalStateException("Unknown status: ${status.status}")) + } + } + } + + private fun fetchAndProcessDynamicResult( + resultUrl: String, + endpoint: FalAiEndpoint, + parameters: Map, + ): Single> { + debugLog("FalAi fetchDynamicResult: fetching from $resultUrl") + return api.fetchResult(resultUrl) + .doOnSuccess { result -> debugLog("FalAi fetchDynamicResult response: images=${result.images?.size}, video=${result.video != null}") } + .doOnError { t -> errorLog("FalAi fetchDynamicResult error: ${t.message}") } + .flatMap { result -> + // Check for images first + val images = result.images + if (!images.isNullOrEmpty()) { + return@flatMap processImages(images, endpoint, parameters, result.seed, result.prompt) + } + + // Check for video + result.video?.let { video -> + return@flatMap processVideo(video, endpoint, parameters, result.seed, result.prompt) + } + + // No images or video found + Single.error>( + IllegalStateException("No images or video in fal.ai response") + ) + } + } + + private fun processImages( + images: List, + endpoint: FalAiEndpoint, + parameters: Map, + responseSeed: String? = null, + responsePrompt: String? = null, + ): Single> { + return io.reactivex.rxjava3.core.Observable.fromIterable(images) + .flatMapSingle { image -> + downloadAndConvertToBase64(image.url) + .map { base64 -> + createDynamicImageResult( + endpoint = endpoint, + parameters = parameters, + base64 = base64, + responseSeed = responseSeed, + responsePrompt = responsePrompt, + imageWidth = image.width, + imageHeight = image.height, + ) + } + } + .toList() + } + + private fun processVideo( + video: FalAiImage, + endpoint: FalAiEndpoint, + parameters: Map, + responseSeed: String? = null, + responsePrompt: String? = null, + ): Single> { + return downloadAndSaveMedia(video.url, MediaType.VIDEO) + .map { mediaPath -> + createDynamicResult( + endpoint = endpoint, + parameters = parameters, + mediaPath = mediaPath, + mediaType = MediaType.VIDEO, + responseSeed = responseSeed, + responsePrompt = responsePrompt, + imageWidth = video.width, + imageHeight = video.height, + ) + } + .map { listOf(it) } + } + + private fun createDynamicImageResult( + endpoint: FalAiEndpoint, + parameters: Map, + base64: String, + responseSeed: String? = null, + responsePrompt: String? = null, + imageWidth: Int? = null, + imageHeight: Int? = null, + ): AiGenerationResult { + val prompt = responsePrompt ?: parameters["prompt"]?.toString() ?: "" + val negativePrompt = parameters["negative_prompt"]?.toString() ?: "" + val width = imageWidth ?: extractWidth(parameters) + val height = imageHeight ?: extractHeight(parameters) + val steps = (parameters["num_inference_steps"] as? Number)?.toInt() ?: 28 + val guidance = (parameters["guidance_scale"] as? Number)?.toFloat() ?: 3.5f + val seed = responseSeed ?: parameters["seed"]?.toString() ?: "" + + val generationType = when (endpoint.category) { + FalAiEndpointCategory.IMAGE_TO_IMAGE, + FalAiEndpointCategory.INPAINTING -> AiGenerationResult.Type.IMAGE_TO_IMAGE + else -> AiGenerationResult.Type.TEXT_TO_IMAGE + } + + return AiGenerationResult( + id = 0L, + image = base64, + inputImage = "", + createdAt = Date(), + type = generationType, + prompt = prompt, + negativePrompt = negativePrompt, + width = width, + height = height, + samplingSteps = steps, + cfgScale = guidance, + restoreFaces = false, + sampler = "fal.ai/${endpoint.endpointId}", + seed = seed, + subSeed = "", + subSeedStrength = 0f, + denoisingStrength = 0f, + hidden = false, + ) + } + + private fun createDynamicResult( + endpoint: FalAiEndpoint, + parameters: Map, + mediaPath: String, + mediaType: MediaType, + responseSeed: String? = null, + responsePrompt: String? = null, + imageWidth: Int? = null, + imageHeight: Int? = null, + ): AiGenerationResult { + // Prefer response values over input parameters + val prompt = responsePrompt ?: parameters["prompt"]?.toString() ?: "" + val negativePrompt = parameters["negative_prompt"]?.toString() ?: "" + + // Prefer actual image dimensions from response, then parameters, then defaults + val width = imageWidth ?: extractWidth(parameters) + val height = imageHeight ?: extractHeight(parameters) + + val steps = (parameters["num_inference_steps"] as? Number)?.toInt() ?: 28 + val guidance = (parameters["guidance_scale"] as? Number)?.toFloat() ?: 3.5f + + // Use seed from response if available (server may generate random seed) + val seed = responseSeed ?: parameters["seed"]?.toString() ?: "" + + val generationType = when (endpoint.category) { + FalAiEndpointCategory.IMAGE_TO_IMAGE, + FalAiEndpointCategory.INPAINTING -> AiGenerationResult.Type.IMAGE_TO_IMAGE + else -> AiGenerationResult.Type.TEXT_TO_IMAGE + } + + return AiGenerationResult( + id = 0L, + image = "", + inputImage = "", + createdAt = Date(), + type = generationType, + prompt = prompt, + negativePrompt = negativePrompt, + width = width, + height = height, + samplingSteps = steps, + cfgScale = guidance, + restoreFaces = false, + sampler = "fal.ai/${endpoint.endpointId}", + seed = seed, + subSeed = "", + subSeedStrength = 0f, + denoisingStrength = 0f, + hidden = false, + mediaPath = mediaPath, + inputMediaPath = "", + mediaType = mediaType, + ) + } + + private fun extractWidth(parameters: Map): Int { + // Handle image_size as object with width/height + val imageSize = parameters["image_size"] + return when (imageSize) { + is Map<*, *> -> (imageSize["width"] as? Number)?.toInt() ?: 1024 + is String -> parseImageSizeDimension(imageSize, true) + else -> 1024 + } + } + + private fun extractHeight(parameters: Map): Int { + val imageSize = parameters["image_size"] + return when (imageSize) { + is Map<*, *> -> (imageSize["height"] as? Number)?.toInt() ?: 1024 + is String -> parseImageSizeDimension(imageSize, false) + else -> 1024 + } + } + + private fun parseImageSizeDimension(sizeStr: String, isWidth: Boolean): Int { + // Handle formats like "1024x1024", "landscape_16_9", etc. + return if (sizeStr.contains("x")) { + val parts = sizeStr.split("x") + (if (isWidth) parts.getOrNull(0) else parts.getOrNull(1)) + ?.toIntOrNull() ?: 1024 + } else { + 1024 + } + } + + companion object { + private const val BASE_URL = "https://queue.fal.run/" + private const val DEFAULT_MODEL = "fal-ai/flux-lora" + private const val POLL_INTERVAL_MS = 2000L + } +} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/FalAiEndpointRepositoryImpl.kt b/data/src/main/java/com/shifthackz/aisdv1/data/repository/FalAiEndpointRepositoryImpl.kt new file mode 100644 index 000000000..333a42ae5 --- /dev/null +++ b/data/src/main/java/com/shifthackz/aisdv1/data/repository/FalAiEndpointRepositoryImpl.kt @@ -0,0 +1,72 @@ +package com.shifthackz.aisdv1.data.repository + +import com.shifthackz.aisdv1.data.mappers.FalAiOpenApiParser +import com.shifthackz.aisdv1.domain.datasource.FalAiEndpointDataSource +import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint +import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import com.shifthackz.aisdv1.domain.repository.FalAiEndpointRepository +import io.reactivex.rxjava3.core.Completable +import io.reactivex.rxjava3.core.Observable +import io.reactivex.rxjava3.core.Single + +internal class FalAiEndpointRepositoryImpl( + private val builtInDataSource: FalAiEndpointDataSource.BuiltIn, + private val remoteDataSource: FalAiEndpointDataSource.Remote, + private val localDataSource: FalAiEndpointDataSource.Local, + private val preferenceManager: PreferenceManager, +) : FalAiEndpointRepository { + + override fun observeAll(): Observable> = Observable + .combineLatest( + builtInDataSource.getAll().toObservable(), + localDataSource.observeAll().startWithItem(emptyList()), + ) { builtIn, custom -> + builtIn + custom + } + + override fun getAll(): Single> = Single + .zip( + builtInDataSource.getAll(), + localDataSource.getAll().onErrorReturnItem(emptyList()), + ) { builtIn, custom -> + builtIn + custom + } + + override fun getById(id: String): Single = getAll() + .flatMap { endpoints -> + endpoints.find { it.endpointId == id || it.id == id } + ?.let { Single.just(it) } + ?: Single.error(NoSuchElementException("Endpoint not found: $id")) + } + + override fun getSelected(): Single { + val selectedId = preferenceManager.falAiSelectedEndpointId + return if (selectedId.isBlank()) { + // Return default endpoint (first built-in) + builtInDataSource.getAll().map { it.first() } + } else { + getById(selectedId).onErrorResumeNext { + // Fallback to first built-in if selected not found + builtInDataSource.getAll().map { it.first() } + } + } + } + + override fun setSelected(id: String): Completable = Completable.fromAction { + preferenceManager.falAiSelectedEndpointId = id + } + + override fun importFromJson(json: String): Single = Single + .fromCallable { FalAiOpenApiParser.parse(json, isCustom = true) } + .flatMap { endpoint -> + localDataSource.save(endpoint).andThen(Single.just(endpoint)) + } + + override fun importFromUrl(url: String): Single = remoteDataSource + .fetchFromUrl(url) + .flatMap { endpoint -> + localDataSource.save(endpoint).andThen(Single.just(endpoint)) + } + + override fun delete(id: String): Completable = localDataSource.delete(id) +} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/FalAiGenerationRepositoryImpl.kt b/data/src/main/java/com/shifthackz/aisdv1/data/repository/FalAiGenerationRepositoryImpl.kt new file mode 100644 index 000000000..284be68d5 --- /dev/null +++ b/data/src/main/java/com/shifthackz/aisdv1/data/repository/FalAiGenerationRepositoryImpl.kt @@ -0,0 +1,27 @@ +package com.shifthackz.aisdv1.data.repository + +import com.shifthackz.aisdv1.domain.datasource.FalAiGenerationDataSource +import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint +import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import com.shifthackz.aisdv1.domain.repository.FalAiEndpointRepository +import com.shifthackz.aisdv1.domain.repository.FalAiGenerationRepository +import io.reactivex.rxjava3.core.Single + +internal class FalAiGenerationRepositoryImpl( + private val remoteDataSource: FalAiGenerationDataSource.Remote, + private val endpointRepository: FalAiEndpointRepository, +) : FalAiGenerationRepository { + + override fun validateApiKey(): Single = remoteDataSource.validateApiKey() + + override fun generateFromText(payload: TextToImagePayload): Single = + endpointRepository.getSelected() + .map { endpoint -> endpoint.endpointId } + .flatMap { endpointId -> remoteDataSource.textToImage(endpointId, payload) } + + override fun generateDynamic( + endpoint: FalAiEndpoint, + parameters: Map, + ): Single> = remoteDataSource.generateDynamic(endpoint, parameters) +} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/HordeGenerationRepositoryImpl.kt b/data/src/main/java/com/shifthackz/aisdv1/data/repository/HordeGenerationRepositoryImpl.kt index d69792f2c..5dc5d3127 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/HordeGenerationRepositoryImpl.kt +++ b/data/src/main/java/com/shifthackz/aisdv1/data/repository/HordeGenerationRepositoryImpl.kt @@ -6,6 +6,7 @@ import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource import com.shifthackz.aisdv1.domain.datasource.HordeGenerationDataSource import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import com.shifthackz.aisdv1.domain.feature.MediaFileManager import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway import com.shifthackz.aisdv1.domain.preference.PreferenceManager @@ -17,6 +18,7 @@ internal class HordeGenerationRepositoryImpl( localDataSource: GenerationResultDataSource.Local, preferenceManager: PreferenceManager, backgroundWorkObserver: BackgroundWorkObserver, + mediaFileManager: MediaFileManager, private val remoteDataSource: HordeGenerationDataSource.Remote, private val statusSource: HordeGenerationDataSource.StatusSource, ) : CoreGenerationRepository( @@ -25,6 +27,7 @@ internal class HordeGenerationRepositoryImpl( localDataSource = localDataSource, preferenceManager = preferenceManager, backgroundWorkObserver = backgroundWorkObserver, + mediaFileManager = mediaFileManager, ), HordeGenerationRepository { override fun observeStatus() = statusSource.observe() diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/HuggingFaceGenerationRepositoryImpl.kt b/data/src/main/java/com/shifthackz/aisdv1/data/repository/HuggingFaceGenerationRepositoryImpl.kt index e30af6110..4a2dc48b8 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/HuggingFaceGenerationRepositoryImpl.kt +++ b/data/src/main/java/com/shifthackz/aisdv1/data/repository/HuggingFaceGenerationRepositoryImpl.kt @@ -6,6 +6,7 @@ import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource import com.shifthackz.aisdv1.domain.datasource.HuggingFaceGenerationDataSource import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import com.shifthackz.aisdv1.domain.feature.MediaFileManager import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway import com.shifthackz.aisdv1.domain.preference.PreferenceManager @@ -16,6 +17,7 @@ internal class HuggingFaceGenerationRepositoryImpl( base64ToBitmapConverter: Base64ToBitmapConverter, localDataSource: GenerationResultDataSource.Local, backgroundWorkObserver: BackgroundWorkObserver, + mediaFileManager: MediaFileManager, private val preferenceManager: PreferenceManager, private val remoteDataSource: HuggingFaceGenerationDataSource.Remote, ) : CoreGenerationRepository( @@ -24,6 +26,7 @@ internal class HuggingFaceGenerationRepositoryImpl( localDataSource = localDataSource, preferenceManager = preferenceManager, backgroundWorkObserver = backgroundWorkObserver, + mediaFileManager = mediaFileManager, ), HuggingFaceGenerationRepository { override fun validateApiKey() = remoteDataSource.validateApiKey() diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/LocalDiffusionGenerationRepositoryImpl.kt b/data/src/main/java/com/shifthackz/aisdv1/data/repository/LocalDiffusionGenerationRepositoryImpl.kt index 625a1ca83..c54dcb701 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/LocalDiffusionGenerationRepositoryImpl.kt +++ b/data/src/main/java/com/shifthackz/aisdv1/data/repository/LocalDiffusionGenerationRepositoryImpl.kt @@ -8,6 +8,7 @@ import com.shifthackz.aisdv1.data.mappers.mapLocalDiffusionToAiGenResult import com.shifthackz.aisdv1.domain.datasource.DownloadableModelDataSource import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import com.shifthackz.aisdv1.domain.feature.MediaFileManager import com.shifthackz.aisdv1.domain.feature.diffusion.LocalDiffusion import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway @@ -20,6 +21,7 @@ internal class LocalDiffusionGenerationRepositoryImpl( base64ToBitmapConverter: Base64ToBitmapConverter, localDataSource: GenerationResultDataSource.Local, backgroundWorkObserver: BackgroundWorkObserver, + mediaFileManager: MediaFileManager, private val preferenceManager: PreferenceManager, private val localDiffusion: LocalDiffusion, private val downloadableLocalDataSource: DownloadableModelDataSource.Local, @@ -31,6 +33,7 @@ internal class LocalDiffusionGenerationRepositoryImpl( localDataSource = localDataSource, preferenceManager = preferenceManager, backgroundWorkObserver = backgroundWorkObserver, + mediaFileManager = mediaFileManager, ), LocalDiffusionGenerationRepository { override fun observeStatus() = localDiffusion.observeStatus() diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/MediaPipeGenerationRepositoryImpl.kt b/data/src/main/java/com/shifthackz/aisdv1/data/repository/MediaPipeGenerationRepositoryImpl.kt index 884712091..9e592ba7b 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/MediaPipeGenerationRepositoryImpl.kt +++ b/data/src/main/java/com/shifthackz/aisdv1/data/repository/MediaPipeGenerationRepositoryImpl.kt @@ -8,6 +8,7 @@ import com.shifthackz.aisdv1.data.mappers.mapLocalDiffusionToAiGenResult import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource import com.shifthackz.aisdv1.domain.entity.AiGenerationResult import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import com.shifthackz.aisdv1.domain.feature.MediaFileManager import com.shifthackz.aisdv1.domain.feature.mediapipe.MediaPipe import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway @@ -21,6 +22,7 @@ internal class MediaPipeGenerationRepositoryImpl( base64ToBitmapConverter: Base64ToBitmapConverter, localDataSource: GenerationResultDataSource.Local, backgroundWorkObserver: BackgroundWorkObserver, + mediaFileManager: MediaFileManager, preferenceManager: PreferenceManager, private val schedulersProvider: SchedulersProvider, private val mediaPipe: MediaPipe, @@ -31,6 +33,7 @@ internal class MediaPipeGenerationRepositoryImpl( localDataSource = localDataSource, preferenceManager = preferenceManager, backgroundWorkObserver = backgroundWorkObserver, + mediaFileManager = mediaFileManager, ), MediaPipeGenerationRepository { override fun generateFromText(payload: TextToImagePayload): Single = mediaPipe diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/OpenAiGenerationRepositoryImpl.kt b/data/src/main/java/com/shifthackz/aisdv1/data/repository/OpenAiGenerationRepositoryImpl.kt index 3b6b85784..a2b3b2769 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/OpenAiGenerationRepositoryImpl.kt +++ b/data/src/main/java/com/shifthackz/aisdv1/data/repository/OpenAiGenerationRepositoryImpl.kt @@ -5,6 +5,7 @@ import com.shifthackz.aisdv1.data.core.CoreGenerationRepository import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource import com.shifthackz.aisdv1.domain.datasource.OpenAiGenerationDataSource import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import com.shifthackz.aisdv1.domain.feature.MediaFileManager import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway import com.shifthackz.aisdv1.domain.preference.PreferenceManager @@ -16,6 +17,7 @@ internal class OpenAiGenerationRepositoryImpl( localDataSource: GenerationResultDataSource.Local, preferenceManager: PreferenceManager, backgroundWorkObserver: BackgroundWorkObserver, + mediaFileManager: MediaFileManager, private val remoteDataSource: OpenAiGenerationDataSource.Remote, ) : CoreGenerationRepository( mediaStoreGateway = mediaStoreGateway, @@ -23,6 +25,7 @@ internal class OpenAiGenerationRepositoryImpl( localDataSource = localDataSource, preferenceManager = preferenceManager, backgroundWorkObserver = backgroundWorkObserver, + mediaFileManager = mediaFileManager, ), OpenAiGenerationRepository { override fun validateApiKey() = remoteDataSource.validateApiKey() diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/StabilityAiGenerationRepositoryImpl.kt b/data/src/main/java/com/shifthackz/aisdv1/data/repository/StabilityAiGenerationRepositoryImpl.kt index ba8908ca6..6334d4569 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/StabilityAiGenerationRepositoryImpl.kt +++ b/data/src/main/java/com/shifthackz/aisdv1/data/repository/StabilityAiGenerationRepositoryImpl.kt @@ -9,6 +9,7 @@ import com.shifthackz.aisdv1.domain.datasource.StabilityAiGenerationDataSource import com.shifthackz.aisdv1.domain.entity.AiGenerationResult import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import com.shifthackz.aisdv1.domain.feature.MediaFileManager import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway import com.shifthackz.aisdv1.domain.preference.PreferenceManager @@ -21,6 +22,7 @@ internal class StabilityAiGenerationRepositoryImpl( backgroundWorkObserver: BackgroundWorkObserver, private val base64ToBitmapConverter: Base64ToBitmapConverter, localDataSource: GenerationResultDataSource.Local, + mediaFileManager: MediaFileManager, private val preferenceManager: PreferenceManager, private val generationRds: StabilityAiGenerationDataSource.Remote, private val creditsRds: StabilityAiCreditsDataSource.Remote, @@ -31,6 +33,7 @@ internal class StabilityAiGenerationRepositoryImpl( localDataSource = localDataSource, preferenceManager = preferenceManager, backgroundWorkObserver = backgroundWorkObserver, + mediaFileManager = mediaFileManager, ), StabilityAiGenerationRepository { override fun validateApiKey() = generationRds.validateApiKey() diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/StableDiffusionGenerationRepositoryImpl.kt b/data/src/main/java/com/shifthackz/aisdv1/data/repository/StableDiffusionGenerationRepositoryImpl.kt index 340657d5d..3613afb25 100755 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/StableDiffusionGenerationRepositoryImpl.kt +++ b/data/src/main/java/com/shifthackz/aisdv1/data/repository/StableDiffusionGenerationRepositoryImpl.kt @@ -9,6 +9,7 @@ import com.shifthackz.aisdv1.domain.demo.TextToImageDemo import com.shifthackz.aisdv1.domain.entity.AiGenerationResult import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import com.shifthackz.aisdv1.domain.feature.MediaFileManager import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway import com.shifthackz.aisdv1.domain.preference.PreferenceManager @@ -20,6 +21,7 @@ internal class StableDiffusionGenerationRepositoryImpl( backgroundWorkObserver: BackgroundWorkObserver, base64ToBitmapConverter: Base64ToBitmapConverter, localDataSource: GenerationResultDataSource.Local, + mediaFileManager: MediaFileManager, private val remoteDataSource: StableDiffusionGenerationDataSource.Remote, private val preferenceManager: PreferenceManager, private val textToImageDemo: TextToImageDemo, @@ -30,6 +32,7 @@ internal class StableDiffusionGenerationRepositoryImpl( localDataSource = localDataSource, preferenceManager = preferenceManager, backgroundWorkObserver = backgroundWorkObserver, + mediaFileManager = mediaFileManager, ), StableDiffusionGenerationRepository { override fun checkApiAvailability() = remoteDataSource.checkAvailability() diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/SwarmUiGenerationRepositoryImpl.kt b/data/src/main/java/com/shifthackz/aisdv1/data/repository/SwarmUiGenerationRepositoryImpl.kt index 8dc845df4..fbb87f64f 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/SwarmUiGenerationRepositoryImpl.kt +++ b/data/src/main/java/com/shifthackz/aisdv1/data/repository/SwarmUiGenerationRepositoryImpl.kt @@ -8,6 +8,7 @@ import com.shifthackz.aisdv1.domain.datasource.SwarmUiSessionDataSource import com.shifthackz.aisdv1.domain.entity.AiGenerationResult import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import com.shifthackz.aisdv1.domain.feature.MediaFileManager import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway import com.shifthackz.aisdv1.domain.preference.PreferenceManager @@ -20,6 +21,7 @@ internal class SwarmUiGenerationRepositoryImpl( base64ToBitmapConverter: Base64ToBitmapConverter, localDataSource: GenerationResultDataSource.Local, backgroundWorkObserver: BackgroundWorkObserver, + mediaFileManager: MediaFileManager, private val preferenceManager: PreferenceManager, private val session: SwarmUiSessionDataSource, private val remoteDataSource: SwarmUiGenerationDataSource.Remote, @@ -29,6 +31,7 @@ internal class SwarmUiGenerationRepositoryImpl( localDataSource = localDataSource, preferenceManager = preferenceManager, backgroundWorkObserver = backgroundWorkObserver, + mediaFileManager = mediaFileManager, ), SwarmUiGenerationRepository { override fun checkApiAvailability(): Completable = session diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/FalAiEndpointDataSource.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/FalAiEndpointDataSource.kt new file mode 100644 index 000000000..1a61f3325 --- /dev/null +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/FalAiEndpointDataSource.kt @@ -0,0 +1,34 @@ +package com.shifthackz.aisdv1.domain.datasource + +import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint +import io.reactivex.rxjava3.core.Completable +import io.reactivex.rxjava3.core.Observable +import io.reactivex.rxjava3.core.Single + +interface FalAiEndpointDataSource { + + /** + * Provides built-in endpoints shipped with the app. + */ + interface BuiltIn { + fun getAll(): Single> + } + + /** + * Provides remote endpoint fetching from URL. + */ + interface Remote { + fun fetchFromUrl(url: String): Single + } + + /** + * Provides local storage for custom endpoints. + */ + interface Local { + fun observeAll(): Observable> + fun getAll(): Single> + fun getById(id: String): Single + fun save(endpoint: FalAiEndpoint): Completable + fun delete(id: String): Completable + } +} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/FalAiGenerationDataSource.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/FalAiGenerationDataSource.kt new file mode 100644 index 000000000..920d55050 --- /dev/null +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/FalAiGenerationDataSource.kt @@ -0,0 +1,21 @@ +package com.shifthackz.aisdv1.domain.datasource + +import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint +import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import io.reactivex.rxjava3.core.Single + +sealed interface FalAiGenerationDataSource { + + interface Remote : FalAiGenerationDataSource { + + fun validateApiKey(): Single + + fun textToImage(model: String, payload: TextToImagePayload): Single + + fun generateDynamic( + endpoint: FalAiEndpoint, + parameters: Map, + ): Single> + } +} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/di/DomainModule.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/di/DomainModule.kt index 3a5f59eb0..7679a8a8b 100755 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/di/DomainModule.kt +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/di/DomainModule.kt @@ -24,6 +24,8 @@ import com.shifthackz.aisdv1.domain.usecase.connectivity.TestHuggingFaceApiKeyUs import com.shifthackz.aisdv1.domain.usecase.connectivity.TestHuggingFaceApiKeyUseCaseImpl import com.shifthackz.aisdv1.domain.usecase.connectivity.TestOpenAiApiKeyUseCase import com.shifthackz.aisdv1.domain.usecase.connectivity.TestOpenAiApiKeyUseCaseImpl +import com.shifthackz.aisdv1.domain.usecase.connectivity.TestFalAiApiKeyUseCase +import com.shifthackz.aisdv1.domain.usecase.connectivity.TestFalAiApiKeyUseCaseImpl import com.shifthackz.aisdv1.domain.usecase.connectivity.TestStabilityAiApiKeyUseCase import com.shifthackz.aisdv1.domain.usecase.connectivity.TestStabilityAiApiKeyUseCaseImpl import com.shifthackz.aisdv1.domain.usecase.connectivity.TestSwarmUiConnectivityUseCase @@ -44,6 +46,8 @@ import com.shifthackz.aisdv1.domain.usecase.downloadable.GetLocalOnnxModelsUseCa import com.shifthackz.aisdv1.domain.usecase.downloadable.GetLocalOnnxModelsUseCaseImpl import com.shifthackz.aisdv1.domain.usecase.downloadable.ObserveLocalOnnxModelsUseCase import com.shifthackz.aisdv1.domain.usecase.downloadable.ObserveLocalOnnxModelsUseCaseImpl +import com.shifthackz.aisdv1.domain.usecase.forgemodule.GetForgeModulesUseCase +import com.shifthackz.aisdv1.domain.usecase.forgemodule.GetForgeModulesUseCaseImpl import com.shifthackz.aisdv1.domain.usecase.gallery.DeleteAllGalleryUseCase import com.shifthackz.aisdv1.domain.usecase.gallery.DeleteAllGalleryUseCaseImpl import com.shifthackz.aisdv1.domain.usecase.gallery.DeleteGalleryItemUseCase @@ -54,10 +58,14 @@ import com.shifthackz.aisdv1.domain.usecase.gallery.GetAllGalleryUseCase import com.shifthackz.aisdv1.domain.usecase.gallery.GetAllGalleryUseCaseImpl import com.shifthackz.aisdv1.domain.usecase.gallery.GetGalleryItemsUseCase import com.shifthackz.aisdv1.domain.usecase.gallery.GetGalleryItemsUseCaseImpl +import com.shifthackz.aisdv1.domain.usecase.gallery.GetGalleryPagedIdsUseCase +import com.shifthackz.aisdv1.domain.usecase.gallery.GetGalleryPagedIdsUseCaseImpl import com.shifthackz.aisdv1.domain.usecase.gallery.GetMediaStoreInfoUseCase import com.shifthackz.aisdv1.domain.usecase.gallery.GetMediaStoreInfoUseCaseImpl import com.shifthackz.aisdv1.domain.usecase.gallery.ToggleImageVisibilityUseCase import com.shifthackz.aisdv1.domain.usecase.gallery.ToggleImageVisibilityUseCaseImpl +import com.shifthackz.aisdv1.domain.usecase.generation.FalAiGenerationUseCase +import com.shifthackz.aisdv1.domain.usecase.generation.FalAiGenerationUseCaseImpl import com.shifthackz.aisdv1.domain.usecase.generation.GetGenerationResultPagedUseCase import com.shifthackz.aisdv1.domain.usecase.generation.GetGenerationResultPagedUseCaseImpl import com.shifthackz.aisdv1.domain.usecase.generation.GetGenerationResultUseCase @@ -104,6 +112,8 @@ import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToMediaPipeUseCase import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToMediaPipeUseCaseImpl import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToOpenAiUseCase import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToOpenAiUseCaseImpl +import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToFalAiUseCase +import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToFalAiUseCaseImpl import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToStabilityAiUseCase import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToStabilityAiUseCaseImpl import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToSwarmUiUseCase @@ -131,6 +141,7 @@ import org.koin.dsl.module internal val useCasesModule = module { factoryOf(::TextToImageUseCaseImpl) bind TextToImageUseCase::class factoryOf(::ImageToImageUseCaseImpl) bind ImageToImageUseCase::class + factoryOf(::FalAiGenerationUseCaseImpl) bind FalAiGenerationUseCase::class factoryOf(::PingStableDiffusionServiceUseCaseImpl) bind PingStableDiffusionServiceUseCase::class factoryOf(::ClearAppCacheUseCaseImpl) bind ClearAppCacheUseCase::class factoryOf(::DataPreLoaderUseCaseImpl) bind DataPreLoaderUseCase::class @@ -140,6 +151,7 @@ internal val useCasesModule = module { factoryOf(::GetGenerationResultPagedUseCaseImpl) bind GetGenerationResultPagedUseCase::class factoryOf(::GetAllGalleryUseCaseImpl) bind GetAllGalleryUseCase::class factoryOf(::GetGalleryItemsUseCaseImpl) bind GetGalleryItemsUseCase::class + factoryOf(::GetGalleryPagedIdsUseCaseImpl) bind GetGalleryPagedIdsUseCase::class factoryOf(::GetGenerationResultUseCaseImpl) bind GetGenerationResultUseCase::class factoryOf(::DeleteGalleryItemUseCaseImpl) bind DeleteGalleryItemUseCase::class factoryOf(::DeleteGalleryItemsUseCaseImpl) bind DeleteGalleryItemsUseCase::class @@ -148,6 +160,7 @@ internal val useCasesModule = module { factoryOf(::FetchAndGetLorasUseCaseImpl) bind FetchAndGetLorasUseCase::class factoryOf(::FetchAndGetHyperNetworksUseCaseImpl) bind FetchAndGetHyperNetworksUseCase::class factoryOf(::FetchAndGetEmbeddingsUseCaseImpl) bind FetchAndGetEmbeddingsUseCase::class + factoryOf(::GetForgeModulesUseCaseImpl) bind GetForgeModulesUseCase::class factoryOf(::SplashNavigationUseCaseImpl) bind SplashNavigationUseCase::class factoryOf(::GetConfigurationUseCaseImpl) bind GetConfigurationUseCase::class factoryOf(::SetServerConfigurationUseCaseImpl) bind SetServerConfigurationUseCase::class @@ -156,6 +169,7 @@ internal val useCasesModule = module { factoryOf(::TestHuggingFaceApiKeyUseCaseImpl) bind TestHuggingFaceApiKeyUseCase::class factoryOf(::TestOpenAiApiKeyUseCaseImpl) bind TestOpenAiApiKeyUseCase::class factoryOf(::TestStabilityAiApiKeyUseCaseImpl) bind TestStabilityAiApiKeyUseCase::class + factoryOf(::TestFalAiApiKeyUseCaseImpl) bind TestFalAiApiKeyUseCase::class factoryOf(::TestSwarmUiConnectivityUseCaseImpl) bind TestSwarmUiConnectivityUseCase::class factoryOf(::SaveGenerationResultUseCaseImpl) bind SaveGenerationResultUseCase::class factoryOf(::ObserveSeverConnectivityUseCaseImpl) bind ObserveSeverConnectivityUseCase::class @@ -182,6 +196,7 @@ internal val useCasesModule = module { factoryOf(::ConnectToHuggingFaceUseCaseImpl) bind ConnectToHuggingFaceUseCase::class factoryOf(::ConnectToOpenAiUseCaseImpl) bind ConnectToOpenAiUseCase::class factoryOf(::ConnectToStabilityAiUseCaseImpl) bind ConnectToStabilityAiUseCase::class + factoryOf(::ConnectToFalAiUseCaseImpl) bind ConnectToFalAiUseCase::class factoryOf(::FetchAndGetHuggingFaceModelsUseCaseImpl) bind FetchAndGetHuggingFaceModelsUseCase::class factoryOf(::ObserveStabilityAiCreditsUseCaseImpl) bind ObserveStabilityAiCreditsUseCase::class factoryOf(::FetchAndGetStabilityAiEnginesUseCaseImpl) bind FetchAndGetStabilityAiEnginesUseCase::class diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Configuration.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Configuration.kt index 40c5e10a3..a4662b4d7 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Configuration.kt +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Configuration.kt @@ -14,6 +14,7 @@ data class Configuration( val huggingFaceModel: String = "", val stabilityAiApiKey: String = "", val stabilityAiEngineId: String = "", + val falAiApiKey: String = "", val authCredentials: AuthorizationCredentials = AuthorizationCredentials.None, val localOnnxModelId: String = "", val localOnnxModelPath: String = "", diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/FalAiEndpoint.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/FalAiEndpoint.kt new file mode 100644 index 000000000..33ca301ad --- /dev/null +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/FalAiEndpoint.kt @@ -0,0 +1,97 @@ +package com.shifthackz.aisdv1.domain.entity + +/** + * Represents a fal.ai endpoint loaded from OpenAPI schema. + * Can be either built-in (shipped with app) or custom (imported by user). + */ +data class FalAiEndpoint( + val id: String, + val endpointId: String, + val title: String, + val description: String, + val category: FalAiEndpointCategory, + val group: String, // For hierarchical display, e.g. "FLUX 2", "FLUX LoRA" + val thumbnailUrl: String, + val playgroundUrl: String, + val documentationUrl: String, + val isCustom: Boolean, + val schema: FalAiEndpointSchema, +) + +enum class FalAiEndpointCategory(val key: String, val displayName: String) { + TEXT_TO_IMAGE("text-to-image", "Text to Image"), + IMAGE_TO_IMAGE("image-to-image", "Image to Image"), + INPAINTING("inpainting", "Inpainting"), + UPSCALING("upscaling", "Upscaling"), + OTHER("other", "Other"); + + companion object { + fun fromKey(key: String): FalAiEndpointCategory = + entries.find { it.key.equals(key, ignoreCase = true) } ?: OTHER + } +} + +/** + * Schema definition for a fal.ai endpoint, parsed from OpenAPI JSON. + */ +data class FalAiEndpointSchema( + val baseUrl: String, + val submissionPath: String, + val inputProperties: List, + val requiredProperties: List, + val propertyOrder: List, +) + +/** + * Represents an input property from the OpenAPI schema. + */ +data class FalAiInputProperty( + val name: String, + val title: String, + val description: String, + val type: FalAiPropertyType, + val default: Any? = null, + val minimum: Number? = null, + val maximum: Number? = null, + val enumValues: List? = null, + val isRequired: Boolean = false, + val isImageInput: Boolean = false, + val arrayItemProperties: List? = null, + val linkedMaskProperty: String? = null, // For inpainting: links image_url to its mask_url +) + +enum class FalAiPropertyType { + STRING, + INTEGER, + NUMBER, + BOOLEAN, + ARRAY, + OBJECT, + IMAGE_URL, + IMAGE_URL_ARRAY, + INPAINT, // Combined image + mask drawing + ENUM, + IMAGE_SIZE; + + companion object { + fun fromString( + type: String?, + hasEnum: Boolean = false, + isImageField: Boolean = false, + isImageArray: Boolean = false, + ): FalAiPropertyType { + if (isImageArray) return IMAGE_URL_ARRAY + if (isImageField) return IMAGE_URL + if (hasEnum) return ENUM + return when (type?.lowercase()) { + "string" -> STRING + "integer" -> INTEGER + "number" -> NUMBER + "boolean" -> BOOLEAN + "array" -> ARRAY + "object" -> OBJECT + else -> STRING + } + } + } +} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/FalAiPayload.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/FalAiPayload.kt new file mode 100644 index 000000000..aeb64e7a1 --- /dev/null +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/FalAiPayload.kt @@ -0,0 +1,6 @@ +package com.shifthackz.aisdv1.domain.entity + +data class FalAiPayload( + val endpointId: String, + val parameters: Map, +) diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ServerSource.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ServerSource.kt index 15244e1da..f8568826e 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ServerSource.kt +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ServerSource.kt @@ -65,6 +65,14 @@ enum class ServerSource( FeatureTag.Batch, ), ), + FAL_AI( + key = "fal_ai", + featureTags = setOf( + FeatureTag.Txt2Img, + FeatureTag.MultipleModels, + FeatureTag.Batch, + ), + ), LOCAL_MICROSOFT_ONNX( key = "local", featureTags = setOf( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Settings.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Settings.kt index c4da9e467..b9e7a681c 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Settings.kt +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Settings.kt @@ -5,6 +5,7 @@ import com.shifthackz.aisdv1.core.common.schedulers.SchedulersToken data class Settings( val serverUrl: String = "", val sdModel: String = "", + val modelType: ModelType = ModelType.SD_1_5, val demoMode: Boolean = false, val developerMode: Boolean = false, val localDiffusionAllowCancel: Boolean = false, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/feature/work/BackgroundTaskManager.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/feature/work/BackgroundTaskManager.kt index 78199398e..e905c93d3 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/feature/work/BackgroundTaskManager.kt +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/feature/work/BackgroundTaskManager.kt @@ -1,12 +1,15 @@ package com.shifthackz.aisdv1.domain.feature.work +import com.shifthackz.aisdv1.domain.entity.FalAiPayload import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload import com.shifthackz.aisdv1.domain.entity.TextToImagePayload interface BackgroundTaskManager { fun scheduleTextToImageTask(payload: TextToImagePayload) fun scheduleImageToImageTask(payload: ImageToImagePayload) + fun scheduleFalAiTask(payload: FalAiPayload) fun retryLastTextToImageTask(): Result fun retryLastImageToImageTask(): Result + fun retryLastFalAiTask(): Result fun cancelAll(): Result } diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/interactor/settings/SetupConnectionInterActor.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/interactor/settings/SetupConnectionInterActor.kt index 5959a0355..127619cfa 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/interactor/settings/SetupConnectionInterActor.kt +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/interactor/settings/SetupConnectionInterActor.kt @@ -1,6 +1,7 @@ package com.shifthackz.aisdv1.domain.interactor.settings import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToA1111UseCase +import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToFalAiUseCase import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToHordeUseCase import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToHuggingFaceUseCase import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToLocalDiffusionUseCase @@ -18,4 +19,5 @@ interface SetupConnectionInterActor { val connectToOpenAi: ConnectToOpenAiUseCase val connectToStabilityAi: ConnectToStabilityAiUseCase val connectToSwarmUi: ConnectToSwarmUiUseCase + val connectToFalAi: ConnectToFalAiUseCase } diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/interactor/settings/SetupConnectionInterActorImpl.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/interactor/settings/SetupConnectionInterActorImpl.kt index 306da0945..f2263c34d 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/interactor/settings/SetupConnectionInterActorImpl.kt +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/interactor/settings/SetupConnectionInterActorImpl.kt @@ -1,6 +1,7 @@ package com.shifthackz.aisdv1.domain.interactor.settings import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToA1111UseCase +import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToFalAiUseCase import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToHordeUseCase import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToHuggingFaceUseCase import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToLocalDiffusionUseCase @@ -18,4 +19,5 @@ internal data class SetupConnectionInterActorImpl( override val connectToOpenAi: ConnectToOpenAiUseCase, override val connectToStabilityAi: ConnectToStabilityAiUseCase, override val connectToSwarmUi: ConnectToSwarmUiUseCase, + override val connectToFalAi: ConnectToFalAiUseCase, ) : SetupConnectionInterActor diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/preference/PreferenceManager.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/preference/PreferenceManager.kt index b049cf33e..4ee91ed0b 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/preference/PreferenceManager.kt +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/preference/PreferenceManager.kt @@ -2,6 +2,7 @@ package com.shifthackz.aisdv1.domain.preference import com.shifthackz.aisdv1.core.common.schedulers.SchedulersToken import com.shifthackz.aisdv1.domain.entity.Grid +import com.shifthackz.aisdv1.domain.entity.ModelType import com.shifthackz.aisdv1.domain.entity.ServerSource import com.shifthackz.aisdv1.domain.entity.Settings import io.reactivex.rxjava3.core.Completable @@ -24,12 +25,15 @@ interface PreferenceManager { var formPromptTaggedInput: Boolean var source: ServerSource var sdModel: String + var modelType: ModelType var hordeApiKey: String var openAiApiKey: String var huggingFaceApiKey: String var huggingFaceModel: String var stabilityAiApiKey: String var stabilityAiEngineId: String + var falAiApiKey: String + var falAiSelectedEndpointId: String var onBoardingComplete: Boolean var forceSetupAfterUpdate: Boolean var localOnnxModelId: String @@ -46,4 +50,7 @@ interface PreferenceManager { fun observe(): Flowable fun refresh(): Completable + + fun saveFalAiEndpointParams(endpointId: String, params: Map) + fun getFalAiEndpointParams(endpointId: String): Map } diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/FalAiEndpointRepository.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/FalAiEndpointRepository.kt new file mode 100644 index 000000000..58112b025 --- /dev/null +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/FalAiEndpointRepository.kt @@ -0,0 +1,49 @@ +package com.shifthackz.aisdv1.domain.repository + +import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint +import io.reactivex.rxjava3.core.Completable +import io.reactivex.rxjava3.core.Observable +import io.reactivex.rxjava3.core.Single + +interface FalAiEndpointRepository { + + /** + * Get all available endpoints (built-in + custom). + */ + fun observeAll(): Observable> + + /** + * Get all endpoints once. + */ + fun getAll(): Single> + + /** + * Get endpoint by ID. + */ + fun getById(id: String): Single + + /** + * Get currently selected endpoint. + */ + fun getSelected(): Single + + /** + * Set selected endpoint ID. + */ + fun setSelected(id: String): Completable + + /** + * Import custom endpoint from OpenAPI JSON string. + */ + fun importFromJson(json: String): Single + + /** + * Import custom endpoint from URL. + */ + fun importFromUrl(url: String): Single + + /** + * Delete custom endpoint. + */ + fun delete(id: String): Completable +} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/FalAiGenerationRepository.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/FalAiGenerationRepository.kt new file mode 100644 index 000000000..34982b6e3 --- /dev/null +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/FalAiGenerationRepository.kt @@ -0,0 +1,12 @@ +package com.shifthackz.aisdv1.domain.repository + +import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint +import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import io.reactivex.rxjava3.core.Single + +interface FalAiGenerationRepository { + fun validateApiKey(): Single + fun generateFromText(payload: TextToImagePayload): Single + fun generateDynamic(endpoint: FalAiEndpoint, parameters: Map): Single> +} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestFalAiApiKeyUseCase.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestFalAiApiKeyUseCase.kt new file mode 100644 index 000000000..094a9046d --- /dev/null +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestFalAiApiKeyUseCase.kt @@ -0,0 +1,7 @@ +package com.shifthackz.aisdv1.domain.usecase.connectivity + +import io.reactivex.rxjava3.core.Single + +interface TestFalAiApiKeyUseCase { + operator fun invoke(): Single +} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestFalAiApiKeyUseCaseImpl.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestFalAiApiKeyUseCaseImpl.kt new file mode 100644 index 000000000..d6bcb5665 --- /dev/null +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestFalAiApiKeyUseCaseImpl.kt @@ -0,0 +1,10 @@ +package com.shifthackz.aisdv1.domain.usecase.connectivity + +import com.shifthackz.aisdv1.domain.repository.FalAiGenerationRepository + +internal class TestFalAiApiKeyUseCaseImpl( + private val falAiGenerationRepository: FalAiGenerationRepository, +) : TestFalAiApiKeyUseCase { + + override fun invoke() = falAiGenerationRepository.validateApiKey() +} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/FalAiGenerationUseCase.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/FalAiGenerationUseCase.kt new file mode 100644 index 000000000..5b592453e --- /dev/null +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/FalAiGenerationUseCase.kt @@ -0,0 +1,9 @@ +package com.shifthackz.aisdv1.domain.usecase.generation + +import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import com.shifthackz.aisdv1.domain.entity.FalAiPayload +import io.reactivex.rxjava3.core.Single + +interface FalAiGenerationUseCase { + operator fun invoke(payload: FalAiPayload): Single> +} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/FalAiGenerationUseCaseImpl.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/FalAiGenerationUseCaseImpl.kt new file mode 100644 index 000000000..44618ff64 --- /dev/null +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/FalAiGenerationUseCaseImpl.kt @@ -0,0 +1,30 @@ +package com.shifthackz.aisdv1.domain.usecase.generation + +import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import com.shifthackz.aisdv1.domain.entity.FalAiPayload +import com.shifthackz.aisdv1.domain.repository.FalAiEndpointRepository +import com.shifthackz.aisdv1.domain.repository.FalAiGenerationRepository +import io.reactivex.rxjava3.core.Completable +import io.reactivex.rxjava3.core.Single + +class FalAiGenerationUseCaseImpl( + private val falAiEndpointRepository: FalAiEndpointRepository, + private val falAiGenerationRepository: FalAiGenerationRepository, + private val saveGenerationResultUseCase: SaveGenerationResultUseCase, +) : FalAiGenerationUseCase { + + override fun invoke(payload: FalAiPayload): Single> { + return falAiEndpointRepository.getAll() + .flatMap { endpoints -> + val endpoint = endpoints.find { it.id == payload.endpointId || it.endpointId == payload.endpointId } + ?: return@flatMap Single.error(Throwable("Endpoint not found: ${payload.endpointId}")) + + falAiGenerationRepository.generateDynamic(endpoint, payload.parameters) + .flatMap { results -> + val saveCompletables = results.map { saveGenerationResultUseCase(it) } + Completable.merge(saveCompletables) + .andThen(Single.just(results)) + } + } + } +} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/TextToImageUseCaseImpl.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/TextToImageUseCaseImpl.kt index f823a153c..632c6ea48 100755 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/TextToImageUseCaseImpl.kt +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/TextToImageUseCaseImpl.kt @@ -4,6 +4,7 @@ import com.shifthackz.aisdv1.domain.entity.AiGenerationResult import com.shifthackz.aisdv1.domain.entity.ServerSource import com.shifthackz.aisdv1.domain.entity.TextToImagePayload import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import com.shifthackz.aisdv1.domain.repository.FalAiGenerationRepository import com.shifthackz.aisdv1.domain.repository.HordeGenerationRepository import com.shifthackz.aisdv1.domain.repository.HuggingFaceGenerationRepository import com.shifthackz.aisdv1.domain.repository.LocalDiffusionGenerationRepository @@ -21,6 +22,7 @@ internal class TextToImageUseCaseImpl( private val huggingFaceGenerationRepository: HuggingFaceGenerationRepository, private val openAiGenerationRepository: OpenAiGenerationRepository, private val stabilityAiGenerationRepository: StabilityAiGenerationRepository, + private val falAiGenerationRepository: FalAiGenerationRepository, private val swarmUiGenerationRepository: SwarmUiGenerationRepository, private val localDiffusionGenerationRepository: LocalDiffusionGenerationRepository, private val mediaPipeGenerationRepository: MediaPipeGenerationRepository, @@ -41,6 +43,7 @@ internal class TextToImageUseCaseImpl( ServerSource.AUTOMATIC1111 -> stableDiffusionGenerationRepository.generateFromText(payload) ServerSource.OPEN_AI -> openAiGenerationRepository.generateFromText(payload) ServerSource.STABILITY_AI -> stabilityAiGenerationRepository.generateFromText(payload) + ServerSource.FAL_AI -> falAiGenerationRepository.generateFromText(payload) ServerSource.SWARM_UI -> swarmUiGenerationRepository.generateFromText(payload) ServerSource.LOCAL_GOOGLE_MEDIA_PIPE -> mediaPipeGenerationRepository.generateFromText(payload) } diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToFalAiUseCase.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToFalAiUseCase.kt new file mode 100644 index 000000000..cdb7ab495 --- /dev/null +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToFalAiUseCase.kt @@ -0,0 +1,7 @@ +package com.shifthackz.aisdv1.domain.usecase.settings + +import io.reactivex.rxjava3.core.Single + +interface ConnectToFalAiUseCase { + operator fun invoke(apiKey: String, endpointId: String): Single> +} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToFalAiUseCaseImpl.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToFalAiUseCaseImpl.kt new file mode 100644 index 000000000..e94bd1728 --- /dev/null +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToFalAiUseCaseImpl.kt @@ -0,0 +1,45 @@ +package com.shifthackz.aisdv1.domain.usecase.settings + +import com.shifthackz.aisdv1.domain.entity.Configuration +import com.shifthackz.aisdv1.domain.entity.ServerSource +import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationCredentials +import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import com.shifthackz.aisdv1.domain.usecase.connectivity.TestFalAiApiKeyUseCase +import io.reactivex.rxjava3.core.Single +import java.util.concurrent.TimeUnit + +internal class ConnectToFalAiUseCaseImpl( + private val getConfigurationUseCase: GetConfigurationUseCase, + private val setServerConfigurationUseCase: SetServerConfigurationUseCase, + private val testFalAiApiKeyUseCase: TestFalAiApiKeyUseCase, + private val preferenceManager: PreferenceManager, +) : ConnectToFalAiUseCase { + + override fun invoke(apiKey: String, endpointId: String): Single> { + var configuration: Configuration? = null + return getConfigurationUseCase.invoke() + .map { originalConfiguration -> + configuration = originalConfiguration + originalConfiguration.copy( + source = ServerSource.FAL_AI, + falAiApiKey = apiKey, + authCredentials = AuthorizationCredentials.None, + ) + } + .flatMapCompletable(setServerConfigurationUseCase::invoke) + .doOnComplete { preferenceManager.falAiSelectedEndpointId = endpointId } + .delay(3L, TimeUnit.SECONDS) + .andThen(testFalAiApiKeyUseCase()) + .flatMap { + if (it) Single.just(Result.success(Unit)) + else Single.error(IllegalStateException("Bad key")) + } + .onErrorResumeNext { t -> + val rollback = configuration + ?.copy(authCredentials = AuthorizationCredentials.None) + ?: return@onErrorResumeNext Single.just(Result.failure(t)) + setServerConfigurationUseCase(rollback) + .andThen(Single.just(Result.failure(t))) + } + } +} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/GetConfigurationUseCaseImpl.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/GetConfigurationUseCaseImpl.kt index e88ebd63a..9ed709447 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/GetConfigurationUseCaseImpl.kt +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/GetConfigurationUseCaseImpl.kt @@ -23,6 +23,7 @@ internal class GetConfigurationUseCaseImpl( huggingFaceModel = preferenceManager.huggingFaceModel, stabilityAiApiKey = preferenceManager.stabilityAiApiKey, stabilityAiEngineId = preferenceManager.stabilityAiEngineId, + falAiApiKey = preferenceManager.falAiApiKey, authCredentials = authorizationStore.getAuthorizationCredentials(), localOnnxModelId = preferenceManager.localOnnxModelId, localOnnxModelPath = preferenceManager.localOnnxCustomModelPath, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/SetServerConfigurationUseCaseImpl.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/SetServerConfigurationUseCaseImpl.kt index aab29abc1..22b94145e 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/SetServerConfigurationUseCaseImpl.kt +++ b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/SetServerConfigurationUseCaseImpl.kt @@ -24,6 +24,7 @@ internal class SetServerConfigurationUseCaseImpl( preferenceManager.huggingFaceModel = configuration.huggingFaceModel preferenceManager.stabilityAiApiKey = configuration.stabilityAiApiKey preferenceManager.stabilityAiEngineId = configuration.stabilityAiEngineId + preferenceManager.falAiApiKey = configuration.falAiApiKey preferenceManager.localOnnxModelId = configuration.localOnnxModelId preferenceManager.localOnnxCustomModelPath = configuration.localOnnxModelPath preferenceManager.localMediaPipeModelId = configuration.localMediaPipeModelId diff --git a/feature/work/build.gradle.kts b/feature/work/build.gradle.kts index d7e637214..7f45580bc 100644 --- a/feature/work/build.gradle.kts +++ b/feature/work/build.gradle.kts @@ -15,4 +15,5 @@ dependencies { implementation(libs.koin.android) implementation(libs.rx.kotlin) implementation(libs.androidx.work.runtime) + implementation(libs.google.gson) } diff --git a/feature/work/src/main/java/com/shifthackz/aisdv1/work/BackgroundTaskManagerImpl.kt b/feature/work/src/main/java/com/shifthackz/aisdv1/work/BackgroundTaskManagerImpl.kt index c1444ec9b..75ec4643a 100644 --- a/feature/work/src/main/java/com/shifthackz/aisdv1/work/BackgroundTaskManagerImpl.kt +++ b/feature/work/src/main/java/com/shifthackz/aisdv1/work/BackgroundTaskManagerImpl.kt @@ -5,11 +5,14 @@ import androidx.work.ListenableWorker import androidx.work.OneTimeWorkRequestBuilder import androidx.work.OutOfQuotaPolicy import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor +import com.shifthackz.aisdv1.domain.entity.FalAiPayload import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload import com.shifthackz.aisdv1.domain.entity.TextToImagePayload import com.shifthackz.aisdv1.domain.feature.work.BackgroundTaskManager import com.shifthackz.aisdv1.work.di.WorkManagerProvider import com.shifthackz.aisdv1.work.mappers.toByteArray +import com.shifthackz.aisdv1.work.mappers.toByteArray as toFalAiByteArray +import com.shifthackz.aisdv1.work.task.FalAiTask import com.shifthackz.aisdv1.work.task.ImageToImageTask import com.shifthackz.aisdv1.work.task.TextToImageTask import org.koin.java.KoinJavaComponent.inject @@ -25,6 +28,10 @@ internal class BackgroundTaskManagerImpl : BackgroundTaskManager { runWork(payload.toByteArray(), Constants.FILE_IMAGE_TO_IMAGE) } + override fun scheduleFalAiTask(payload: FalAiPayload) { + runWork(payload.toByteArray(), Constants.FILE_FAL_AI) + } + override fun retryLastTextToImageTask(): Result { try { val bytes = readPayload(Constants.FILE_TEXT_TO_IMAGE) @@ -47,6 +54,17 @@ internal class BackgroundTaskManagerImpl : BackgroundTaskManager { } } + override fun retryLastFalAiTask(): Result { + try { + val bytes = readPayload(Constants.FILE_FAL_AI) + ?: return Result.failure(Throwable("Payload is null.")) + runWork(bytes, Constants.FILE_FAL_AI) + return Result.success(Unit) + } catch (e: Exception) { + return Result.failure(e) + } + } + override fun cancelAll(): Result = runCatching { val workManager: WorkManagerProvider by inject(WorkManagerProvider::class.java) workManager().cancelAllWork() diff --git a/feature/work/src/main/java/com/shifthackz/aisdv1/work/Constants.kt b/feature/work/src/main/java/com/shifthackz/aisdv1/work/Constants.kt index f6ca341e0..0fea29a82 100644 --- a/feature/work/src/main/java/com/shifthackz/aisdv1/work/Constants.kt +++ b/feature/work/src/main/java/com/shifthackz/aisdv1/work/Constants.kt @@ -6,9 +6,12 @@ internal object Constants { const val NOTIFICATION_TEXT_TO_IMAGE_GENERIC = 5599 const val NOTIFICATION_IMAGE_TO_IMAGE_FOREGROUND = 151297 const val NOTIFICATION_IMAGE_TO_IMAGE_GENERIC = 151298 + const val NOTIFICATION_FAL_AI_FOREGROUND = 161300 + const val NOTIFICATION_FAL_AI_GENERIC = 161301 const val TAG_GENERATION = "work_ai_generation" const val FILE_TEXT_TO_IMAGE = "txt2img.bin" const val FILE_IMAGE_TO_IMAGE = "img2img.bin" + const val FILE_FAL_AI = "falai.bin" } diff --git a/feature/work/src/main/java/com/shifthackz/aisdv1/work/core/NotificationWorker.kt b/feature/work/src/main/java/com/shifthackz/aisdv1/work/core/NotificationWorker.kt index 233c65d88..d0684a102 100644 --- a/feature/work/src/main/java/com/shifthackz/aisdv1/work/core/NotificationWorker.kt +++ b/feature/work/src/main/java/com/shifthackz/aisdv1/work/core/NotificationWorker.kt @@ -12,6 +12,7 @@ import androidx.work.WorkerParameters import com.shifthackz.aisdv1.core.common.appbuild.ActivityIntentProvider import com.shifthackz.aisdv1.core.common.extensions.isAppInForeground import com.shifthackz.aisdv1.core.notification.PushNotificationManager +import io.reactivex.rxjava3.core.Single internal abstract class NotificationWorker( context: Context, @@ -24,6 +25,35 @@ internal abstract class NotificationWorker( abstract val genericNotificationId: Int + override val foregroundInfo: Single + get() = Single.fromCallable { + pushNotificationManager.createNotificationChannel() + val notification = pushNotificationManager.createNotification( + "Generation in progress", + "Your image is being generated..." + ) { + setOngoing(true) + setProgress(0, 0, true) + setAutoCancel(false) + setForegroundServiceBehavior(NotificationCompat.FOREGROUND_SERVICE_IMMEDIATE) + setContentIntent( + PendingIntent.getActivity( + applicationContext, + 0, + activityIntentProvider().also { intent -> + intent.flags = Intent.FLAG_ACTIVITY_SINGLE_TOP + }, + PendingIntent.FLAG_IMMUTABLE or PendingIntent.FLAG_UPDATE_CURRENT, + ), + ) + } + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { + ForegroundInfo(notificationId, notification, FOREGROUND_SERVICE_TYPE_DATA_SYNC) + } else { + ForegroundInfo(notificationId, notification) + } + } + fun showGenericNotification(text: String, body: String?) { pushNotificationManager.createNotificationChannel() val notification = pushNotificationManager.createNotification(text, body) { diff --git a/feature/work/src/main/java/com/shifthackz/aisdv1/work/core/Rx3Worker.kt b/feature/work/src/main/java/com/shifthackz/aisdv1/work/core/Rx3Worker.kt index ea71bdc35..5e2574746 100644 --- a/feature/work/src/main/java/com/shifthackz/aisdv1/work/core/Rx3Worker.kt +++ b/feature/work/src/main/java/com/shifthackz/aisdv1/work/core/Rx3Worker.kt @@ -61,7 +61,7 @@ internal abstract class Rx3Worker( return convert(SingleFutureAdapter(), foregroundInfo) } - val foregroundInfo: Single + open val foregroundInfo: Single get() { val message = ( "Expedited WorkRequests require a RxWorker to provide an implementation for" diff --git a/feature/work/src/main/java/com/shifthackz/aisdv1/work/di/SdaiWorkerFactory.kt b/feature/work/src/main/java/com/shifthackz/aisdv1/work/di/SdaiWorkerFactory.kt index 68d419d1f..e6e358dbc 100644 --- a/feature/work/src/main/java/com/shifthackz/aisdv1/work/di/SdaiWorkerFactory.kt +++ b/feature/work/src/main/java/com/shifthackz/aisdv1/work/di/SdaiWorkerFactory.kt @@ -9,11 +9,13 @@ import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor import com.shifthackz.aisdv1.core.notification.PushNotificationManager import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import com.shifthackz.aisdv1.domain.usecase.generation.FalAiGenerationUseCase import com.shifthackz.aisdv1.domain.usecase.generation.ImageToImageUseCase import com.shifthackz.aisdv1.domain.usecase.generation.InterruptGenerationUseCase import com.shifthackz.aisdv1.domain.usecase.generation.ObserveHordeProcessStatusUseCase import com.shifthackz.aisdv1.domain.usecase.generation.ObserveLocalDiffusionProcessStatusUseCase import com.shifthackz.aisdv1.domain.usecase.generation.TextToImageUseCase +import com.shifthackz.aisdv1.work.task.FalAiTask import com.shifthackz.aisdv1.work.task.ImageToImageTask import com.shifthackz.aisdv1.work.task.TextToImageTask @@ -23,6 +25,7 @@ class SdaiWorkerFactory( private val preferenceManager: PreferenceManager, private val textToImageUseCase: TextToImageUseCase, private val imageToImageUseCase: ImageToImageUseCase, + private val falAiGenerationUseCase: FalAiGenerationUseCase, private val observeHordeProcessStatusUseCase: ObserveHordeProcessStatusUseCase, private val observeLocalDiffusionProcessStatusUseCase: ObserveLocalDiffusionProcessStatusUseCase, private val interruptGenerationUseCase: InterruptGenerationUseCase, @@ -64,6 +67,20 @@ class SdaiWorkerFactory( fileProviderDescriptor = fileProviderDescriptor, ) + FalAiTask::class.java.name -> FalAiTask( + context = appContext, + workerParameters = workerParameters, + pushNotificationManager = pushNotificationManager, + activityIntentProvider = activityIntentProvider, + backgroundWorkObserver = backgroundWorkObserver, + preferenceManager = preferenceManager, + falAiGenerationUseCase = falAiGenerationUseCase, + observeHordeProcessStatusUseCase = observeHordeProcessStatusUseCase, + observeLocalDiffusionProcessStatusUseCase = observeLocalDiffusionProcessStatusUseCase, + interruptGenerationUseCase = interruptGenerationUseCase, + fileProviderDescriptor = fileProviderDescriptor, + ) + else -> null } } diff --git a/feature/work/src/main/java/com/shifthackz/aisdv1/work/mappers/FalAiPayloadMappers.kt b/feature/work/src/main/java/com/shifthackz/aisdv1/work/mappers/FalAiPayloadMappers.kt new file mode 100644 index 000000000..eec91e32b --- /dev/null +++ b/feature/work/src/main/java/com/shifthackz/aisdv1/work/mappers/FalAiPayloadMappers.kt @@ -0,0 +1,36 @@ +package com.shifthackz.aisdv1.work.mappers + +import com.google.gson.Gson +import com.google.gson.reflect.TypeToken +import com.shifthackz.aisdv1.domain.entity.FalAiPayload + +private val gson = Gson() + +internal fun FalAiPayload.toByteArray(): ByteArray { + val json = gson.toJson(mapOf( + "endpointId" to endpointId, + "parameters" to parameters, + )) + return json.toByteArray(Charsets.UTF_8) +} + +internal fun FalAiPayload.toFalAiPayloadByteArray(): ByteArray = toByteArray() + +internal fun ByteArray.toFalAiPayload(): FalAiPayload? { + return try { + val json = toString(Charsets.UTF_8) + val type = object : TypeToken>() {}.type + val map: Map = gson.fromJson(json, type) + + val endpointId = map["endpointId"] as? String ?: return null + @Suppress("UNCHECKED_CAST") + val parameters = map["parameters"] as? Map ?: emptyMap() + + FalAiPayload( + endpointId = endpointId, + parameters = parameters, + ) + } catch (e: Exception) { + null + } +} diff --git a/feature/work/src/main/java/com/shifthackz/aisdv1/work/task/FalAiTask.kt b/feature/work/src/main/java/com/shifthackz/aisdv1/work/task/FalAiTask.kt new file mode 100644 index 000000000..c6a41b79a --- /dev/null +++ b/feature/work/src/main/java/com/shifthackz/aisdv1/work/task/FalAiTask.kt @@ -0,0 +1,114 @@ +package com.shifthackz.aisdv1.work.task + +import android.content.Context +import androidx.work.WorkerParameters +import com.shifthackz.aisdv1.core.common.appbuild.ActivityIntentProvider +import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor +import com.shifthackz.aisdv1.core.common.log.debugLog +import com.shifthackz.aisdv1.core.common.log.errorLog +import com.shifthackz.aisdv1.core.notification.PushNotificationManager +import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver +import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import com.shifthackz.aisdv1.domain.usecase.generation.FalAiGenerationUseCase +import com.shifthackz.aisdv1.domain.usecase.generation.InterruptGenerationUseCase +import com.shifthackz.aisdv1.domain.usecase.generation.ObserveHordeProcessStatusUseCase +import com.shifthackz.aisdv1.domain.usecase.generation.ObserveLocalDiffusionProcessStatusUseCase +import com.shifthackz.aisdv1.work.Constants +import com.shifthackz.aisdv1.work.Constants.NOTIFICATION_FAL_AI_FOREGROUND +import com.shifthackz.aisdv1.work.Constants.NOTIFICATION_FAL_AI_GENERIC +import com.shifthackz.aisdv1.work.core.CoreGenerationWorker +import com.shifthackz.aisdv1.work.mappers.toFalAiPayload +import io.reactivex.rxjava3.core.Single +import java.io.File + +internal class FalAiTask( + context: Context, + workerParameters: WorkerParameters, + pushNotificationManager: PushNotificationManager, + activityIntentProvider: ActivityIntentProvider, + observeHordeProcessStatusUseCase: ObserveHordeProcessStatusUseCase, + observeLocalDiffusionProcessStatusUseCase: ObserveLocalDiffusionProcessStatusUseCase, + interruptGenerationUseCase: InterruptGenerationUseCase, + private val preferenceManager: PreferenceManager, + private val backgroundWorkObserver: BackgroundWorkObserver, + private val falAiGenerationUseCase: FalAiGenerationUseCase, + private val fileProviderDescriptor: FileProviderDescriptor, +) : CoreGenerationWorker( + context = context, + workerParameters = workerParameters, + pushNotificationManager = pushNotificationManager, + activityIntentProvider = activityIntentProvider, + preferenceManager = preferenceManager, + backgroundWorkObserver = backgroundWorkObserver, + observeHordeProcessStatusUseCase = observeHordeProcessStatusUseCase, + observeLocalDiffusionProcessStatusUseCase = observeLocalDiffusionProcessStatusUseCase, + interruptGenerationUseCase = interruptGenerationUseCase, +) { + + override val notificationId: Int = NOTIFICATION_FAL_AI_FOREGROUND + + override val genericNotificationId: Int = NOTIFICATION_FAL_AI_GENERIC + + override fun createWork(): Single { + if (preferenceManager.backgroundProcessCount > 0) { + handleProcess() + handleError(Throwable("Background process count > 0")) + compositeDisposable.clear() + preferenceManager.backgroundProcessCount = 0 + debugLog("Background process count > 0! Skipping task.") + return Single.just(Result.failure()) + } + + preferenceManager.backgroundProcessCount++ + handleStart() + backgroundWorkObserver.refreshStatus() + backgroundWorkObserver.dismissResult() + debugLog("Starting FalAiTask!") + + return try { + val file = File(fileProviderDescriptor.workCacheDirPath, Constants.FILE_FAL_AI) + if (!file.exists()) { + preferenceManager.backgroundProcessCount-- + val t = Throwable("File is null.") + handleError(t) + compositeDisposable.clear() + errorLog(t, "Payload file does not exist.") + return Single.just(Result.failure()) + } + + val bytes = file.readBytes() + val payload = bytes.toFalAiPayload() + + if (payload == null) { + preferenceManager.backgroundProcessCount-- + val t = Throwable("Payload is null.") + handleError(t) + compositeDisposable.clear() + errorLog(t, "Payload was failed to read/parse.") + return Single.just(Result.failure()) + } + + falAiGenerationUseCase(payload) + .doOnSubscribe { handleProcess() } + .map { result -> + preferenceManager.backgroundProcessCount-- + handleSuccess(result) + debugLog("Fal AI generation finished successfully!") + Result.success() + } + .onErrorReturn { t -> + preferenceManager.backgroundProcessCount-- + handleError(t) + errorLog(t, "Caught exception from FalAiGenerationUseCase!") + Result.failure() + } + .doFinally { compositeDisposable.clear() } + } catch (e: Exception) { + preferenceManager.backgroundProcessCount-- + handleError(e) + compositeDisposable.clear() + errorLog(e, "Caught exception from FalAiTask worker!") + Single.just(Result.failure()) + } + } +} diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/api/falai/FalAiApi.kt b/network/src/main/java/com/shifthackz/aisdv1/network/api/falai/FalAiApi.kt new file mode 100644 index 000000000..5715c2510 --- /dev/null +++ b/network/src/main/java/com/shifthackz/aisdv1/network/api/falai/FalAiApi.kt @@ -0,0 +1,55 @@ +package com.shifthackz.aisdv1.network.api.falai + +import com.shifthackz.aisdv1.network.request.FalAiTextToImageRequest +import com.shifthackz.aisdv1.network.response.FalAiQueueResponse +import com.shifthackz.aisdv1.network.response.FalAiQueueStatusResponse +import com.shifthackz.aisdv1.network.response.FalAiGenerationResponse +import io.reactivex.rxjava3.core.Single +import retrofit2.http.Body +import retrofit2.http.GET +import retrofit2.http.POST +import retrofit2.http.Url + +interface FalAiApi { + + /** + * Validate the API key by listing models. + * This is a free endpoint that returns 200 OK for valid keys. + */ + @GET("https://api.fal.ai/v1/models") + fun listModels(@retrofit2.http.Query("limit") limit: Int = 1): Single + + /** + * Submit a text-to-image request to the fal.ai queue. + * Uses full URL to avoid path encoding issues with slashes. + */ + @POST + fun submitToQueue( + @Url url: String, + @Body request: FalAiTextToImageRequest, + ): Single + + /** + * Submit a dynamic request to the fal.ai queue. + * Supports any endpoint with dynamic parameters based on OpenAPI schema. + */ + @POST + fun submitDynamicToQueue( + @Url url: String, + @Body request: Map, + ): Single + + /** + * Check the status of a queued request. + * Uses the status_url returned from submitToQueue. + */ + @GET + fun checkStatus(@Url statusUrl: String): Single + + /** + * Fetch the result of a completed request. + * Uses the response_url returned from submitToQueue. + */ + @GET + fun fetchResult(@Url resultUrl: String): Single +} diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/di/NetworkModule.kt b/network/src/main/java/com/shifthackz/aisdv1/network/di/NetworkModule.kt index eb6a3528f..39397d658 100755 --- a/network/src/main/java/com/shifthackz/aisdv1/network/di/NetworkModule.kt +++ b/network/src/main/java/com/shifthackz/aisdv1/network/di/NetworkModule.kt @@ -4,6 +4,7 @@ import com.google.gson.Gson import com.google.gson.GsonBuilder import com.google.gson.Strictness import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi +import com.shifthackz.aisdv1.network.api.falai.FalAiApi import com.shifthackz.aisdv1.network.api.horde.HordeRestApi import com.shifthackz.aisdv1.network.api.huggingface.HuggingFaceApi import com.shifthackz.aisdv1.network.api.huggingface.HuggingFaceInferenceApi @@ -180,6 +181,12 @@ val networkModule = module { .create(StabilityAiApi::class.java) } + single { + get() + .withBaseUrl(get().falAiApiUrl) + .create(FalAiApi::class.java) + } + singleOf(::ImageCdnRestApiImpl) bind ImageCdnRestApi::class singleOf(::DownloadableModelsApiImpl) bind DownloadableModelsApi::class singleOf(::HuggingFaceInferenceApiImpl) bind HuggingFaceInferenceApi::class diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/ApiUrlProvider.kt b/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/ApiUrlProvider.kt index 90fd00beb..48819750e 100755 --- a/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/ApiUrlProvider.kt +++ b/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/ApiUrlProvider.kt @@ -10,4 +10,5 @@ interface ApiUrlProvider { val huggingFaceInferenceApiUrl: String val openAiApiUrl: String val stabilityAiApiUrl: String + val falAiApiUrl: String } diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/NetworkPrefixes.kt b/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/NetworkPrefixes.kt index 7a7fde0cb..626f69b7e 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/NetworkPrefixes.kt +++ b/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/NetworkPrefixes.kt @@ -2,4 +2,5 @@ package com.shifthackz.aisdv1.network.qualifiers object NetworkPrefixes { const val BEARER = "Bearer" + const val KEY = "Key" } diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/request/FalAiTextToImageRequest.kt b/network/src/main/java/com/shifthackz/aisdv1/network/request/FalAiTextToImageRequest.kt new file mode 100644 index 000000000..5f8e3bd0a --- /dev/null +++ b/network/src/main/java/com/shifthackz/aisdv1/network/request/FalAiTextToImageRequest.kt @@ -0,0 +1,43 @@ +package com.shifthackz.aisdv1.network.request + +import com.google.gson.annotations.SerializedName + +data class FalAiTextToImageRequest( + @SerializedName("prompt") + val prompt: String, + + @SerializedName("negative_prompt") + val negativePrompt: String? = null, + + @SerializedName("image_size") + val imageSize: FalAiImageSize? = null, + + @SerializedName("num_inference_steps") + val numInferenceSteps: Int? = null, + + @SerializedName("guidance_scale") + val guidanceScale: Float? = null, + + @SerializedName("seed") + val seed: Long? = null, + + @SerializedName("num_images") + val numImages: Int = 1, + + @SerializedName("output_format") + val outputFormat: String = "jpeg", + + @SerializedName("enable_safety_checker") + val enableSafetyChecker: Boolean = false, + + @SerializedName("sync_mode") + val syncMode: Boolean = false, +) + +data class FalAiImageSize( + @SerializedName("width") + val width: Int, + + @SerializedName("height") + val height: Int, +) diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/response/FalAiResponses.kt b/network/src/main/java/com/shifthackz/aisdv1/network/response/FalAiResponses.kt new file mode 100644 index 000000000..32190947a --- /dev/null +++ b/network/src/main/java/com/shifthackz/aisdv1/network/response/FalAiResponses.kt @@ -0,0 +1,96 @@ +package com.shifthackz.aisdv1.network.response + +import com.google.gson.annotations.SerializedName + +/** + * Response from submitting a request to the fal.ai queue. + */ +data class FalAiQueueResponse( + @SerializedName("request_id") + val requestId: String, + + @SerializedName("status") + val status: String? = null, + + @SerializedName("response_url") + val responseUrl: String? = null, + + @SerializedName("status_url") + val statusUrl: String? = null, + + @SerializedName("cancel_url") + val cancelUrl: String? = null, + + // If sync_mode=true or immediate response, images may be included directly + @SerializedName("images") + val images: List? = null, + + // For video generation endpoints + @SerializedName("video") + val video: FalAiImage? = null, + + // Seed can exceed Long.MAX_VALUE, so we use String + @SerializedName("seed") + val seed: String? = null, + + @SerializedName("prompt") + val prompt: String? = null, +) + +/** + * Response when checking status of a queued request. + */ +data class FalAiQueueStatusResponse( + @SerializedName("status") + val status: String, + + @SerializedName("request_id") + val requestId: String? = null, + + @SerializedName("response_url") + val responseUrl: String? = null, + + @SerializedName("queue_position") + val queuePosition: Int? = null, + + @SerializedName("logs") + val logs: Any? = null, +) + +/** + * Final response with generated images or video. + */ +data class FalAiGenerationResponse( + @SerializedName("images") + val images: List? = null, + + @SerializedName("video") + val video: FalAiImage? = null, + + // Seed can exceed Long.MAX_VALUE, so we use String + @SerializedName("seed") + val seed: String? = null, + + @SerializedName("prompt") + val prompt: String? = null, + + @SerializedName("timings") + val timings: Map? = null, + + @SerializedName("has_nsfw_concepts") + val hasNsfwConcepts: List? = null, +) + +data class FalAiImage( + @SerializedName("url") + val url: String, + + @SerializedName("width") + val width: Int? = null, + + @SerializedName("height") + val height: Int? = null, + + @SerializedName("content_type") + val contentType: String? = null, +) diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/di/ViewModelModule.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/di/ViewModelModule.kt index 054bdb337..80a1e9f56 100755 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/di/ViewModelModule.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/di/ViewModelModule.kt @@ -10,6 +10,7 @@ import com.shifthackz.aisdv1.presentation.model.LaunchSource import com.shifthackz.aisdv1.presentation.screen.debug.DebugMenuViewModel import com.shifthackz.aisdv1.presentation.screen.donate.DonateViewModel import com.shifthackz.aisdv1.presentation.screen.drawer.DrawerViewModel +import com.shifthackz.aisdv1.presentation.screen.falai.FalAiGenerationViewModel import com.shifthackz.aisdv1.presentation.screen.gallery.detail.GalleryDetailViewModel import com.shifthackz.aisdv1.presentation.screen.gallery.list.GalleryViewModel import com.shifthackz.aisdv1.presentation.screen.home.HomeNavigationViewModel @@ -55,6 +56,7 @@ val viewModelModule = module { viewModelOf(::BackgroundWorkViewModel) viewModelOf(::LoggerViewModel) viewModelOf(::DownloadDialogViewModel) + viewModelOf(::FalAiGenerationViewModel) viewModel { parameters -> OnBoardingViewModel( @@ -77,6 +79,7 @@ val viewModelModule = module { getLocalOnnxModelsUseCase = get(), getLocalMediaPipeModelsUseCase = get(), fetchAndGetHuggingFaceModelsUseCase = get(), + falAiEndpointRepository = get(), urlValidator = get(), stringValidator = get(), filePathValidator = get(), @@ -96,8 +99,10 @@ val viewModelModule = module { itemId = parameters.get(), dispatchersProvider = get(), buildInfoProvider = get(), + preferenceManager = get(), getGenerationResultUseCase = get(), getLastResultFromCacheUseCase = get(), + getGalleryPagedIdsUseCase = get(), deleteGalleryItemUseCase = get(), toggleImageVisibilityUseCase = get(), galleryDetailBitmapExporter = get(), @@ -105,6 +110,7 @@ val viewModelModule = module { schedulersProvider = get(), generationFormUpdateEvent = get(), mainRouter = get(), + mediaStoreGateway = get(), ) } @@ -126,6 +132,7 @@ val viewModelModule = module { dispatchersProvider = get(), generationFormUpdateEvent = get(), getStableDiffusionSamplersUseCase = get(), + getForgeModulesUseCase = get(), observeHordeProcessStatusUseCase = get(), observeLocalDiffusionProcessStatusUseCase = get(), saveLastResultToCacheUseCase = get(), diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/ModalRenderer.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/ModalRenderer.kt index a25ea9bbd..75f7d1fc6 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/ModalRenderer.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/ModalRenderer.kt @@ -33,6 +33,7 @@ import com.shifthackz.aisdv1.presentation.modal.ldscheduler.LDSchedulerBottomShe import com.shifthackz.aisdv1.presentation.modal.tag.EditTagDialog import com.shifthackz.aisdv1.presentation.model.Modal import com.shifthackz.aisdv1.presentation.screen.debug.DebugMenuIntent +import com.shifthackz.aisdv1.presentation.screen.falai.FalAiGenerationIntent import com.shifthackz.aisdv1.presentation.screen.gallery.detail.GalleryDetailIntent import com.shifthackz.aisdv1.presentation.screen.gallery.list.GalleryIntent import com.shifthackz.aisdv1.presentation.screen.inpaint.InPaintIntent @@ -64,6 +65,7 @@ fun ModalRenderer( processIntent(InPaintIntent.ScreenModal.Dismiss) processIntent(DebugMenuIntent.DismissModal) processIntent(ReportIntent.DismissError) + processIntent(FalAiGenerationIntent.DismissModal) } val context = LocalContext.current when (screenModal) { @@ -256,6 +258,16 @@ fun ModalRenderer( onDismissRequest = dismiss, ) + is Modal.ConfirmSaveToGallery -> DecisionInteractiveDialog( + title = LocalizationR.string.interaction_save_to_gallery_title.asUiText(), + text = LocalizationR.string.interaction_save_to_gallery_sub_title.asUiText(), + confirmActionResId = LocalizationR.string.action_save, + onConfirmAction = { + processIntent(GalleryIntent.SaveToGallery.All.Confirm) + }, + onDismissRequest = dismiss, + ) + Modal.ExportInProgress -> ProgressDialog( titleResId = LocalizationR.string.exporting_progress_title, subTitleResId = LocalizationR.string.exporting_progress_sub_title, diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/FalAiState.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/FalAiState.kt new file mode 100644 index 000000000..bb0c4f5cf --- /dev/null +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/FalAiState.kt @@ -0,0 +1,92 @@ +package com.shifthackz.aisdv1.presentation.model + +import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint +import com.shifthackz.aisdv1.domain.entity.FalAiInputProperty +import com.shifthackz.aisdv1.domain.entity.FalAiPropertyType + +/** + * UI representation of a FalAi endpoint for display. + */ +data class FalAiEndpointUi( + val id: String, + val endpointId: String, + val title: String, + val description: String, + val category: String, + val group: String, // For hierarchical display + val thumbnailUrl: String, + val isCustom: Boolean, + val properties: List, +) + +/** + * UI representation of an input property with current value. + */ +data class FalAiPropertyUi( + val name: String, + val title: String, + val description: String, + val type: FalAiPropertyType, + val required: Boolean, + val defaultValue: Any?, + val currentValue: Any?, + val minimum: Double?, + val maximum: Double?, + val enumValues: List, + val isAdvanced: Boolean, + val arrayItemProperties: List?, + val linkedMaskProperty: String? = null, // For inpainting: links image_url to its mask_url +) { + companion object { + fun fromDomain(property: FalAiInputProperty, isRequired: Boolean): FalAiPropertyUi { + // For INPAINT type, it's a main property (not advanced) + val isAdvanced = property.type != FalAiPropertyType.INPAINT + && property.name !in listOf("prompt", "image_url", "mask_url") + && !property.name.contains("image") + && !property.name.contains("mask") + + return FalAiPropertyUi( + name = property.name, + title = property.title.ifBlank { property.name.replace("_", " ").replaceFirstChar { it.uppercase() } }, + description = property.description, + type = property.type, + required = isRequired, + defaultValue = property.default, + currentValue = property.default, + minimum = property.minimum?.toDouble(), + maximum = property.maximum?.toDouble(), + enumValues = property.enumValues ?: emptyList(), + isAdvanced = isAdvanced, + arrayItemProperties = property.arrayItemProperties?.map { itemProp -> + fromDomain(itemProp, itemProp.isRequired) + }, + linkedMaskProperty = property.linkedMaskProperty, + ) + } + } +} + +/** + * State for FalAi generation form. + */ +data class FalAiFormState( + val endpoints: List = emptyList(), + val selectedEndpoint: FalAiEndpointUi? = null, + val propertyValues: Map = emptyMap(), + val advancedOptionsVisible: Boolean = false, + val isLoading: Boolean = false, +) + +fun FalAiEndpoint.toUi(): FalAiEndpointUi = FalAiEndpointUi( + id = id, + endpointId = endpointId, + title = title, + description = description, + category = category.displayName, + group = group, + thumbnailUrl = thumbnailUrl, + isCustom = isCustom, + properties = schema.inputProperties.map { prop -> + FalAiPropertyUi.fromDomain(prop, schema.requiredProperties.contains(prop.name)) + }, +) diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/Modal.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/Modal.kt index 98983733b..9d11bff19 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/Modal.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/Modal.kt @@ -26,6 +26,8 @@ sealed interface Modal { data class ConfirmExport(val exportAll: Boolean) : Modal + data class ConfirmSaveToGallery(val saveAll: Boolean) : Modal + data object ExportInProgress : Modal data object ConnectLocalHost : Modal diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/NavigationRoute.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/NavigationRoute.kt index d898633bf..be1188c5b 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/NavigationRoute.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/NavigationRoute.kt @@ -47,6 +47,9 @@ sealed interface NavigationRoute { @Serializable data object ImgToImg : HomeNavigation + @Serializable + data object FalAi : HomeNavigation + @Serializable data object Gallery : HomeNavigation diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/DrawerNavGraph.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/DrawerNavGraph.kt index a5b0463da..e2d70bd24 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/DrawerNavGraph.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/DrawerNavGraph.kt @@ -16,8 +16,12 @@ import com.shifthackz.aisdv1.presentation.widget.source.getNameUiText import com.shifthackz.aisdv1.core.localization.R as LocalizationR fun mainDrawerNavItems(settings: Settings? = null): List = buildList { - add(txt2ImgTab().copy(name = LocalizationR.string.title_text_to_image.asUiText())) - add(img2imgTab().copy(name = LocalizationR.string.title_image_to_image.asUiText())) + if (settings?.source == ServerSource.FAL_AI) { + add(falAiTab()) + } else { + add(txt2ImgTab().copy(name = LocalizationR.string.title_text_to_image.asUiText())) + add(img2imgTab().copy(name = LocalizationR.string.title_image_to_image.asUiText())) + } add(galleryTab()) settings?.source?.takeIf { it.featureTags.contains(FeatureTag.OwnServer) }?.let { add(webUi(it)) diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/HomeNavGraph.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/HomeNavGraph.kt index dfccf1b30..16633e573 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/HomeNavGraph.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/HomeNavGraph.kt @@ -4,34 +4,65 @@ import androidx.compose.foundation.layout.size import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.Settings import androidx.compose.runtime.Composable +import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable import com.shifthackz.aisdv1.core.model.asUiText +import com.shifthackz.aisdv1.domain.entity.ServerSource +import com.shifthackz.aisdv1.domain.preference.PreferenceManager import com.shifthackz.aisdv1.presentation.model.NavItem import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute import com.shifthackz.aisdv1.presentation.navigation.router.home.HomeRouter +import com.shifthackz.aisdv1.presentation.screen.falai.FalAiGenerationScreen import com.shifthackz.aisdv1.presentation.screen.gallery.list.GalleryScreen import com.shifthackz.aisdv1.presentation.screen.home.HomeNavigationScreen import com.shifthackz.aisdv1.presentation.screen.img2img.ImageToImageScreen import com.shifthackz.aisdv1.presentation.screen.settings.SettingsScreen import com.shifthackz.aisdv1.presentation.screen.txt2img.TextToImageScreen +import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers +import io.reactivex.rxjava3.disposables.Disposable import org.koin.compose.koinInject import com.shifthackz.aisdv1.core.localization.R as LocalizationR import com.shifthackz.aisdv1.presentation.R as PresentationR fun NavGraphBuilder.homeScreenNavGraph() { composable { - HomeNavigationScreen( - navItems = listOf( + val preferenceManager: PreferenceManager = koinInject() + var serverSource by remember { mutableStateOf(preferenceManager.source) } + + DisposableEffect(preferenceManager) { + val disposable: Disposable = preferenceManager + .observe() + .map { it.source } + .distinctUntilChanged() + .observeOn(AndroidSchedulers.mainThread()) + .subscribe { source -> serverSource = source } + + onDispose { disposable.dispose() } + } + + val navItems = when (serverSource) { + ServerSource.FAL_AI -> listOf( + falAiTab(), + galleryTab(), + settingsTab(), + ) + else -> listOf( txt2ImgTab(), img2imgTab(), galleryTab(), settingsTab(), - ), - ) + ) + } + + HomeNavigationScreen(navItems = navItems) } } @@ -77,6 +108,20 @@ fun galleryTab() = NavItem( }, ) +fun falAiTab() = NavItem( + name = "Fal AI".asUiText(), + navRoute = NavigationRoute.HomeNavigation.FalAi, + icon = NavItem.Icon.Resource( + resId = PresentationR.drawable.ic_text, + modifier = Modifier.size(24.dp), + ), + content = { + HomeTabBase(NavigationRoute.HomeNavigation.FalAi) { + FalAiGenerationScreen() + } + }, +) + fun settingsTab() = NavItem( name = LocalizationR.string.home_tab_settings.asUiText(), navRoute = NavigationRoute.HomeNavigation.Settings, diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationEffect.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationEffect.kt new file mode 100644 index 000000000..cf6fe7aaa --- /dev/null +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationEffect.kt @@ -0,0 +1,5 @@ +package com.shifthackz.aisdv1.presentation.screen.falai + +import com.shifthackz.android.core.mvi.MviEffect + +sealed interface FalAiGenerationEffect : MviEffect diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationIntent.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationIntent.kt new file mode 100644 index 000000000..e6e2a2705 --- /dev/null +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationIntent.kt @@ -0,0 +1,26 @@ +package com.shifthackz.aisdv1.presentation.screen.falai + +import com.shifthackz.aisdv1.presentation.model.Modal +import com.shifthackz.aisdv1.presentation.screen.drawer.DrawerIntent +import com.shifthackz.android.core.mvi.MviIntent + +sealed interface FalAiGenerationIntent : MviIntent { + + data class SelectEndpoint(val endpointId: String) : FalAiGenerationIntent + + data class UpdateProperty(val name: String, val value: Any?) : FalAiGenerationIntent + + data class ToggleAdvancedOptions(val visible: Boolean) : FalAiGenerationIntent + + data object Generate : FalAiGenerationIntent + + data class SetModal(val modal: Modal) : FalAiGenerationIntent + + data object DismissModal : FalAiGenerationIntent + + data class Drawer(val intent: DrawerIntent) : FalAiGenerationIntent + + data class ImportOpenApiJson(val json: String) : FalAiGenerationIntent + + data class DeleteEndpoint(val endpointId: String) : FalAiGenerationIntent +} diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationScreen.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationScreen.kt new file mode 100644 index 000000000..2ac68d175 --- /dev/null +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationScreen.kt @@ -0,0 +1,192 @@ +@file:OptIn(ExperimentalMaterial3Api::class) + +package com.shifthackz.aisdv1.presentation.screen.falai + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Menu +import androidx.compose.material3.Button +import androidx.compose.material3.CenterAlignedTopAppBar +import androidx.compose.material3.CircularProgressIndicator +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.LocalContentColor +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Scaffold +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalSoftwareKeyboardController +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp +import com.shifthackz.android.core.mvi.MviComponent +import com.shifthackz.aisdv1.presentation.modal.ModalRenderer +import com.shifthackz.aisdv1.presentation.model.Modal +import com.shifthackz.aisdv1.presentation.screen.drawer.DrawerIntent +import com.shifthackz.aisdv1.presentation.widget.falai.FalAiDynamicForm +import com.shifthackz.aisdv1.presentation.widget.work.BackgroundWorkWidget +import org.koin.androidx.compose.koinViewModel +import com.shifthackz.aisdv1.core.localization.R as LocalizationR + +@Composable +fun FalAiGenerationScreen() { + MviComponent( + viewModel = koinViewModel(), + ) { state, intentHandler -> + FalAiGenerationScreenContent( + modifier = Modifier.fillMaxSize(), + state = state, + processIntent = intentHandler, + ) + } +} + +@Composable +fun FalAiGenerationScreenContent( + modifier: Modifier = Modifier, + state: FalAiGenerationState, + processIntent: (FalAiGenerationIntent) -> Unit = {}, +) { + val keyboardController = LocalSoftwareKeyboardController.current + val scrollState = rememberScrollState() + + Box(modifier) { + Scaffold( + topBar = { + Column { + CenterAlignedTopAppBar( + navigationIcon = { + IconButton(onClick = { + processIntent(FalAiGenerationIntent.Drawer(DrawerIntent.Open)) + }) { + Icon( + imageVector = Icons.Default.Menu, + contentDescription = "Menu", + ) + } + }, + title = { + Text( + text = "Fal AI", + style = MaterialTheme.typography.headlineMedium, + ) + }, + windowInsets = WindowInsets(0, 0, 0, 0), + ) + BackgroundWorkWidget( + modifier = Modifier + .background(MaterialTheme.colorScheme.background) + .padding(vertical = 4.dp), + ) + } + }, + content = { paddingValues -> + when { + state.loading -> { + Box( + modifier = Modifier + .fillMaxSize() + .padding(paddingValues), + contentAlignment = Alignment.Center, + ) { + CircularProgressIndicator() + } + } + + state.endpoints.isEmpty() -> { + Box( + modifier = Modifier + .fillMaxSize() + .padding(paddingValues), + contentAlignment = Alignment.Center, + ) { + Text( + text = "No endpoints available", + style = MaterialTheme.typography.bodyLarge, + ) + } + } + + else -> { + Column( + modifier = Modifier + .padding(paddingValues) + .verticalScroll(scrollState) + .padding(horizontal = 16.dp), + ) { + Spacer(modifier = Modifier.height(8.dp)) + + FalAiDynamicForm( + state = state, + onEndpointSelected = { id -> + processIntent(FalAiGenerationIntent.SelectEndpoint(id)) + }, + onPropertyChanged = { name, value -> + processIntent(FalAiGenerationIntent.UpdateProperty(name, value)) + }, + onToggleAdvanced = { visible -> + processIntent(FalAiGenerationIntent.ToggleAdvancedOptions(visible)) + }, + onImportOpenApi = { json -> + processIntent(FalAiGenerationIntent.ImportOpenApiJson(json)) + }, + onDeleteEndpoint = { id -> + processIntent(FalAiGenerationIntent.DeleteEndpoint(id)) + }, + ) + + Spacer(modifier = Modifier.height(16.dp)) + + // Generate button + Button( + modifier = Modifier + .fillMaxWidth() + .height(56.dp), + enabled = state.canGenerate, + onClick = { + keyboardController?.hide() + processIntent(FalAiGenerationIntent.Generate) + }, + ) { + Text( + text = stringResource(id = LocalizationR.string.action_generate), + color = LocalContentColor.current, + ) + } + + Spacer(modifier = Modifier.height(16.dp)) + } + } + } + }, + ) + + // Modal rendering + ModalRenderer( + screenModal = state.screenModal, + processIntent = { intent -> + when (intent) { + is FalAiGenerationIntent -> processIntent(intent) + else -> { + // Handle dismiss - check if it's a dismiss intent + if (state.screenModal != Modal.None) { + processIntent(FalAiGenerationIntent.DismissModal) + } + } + } + }, + ) + } +} diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationState.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationState.kt new file mode 100644 index 000000000..08dc73618 --- /dev/null +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationState.kt @@ -0,0 +1,28 @@ +package com.shifthackz.aisdv1.presentation.screen.falai + +import androidx.compose.runtime.Immutable +import com.shifthackz.aisdv1.presentation.model.FalAiEndpointUi +import com.shifthackz.aisdv1.presentation.model.FalAiPropertyUi +import com.shifthackz.aisdv1.presentation.model.Modal +import com.shifthackz.android.core.mvi.MviState + +@Immutable +data class FalAiGenerationState( + val loading: Boolean = true, + val screenModal: Modal = Modal.None, + val endpoints: List = emptyList(), + val selectedEndpoint: FalAiEndpointUi? = null, + val propertyValues: Map = emptyMap(), + val advancedOptionsVisible: Boolean = false, + val generating: Boolean = false, + val generationError: String? = null, + val mainProperties: List = emptyList(), + val advancedProperties: List = emptyList(), +) : MviState { + + val hasAdvancedProperties: Boolean + get() = advancedProperties.isNotEmpty() + + val canGenerate: Boolean + get() = selectedEndpoint != null && !generating && propertyValues["prompt"]?.toString()?.isNotBlank() == true +} diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationViewModel.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationViewModel.kt new file mode 100644 index 000000000..c12062053 --- /dev/null +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationViewModel.kt @@ -0,0 +1,439 @@ +package com.shifthackz.aisdv1.presentation.screen.falai + +import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider +import com.shifthackz.aisdv1.core.common.appbuild.BuildType +import com.shifthackz.aisdv1.core.common.log.errorLog +import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider +import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider +import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread +import com.shifthackz.aisdv1.core.model.asUiText +import com.shifthackz.aisdv1.core.notification.PushNotificationManager +import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel +import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint +import com.shifthackz.aisdv1.domain.entity.FalAiPayload +import com.shifthackz.aisdv1.domain.entity.FalAiPropertyType +import com.shifthackz.aisdv1.domain.feature.work.BackgroundTaskManager +import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver +import com.shifthackz.aisdv1.domain.interactor.wakelock.WakeLockInterActor +import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import com.shifthackz.aisdv1.domain.repository.FalAiEndpointRepository +import com.shifthackz.aisdv1.domain.repository.FalAiGenerationRepository +import com.shifthackz.aisdv1.domain.usecase.generation.SaveGenerationResultUseCase +import com.shifthackz.aisdv1.presentation.core.GenerationFormUpdateEvent +import com.shifthackz.aisdv1.presentation.model.Modal +import com.shifthackz.aisdv1.presentation.model.toUi +import com.shifthackz.aisdv1.presentation.navigation.router.drawer.DrawerRouter +import com.shifthackz.aisdv1.presentation.screen.drawer.DrawerIntent +import io.reactivex.rxjava3.kotlin.subscribeBy +import com.shifthackz.aisdv1.core.localization.R as LocalizationR + +class FalAiGenerationViewModel( + dispatchersProvider: DispatchersProvider, + private val falAiEndpointRepository: FalAiEndpointRepository, + private val falAiGenerationRepository: FalAiGenerationRepository, + private val saveGenerationResultUseCase: SaveGenerationResultUseCase, + private val schedulersProvider: SchedulersProvider, + private val preferenceManager: PreferenceManager, + private val wakeLockInterActor: WakeLockInterActor, + private val notificationManager: PushNotificationManager, + private val drawerRouter: DrawerRouter, + private val buildInfoProvider: BuildInfoProvider, + private val backgroundTaskManager: BackgroundTaskManager, + private val backgroundWorkObserver: BackgroundWorkObserver, + private val generationFormUpdateEvent: GenerationFormUpdateEvent, +) : MviRxViewModel() { + + override val initialState = FalAiGenerationState() + + override val effectDispatcher = dispatchersProvider.immediate + + private var selectedEndpointDomain: FalAiEndpoint? = null + + init { + loadEndpoints() + observeFormUpdates() + } + + private fun observeFormUpdates() { + !generationFormUpdateEvent.observeFalAiForm() + .subscribeOnMainThread(schedulersProvider) + .subscribeBy( + onError = ::errorLog, + onNext = { payload -> + when (payload) { + is GenerationFormUpdateEvent.Payload.FalAiForm -> { + applyFormFromGallery(payload.ai) + } + else -> Unit + } + }, + ) + } + + private fun applyFormFromGallery(ai: AiGenerationResult) { + // Extract endpoint ID from sampler field (format: "fal.ai/endpoint-id") + val endpointId = ai.sampler.removePrefix("fal.ai/") + + // First select the endpoint, then apply saved values on top + !falAiEndpointRepository.getAll() + .subscribeOnMainThread(schedulersProvider) + .subscribeBy( + onError = ::errorLog, + onSuccess = { endpoints -> + val endpoint = endpoints.find { it.id == endpointId || it.endpointId == endpointId } + + // Use found endpoint or fall back to currently selected endpoint + val targetEndpoint = endpoint ?: selectedEndpointDomain + + if (targetEndpoint != null) { + if (endpoint != null) { + selectedEndpointDomain = endpoint + preferenceManager.falAiSelectedEndpointId = endpoint.id + } + + val endpointUi = targetEndpoint.toUi() + val defaultValues = targetEndpoint.schema.inputProperties + .associate { prop -> prop.name to prop.default } + .toMutableMap() + + // Apply saved values from gallery + defaultValues["prompt"] = ai.prompt + if (ai.negativePrompt.isNotBlank()) { + defaultValues["negative_prompt"] = ai.negativePrompt + } + if (ai.seed.isNotBlank()) { + defaultValues["seed"] = ai.seed.toLongOrNull() + } + + // Apply image_size if endpoint supports custom dimensions + val imageSizeProperty = targetEndpoint.schema.inputProperties.find { it.name == "image_size" } + if (imageSizeProperty != null && imageSizeProperty.type == FalAiPropertyType.IMAGE_SIZE) { + defaultValues["image_size"] = mapOf("width" to ai.width, "height" to ai.height) + } + + val allProperties = endpointUi.properties.map { prop -> + val savedValue = defaultValues[prop.name] + prop.copy(currentValue = savedValue ?: prop.defaultValue) + } + + val mainProps = allProperties.filter { !it.isAdvanced } + val advancedProps = allProperties.filter { it.isAdvanced } + + updateState { state -> + state.copy( + selectedEndpoint = endpointUi, + propertyValues = defaultValues, + mainProperties = mainProps, + advancedProperties = advancedProps, + ) + } + } else { + // No endpoint available, just update prompt in current state + updateState { state -> + val updatedValues = state.propertyValues.toMutableMap() + updatedValues["prompt"] = ai.prompt + if (ai.negativePrompt.isNotBlank()) { + updatedValues["negative_prompt"] = ai.negativePrompt + } + state.copy(propertyValues = updatedValues) + } + } + + // Clear the form update event + generationFormUpdateEvent.clear() + }, + ) + } + + override fun processIntent(intent: FalAiGenerationIntent) { + when (intent) { + is FalAiGenerationIntent.SelectEndpoint -> selectEndpoint(intent.endpointId) + is FalAiGenerationIntent.UpdateProperty -> updateProperty(intent.name, intent.value) + is FalAiGenerationIntent.ToggleAdvancedOptions -> toggleAdvancedOptions(intent.visible) + is FalAiGenerationIntent.Generate -> generate() + is FalAiGenerationIntent.SetModal -> setModal(intent.modal) + is FalAiGenerationIntent.DismissModal -> dismissModal() + is FalAiGenerationIntent.Drawer -> when (intent.intent) { + DrawerIntent.Open -> drawerRouter.openDrawer() + DrawerIntent.Close -> drawerRouter.closeDrawer() + } + is FalAiGenerationIntent.ImportOpenApiJson -> importOpenApiJson(intent.json) + is FalAiGenerationIntent.DeleteEndpoint -> deleteEndpoint(intent.endpointId) + } + } + + private fun loadEndpoints() { + !falAiEndpointRepository.getAll() + .subscribeOnMainThread(schedulersProvider) + .subscribeBy( + onError = { t -> + errorLog(t) + updateState { it.copy(loading = false) } + }, + onSuccess = { endpoints -> + val uiEndpoints = endpoints.map { it.toUi() } + val selectedId = preferenceManager.falAiSelectedEndpointId + val selected = endpoints.find { it.id == selectedId } + ?: endpoints.find { it.endpointId == selectedId } + ?: endpoints.firstOrNull() + + selectedEndpointDomain = selected + + val selectedUi = selected?.toUi() + + // Start with default values + val defaultValues = selected?.schema?.inputProperties + ?.associate { prop -> prop.name to prop.default } + ?.toMutableMap() + ?: mutableMapOf() + + // Overlay saved params on top of defaults + if (selected != null) { + val savedParams = preferenceManager.getFalAiEndpointParams(selected.endpointId) + savedParams.forEach { (key, value) -> + if (value != null) { + defaultValues[key] = value + } + } + } + + val allProperties = selectedUi?.properties?.map { prop -> + prop.copy(currentValue = defaultValues[prop.name] ?: prop.defaultValue) + } ?: emptyList() + + val mainProps = allProperties.filter { !it.isAdvanced } + val advancedProps = allProperties.filter { it.isAdvanced } + + updateState { state -> + state.copy( + loading = false, + endpoints = uiEndpoints, + selectedEndpoint = selectedUi, + propertyValues = defaultValues, + mainProperties = mainProps, + advancedProperties = advancedProps, + ) + } + }, + ) + } + + private fun selectEndpoint(endpointId: String) { + !falAiEndpointRepository.getAll() + .subscribeOnMainThread(schedulersProvider) + .subscribeBy( + onError = ::errorLog, + onSuccess = { endpoints -> + val endpoint = endpoints.find { it.id == endpointId || it.endpointId == endpointId } + if (endpoint != null) { + selectedEndpointDomain = endpoint + preferenceManager.falAiSelectedEndpointId = endpoint.id + + val endpointUi = endpoint.toUi() + + // Start with default values + val defaultValues = endpoint.schema.inputProperties + .associate { prop -> prop.name to prop.default } + .toMutableMap() + + // Overlay saved params on top of defaults + val savedParams = preferenceManager.getFalAiEndpointParams(endpoint.endpointId) + savedParams.forEach { (key, value) -> + if (value != null) { + defaultValues[key] = value + } + } + + val allProperties = endpointUi.properties.map { prop -> + prop.copy(currentValue = defaultValues[prop.name] ?: prop.defaultValue) + } + + val mainProps = allProperties.filter { !it.isAdvanced } + val advancedProps = allProperties.filter { it.isAdvanced } + + updateState { state -> + state.copy( + selectedEndpoint = endpointUi, + propertyValues = defaultValues, + mainProperties = mainProps, + advancedProperties = advancedProps, + ) + } + } + }, + ) + } + + private fun updateProperty(name: String, value: Any?) { + updateState { state -> + val newPropertyValues = state.propertyValues.toMutableMap().apply { + put(name, value) + } + + val updatedMainProperties = state.mainProperties.map { prop -> + if (prop.name == name) prop.copy(currentValue = value) else prop + } + + val updatedAdvancedProperties = state.advancedProperties.map { prop -> + if (prop.name == name) prop.copy(currentValue = value) else prop + } + + state.copy( + propertyValues = newPropertyValues, + mainProperties = updatedMainProperties, + advancedProperties = updatedAdvancedProperties, + ) + } + } + + private fun toggleAdvancedOptions(visible: Boolean) { + updateState { it.copy(advancedOptionsVisible = visible) } + } + + private fun setModal(modal: Modal) { + updateState { it.copy(screenModal = modal) } + } + + private fun dismissModal() { + updateState { it.copy(screenModal = Modal.None) } + } + + private fun importOpenApiJson(json: String) { + !falAiEndpointRepository.importFromJson(json) + .subscribeOnMainThread(schedulersProvider) + .subscribeBy( + onError = { t -> + errorLog(t) + updateState { state -> + state.copy( + screenModal = Modal.Error( + (t.localizedMessage ?: "Failed to import endpoint").asUiText() + ) + ) + } + }, + onSuccess = { endpoint -> + // Reload endpoints and select the new one + loadEndpoints() + selectEndpoint(endpoint.id) + }, + ) + } + + private fun deleteEndpoint(endpointId: String) { + !falAiEndpointRepository.delete(endpointId) + .subscribeOnMainThread(schedulersProvider) + .subscribeBy( + onError = { t -> + errorLog(t) + updateState { state -> + state.copy( + screenModal = Modal.Error( + (t.localizedMessage ?: "Failed to delete endpoint").asUiText() + ) + ) + } + }, + onComplete = { + loadEndpoints() + }, + ) + } + + private fun generate() { + val endpoint = selectedEndpointDomain ?: return + val parameters = currentState.propertyValues + + // Save parameters for this endpoint + preferenceManager.saveFalAiEndpointParams(endpoint.endpointId, parameters) + + if (backgroundWorkObserver.hasActiveTasks()) { + updateState { it.copy(screenModal = Modal.Background.Running) } + return + } + + if (preferenceManager.backgroundGeneration) { + generateBackground(endpoint.endpointId, parameters) + return + } + + generateOnUi(endpoint, parameters) + } + + private fun generateBackground(endpointId: String, parameters: Map) { + val payload = FalAiPayload( + endpointId = endpointId, + parameters = parameters, + ) + backgroundTaskManager.scheduleFalAiTask(payload) + backgroundWorkObserver.refreshStatus() + updateState { it.copy(screenModal = Modal.Background.Scheduled) } + } + + private fun generateOnUi(endpoint: FalAiEndpoint, parameters: Map) { + !falAiGenerationRepository.generateDynamic(endpoint, parameters) + .doOnSubscribe { + wakeLockInterActor.acquireWakelockUseCase() + updateState { it.copy(generating = true, screenModal = Modal.Communicating()) } + } + .doFinally { + wakeLockInterActor.releaseWakeLockUseCase() + } + .flatMapCompletable { results -> + if (preferenceManager.autoSaveAiResults) { + val saveCompletables = results.map { saveGenerationResultUseCase(it) } + io.reactivex.rxjava3.core.Completable.merge(saveCompletables) + .doOnComplete { + updateState { state -> + state.copy( + generating = false, + screenModal = Modal.Image.create( + list = results, + autoSaveEnabled = true, + reportEnabled = buildInfoProvider.type != BuildType.FOSS, + ), + ) + } + } + } else { + io.reactivex.rxjava3.core.Completable.fromAction { + updateState { state -> + state.copy( + generating = false, + screenModal = Modal.Image.create( + list = results, + autoSaveEnabled = false, + reportEnabled = buildInfoProvider.type != BuildType.FOSS, + ), + ) + } + } + } + } + .subscribeOnMainThread(schedulersProvider) + .subscribeBy( + onError = { t -> + errorLog(t) + notificationManager.createAndShowInstant( + LocalizationR.string.notification_fail_title.asUiText(), + LocalizationR.string.notification_fail_sub_title.asUiText(), + ) + updateState { state -> + state.copy( + generating = false, + screenModal = Modal.Error( + (t.localizedMessage ?: "Generation failed").asUiText() + ), + ) + } + }, + onComplete = { + notificationManager.createAndShowInstant( + LocalizationR.string.notification_finish_title.asUiText(), + LocalizationR.string.notification_finish_sub_title.asUiText(), + ) + }, + ) + } +} diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationScreen.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationScreen.kt index 083880b79..b43e304f5 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationScreen.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationScreen.kt @@ -119,6 +119,10 @@ fun HomeNavigationScreen( item.content?.invoke() } + HomeNavigation.FalAi -> composable { + item.content?.invoke() + } + HomeNavigation.Settings -> composable { item.content?.invoke() } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationViewModel.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationViewModel.kt index 429c0fd62..09ad7c5b0 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationViewModel.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationViewModel.kt @@ -10,6 +10,7 @@ import com.shifthackz.aisdv1.domain.entity.AiGenerationResult import com.shifthackz.aisdv1.domain.preference.PreferenceManager import com.shifthackz.aisdv1.presentation.core.GenerationFormUpdateEvent import com.shifthackz.aisdv1.presentation.navigation.NavigationEffect +import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute import com.shifthackz.aisdv1.presentation.navigation.router.home.HomeRouter import com.shifthackz.android.core.mvi.EmptyState import io.reactivex.rxjava3.core.Observable @@ -43,6 +44,13 @@ class HomeNavigationViewModel( .subscribeOnMainThread(schedulersProvider) .subscribeBy(::errorLog, EmptyLambda, ::processIntent) + !generationFormUpdateEvent + .observeFalAiRoute() + .map { NavigationRoute.HomeNavigation.FalAi } + .map(HomeNavigationIntent::Route) + .subscribeOnMainThread(schedulersProvider) + .subscribeBy(::errorLog, EmptyLambda, ::processIntent) + !Observable .timer(250L, TimeUnit.MILLISECONDS) .flatMapCompletable { preferenceManager.refresh() } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsScreen.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsScreen.kt index 1942f01c6..5824af908 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsScreen.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsScreen.kt @@ -237,6 +237,7 @@ private fun ContentSettingsState( ServerSource.HUGGING_FACE -> LocalizationR.string.srv_type_hugging_face_short ServerSource.OPEN_AI -> LocalizationR.string.srv_type_open_ai ServerSource.STABILITY_AI -> LocalizationR.string.srv_type_stability_ai + ServerSource.FAL_AI -> LocalizationR.string.srv_type_fal_ai ServerSource.LOCAL_MICROSOFT_ONNX -> LocalizationR.string.srv_type_local_short ServerSource.LOCAL_GOOGLE_MEDIA_PIPE -> LocalizationR.string.srv_type_media_pipe_short ServerSource.SWARM_UI -> LocalizationR.string.srv_type_swarm_ui diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupIntent.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupIntent.kt index 9735a3583..012027ef8 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupIntent.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupIntent.kt @@ -28,10 +28,14 @@ sealed interface ServerSetupIntent : MviIntent { data class UpdateStabilityAiApiKey(val key: String) : ServerSetupIntent + data class UpdateFalAiApiKey(val key: String) : ServerSetupIntent + data class UpdateHuggingFaceApiKey(val key: String) : ServerSetupIntent data class UpdateHuggingFaceModel(val model: String): ServerSetupIntent + data class UpdateFalAiEndpoint(val endpoint: ServerSetupState.FalAiEndpointUi) : ServerSetupIntent + data class UpdateDemoMode(val value: Boolean) : ServerSetupIntent data class UpdateHordeDefaultApiKey(val value: Boolean) : ServerSetupIntent @@ -91,6 +95,11 @@ sealed interface ServerSetupIntent : MviIntent { override val url: String get() = linksProvider.stabilityAiInfoUrl } + + data object FalAiInfo : LaunchUrl() { + override val url: String + get() = linksProvider.falAiInfoUrl + } } sealed interface LocalModel : ServerSetupIntent { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupState.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupState.kt index ca65ed907..ab2cfb18b 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupState.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupState.kt @@ -29,6 +29,9 @@ data class ServerSetupState( val huggingFaceApiKey: String = "", val openAiApiKey: String = "", val stabilityAiApiKey: String = "", + val falAiApiKey: String = "", + val falAiEndpoints: List = emptyList(), + val falAiSelectedEndpoint: String = "", val hordeDefaultApiKey: Boolean = false, val demoMode: Boolean = false, val authType: AuthType = AuthType.ANONYMOUS, @@ -51,6 +54,7 @@ data class ServerSetupState( val huggingFaceApiKeyValidationError: UiText? = null, val openAiApiKeyValidationError: UiText? = null, val stabilityAiApiKeyValidationError: UiText? = null, + val falAiApiKeyValidationError: UiText? = null, val localCustomOnnxPathValidationError: UiText? = null, val localCustomMediaPipePathValidationError: UiText? = null, ) : MviState, KoinComponent { @@ -208,6 +212,14 @@ data class ServerSetupState( val downloadState: DownloadState = DownloadState.Unknown, val selected: Boolean = false, ) + + data class FalAiEndpointUi( + val id: String, + val endpointId: String, + val title: String, + val category: String, + val isCustom: Boolean, + ) } val Configuration.authType: ServerSetupState.AuthType diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupViewModel.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupViewModel.kt index 0e5601955..e4f26fd37 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupViewModel.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupViewModel.kt @@ -25,6 +25,7 @@ import com.shifthackz.aisdv1.domain.usecase.downloadable.GetLocalMediaPipeModels import com.shifthackz.aisdv1.domain.usecase.downloadable.GetLocalOnnxModelsUseCase import com.shifthackz.aisdv1.domain.usecase.huggingface.FetchAndGetHuggingFaceModelsUseCase import com.shifthackz.aisdv1.domain.usecase.settings.GetConfigurationUseCase +import com.shifthackz.aisdv1.domain.repository.FalAiEndpointRepository import com.shifthackz.aisdv1.presentation.model.LaunchSource import com.shifthackz.aisdv1.presentation.model.Modal import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter @@ -44,6 +45,7 @@ class ServerSetupViewModel( getLocalOnnxModelsUseCase: GetLocalOnnxModelsUseCase, getLocalMediaPipeModelsUseCase: GetLocalMediaPipeModelsUseCase, fetchAndGetHuggingFaceModelsUseCase: FetchAndGetHuggingFaceModelsUseCase, + falAiEndpointRepository: FalAiEndpointRepository, private val urlValidator: UrlValidator, private val stringValidator: CommonStringValidator, private val filePathValidator: FilePathValidator, @@ -94,6 +96,7 @@ class ServerSetupViewModel( huggingFaceApiKey = configuration.huggingFaceApiKey, openAiApiKey = configuration.openAiApiKey, stabilityAiApiKey = configuration.stabilityAiApiKey, + falAiApiKey = configuration.falAiApiKey, localOnnxModels = onnxModels.mapToUi(), localOnnxCustomModel = onnxModels.mapLocalCustomOnnxSwitchState(), localOnnxCustomModelPath = configuration.localOnnxModelPath, @@ -111,6 +114,29 @@ class ServerSetupViewModel( .withHordeApiKey(configuration.hordeApiKey) } } + + // Load FalAi endpoints + !falAiEndpointRepository.getAll() + .subscribeOnMainThread(schedulersProvider) + .subscribeBy(::errorLog) { endpoints -> + val selectedId = preferenceManager.falAiSelectedEndpointId + val selected = endpoints.firstOrNull { it.endpointId == selectedId } + ?: endpoints.firstOrNull() + updateState { state -> + state.copy( + falAiEndpoints = endpoints.map { endpoint -> + ServerSetupState.FalAiEndpointUi( + id = endpoint.id, + endpointId = endpoint.endpointId, + title = endpoint.title, + category = endpoint.category.name, + isCustom = endpoint.isCustom, + ) + }, + falAiSelectedEndpoint = selected?.endpointId ?: "", + ) + } + } } override fun onCleared() { @@ -221,6 +247,14 @@ class ServerSetupViewModel( it.copy(stabilityAiApiKey = intent.key) } + is ServerSetupIntent.UpdateFalAiApiKey -> updateState { + it.copy(falAiApiKey = intent.key) + } + + is ServerSetupIntent.UpdateFalAiEndpoint -> updateState { + it.copy(falAiSelectedEndpoint = intent.endpoint.endpointId) + } + ServerSetupIntent.ConnectToLocalHost -> connectToServer() is ServerSetupIntent.SelectLocalModelPath -> updateState { state -> @@ -246,6 +280,7 @@ class ServerSetupViewModel( ServerSource.HUGGING_FACE -> connectToHuggingFace() ServerSource.OPEN_AI -> connectToOpenAi() ServerSource.STABILITY_AI -> connectToStabilityAi() + ServerSource.FAL_AI -> connectToFalAi() ServerSource.SWARM_UI -> connectToSwarmUi() ServerSource.LOCAL_GOOGLE_MEDIA_PIPE -> connectToMediaPipe() } @@ -329,6 +364,14 @@ class ServerSetupViewModel( } validation.isValid } + + ServerSource.FAL_AI -> { + val validation = stringValidator(currentState.falAiApiKey) + updateState { + it.copy(falAiApiKeyValidationError = validation.mapToUi()) + } + validation.isValid + } } private fun validateServerUrlAndCredentials(url: String): Boolean { @@ -397,6 +440,11 @@ class ServerSetupViewModel( apiKey = currentState.stabilityAiApiKey, ) + private fun connectToFalAi() = setupConnectionInterActor.connectToFalAi( + apiKey = currentState.falAiApiKey, + endpointId = currentState.falAiSelectedEndpoint, + ) + private fun connectToHorde(): Single> { val testApiKey = if (currentState.hordeDefaultApiKey) { Constants.HORDE_DEFAULT_API_KEY diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/components/ConfigurationModeButton.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/components/ConfigurationModeButton.kt index f8626a6e3..29013742c 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/components/ConfigurationModeButton.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/components/ConfigurationModeButton.kt @@ -77,6 +77,7 @@ fun ConfigurationModeButton( ServerSource.HORDE, ServerSource.OPEN_AI, ServerSource.STABILITY_AI, + ServerSource.FAL_AI, ServerSource.HUGGING_FACE -> Icons.Default.Cloud ServerSource.LOCAL_MICROSOFT_ONNX, @@ -100,6 +101,7 @@ fun ConfigurationModeButton( ServerSource.OPEN_AI -> LocalizationR.string.hint_open_ai_sub_title ServerSource.LOCAL_MICROSOFT_ONNX -> LocalizationR.string.hint_local_diffusion_sub_title ServerSource.STABILITY_AI -> LocalizationR.string.hint_stability_ai_sub_title + ServerSource.FAL_AI -> LocalizationR.string.hint_fal_ai_sub_title ServerSource.SWARM_UI -> LocalizationR.string.hint_swarm_ui_sub_title ServerSource.LOCAL_GOOGLE_MEDIA_PIPE -> LocalizationR.string.hint_mediapipe_sub_title } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/FalAiForm.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/FalAiForm.kt new file mode 100644 index 000000000..45edfa722 --- /dev/null +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/FalAiForm.kt @@ -0,0 +1,73 @@ +package com.shifthackz.aisdv1.presentation.screen.setup.forms + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.Help +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.font.FontWeight +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.unit.dp +import com.shifthackz.aisdv1.core.model.asString +import com.shifthackz.aisdv1.core.model.asUiText +import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupIntent +import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupState +import com.shifthackz.aisdv1.presentation.theme.textFieldColors +import com.shifthackz.aisdv1.presentation.widget.item.SettingsItem +import com.shifthackz.aisdv1.core.localization.R as LocalizationR + +@Composable +fun FalAiForm( + modifier: Modifier = Modifier, + state: ServerSetupState, + processIntent: (ServerSetupIntent) -> Unit, +) { + Column( + modifier = modifier.padding(horizontal = 16.dp), + ) { + Text( + modifier = Modifier + .fillMaxWidth() + .padding(top = 32.dp, bottom = 8.dp), + text = stringResource(id = LocalizationR.string.hint_fal_ai_title), + style = MaterialTheme.typography.bodyLarge, + textAlign = TextAlign.Center, + fontWeight = FontWeight.Bold, + ) + Text( + modifier = Modifier.padding(top = 16.dp), + text = stringResource(id = LocalizationR.string.hint_fal_ai_sub_title), + style = MaterialTheme.typography.bodyMedium, + ) + TextField( + modifier = Modifier + .fillMaxWidth() + .padding(top = 8.dp), + value = state.falAiApiKey, + onValueChange = { + processIntent(ServerSetupIntent.UpdateFalAiApiKey(it)) + }, + label = { Text(stringResource(id = LocalizationR.string.hint_server_horde_api_key)) }, + isError = state.falAiApiKeyValidationError != null, + supportingText = { + state.falAiApiKeyValidationError + ?.let { Text(it.asString(), color = MaterialTheme.colorScheme.error) } + }, + colors = textFieldColors, + ) + SettingsItem( + modifier = Modifier + .padding(top = 16.dp) + .fillMaxWidth(), + startIcon = Icons.AutoMirrored.Filled.Help, + text = LocalizationR.string.hint_fal_ai_about.asUiText(), + onClick = { processIntent(ServerSetupIntent.LaunchUrl.FalAiInfo) }, + ) + } +} diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/steps/ConfigurationStep.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/steps/ConfigurationStep.kt index d25e82371..6e378d0ab 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/steps/ConfigurationStep.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/steps/ConfigurationStep.kt @@ -7,6 +7,7 @@ import com.shifthackz.aisdv1.domain.entity.ServerSource import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupIntent import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupState import com.shifthackz.aisdv1.presentation.screen.setup.forms.Automatic1111Form +import com.shifthackz.aisdv1.presentation.screen.setup.forms.FalAiForm import com.shifthackz.aisdv1.presentation.screen.setup.forms.HordeForm import com.shifthackz.aisdv1.presentation.screen.setup.forms.HuggingFaceForm import com.shifthackz.aisdv1.presentation.screen.setup.forms.LocalDiffusionForm @@ -55,6 +56,11 @@ fun ConfigurationStep( processIntent = processIntent, ) + ServerSource.FAL_AI -> FalAiForm( + state = state, + processIntent = processIntent, + ) + ServerSource.SWARM_UI -> SwarmUiForm( state = state, processIntent = processIntent, diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/Constants.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/Constants.kt index 153a6e0a1..89a87adba 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/Constants.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/Constants.kt @@ -3,7 +3,7 @@ package com.shifthackz.aisdv1.presentation.utils import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute.HomeNavigation object Constants { - const val PAGINATION_PAYLOAD_SIZE = 1000 + const val PAGINATION_PAYLOAD_SIZE = 30 const val DEBUG_MENU_ACCESS_TAPS = 7 const val SUB_SEED_STRENGTH_MIN = 0f @@ -46,6 +46,7 @@ object Constants { val homeRoutes = listOf( HomeNavigation.TxtToImg, HomeNavigation.ImgToImg, + HomeNavigation.FalAi, HomeNavigation.Gallery, HomeNavigation.Settings, ) diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/dialog/GenerationImageResultDialog.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/dialog/GenerationImageResultDialog.kt index e23155824..11a0b958f 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/dialog/GenerationImageResultDialog.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/dialog/GenerationImageResultDialog.kt @@ -106,7 +106,7 @@ fun GenerationImageResultDialog( ) } } - + OutlinedButton( modifier = Modifier .padding(top = 8.dp) diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/engine/EngineSelectionComponent.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/engine/EngineSelectionComponent.kt index 9799f9c8e..d43718825 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/engine/EngineSelectionComponent.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/engine/EngineSelectionComponent.kt @@ -66,6 +66,7 @@ fun EngineSelectionComponent( ServerSource.LOCAL_GOOGLE_MEDIA_PIPE -> Unit ServerSource.HORDE -> Unit ServerSource.OPEN_AI -> Unit + ServerSource.FAL_AI -> Unit } } } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/falai/FalAiDynamicForm.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/falai/FalAiDynamicForm.kt new file mode 100644 index 000000000..056971dce --- /dev/null +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/falai/FalAiDynamicForm.kt @@ -0,0 +1,249 @@ +@file:OptIn(ExperimentalMaterial3Api::class) + +package com.shifthackz.aisdv1.presentation.widget.falai + +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.expandVertically +import androidx.compose.animation.shrinkVertically +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.Delete +import androidx.compose.material.icons.filled.ExpandLess +import androidx.compose.material.icons.filled.ExpandMore +import androidx.compose.material3.Card +import androidx.compose.material3.CardDefaults +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import com.shifthackz.aisdv1.core.model.asUiText +import com.shifthackz.aisdv1.domain.entity.FalAiPropertyType +import com.shifthackz.aisdv1.presentation.model.FalAiEndpointUi +import com.shifthackz.aisdv1.presentation.model.FalAiPropertyUi +import com.shifthackz.aisdv1.presentation.screen.falai.FalAiGenerationState +import com.shifthackz.aisdv1.presentation.widget.input.DropdownTextField + +@Composable +fun FalAiDynamicForm( + state: FalAiGenerationState, + onEndpointSelected: (String) -> Unit, + onPropertyChanged: (String, Any?) -> Unit, + onToggleAdvanced: (Boolean) -> Unit, + onImportOpenApi: (String) -> Unit = {}, + onDeleteEndpoint: (String) -> Unit = {}, + modifier: Modifier = Modifier, +) { + Column(modifier = modifier) { + // Endpoint selector with import button + FalAiEndpointSelector( + endpoints = state.endpoints, + selectedEndpoint = state.selectedEndpoint, + onEndpointSelected = onEndpointSelected, + onImportOpenApi = onImportOpenApi, + onDeleteEndpoint = onDeleteEndpoint, + ) + + Spacer(modifier = Modifier.height(16.dp)) + + // Main properties (prompt, image fields, etc.) + state.mainProperties.forEach { property -> + if (property.type == FalAiPropertyType.INPAINT) { + // Special handling for inpainting - combined image + mask field + FalAiInpaintField( + property = property, + currentImageValue = state.propertyValues[property.name], + currentMaskValue = property.linkedMaskProperty?.let { state.propertyValues[it] }, + onImageChange = { value -> onPropertyChanged(property.name, value) }, + onMaskChange = { value -> + property.linkedMaskProperty?.let { maskProp -> + onPropertyChanged(maskProp, value) + } + }, + ) + } else { + FalAiPropertyField( + property = property, + onValueChange = { value -> onPropertyChanged(property.name, value) }, + ) + } + } + + // Advanced options section + if (state.hasAdvancedProperties) { + Spacer(modifier = Modifier.height(16.dp)) + + AdvancedOptionsSection( + visible = state.advancedOptionsVisible, + onToggle = onToggleAdvanced, + properties = state.advancedProperties, + onPropertyChanged = onPropertyChanged, + ) + } + } +} + +@Composable +fun FalAiEndpointSelector( + endpoints: List, + selectedEndpoint: FalAiEndpointUi?, + onEndpointSelected: (String) -> Unit, + onImportOpenApi: (String) -> Unit = {}, + onDeleteEndpoint: (String) -> Unit = {}, + modifier: Modifier = Modifier, +) { + val context = LocalContext.current + + val jsonFilePicker = rememberLauncherForActivityResult( + ActivityResultContracts.GetContent() + ) { uri -> + uri ?: return@rememberLauncherForActivityResult + try { + context.contentResolver.openInputStream(uri)?.use { inputStream -> + val json = inputStream.bufferedReader().readText() + onImportOpenApi(json) + } + } catch (e: Exception) { + e.printStackTrace() + } + } + + Column(modifier = modifier) { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + text = "Model", + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.weight(1f), + ) + + // Import button + OutlinedButton( + onClick = { jsonFilePicker.launch("application/json") }, + ) { + Icon( + imageVector = Icons.Default.Add, + contentDescription = null, + modifier = Modifier.padding(end = 4.dp), + ) + Text("Import") + } + + // Delete button (only for custom endpoints) + if (selectedEndpoint?.isCustom == true) { + Spacer(modifier = Modifier.width(8.dp)) + IconButton( + onClick = { onDeleteEndpoint(selectedEndpoint.id) }, + ) { + Icon( + imageVector = Icons.Default.Delete, + contentDescription = "Delete endpoint", + tint = MaterialTheme.colorScheme.error, + ) + } + } + } + + Spacer(modifier = Modifier.height(8.dp)) + + // Sort endpoints by title + val sortedEndpoints = endpoints.sortedBy { it.title } + + DropdownTextField( + modifier = Modifier.fillMaxWidth(), + label = "Select endpoint".asUiText(), + value = selectedEndpoint, + items = sortedEndpoints, + onItemSelected = { endpoint -> onEndpointSelected(endpoint.id) }, + displayDelegate = { endpoint -> + val customSuffix = if (endpoint.isCustom) " ⭐" else "" + "${endpoint.title} (${endpoint.category})$customSuffix".asUiText() + }, + ) + + selectedEndpoint?.description?.takeIf { it.isNotBlank() }?.let { description -> + Text( + text = description, + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(top = 8.dp, start = 4.dp), + ) + } + } +} + +@Composable +private fun AdvancedOptionsSection( + visible: Boolean, + onToggle: (Boolean) -> Unit, + properties: List, + onPropertyChanged: (String, Any?) -> Unit, +) { + Card( + modifier = Modifier.fillMaxWidth(), + colors = CardDefaults.cardColors( + containerColor = MaterialTheme.colorScheme.surfaceVariant.copy(alpha = 0.5f), + ), + ) { + Column { + // Header (always visible) + Row( + modifier = Modifier + .fillMaxWidth() + .clickable { onToggle(!visible) } + .padding(16.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + text = "Advanced Options", + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.weight(1f), + ) + Icon( + imageVector = if (visible) Icons.Default.ExpandLess else Icons.Default.ExpandMore, + contentDescription = if (visible) "Collapse" else "Expand", + ) + } + + // Content (animated visibility) + AnimatedVisibility( + visible = visible, + enter = expandVertically(), + exit = shrinkVertically(), + ) { + Column( + modifier = Modifier.padding( + start = 16.dp, + end = 16.dp, + bottom = 16.dp, + ), + ) { + properties.forEach { property -> + FalAiPropertyField( + property = property, + onValueChange = { value -> onPropertyChanged(property.name, value) }, + ) + } + } + } + } + } +} diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/falai/FalAiInpaintField.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/falai/FalAiInpaintField.kt new file mode 100644 index 000000000..977996497 --- /dev/null +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/falai/FalAiInpaintField.kt @@ -0,0 +1,249 @@ +package com.shifthackz.aisdv1.presentation.widget.falai + +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.util.Base64 +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.PickVisualMediaRequest +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.width +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.Undo +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.CleaningServices +import androidx.compose.material3.Icon +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Slider +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableFloatStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Path +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.unit.dp +import com.shifthackz.aisdv1.presentation.model.FalAiPropertyUi +import com.shifthackz.aisdv1.presentation.model.InPaintModel +import com.shifthackz.aisdv1.presentation.screen.inpaint.components.InPaintComponent +import com.shifthackz.aisdv1.presentation.utils.uriToBitmap +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import java.io.ByteArrayOutputStream + +/** + * Combined image + mask drawing field for inpainting endpoints. + * Shows the image and allows drawing a mask on top. + */ +@Composable +fun FalAiInpaintField( + property: FalAiPropertyUi, + currentImageValue: Any?, + currentMaskValue: Any?, + onImageChange: (String) -> Unit, + onMaskChange: (String) -> Unit, + modifier: Modifier = Modifier, +) { + val context = LocalContext.current + var imageBitmap by remember { mutableStateOf(null) } + var inPaintModel by remember { mutableStateOf(InPaintModel()) } + var brushSize by remember { mutableFloatStateOf(24f) } + + // Restore image from currentValue if it's a base64 string + LaunchedEffect(currentImageValue) { + val imageUrl = currentImageValue?.toString() ?: "" + if (imageUrl.startsWith("data:image") && imageBitmap == null) { + withContext(Dispatchers.IO) { + val bitmap = base64DataUriToBitmap(imageUrl) + withContext(Dispatchers.Main) { + imageBitmap = bitmap + } + } + } else if (imageUrl.isBlank()) { + imageBitmap = null + inPaintModel = InPaintModel() + } + } + + val mediaPicker = rememberLauncherForActivityResult( + ActivityResultContracts.PickVisualMedia(), + ) { uri -> + val bitmap = uri?.let { uriToBitmap(context, it) } ?: return@rememberLauncherForActivityResult + imageBitmap = bitmap + // Clear existing mask when new image is selected + inPaintModel = InPaintModel() + onMaskChange("") + // Convert to base64 data URI + val base64 = bitmapToBase64DataUri(bitmap) + onImageChange(base64) + } + + Column(modifier = modifier.fillMaxWidth()) { + Text( + text = property.title, + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.padding(bottom = 8.dp), + ) + + if (property.description.isNotBlank()) { + Text( + text = property.description, + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(bottom = 8.dp), + ) + } + + if (imageBitmap != null) { + // Show inpainting canvas + InPaintComponent( + modifier = Modifier.fillMaxWidth(), + drawMode = true, + inPaint = inPaintModel, + bitmap = imageBitmap, + capWidth = brushSize.toInt(), + onPathDrawn = { path -> + inPaintModel = inPaintModel.copy( + paths = inPaintModel.paths + (path to brushSize.toInt()) + ) + }, + onPathBitmapDrawn = { maskBitmap -> + if (maskBitmap != null) { + val maskBase64 = bitmapToBase64DataUri(maskBitmap) + onMaskChange(maskBase64) + } + }, + ) + + Spacer(modifier = Modifier.height(12.dp)) + + // Brush size slider + Column(modifier = Modifier.fillMaxWidth()) { + Text( + text = "Brush size: ${brushSize.toInt()}", + style = MaterialTheme.typography.bodyMedium, + ) + Slider( + value = brushSize, + onValueChange = { brushSize = it }, + valueRange = 4f..64f, + modifier = Modifier.fillMaxWidth(), + ) + } + + Spacer(modifier = Modifier.height(8.dp)) + + // Action buttons + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + ) { + OutlinedButton( + onClick = { + if (inPaintModel.paths.isNotEmpty()) { + inPaintModel = inPaintModel.copy( + paths = inPaintModel.paths.dropLast(1) + ) + } + }, + enabled = inPaintModel.paths.isNotEmpty(), + modifier = Modifier.weight(1f), + ) { + Icon( + imageVector = Icons.AutoMirrored.Filled.Undo, + contentDescription = "Undo", + ) + Text( + modifier = Modifier.padding(start = 8.dp), + text = "Undo", + ) + } + + Spacer(modifier = Modifier.width(8.dp)) + + OutlinedButton( + onClick = { + inPaintModel = InPaintModel() + onMaskChange("") + }, + enabled = inPaintModel.paths.isNotEmpty(), + modifier = Modifier.weight(1f), + ) { + Icon( + imageVector = Icons.Default.CleaningServices, + contentDescription = "Clear", + ) + Text( + modifier = Modifier.padding(start = 8.dp), + text = "Clear", + ) + } + } + + Spacer(modifier = Modifier.height(8.dp)) + + // Change image button + OutlinedButton( + onClick = { + mediaPicker.launch( + PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly) + ) + }, + modifier = Modifier.fillMaxWidth(), + ) { + Icon( + imageVector = Icons.Default.Add, + contentDescription = null, + modifier = Modifier.padding(end = 8.dp), + ) + Text("Change Image") + } + } else { + // No image selected - show picker button + OutlinedButton( + onClick = { + mediaPicker.launch( + PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly) + ) + }, + modifier = Modifier.fillMaxWidth(), + ) { + Icon( + imageVector = Icons.Default.Add, + contentDescription = null, + modifier = Modifier.padding(end = 8.dp), + ) + Text("Select Image for Inpainting") + } + } + } +} + +private fun bitmapToBase64DataUri(bitmap: Bitmap): String { + val outputStream = ByteArrayOutputStream() + bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream) + val base64 = Base64.encodeToString(outputStream.toByteArray(), Base64.NO_WRAP) + return "data:image/png;base64,$base64" +} + +private fun base64DataUriToBitmap(dataUri: String): Bitmap? { + return try { + val base64Image = dataUri.substringAfter("base64,") + val decodedString = Base64.decode(base64Image, Base64.DEFAULT) + BitmapFactory.decodeByteArray(decodedString, 0, decodedString.size) + } catch (e: Exception) { + e.printStackTrace() + null + } +} diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/falai/FalAiPropertyField.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/falai/FalAiPropertyField.kt new file mode 100644 index 000000000..207e330e6 --- /dev/null +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/falai/FalAiPropertyField.kt @@ -0,0 +1,973 @@ +@file:OptIn(ExperimentalMaterial3Api::class) + +package com.shifthackz.aisdv1.presentation.widget.falai + +import android.graphics.Bitmap +import android.graphics.BitmapFactory +import android.util.Base64 +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.PickVisualMediaRequest +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.animation.AnimatedVisibility +import androidx.compose.animation.expandVertically +import androidx.compose.animation.shrinkVertically +import androidx.compose.foundation.Image +import androidx.compose.foundation.border +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.aspectRatio +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add +import androidx.compose.material.icons.filled.Close +import androidx.compose.material.icons.filled.Delete +import androidx.compose.material.icons.filled.Image +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedButton +import androidx.compose.material3.Switch +import androidx.compose.material3.Text +import androidx.compose.material3.TextField +import androidx.compose.runtime.Composable +import androidx.compose.runtime.LaunchedEffect +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableIntStateOf +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.asImageBitmap +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.unit.dp +import com.shifthackz.aisdv1.core.model.asUiText +import com.shifthackz.aisdv1.domain.entity.FalAiPropertyType +import com.shifthackz.aisdv1.presentation.model.FalAiPropertyUi +import com.shifthackz.aisdv1.presentation.theme.textFieldColors +import com.shifthackz.aisdv1.presentation.utils.uriToBitmap +import com.shifthackz.aisdv1.presentation.widget.input.DropdownTextField +import com.shifthackz.aisdv1.presentation.widget.input.SliderTextInputField +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.withContext +import java.io.ByteArrayOutputStream + +private const val CUSTOM_SIZE_OPTION = "custom" + +@Composable +fun FalAiPropertyField( + property: FalAiPropertyUi, + onValueChange: (Any?) -> Unit, + modifier: Modifier = Modifier, +) { + Column(modifier = modifier.padding(vertical = 4.dp)) { + when (property.type) { + FalAiPropertyType.STRING -> FalAiStringField(property, onValueChange) + FalAiPropertyType.INTEGER -> FalAiIntegerField(property, onValueChange) + FalAiPropertyType.NUMBER -> FalAiNumberField(property, onValueChange) + FalAiPropertyType.BOOLEAN -> FalAiBooleanField(property, onValueChange) + FalAiPropertyType.ENUM -> FalAiEnumField(property, onValueChange) + FalAiPropertyType.IMAGE_URL -> FalAiImageUrlField(property, onValueChange) + FalAiPropertyType.IMAGE_URL_ARRAY -> FalAiImageUrlArrayField(property, onValueChange) + FalAiPropertyType.IMAGE_SIZE -> FalAiImageSizeField(property, onValueChange) + FalAiPropertyType.ARRAY -> { + if (property.arrayItemProperties != null) { + FalAiArrayField(property, onValueChange) + } else { + // Fallback to text field for unsupported array types + FalAiStringField(property, onValueChange) + } + } + FalAiPropertyType.OBJECT -> { + // For now, show as text field for JSON input + FalAiStringField(property, onValueChange) + } + FalAiPropertyType.INPAINT -> { + // INPAINT is handled separately in FalAiDynamicForm with FalAiInpaintField + // This fallback shows a simple image picker if used standalone + FalAiImageUrlField(property, onValueChange) + } + } + if (property.description.isNotBlank()) { + Text( + text = property.description, + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(start = 8.dp, top = 4.dp), + ) + } + } +} + +@Composable +private fun FalAiStringField( + property: FalAiPropertyUi, + onValueChange: (Any?) -> Unit, +) { + var text by remember { mutableStateOf(property.currentValue?.toString() ?: "") } + + LaunchedEffect(property.currentValue) { + text = property.currentValue?.toString() ?: "" + } + + val isPromptField = property.name == "prompt" + + TextField( + modifier = Modifier.fillMaxWidth(), + value = text, + onValueChange = { newValue -> + text = newValue + onValueChange(newValue) + }, + label = { Text(property.title) }, + minLines = if (isPromptField) 3 else 1, + maxLines = if (isPromptField) 6 else 3, + singleLine = !isPromptField, + keyboardOptions = KeyboardOptions( + imeAction = if (isPromptField) ImeAction.Default else ImeAction.Done, + ), + colors = textFieldColors, + ) +} + +@Composable +private fun FalAiIntegerField( + property: FalAiPropertyUi, + onValueChange: (Any?) -> Unit, +) { + val min = property.minimum ?: 0.0 + val max = property.maximum ?: 100.0 + val hasRange = property.minimum != null && property.maximum != null + + if (hasRange) { + Column(modifier = Modifier.fillMaxWidth()) { + Text( + text = property.title, + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.padding(bottom = 4.dp), + ) + SliderTextInputField( + value = (property.currentValue as? Number)?.toFloat() ?: min.toFloat(), + onValueChange = { onValueChange(it.toInt()) }, + valueRange = min.toFloat()..max.toFloat(), + fractionDigits = 0, + ) + } + } else { + var text by remember { mutableStateOf(property.currentValue?.toString() ?: "") } + + LaunchedEffect(property.currentValue) { + text = property.currentValue?.toString() ?: "" + } + + TextField( + modifier = Modifier.fillMaxWidth(), + value = text, + onValueChange = { newValue -> + text = newValue + newValue.toIntOrNull()?.let { onValueChange(it) } + }, + label = { Text(property.title) }, + singleLine = true, + keyboardOptions = KeyboardOptions( + keyboardType = KeyboardType.Number, + imeAction = ImeAction.Done, + ), + colors = textFieldColors, + ) + } +} + +@Composable +private fun FalAiNumberField( + property: FalAiPropertyUi, + onValueChange: (Any?) -> Unit, +) { + val min = property.minimum ?: 0.0 + val max = property.maximum ?: 100.0 + val hasRange = property.minimum != null && property.maximum != null + + if (hasRange) { + Column(modifier = Modifier.fillMaxWidth()) { + Text( + text = property.title, + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.padding(bottom = 4.dp), + ) + SliderTextInputField( + value = (property.currentValue as? Number)?.toDouble() ?: min, + onValueChange = { onValueChange(it) }, + valueRange = min..max, + fractionDigits = 2, + ) + } + } else { + var text by remember { mutableStateOf(property.currentValue?.toString() ?: "") } + + LaunchedEffect(property.currentValue) { + text = property.currentValue?.toString() ?: "" + } + + TextField( + modifier = Modifier.fillMaxWidth(), + value = text, + onValueChange = { newValue -> + text = newValue + newValue.toDoubleOrNull()?.let { onValueChange(it) } + }, + label = { Text(property.title) }, + singleLine = true, + keyboardOptions = KeyboardOptions( + keyboardType = KeyboardType.Decimal, + imeAction = ImeAction.Done, + ), + colors = textFieldColors, + ) + } +} + +@Composable +private fun FalAiBooleanField( + property: FalAiPropertyUi, + onValueChange: (Any?) -> Unit, +) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 8.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + text = property.title, + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.weight(1f), + ) + Spacer(modifier = Modifier.width(16.dp)) + Switch( + checked = property.currentValue as? Boolean ?: false, + onCheckedChange = { onValueChange(it) }, + ) + } +} + +@Composable +private fun FalAiEnumField( + property: FalAiPropertyUi, + onValueChange: (Any?) -> Unit, +) { + DropdownTextField( + modifier = Modifier.fillMaxWidth(), + label = property.title.asUiText(), + value = property.currentValue?.toString() ?: property.enumValues.firstOrNull(), + items = property.enumValues, + onItemSelected = { onValueChange(it) }, + ) +} + +@Composable +private fun FalAiImageUrlField( + property: FalAiPropertyUi, + onValueChange: (Any?) -> Unit, +) { + val context = LocalContext.current + var imageUrl by remember { mutableStateOf(property.currentValue?.toString() ?: "") } + var previewBitmap by remember { mutableStateOf(null) } + + LaunchedEffect(property.currentValue) { + val newUrl = property.currentValue?.toString() ?: "" + imageUrl = newUrl + if (newUrl.startsWith("data:image") && previewBitmap == null) { + withContext(Dispatchers.IO) { + val bitmap = base64DataUriToBitmap(newUrl) + withContext(Dispatchers.Main) { + previewBitmap = bitmap + } + } + } else if (newUrl.isBlank()) { + previewBitmap = null + } + } + + val mediaPicker = rememberLauncherForActivityResult( + ActivityResultContracts.PickVisualMedia(), + ) { uri -> + val bitmap = uri?.let { uriToBitmap(context, it) } ?: return@rememberLauncherForActivityResult + previewBitmap = bitmap + // Convert to base64 data URI + val base64 = bitmapToBase64DataUri(bitmap) + imageUrl = base64 + onValueChange(base64) + } + + Column(modifier = Modifier.fillMaxWidth()) { + Text( + text = property.title, + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.padding(bottom = 8.dp), + ) + + // Show preview if we have an image (compact row layout like multi-image) + if (previewBitmap != null || imageUrl.startsWith("data:image") || imageUrl.startsWith("http")) { + Row( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 4.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + // Image preview (compact) + Box( + modifier = Modifier + .size(80.dp) + .clip(RoundedCornerShape(8.dp)) + .border( + width = 1.dp, + color = MaterialTheme.colorScheme.outline, + shape = RoundedCornerShape(8.dp), + ), + ) { + previewBitmap?.let { bitmap -> + Image( + bitmap = bitmap.asImageBitmap(), + contentDescription = "Selected image", + modifier = Modifier.fillMaxWidth(), + contentScale = ContentScale.Crop, + ) + } ?: run { + // For URL-based images, just show icon + Box( + modifier = Modifier.fillMaxWidth(), + contentAlignment = Alignment.Center, + ) { + Icon( + imageVector = Icons.Default.Image, + contentDescription = null, + modifier = Modifier.size(32.dp), + tint = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } + } + } + + Spacer(modifier = Modifier.width(12.dp)) + + // Image info + Column(modifier = Modifier.weight(1f)) { + Text( + text = property.title, + style = MaterialTheme.typography.bodyMedium, + ) + Text( + text = if (imageUrl.startsWith("data:image")) "Local image" else imageUrl.take(30) + if (imageUrl.length > 30) "..." else "", + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } + + // Remove button + IconButton( + onClick = { + previewBitmap = null + imageUrl = "" + onValueChange("") + }, + ) { + Icon( + imageVector = Icons.Default.Delete, + contentDescription = "Remove image", + tint = MaterialTheme.colorScheme.error, + ) + } + } + + Spacer(modifier = Modifier.height(8.dp)) + + // Change image button + OutlinedButton( + onClick = { + mediaPicker.launch( + PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly) + ) + }, + modifier = Modifier.fillMaxWidth(), + ) { + Icon( + imageVector = Icons.Default.Add, + contentDescription = null, + modifier = Modifier.padding(end = 8.dp), + ) + Text("Change Image") + } + } else { + // Add image button (like multi-image) + OutlinedButton( + onClick = { + mediaPicker.launch( + PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly) + ) + }, + modifier = Modifier.fillMaxWidth(), + ) { + Icon( + imageVector = Icons.Default.Add, + contentDescription = null, + modifier = Modifier.padding(end = 8.dp), + ) + Text("Add Image") + } + } + + Spacer(modifier = Modifier.height(8.dp)) + + // URL input field (for pasting URLs) + TextField( + modifier = Modifier.fillMaxWidth(), + value = if (imageUrl.startsWith("data:image")) "" else imageUrl, + onValueChange = { newValue -> + if (!newValue.startsWith("data:image")) { + imageUrl = newValue + previewBitmap = null + onValueChange(newValue) + } + }, + label = { Text("Or paste image URL") }, + placeholder = { Text("https://...") }, + singleLine = true, + keyboardOptions = KeyboardOptions( + imeAction = ImeAction.Done, + ), + colors = textFieldColors, + ) + } +} + +/** + * Converts a Bitmap to a base64 data URI string. + */ +private fun bitmapToBase64DataUri(bitmap: Bitmap): String { + val outputStream = ByteArrayOutputStream() + bitmap.compress(Bitmap.CompressFormat.PNG, 100, outputStream) + val base64 = Base64.encodeToString(outputStream.toByteArray(), Base64.NO_WRAP) + return "data:image/png;base64,$base64" +} + +/** + * Field for an array of image URLs (e.g., image_urls for flux-2/edit). + * Supports adding multiple images via picker or URL input. + */ +@Composable +private fun FalAiImageUrlArrayField( + property: FalAiPropertyUi, + onValueChange: (Any?) -> Unit, +) { + val context = LocalContext.current + + // Parse current value as list of strings + @Suppress("UNCHECKED_CAST") + val initialImages = when (val current = property.currentValue) { + is List<*> -> current.filterIsInstance().toMutableList() + else -> mutableListOf() + } + + var images by remember { mutableStateOf(initialImages) } + var bitmaps by remember { mutableStateOf>(emptyMap()) } + + LaunchedEffect(property.currentValue) { + @Suppress("UNCHECKED_CAST") + val newImages = when (val current = property.currentValue) { + is List<*> -> current.filterIsInstance().toMutableList() + else -> mutableListOf() + } + if (newImages != images) { + images = newImages + } + + // Restore bitmaps if missing or out of sync + if (bitmaps.size != newImages.size || bitmaps.keys.any { it >= newImages.size }) { + withContext(Dispatchers.IO) { + val newBitmaps = mutableMapOf() + newImages.forEachIndexed { index, url -> + if (url.startsWith("data:image")) { + base64DataUriToBitmap(url)?.let { + newBitmaps[index] = it + } + } + } + withContext(Dispatchers.Main) { + bitmaps = newBitmaps + } + } + } + } + + val mediaPicker = rememberLauncherForActivityResult( + ActivityResultContracts.PickMultipleVisualMedia(maxItems = 4), + ) { uris -> + val newBitmaps = mutableMapOf() + val newUrls = uris.mapNotNull { uri -> + uriToBitmap(context, uri)?.let { bitmap -> + val index = images.size + newBitmaps.size + newBitmaps[index] = bitmap + bitmapToBase64DataUri(bitmap) + } + } + if (newUrls.isNotEmpty()) { + bitmaps = bitmaps + newBitmaps + images = (images + newUrls).toMutableList() + onValueChange(images) + } + } + + Column(modifier = Modifier.fillMaxWidth()) { + Text( + text = property.title, + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.padding(bottom = 8.dp), + ) + + // Show existing images in a grid-like layout + if (images.isNotEmpty()) { + Column { + images.forEachIndexed { index, imageUrl -> + Row( + modifier = Modifier + .fillMaxWidth() + .padding(vertical = 4.dp), + verticalAlignment = Alignment.CenterVertically, + ) { + // Image preview + Box( + modifier = Modifier + .size(80.dp) + .clip(RoundedCornerShape(8.dp)) + .border( + width = 1.dp, + color = MaterialTheme.colorScheme.outline, + shape = RoundedCornerShape(8.dp), + ), + ) { + bitmaps[index]?.let { bitmap -> + Image( + bitmap = bitmap.asImageBitmap(), + contentDescription = "Image ${index + 1}", + modifier = Modifier.fillMaxWidth(), + contentScale = ContentScale.Crop, + ) + } ?: run { + // For URL-based images, just show icon + Box( + modifier = Modifier.fillMaxWidth(), + contentAlignment = Alignment.Center, + ) { + Icon( + imageVector = Icons.Default.Image, + contentDescription = null, + modifier = Modifier.size(32.dp), + tint = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } + } + } + + Spacer(modifier = Modifier.width(12.dp)) + + // Image info + Column(modifier = Modifier.weight(1f)) { + Text( + text = "Image ${index + 1}", + style = MaterialTheme.typography.bodyMedium, + ) + Text( + text = if (imageUrl.startsWith("data:image")) "Local image" else imageUrl.take(30) + "...", + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + ) + } + + // Remove button + IconButton( + onClick = { + bitmaps = bitmaps - index + images = images.toMutableList().apply { removeAt(index) } + onValueChange(images) + }, + ) { + Icon( + imageVector = Icons.Default.Delete, + contentDescription = "Remove image", + tint = MaterialTheme.colorScheme.error, + ) + } + } + } + } + + Spacer(modifier = Modifier.height(8.dp)) + } + + // Add image button + if (images.size < 4) { + OutlinedButton( + onClick = { + mediaPicker.launch( + PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageOnly) + ) + }, + modifier = Modifier.fillMaxWidth(), + ) { + Icon( + imageVector = Icons.Default.Add, + contentDescription = null, + modifier = Modifier.padding(end = 8.dp), + ) + Text("Add Image${if (images.isEmpty()) "s" else ""} (${images.size}/4)") + } + } else { + Text( + text = "Maximum 4 images reached", + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(top = 4.dp), + ) + } + } +} + +@Composable +private fun FalAiImageSizeField( + property: FalAiPropertyUi, + onValueChange: (Any?) -> Unit, +) { + // Determine initial state from currentValue + val initialValue = property.currentValue + val initialIsCustom = initialValue is Map<*, *> + val initialPreset = if (initialIsCustom) { + CUSTOM_SIZE_OPTION + } else { + initialValue?.toString() ?: property.defaultValue?.toString() ?: property.enumValues.firstOrNull() ?: "" + } + val initialWidth = if (initialValue is Map<*, *>) { + (initialValue["width"] as? Number)?.toInt() ?: 1024 + } else 1024 + val initialHeight = if (initialValue is Map<*, *>) { + (initialValue["height"] as? Number)?.toInt() ?: 1024 + } else 1024 + + var selectedPreset by remember { mutableStateOf(initialPreset) } + var isCustom by remember { mutableStateOf(initialIsCustom) } + var width by remember { mutableIntStateOf(initialWidth) } + var height by remember { mutableIntStateOf(initialHeight) } + + // Build dropdown options: presets + custom + val allOptions = remember(property.enumValues) { + property.enumValues + CUSTOM_SIZE_OPTION + } + + // Format preset names for display + val formatPresetName: (String) -> String = { preset -> + when (preset) { + CUSTOM_SIZE_OPTION -> "Custom" + else -> preset + } + } + + Column(modifier = Modifier.fillMaxWidth()) { + Text( + text = property.title, + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.padding(bottom = 8.dp), + ) + + // Preset dropdown + DropdownTextField( + modifier = Modifier.fillMaxWidth(), + label = "Size preset".asUiText(), + value = selectedPreset, + items = allOptions, + onItemSelected = { preset -> + selectedPreset = preset + isCustom = preset == CUSTOM_SIZE_OPTION + if (isCustom) { + onValueChange(mapOf("width" to width, "height" to height)) + } else { + onValueChange(preset) + } + }, + displayDelegate = { formatPresetName(it).asUiText() }, + ) + + // Custom dimensions inputs (shown when custom is selected) + AnimatedVisibility( + visible = isCustom, + enter = expandVertically(), + exit = shrinkVertically(), + ) { + Column(modifier = Modifier.padding(top = 12.dp)) { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + ) { + // Width input + Column(modifier = Modifier.weight(1f)) { + Text( + text = "Width", + style = MaterialTheme.typography.bodySmall, + modifier = Modifier.padding(bottom = 4.dp), + ) + TextField( + modifier = Modifier.fillMaxWidth(), + value = width.toString(), + onValueChange = { newValue -> + newValue.toIntOrNull()?.let { w -> + width = w.coerceIn(1, 14142) + onValueChange(mapOf("width" to width, "height" to height)) + } + }, + singleLine = true, + keyboardOptions = KeyboardOptions( + keyboardType = KeyboardType.Number, + imeAction = ImeAction.Next, + ), + colors = textFieldColors, + ) + } + + Spacer(modifier = Modifier.width(16.dp)) + + // Height input + Column(modifier = Modifier.weight(1f)) { + Text( + text = "Height", + style = MaterialTheme.typography.bodySmall, + modifier = Modifier.padding(bottom = 4.dp), + ) + TextField( + modifier = Modifier.fillMaxWidth(), + value = height.toString(), + onValueChange = { newValue -> + newValue.toIntOrNull()?.let { h -> + height = h.coerceIn(1, 14142) + onValueChange(mapOf("width" to width, "height" to height)) + } + }, + singleLine = true, + keyboardOptions = KeyboardOptions( + keyboardType = KeyboardType.Number, + imeAction = ImeAction.Done, + ), + colors = textFieldColors, + ) + } + } + + Text( + text = "Range: 1 - 14142 pixels", + style = MaterialTheme.typography.bodySmall, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(top = 4.dp), + ) + } + } + } +} + +@Composable +private fun FalAiArrayField( + property: FalAiPropertyUi, + onValueChange: (Any?) -> Unit, +) { + val itemProperties = property.arrayItemProperties ?: return + + // Parse current value as list of maps + @Suppress("UNCHECKED_CAST") + val initialItems = when (val current = property.currentValue) { + is List<*> -> current.filterIsInstance>().toMutableList() + else -> mutableListOf() + } + + var items by remember { mutableStateOf(initialItems) } + + // Update items when currentValue changes externally + LaunchedEffect(property.currentValue) { + @Suppress("UNCHECKED_CAST") + val newItems = when (val current = property.currentValue) { + is List<*> -> current.filterIsInstance>().toMutableList() + else -> mutableListOf() + } + if (newItems != items) { + items = newItems + } + } + + Column(modifier = Modifier.fillMaxWidth()) { + // Header with title and add button + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + text = property.title, + style = MaterialTheme.typography.titleMedium, + modifier = Modifier.weight(1f), + ) + OutlinedButton( + onClick = { + // Create new item with default values + val newItem = itemProperties.associate { prop -> + prop.name to prop.defaultValue + } + items = (items + newItem).toMutableList() + onValueChange(items) + }, + ) { + Icon( + imageVector = Icons.Default.Add, + contentDescription = "Add", + modifier = Modifier.padding(end = 4.dp), + ) + Text(text = "Add ${if (property.name == "loras") "LoRA" else "Item"}") + } + } + + Spacer(modifier = Modifier.height(8.dp)) + + // List of items + items.forEachIndexed { index, item -> + FalAiArrayItem( + index = index, + item = item, + itemProperties = itemProperties, + isLora = property.name == "loras", + onItemChange = { updatedItem -> + items = items.toMutableList().apply { + set(index, updatedItem) + } + onValueChange(items) + }, + onRemove = { + items = items.toMutableList().apply { + removeAt(index) + } + onValueChange(items) + }, + ) + if (index < items.size - 1) { + Spacer(modifier = Modifier.height(8.dp)) + } + } + + if (items.isEmpty()) { + Text( + text = "No items added yet", + style = MaterialTheme.typography.bodyMedium, + color = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier.padding(vertical = 16.dp), + ) + } + } +} + +@Composable +private fun FalAiArrayItem( + index: Int, + item: Map, + itemProperties: List, + isLora: Boolean, + onItemChange: (Map) -> Unit, + onRemove: () -> Unit, +) { + Column( + modifier = Modifier + .fillMaxWidth() + .border( + width = 1.dp, + color = MaterialTheme.colorScheme.outline.copy(alpha = 0.5f), + shape = RoundedCornerShape(8.dp), + ) + .padding(12.dp), + ) { + // Item header with number and delete button + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + ) { + Text( + text = if (isLora) "LoRA ${index + 1}" else "Item ${index + 1}", + style = MaterialTheme.typography.titleSmall, + modifier = Modifier.weight(1f), + ) + IconButton(onClick = onRemove) { + Icon( + imageVector = Icons.Default.Delete, + contentDescription = "Remove", + tint = MaterialTheme.colorScheme.error, + ) + } + } + + // Render each property in the item + itemProperties.forEach { prop -> + val currentValue = item[prop.name] + val propertyWithValue = prop.copy(currentValue = currentValue) + + when (prop.type) { + FalAiPropertyType.STRING -> { + FalAiStringField(propertyWithValue) { newValue -> + onItemChange(item + (prop.name to newValue)) + } + } + FalAiPropertyType.NUMBER -> { + FalAiNumberField(propertyWithValue) { newValue -> + onItemChange(item + (prop.name to newValue)) + } + } + FalAiPropertyType.INTEGER -> { + FalAiIntegerField(propertyWithValue) { newValue -> + onItemChange(item + (prop.name to newValue)) + } + } + FalAiPropertyType.BOOLEAN -> { + FalAiBooleanField(propertyWithValue) { newValue -> + onItemChange(item + (prop.name to newValue)) + } + } + FalAiPropertyType.ENUM -> { + FalAiEnumField(propertyWithValue) { newValue -> + onItemChange(item + (prop.name to newValue)) + } + } + else -> { + // Default to string field for unsupported types + FalAiStringField(propertyWithValue) { newValue -> + onItemChange(item + (prop.name to newValue)) + } + } + } + } + } +} + +private fun base64DataUriToBitmap(dataUri: String): Bitmap? { + try { + val base64Image = dataUri.substringAfter("base64,") + val decodedString = Base64.decode(base64Image, Base64.DEFAULT) + return BitmapFactory.decodeByteArray(decodedString, 0, decodedString.size) + } catch (e: Exception) { + e.printStackTrace() + return null + } +} + diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/source/ServerSourceLabel.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/source/ServerSourceLabel.kt index 4ee15fd44..6c6179ea4 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/source/ServerSourceLabel.kt +++ b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/source/ServerSourceLabel.kt @@ -20,5 +20,6 @@ fun ServerSource.getNameUiText(): UiText = when (this) { ServerSource.HUGGING_FACE -> LocalizationR.string.srv_type_hugging_face ServerSource.OPEN_AI -> LocalizationR.string.srv_type_open_ai ServerSource.STABILITY_AI -> LocalizationR.string.srv_type_stability_ai + ServerSource.FAL_AI -> LocalizationR.string.srv_type_fal_ai ServerSource.SWARM_UI -> LocalizationR.string.srv_type_swarm_ui }.asUiText() diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/PersistentDatabase.kt b/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/PersistentDatabase.kt index b5656278a..a6e648314 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/PersistentDatabase.kt +++ b/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/PersistentDatabase.kt @@ -18,6 +18,7 @@ import com.shifthackz.aisdv1.storage.db.persistent.entity.* LocalModelEntity::class, HuggingFaceModelEntity::class, SupporterEntity::class, + FalAiEndpointEntity::class, ], autoMigrations = [ /** @@ -49,6 +50,15 @@ import com.shifthackz.aisdv1.storage.db.persistent.entity.* * - [GenerationResultContract.HIDDEN] */ AutoMigration(from = 6, to = 7), + /** + * Added [FalAiEndpointEntity]. + * Added 1 field to [FalAiEndpointEntity]: GROUP + * Added 3 fields to [GenerationResultEntity] for file-based media storage: + * - [GenerationResultContract.MEDIA_PATH] + * - [GenerationResultContract.INPUT_MEDIA_PATH] + * - [GenerationResultContract.MEDIA_TYPE] + */ + AutoMigration(from = 7, to = 8), ], ) @TypeConverters( @@ -60,9 +70,10 @@ internal abstract class PersistentDatabase : RoomDatabase() { abstract fun localModelDao(): LocalModelDao abstract fun huggingFaceModelDao(): HuggingFaceModelDao abstract fun supporterDao(): SupporterDao + abstract fun falAiEndpointDao(): FalAiEndpointDao companion object { const val DB_NAME = "ai_sd_v1_storage_db" - const val DB_VERSION = 7 + const val DB_VERSION = 8 } } diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/contract/FalAiEndpointContract.kt b/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/contract/FalAiEndpointContract.kt new file mode 100644 index 000000000..d07624265 --- /dev/null +++ b/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/contract/FalAiEndpointContract.kt @@ -0,0 +1,16 @@ +package com.shifthackz.aisdv1.storage.db.persistent.contract + +internal object FalAiEndpointContract { + const val TABLE = "fal_ai_endpoints" + const val ID = "id" + const val ENDPOINT_ID = "endpoint_id" + const val TITLE = "title" + const val DESCRIPTION = "description" + const val CATEGORY = "category" + const val GROUP = "group_name" + const val THUMBNAIL_URL = "thumbnail_url" + const val PLAYGROUND_URL = "playground_url" + const val DOCUMENTATION_URL = "documentation_url" + const val IS_CUSTOM = "is_custom" + const val SCHEMA_JSON = "schema_json" +} diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/dao/FalAiEndpointDao.kt b/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/dao/FalAiEndpointDao.kt new file mode 100644 index 000000000..6089d592d --- /dev/null +++ b/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/dao/FalAiEndpointDao.kt @@ -0,0 +1,33 @@ +package com.shifthackz.aisdv1.storage.db.persistent.dao + +import androidx.room.Dao +import androidx.room.Insert +import androidx.room.OnConflictStrategy +import androidx.room.Query +import com.shifthackz.aisdv1.storage.db.persistent.contract.FalAiEndpointContract +import com.shifthackz.aisdv1.storage.db.persistent.entity.FalAiEndpointEntity +import io.reactivex.rxjava3.core.Completable +import io.reactivex.rxjava3.core.Flowable +import io.reactivex.rxjava3.core.Single + +@Dao +interface FalAiEndpointDao { + + @Query("SELECT * FROM ${FalAiEndpointContract.TABLE}") + fun observeAll(): Flowable> + + @Query("SELECT * FROM ${FalAiEndpointContract.TABLE}") + fun queryAll(): Single> + + @Query("SELECT * FROM ${FalAiEndpointContract.TABLE} WHERE ${FalAiEndpointContract.ID} = :id") + fun queryById(id: String): Single + + @Insert(onConflict = OnConflictStrategy.REPLACE) + fun insert(entity: FalAiEndpointEntity): Completable + + @Query("DELETE FROM ${FalAiEndpointContract.TABLE} WHERE ${FalAiEndpointContract.ID} = :id") + fun deleteById(id: String): Completable + + @Query("DELETE FROM ${FalAiEndpointContract.TABLE}") + fun deleteAll(): Completable +} diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/entity/FalAiEndpointEntity.kt b/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/entity/FalAiEndpointEntity.kt new file mode 100644 index 000000000..a1563693c --- /dev/null +++ b/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/entity/FalAiEndpointEntity.kt @@ -0,0 +1,43 @@ +package com.shifthackz.aisdv1.storage.db.persistent.entity + +import androidx.room.ColumnInfo +import androidx.room.Entity +import androidx.room.PrimaryKey +import com.shifthackz.aisdv1.storage.db.persistent.contract.FalAiEndpointContract + +@Entity(tableName = FalAiEndpointContract.TABLE) +data class FalAiEndpointEntity( + @PrimaryKey + @ColumnInfo(name = FalAiEndpointContract.ID) + val id: String, + + @ColumnInfo(name = FalAiEndpointContract.ENDPOINT_ID) + val endpointId: String, + + @ColumnInfo(name = FalAiEndpointContract.TITLE) + val title: String, + + @ColumnInfo(name = FalAiEndpointContract.DESCRIPTION) + val description: String, + + @ColumnInfo(name = FalAiEndpointContract.CATEGORY) + val category: String, + + @ColumnInfo(name = FalAiEndpointContract.GROUP, defaultValue = "Custom") + val group: String, + + @ColumnInfo(name = FalAiEndpointContract.THUMBNAIL_URL) + val thumbnailUrl: String, + + @ColumnInfo(name = FalAiEndpointContract.PLAYGROUND_URL) + val playgroundUrl: String, + + @ColumnInfo(name = FalAiEndpointContract.DOCUMENTATION_URL) + val documentationUrl: String, + + @ColumnInfo(name = FalAiEndpointContract.IS_CUSTOM, defaultValue = "1") + val isCustom: Boolean, + + @ColumnInfo(name = FalAiEndpointContract.SCHEMA_JSON) + val schemaJson: String, +) diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/di/DatabaseModule.kt b/storage/src/main/java/com/shifthackz/aisdv1/storage/di/DatabaseModule.kt index 5c22374a4..000de3fdd 100755 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/di/DatabaseModule.kt +++ b/storage/src/main/java/com/shifthackz/aisdv1/storage/di/DatabaseModule.kt @@ -51,5 +51,6 @@ val databaseModule = module { single { get().localModelDao() } single { get().huggingFaceModelDao() } single { get().supporterDao() } + single { get().falAiEndpointDao() } //endregion } From a8df743303b6b6dec8eac959cde816b564853f6e Mon Sep 17 00:00:00 2001 From: crim50n Date: Mon, 29 Dec 2025 22:55:21 +0300 Subject: [PATCH 06/42] Update translations --- .../src/main/res/values-ru/strings.xml | 32 ++++++++++++++++-- .../src/main/res/values-tr/strings.xml | 27 +++++++++++++-- .../src/main/res/values-uk/strings.xml | 33 +++++++++++++++---- .../src/main/res/values-zh/strings.xml | 23 ++++++++++++- .../src/main/res/values/strings.xml | 29 ++++++++++++++++ 5 files changed, 132 insertions(+), 12 deletions(-) diff --git a/core/localization/src/main/res/values-ru/strings.xml b/core/localization/src/main/res/values-ru/strings.xml index 61871dd5e..400767176 100644 --- a/core/localization/src/main/res/values-ru/strings.xml +++ b/core/localization/src/main/res/values-ru/strings.xml @@ -10,8 +10,10 @@ Повторить Удалить Загрузить - Длина + Ширина Высота + Поменять местами + Соотношение сторон Просмотр Применить Закрыть @@ -71,7 +73,22 @@ Генерация без интернета Собственный сервер CFG Шкала: %1$s + Distilled CFG Scale: %1$s + Тип модели + VAE / Text Encoder Метод выборки + Планировщик + ADetailer + Включить ADetailer + Модель детекции + Порог уверенности: %1$s + Шумоподавление: %1$s + Hires. Fix + Включить Hires. Fix + Апскейлер + Масштаб: %1$s + Шаги: %1$s (0 = как в первом проходе) + Шумоподавление: %1$s Стиль Клиппинг пресет Восстановление лиц @@ -130,7 +147,13 @@ О Stability AI Stability AI движок - Укажите свйой URL-адрес Swarm UI + Подключиться к Fal AI + Fal AI — быстрая serverless платформа для запуска FLUX и других моделей. + О Fal AI + Fal AI модель + Fal AI эндпоинт + + Укажите свой URL-адрес Swarm UI Модульный веб-интерфейс Stable Diffusion, в котором особое внимание уделяется обеспечению легкого доступа к инструментам, высокой производительности и расширяемости. Эта конфигурация использует Microsoft ONNX и позволяет запускать генерации Stable Diffusion на вашем телефоне без необходимости подключаться к удаленному серверу/облаку. @@ -148,6 +171,8 @@ Изображение Оригинал Подробности + Изображение сохранено в галерею + Все изображения сохранены в галерею Текст в Картинку Картинка в Картинку @@ -184,6 +209,7 @@ Выбранно: %1$s Удалить все Экспортировать все + Сохранить все на устройство Режим выбора Параметры AI @@ -238,6 +264,8 @@ Экспорт галереи Эта функция экспортирует все изображения галереи в архив *.zip. Этот процесс может длиться долго, если у вас много изображений. Желаете продолжить? Эта функция экспортирует выбранные изображения галереи в архив *.zip. Желаете продолжить? + Сохранить в галерею устройства + Это сохранит все изображения в галерею вашего устройства. Процесс может занять некоторое время, если у вас много изображений. Желаете продолжить? Это приведет к сбросу настроек программы и удалению всех созданных изображений. Вы хотите продолжить? Предупреждение diff --git a/core/localization/src/main/res/values-tr/strings.xml b/core/localization/src/main/res/values-tr/strings.xml index 5026c1151..d64abbbe2 100644 --- a/core/localization/src/main/res/values-tr/strings.xml +++ b/core/localization/src/main/res/values-tr/strings.xml @@ -7,14 +7,14 @@ Evet Hayır İptal - yeniden dene + Yeniden dene Silmek İndirmek Genişlik Yükseklik Araştır Uygula - Kapalı + Kapat Sonraki ✅ Başarılı ❌ Başarısızlık @@ -68,10 +68,25 @@ Grup: %1$s Toplu üretim Çoklu Modeller - Çevrimdışı nesil + Çevrimdışı oluşturma Kendi Sunucumuz CFG Scale: %1$s + Distilled CFG Scale: %1$s + Model türü + VAE / Text Encoder Örneklerme Yöntemi + Zamanlayıcı + ADetailer + ADetailer\'ı Etkinleştir + Algılama modeli + Güven eşiği: %1$s + Gürültü giderme: %1$s + Hires. Fix + Hires. Fix\'i Etkinleştir + Yükseltici + Ölçek: %1$s + Adımlar: %1$s (0 = aynı) + Gürültü giderme: %1$s Stil ön ayarı Klip yönlendirme ön ayarı Yüzleri Düzelt @@ -130,6 +145,12 @@ Hakkında Stability AI Stability AI motoru + Fal AI\'ya bağlanın + Fal AI, FLUX ve diğer modelleri çalıştırmak için hızlı bir serverless platformdur. + Hakkında Fal AI + Fal AI modeli + Fal AI endpoint + Swarm UI URL\'nizi sağlayın Araçlara kolay erişim, yüksek performans ve genişletilebilirlik üzerine odaklanan Modüler, Kararlı Yaygın Web Kullanıcı Arayüzü. diff --git a/core/localization/src/main/res/values-uk/strings.xml b/core/localization/src/main/res/values-uk/strings.xml index 07b329dac..77bea6c6a 100644 --- a/core/localization/src/main/res/values-uk/strings.xml +++ b/core/localization/src/main/res/values-uk/strings.xml @@ -10,7 +10,7 @@ Повторити Видалити Завантажити - Довжина + Ширина Висота Дивитися Застосувати @@ -71,7 +71,22 @@ Генерація без інтернету Власний сервер CFG Шкала: %1$s + Distilled CFG Scale: %1$s + Тип моделі + VAE / Text Encoder Метод вибірки + Планувальник + ADetailer + Увімкнути ADetailer + Модель детекції + Поріг впевненості: %1$s + Шумозаглушення: %1$s + Hires. Fix + Увімкнути Hires. Fix + Апскейлер + Масштаб: %1$s + Кроки: %1$s (0 = як у першому проході) + Шумозаглушення: %1$s Стиль Кліпінг пресет Відновлення обличч @@ -91,7 +106,7 @@ Тег Значення Блюр маски: %1$s - Відтупи (тільки маска): %1$s px + Відступи (тільки маска): %1$s px Режим маски Контент маски Область Inpaint @@ -116,7 +131,7 @@ Про Horde AI Отримати свій API Ключ - Підключитися доHugging Face + Підключитися до Hugging Face Hugging Face дозволяє тестувати та оцінювати загальнодоступні моделі машинного навчання або ваші власні приватні моделі. Про Hugging Face Hugging Face модель @@ -130,7 +145,13 @@ Про Stability AI Stability AI двигун - Provide your Swarm UI URL + Підключитися до Fal AI + Fal AI — швидка serverless платформа для запуску FLUX та інших моделей. + Про Fal AI + Fal AI модель + Fal AI ендпоінт + + Вкажіть URL-адресу Swarm UI Модульний веб-інтерфейс Stable Diffusion з наголосом на полегшення доступу до інструментів, високу продуктивність і розширюваність. Ця конфігурація використовує Microsoft ONNX та дозволяє запускати генерації Stable Diffusion на вашому телефоні без необхідності підключатися до віддаленого сервера/хмари. @@ -229,7 +250,7 @@ Завантажуємо випадкове зображення… Генерація Local Diffusion Час очікування: %1$s - Поизиція в черзі: %1$s + Позиція в черзі: %1$s Крок: %1$s/%2$s Експортування вашої галереї… @@ -351,7 +372,7 @@ Push повідомлення Додаток не має дозволів. - Довольте права на %1$s в налаштуваннях. + Дозвольте права на %1$s в налаштуваннях. UI Потік I/O Потік diff --git a/core/localization/src/main/res/values-zh/strings.xml b/core/localization/src/main/res/values-zh/strings.xml index a8c4012d0..8c5a99c97 100644 --- a/core/localization/src/main/res/values-zh/strings.xml +++ b/core/localization/src/main/res/values-zh/strings.xml @@ -87,7 +87,22 @@ 离线生成 个人服务器 CFG 缩放: %1$s + Distilled CFG Scale: %1$s + 模型类型 + VAE / 文本编码器 采样方法 + 调度器 + ADetailer + 启用 ADetailer + 检测模型 + 置信度: %1$s + 去噪强度: %1$s + Hires. Fix + 启用 Hires. Fix + 放大器 + 比例: %1$s + 步数: %1$s (0 = 相同) + 去噪强度: %1$s 风格预设 Clip 引导预设 恢复面孔 @@ -152,6 +167,12 @@ 关于 Stability AI Stability AI 引擎 + 连接到 Fal AI + Fal AI 是一个用于运行 FLUX 和其他模型的快速无服务器平台。 + 关于 Fal AI + Fal AI 模型 + Fal AI 端点 + 提供你的 Swarm UI URL 模块化的 Stable Diffusion Web 用户界面,专注于易访问、高性能和可扩展性。 @@ -412,7 +433,7 @@ 高级功能\n[稳定扩散]。 [离线]生成\n本地扩散。 自定义应用程序,\n让它成为[您的]! - [自由]选择\n代提供商。 + [自由]选择\n生成提供商。 举报图片 提交举报 diff --git a/core/localization/src/main/res/values/strings.xml b/core/localization/src/main/res/values/strings.xml index c767358e6..0d3198904 100755 --- a/core/localization/src/main/res/values/strings.xml +++ b/core/localization/src/main/res/values/strings.xml @@ -16,6 +16,8 @@ Download Width Height + Swap dimensions + Aspect ratio Browse Apply Close @@ -78,6 +80,7 @@ HuggingFace Open AI Stability AI + Fal AI Swarm UI Prompt @@ -89,7 +92,22 @@ Offline generation Own Server CFG Scale: %1$s + Distilled CFG Scale: %1$s + Model type + VAE / Text Encoder Sampling method + Scheduler + ADetailer + Enable ADetailer + Detection model + Confidence: %1$s + Denoising: %1$s + Hires. Fix + Enable Hires. Fix + Upscaler + Scale: %1$s + Steps: %1$s (0 = same) + Denoising: %1$s Style preset Clip guidance preset Restore faces @@ -149,6 +167,12 @@ About Stability AI Stability AI Engine + Connect to Fal AI + Fal AI is a fast serverless inference platform for running FLUX and other models. + About Fal AI + Fal AI Model + Fal AI Endpoint + Provide your Swarm UI URL A Modular Stable Diffusion Web-User-Interface, with an emphasis on making tools easily accessible, high performance, and extensibility. @@ -207,7 +231,10 @@ Selected images: %1$s Delete all Export all + Save all to device Selection mode + Image saved to gallery + All images saved to gallery AI settings App settings @@ -261,6 +288,8 @@ Gallery Export This will export all the gallery images as *.zip archive. This process may be long if you have many images, would you like to proceed? This will export selected gallery images as *.zip archive. Would you like to proceed? + Save to Device Gallery + This will save all images to your device gallery. This process may take some time if you have many images. Would you like to proceed? This will reset app settings and delete all the generated images. Do you want to proceed? Warning From 2c358643e948e959b4436f5b5dca6903796ac1e2 Mon Sep 17 00:00:00 2001 From: crim50n Date: Tue, 30 Dec 2025 11:11:47 +0300 Subject: [PATCH 07/42] test: add tests for Fal.AI, ForgeModules and fix existing tests - Add tests for FalAiEndpointRepositoryImpl, FalAiGenerationRepositoryImpl, ForgeModulesRepositoryImpl - Add tests for TestFalAiApiKeyUseCaseImpl, GetForgeModulesUseCaseImpl, GetGalleryPagedIdsUseCaseImpl - Add tests for FalAiGenerationUseCaseImpl, ConnectToFalAiUseCaseImpl - Fix existing tests: add mediaFileManager, falAiApiKey, mediaPath/inputMediaPath mocks - Add mock files for FalAi and ForgeModule entities --- .../data/mocks/AiGenerationResultMocks.kt | 4 + .../aisdv1/data/mocks/FalAiMocks.kt | 53 ++++ .../aisdv1/data/mocks/ForgeModuleMocks.kt | 16 ++ .../data/mocks/GenerationResultEntityMocks.kt | 3 + .../FalAiEndpointRepositoryImplTest.kt | 253 ++++++++++++++++++ .../FalAiGenerationRepositoryImplTest.kt | 178 ++++++++++++ .../ForgeModulesRepositoryImplTest.kt | 100 +++++++ .../GenerationResultRepositoryImplTest.kt | 51 ++++ .../HordeGenerationRepositoryImplTest.kt | 5 +- ...HuggingFaceGenerationRepositoryImplTest.kt | 5 +- ...alDiffusionGenerationRepositoryImplTest.kt | 5 +- .../OpenAiGenerationRepositoryImplTest.kt | 5 +- ...StabilityAiGenerationRepositoryImplTest.kt | 5 +- ...leDiffusionGenerationRepositoryImplTest.kt | 7 +- .../SwarmUiGenerationRepositoryImplTest.kt | 9 +- .../domain/mocks/AiGenerationResultMocks.kt | 4 + .../aisdv1/domain/mocks/ConfigurationMocks.kt | 3 + .../aisdv1/domain/mocks/FalAiMocks.kt | 53 ++++ .../aisdv1/domain/mocks/ForgeModuleMocks.kt | 16 ++ .../caching/DataPreLoaderUseCaseImplTest.kt | 66 ++++- .../TestFalAiApiKeyUseCaseImplTest.kt | 56 ++++ .../GetForgeModulesUseCaseImplTest.kt | 57 ++++ .../GetGalleryPagedIdsUseCaseImplTest.kt | 58 ++++ .../FalAiGenerationUseCaseImplTest.kt | 113 ++++++++ .../generation/TextToImageUseCaseImplTest.kt | 69 ++++- .../settings/ConnectToFalAiUseCaseImplTest.kt | 180 +++++++++++++ .../GetConfigurationUseCaseImplTest.kt | 4 + .../SetServerConfigurationUseCaseImplTest.kt | 4 + 28 files changed, 1370 insertions(+), 12 deletions(-) create mode 100644 data/src/test/java/com/shifthackz/aisdv1/data/mocks/FalAiMocks.kt create mode 100644 data/src/test/java/com/shifthackz/aisdv1/data/mocks/ForgeModuleMocks.kt create mode 100644 data/src/test/java/com/shifthackz/aisdv1/data/repository/FalAiEndpointRepositoryImplTest.kt create mode 100644 data/src/test/java/com/shifthackz/aisdv1/data/repository/FalAiGenerationRepositoryImplTest.kt create mode 100644 data/src/test/java/com/shifthackz/aisdv1/data/repository/ForgeModulesRepositoryImplTest.kt create mode 100644 domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/FalAiMocks.kt create mode 100644 domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/ForgeModuleMocks.kt create mode 100644 domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestFalAiApiKeyUseCaseImplTest.kt create mode 100644 domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/forgemodule/GetForgeModulesUseCaseImplTest.kt create mode 100644 domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryPagedIdsUseCaseImplTest.kt create mode 100644 domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/FalAiGenerationUseCaseImplTest.kt create mode 100644 domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToFalAiUseCaseImplTest.kt diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/AiGenerationResultMocks.kt b/data/src/test/java/com/shifthackz/aisdv1/data/mocks/AiGenerationResultMocks.kt index f36301b7e..d119e003a 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/AiGenerationResultMocks.kt +++ b/data/src/test/java/com/shifthackz/aisdv1/data/mocks/AiGenerationResultMocks.kt @@ -1,6 +1,7 @@ package com.shifthackz.aisdv1.data.mocks import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import com.shifthackz.aisdv1.domain.entity.MediaType import java.util.Date val mockAiGenerationResult = AiGenerationResult( @@ -22,6 +23,9 @@ val mockAiGenerationResult = AiGenerationResult( subSeedStrength = 5598f, denoisingStrength = 1504f, hidden = false, + mediaPath = "", + inputMediaPath = "", + mediaType = MediaType.IMAGE, ) val mockAiGenerationResults = listOf(mockAiGenerationResult) diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/FalAiMocks.kt b/data/src/test/java/com/shifthackz/aisdv1/data/mocks/FalAiMocks.kt new file mode 100644 index 000000000..553ea1d07 --- /dev/null +++ b/data/src/test/java/com/shifthackz/aisdv1/data/mocks/FalAiMocks.kt @@ -0,0 +1,53 @@ +package com.shifthackz.aisdv1.data.mocks + +import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint +import com.shifthackz.aisdv1.domain.entity.FalAiEndpointCategory +import com.shifthackz.aisdv1.domain.entity.FalAiEndpointSchema +import com.shifthackz.aisdv1.domain.entity.FalAiInputProperty +import com.shifthackz.aisdv1.domain.entity.FalAiPayload +import com.shifthackz.aisdv1.domain.entity.FalAiPropertyType + +val mockFalAiInputProperty = FalAiInputProperty( + name = "prompt", + title = "Prompt", + description = "The prompt to generate an image from", + type = FalAiPropertyType.STRING, + default = null, + minimum = null, + maximum = null, + enumValues = null, + isRequired = true, + isImageInput = false, +) + +val mockFalAiEndpointSchema = FalAiEndpointSchema( + baseUrl = "https://queue.fal.run", + submissionPath = "/fal-ai/flux/schnell", + inputProperties = listOf(mockFalAiInputProperty), + requiredProperties = listOf("prompt"), + propertyOrder = listOf("prompt"), +) + +val mockFalAiEndpoint = FalAiEndpoint( + id = "fal-ai/flux/schnell", + endpointId = "fal-ai/flux/schnell", + title = "FLUX.1 [schnell]", + description = "Fast text to image generation", + category = FalAiEndpointCategory.TEXT_TO_IMAGE, + group = "FLUX", + thumbnailUrl = "https://fal.ai/thumbnails/flux-schnell.jpg", + playgroundUrl = "https://fal.ai/models/fal-ai/flux/schnell", + documentationUrl = "https://fal.ai/models/fal-ai/flux/schnell/api", + isCustom = false, + schema = mockFalAiEndpointSchema, +) + +val mockFalAiEndpoints = listOf(mockFalAiEndpoint) + +val mockFalAiPayload = FalAiPayload( + endpointId = "fal-ai/flux/schnell", + parameters = mapOf( + "prompt" to "a beautiful sunset", + "num_inference_steps" to 4, + ), +) diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/ForgeModuleMocks.kt b/data/src/test/java/com/shifthackz/aisdv1/data/mocks/ForgeModuleMocks.kt new file mode 100644 index 000000000..79311a349 --- /dev/null +++ b/data/src/test/java/com/shifthackz/aisdv1/data/mocks/ForgeModuleMocks.kt @@ -0,0 +1,16 @@ +package com.shifthackz.aisdv1.data.mocks + +import com.shifthackz.aisdv1.domain.entity.ForgeModule + +val mockForgeModule = ForgeModule( + name = "ADetailer", + path = "extensions/adetailer", +) + +val mockForgeModules = listOf( + mockForgeModule, + ForgeModule( + name = "ControlNet", + path = "extensions/sd-webui-controlnet", + ), +) diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/GenerationResultEntityMocks.kt b/data/src/test/java/com/shifthackz/aisdv1/data/mocks/GenerationResultEntityMocks.kt index fd8fa9e4d..e69115664 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/GenerationResultEntityMocks.kt +++ b/data/src/test/java/com/shifthackz/aisdv1/data/mocks/GenerationResultEntityMocks.kt @@ -23,6 +23,9 @@ val mockGenerationResultEntity = GenerationResultEntity( subSeedStrength = 5598f, denoisingStrength = 1504f, hidden = false, + mediaPath = "", + inputMediaPath = "", + mediaType = "IMAGE", ) val mockGenerationResultEntities = listOf(mockGenerationResultEntity) diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/FalAiEndpointRepositoryImplTest.kt b/data/src/test/java/com/shifthackz/aisdv1/data/repository/FalAiEndpointRepositoryImplTest.kt new file mode 100644 index 000000000..8d054db16 --- /dev/null +++ b/data/src/test/java/com/shifthackz/aisdv1/data/repository/FalAiEndpointRepositoryImplTest.kt @@ -0,0 +1,253 @@ +package com.shifthackz.aisdv1.data.repository + +import com.shifthackz.aisdv1.data.mocks.mockFalAiEndpoint +import com.shifthackz.aisdv1.data.mocks.mockFalAiEndpoints +import com.shifthackz.aisdv1.domain.datasource.FalAiEndpointDataSource +import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import io.mockk.every +import io.mockk.mockk +import io.mockk.verify +import io.reactivex.rxjava3.core.Completable +import io.reactivex.rxjava3.core.Observable +import io.reactivex.rxjava3.core.Single +import org.junit.Test + +class FalAiEndpointRepositoryImplTest { + + private val stubException = Throwable("Something went wrong.") + private val stubBuiltInDataSource = mockk() + private val stubRemoteDataSource = mockk() + private val stubLocalDataSource = mockk() + private val stubPreferenceManager = mockk(relaxed = true) + + private val repository = FalAiEndpointRepositoryImpl( + builtInDataSource = stubBuiltInDataSource, + remoteDataSource = stubRemoteDataSource, + localDataSource = stubLocalDataSource, + preferenceManager = stubPreferenceManager, + ) + + @Test + fun `given attempt to observe all endpoints, both sources return data, expected combined list`() { + val customEndpoint = mockFalAiEndpoint.copy(id = "custom-endpoint", isCustom = true) + + every { + stubBuiltInDataSource.getAll() + } returns Single.just(mockFalAiEndpoints) + + every { + stubLocalDataSource.observeAll() + } returns Observable.just(listOf(customEndpoint)) + + repository + .observeAll() + .test() + .assertNoErrors() + .assertValueAt(1) { it.size == 2 && it.containsAll(mockFalAiEndpoints + customEndpoint) } + .dispose() + } + + @Test + fun `given attempt to get all endpoints, both sources return data, expected combined list`() { + val customEndpoint = mockFalAiEndpoint.copy(id = "custom-endpoint", isCustom = true) + + every { + stubBuiltInDataSource.getAll() + } returns Single.just(mockFalAiEndpoints) + + every { + stubLocalDataSource.getAll() + } returns Single.just(listOf(customEndpoint)) + + repository + .getAll() + .test() + .assertNoErrors() + .assertValue { it.size == 2 && it.containsAll(mockFalAiEndpoints + customEndpoint) } + .await() + .assertComplete() + } + + @Test + fun `given attempt to get all endpoints, local source fails, expected built-in endpoints only`() { + every { + stubBuiltInDataSource.getAll() + } returns Single.just(mockFalAiEndpoints) + + every { + stubLocalDataSource.getAll() + } returns Single.error(stubException) + + repository + .getAll() + .test() + .assertNoErrors() + .assertValue(mockFalAiEndpoints) + .await() + .assertComplete() + } + + @Test + fun `given attempt to get endpoint by id, endpoint exists, expected valid endpoint`() { + every { + stubBuiltInDataSource.getAll() + } returns Single.just(mockFalAiEndpoints) + + every { + stubLocalDataSource.getAll() + } returns Single.just(emptyList()) + + repository + .getById(mockFalAiEndpoint.id) + .test() + .assertNoErrors() + .assertValue(mockFalAiEndpoint) + .await() + .assertComplete() + } + + @Test + fun `given attempt to get endpoint by id, endpoint not found, expected error`() { + every { + stubBuiltInDataSource.getAll() + } returns Single.just(mockFalAiEndpoints) + + every { + stubLocalDataSource.getAll() + } returns Single.just(emptyList()) + + repository + .getById("non-existent-id") + .test() + .assertError { it is NoSuchElementException } + .assertNoValues() + .await() + .assertNotComplete() + } + + @Test + fun `given attempt to get selected endpoint, preference has valid id, expected valid endpoint`() { + every { + stubPreferenceManager.falAiSelectedEndpointId + } returns mockFalAiEndpoint.id + + every { + stubBuiltInDataSource.getAll() + } returns Single.just(mockFalAiEndpoints) + + every { + stubLocalDataSource.getAll() + } returns Single.just(emptyList()) + + repository + .getSelected() + .test() + .assertNoErrors() + .assertValue(mockFalAiEndpoint) + .await() + .assertComplete() + } + + @Test + fun `given attempt to get selected endpoint, preference is blank, expected first built-in endpoint`() { + every { + stubPreferenceManager.falAiSelectedEndpointId + } returns "" + + every { + stubBuiltInDataSource.getAll() + } returns Single.just(mockFalAiEndpoints) + + repository + .getSelected() + .test() + .assertNoErrors() + .assertValue(mockFalAiEndpoints.first()) + .await() + .assertComplete() + } + + @Test + fun `given attempt to set selected endpoint, expected preference updated`() { + every { + stubPreferenceManager.falAiSelectedEndpointId = any() + } returns Unit + + repository + .setSelected("new-endpoint-id") + .test() + .assertNoErrors() + .await() + .assertComplete() + + verify { stubPreferenceManager.falAiSelectedEndpointId = "new-endpoint-id" } + } + + @Test + fun `given attempt to import from url, remote returns endpoint, expected endpoint saved and returned`() { + val importedEndpoint = mockFalAiEndpoint.copy(id = "imported", isCustom = true) + + every { + stubRemoteDataSource.fetchFromUrl(any()) + } returns Single.just(importedEndpoint) + + every { + stubLocalDataSource.save(any()) + } returns Completable.complete() + + repository + .importFromUrl("https://fal.ai/api/openapi/queue/openapi.json?endpoint_id=test") + .test() + .assertNoErrors() + .assertValue(importedEndpoint) + .await() + .assertComplete() + + verify { stubLocalDataSource.save(importedEndpoint) } + } + + @Test + fun `given attempt to import from url, remote fails, expected error`() { + every { + stubRemoteDataSource.fetchFromUrl(any()) + } returns Single.error(stubException) + + repository + .importFromUrl("https://fal.ai/api/invalid") + .test() + .assertError(stubException) + .assertNoValues() + .await() + .assertNotComplete() + } + + @Test + fun `given attempt to delete endpoint, expected delete called on local source`() { + every { + stubLocalDataSource.delete(any()) + } returns Completable.complete() + + repository + .delete("endpoint-to-delete") + .test() + .assertNoErrors() + .await() + .assertComplete() + + verify { stubLocalDataSource.delete("endpoint-to-delete") } + } + + @Test + fun `given attempt to delete endpoint, local source fails, expected error`() { + every { + stubLocalDataSource.delete(any()) + } returns Completable.error(stubException) + + repository + .delete("endpoint-to-delete") + .test() + .assertError(stubException) + .await() + .assertNotComplete() + } +} diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/FalAiGenerationRepositoryImplTest.kt b/data/src/test/java/com/shifthackz/aisdv1/data/repository/FalAiGenerationRepositoryImplTest.kt new file mode 100644 index 000000000..63b75cc5a --- /dev/null +++ b/data/src/test/java/com/shifthackz/aisdv1/data/repository/FalAiGenerationRepositoryImplTest.kt @@ -0,0 +1,178 @@ +package com.shifthackz.aisdv1.data.repository + +import com.shifthackz.aisdv1.data.mocks.mockAiGenerationResult +import com.shifthackz.aisdv1.data.mocks.mockAiGenerationResults +import com.shifthackz.aisdv1.data.mocks.mockTextToImagePayload +import com.shifthackz.aisdv1.domain.datasource.FalAiGenerationDataSource +import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint +import com.shifthackz.aisdv1.domain.entity.FalAiEndpointCategory +import com.shifthackz.aisdv1.domain.entity.FalAiEndpointSchema +import com.shifthackz.aisdv1.domain.repository.FalAiEndpointRepository +import io.mockk.every +import io.mockk.mockk +import io.reactivex.rxjava3.core.Single +import org.junit.Test + +class FalAiGenerationRepositoryImplTest { + + private val stubException = Throwable("Something went wrong.") + private val stubRemoteDataSource = mockk() + private val stubEndpointRepository = mockk() + + private val stubEndpoint = FalAiEndpoint( + id = "fal-ai/flux/schnell", + endpointId = "fal-ai/flux/schnell", + title = "FLUX.1 [schnell]", + description = "Fast generation", + category = FalAiEndpointCategory.TEXT_TO_IMAGE, + group = "FLUX", + thumbnailUrl = "", + playgroundUrl = "", + documentationUrl = "", + isCustom = false, + schema = FalAiEndpointSchema( + baseUrl = "https://queue.fal.run", + submissionPath = "/fal-ai/flux/schnell", + inputProperties = emptyList(), + requiredProperties = emptyList(), + propertyOrder = emptyList(), + ), + ) + + private val repository = FalAiGenerationRepositoryImpl( + remoteDataSource = stubRemoteDataSource, + endpointRepository = stubEndpointRepository, + ) + + @Test + fun `given attempt to validate api key, remote returns true, expected true value`() { + every { + stubRemoteDataSource.validateApiKey() + } returns Single.just(true) + + repository + .validateApiKey() + .test() + .assertNoErrors() + .assertValue(true) + .await() + .assertComplete() + } + + @Test + fun `given attempt to validate api key, remote returns false, expected false value`() { + every { + stubRemoteDataSource.validateApiKey() + } returns Single.just(false) + + repository + .validateApiKey() + .test() + .assertNoErrors() + .assertValue(false) + .await() + .assertComplete() + } + + @Test + fun `given attempt to validate api key, remote throws exception, expected error value`() { + every { + stubRemoteDataSource.validateApiKey() + } returns Single.error(stubException) + + repository + .validateApiKey() + .test() + .assertError(stubException) + .assertNoValues() + .await() + .assertNotComplete() + } + + @Test + fun `given attempt to generate from text, endpoint selected and remote returns data, expected valid result`() { + every { + stubEndpointRepository.getSelected() + } returns Single.just(stubEndpoint) + + every { + stubRemoteDataSource.textToImage(any(), any()) + } returns Single.just(mockAiGenerationResult) + + repository + .generateFromText(mockTextToImagePayload) + .test() + .assertNoErrors() + .assertValue(mockAiGenerationResult) + .await() + .assertComplete() + } + + @Test + fun `given attempt to generate from text, endpoint selection fails, expected error value`() { + every { + stubEndpointRepository.getSelected() + } returns Single.error(stubException) + + repository + .generateFromText(mockTextToImagePayload) + .test() + .assertError(stubException) + .assertNoValues() + .await() + .assertNotComplete() + } + + @Test + fun `given attempt to generate from text, remote generation fails, expected error value`() { + every { + stubEndpointRepository.getSelected() + } returns Single.just(stubEndpoint) + + every { + stubRemoteDataSource.textToImage(any(), any()) + } returns Single.error(stubException) + + repository + .generateFromText(mockTextToImagePayload) + .test() + .assertError(stubException) + .assertNoValues() + .await() + .assertNotComplete() + } + + @Test + fun `given attempt to generate dynamic, remote returns data, expected valid results list`() { + val stubParameters = mapOf("prompt" to "test") + + every { + stubRemoteDataSource.generateDynamic(any(), any()) + } returns Single.just(mockAiGenerationResults) + + repository + .generateDynamic(stubEndpoint, stubParameters) + .test() + .assertNoErrors() + .assertValue(mockAiGenerationResults) + .await() + .assertComplete() + } + + @Test + fun `given attempt to generate dynamic, remote throws exception, expected error value`() { + val stubParameters = mapOf("prompt" to "test") + + every { + stubRemoteDataSource.generateDynamic(any(), any()) + } returns Single.error(stubException) + + repository + .generateDynamic(stubEndpoint, stubParameters) + .test() + .assertError(stubException) + .assertNoValues() + .await() + .assertNotComplete() + } +} diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/ForgeModulesRepositoryImplTest.kt b/data/src/test/java/com/shifthackz/aisdv1/data/repository/ForgeModulesRepositoryImplTest.kt new file mode 100644 index 000000000..30ade2e6c --- /dev/null +++ b/data/src/test/java/com/shifthackz/aisdv1/data/repository/ForgeModulesRepositoryImplTest.kt @@ -0,0 +1,100 @@ +package com.shifthackz.aisdv1.data.repository + +import com.shifthackz.aisdv1.data.provider.ServerUrlProvider +import com.shifthackz.aisdv1.domain.entity.ForgeModule +import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi +import com.shifthackz.aisdv1.network.model.ForgeModuleRaw +import io.mockk.every +import io.mockk.mockk +import io.reactivex.rxjava3.core.Single +import org.junit.Before +import org.junit.Test + +class ForgeModulesRepositoryImplTest { + + private val stubException = Throwable("Something went wrong.") + private val stubServerUrlProvider = mockk() + private val stubApi = mockk() + + private val stubModulesRaw = listOf( + ForgeModuleRaw(modelName = "ADetailer", filename = "extensions/adetailer"), + ForgeModuleRaw(modelName = "ControlNet", filename = "extensions/controlnet"), + ) + + private val expectedModules = listOf( + ForgeModule(name = "ADetailer", path = "extensions/adetailer"), + ForgeModule(name = "ControlNet", path = "extensions/controlnet"), + ) + + private val repository = ForgeModulesRepositoryImpl( + serverUrlProvider = stubServerUrlProvider, + api = stubApi, + ) + + @Before + fun initialize() { + every { + stubServerUrlProvider(any()) + } returns Single.just("http://192.168.0.1:7860/sdapi/v1/extensions") + } + + @Test + fun `given attempt to fetch modules, api returns data, expected valid modules list value`() { + every { + stubApi.fetchForgeModules(any()) + } returns Single.just(stubModulesRaw) + + repository + .fetchModules() + .test() + .assertNoErrors() + .assertValue(expectedModules) + .await() + .assertComplete() + } + + @Test + fun `given attempt to fetch modules, api returns empty list, expected empty list value`() { + every { + stubApi.fetchForgeModules(any()) + } returns Single.just(emptyList()) + + repository + .fetchModules() + .test() + .assertNoErrors() + .assertValue(emptyList()) + .await() + .assertComplete() + } + + @Test + fun `given attempt to fetch modules, api throws exception, expected empty list value due to onErrorReturn`() { + every { + stubApi.fetchForgeModules(any()) + } returns Single.error(stubException) + + repository + .fetchModules() + .test() + .assertNoErrors() + .assertValue(emptyList()) + .await() + .assertComplete() + } + + @Test + fun `given attempt to fetch modules, url provider fails, expected empty list value due to onErrorReturn`() { + every { + stubServerUrlProvider(any()) + } returns Single.error(stubException) + + repository + .fetchModules() + .test() + .assertNoErrors() + .assertValue(emptyList()) + .await() + .assertComplete() + } +} diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/GenerationResultRepositoryImplTest.kt b/data/src/test/java/com/shifthackz/aisdv1/data/repository/GenerationResultRepositoryImplTest.kt index a95b5d494..60733643f 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/GenerationResultRepositoryImplTest.kt +++ b/data/src/test/java/com/shifthackz/aisdv1/data/repository/GenerationResultRepositoryImplTest.kt @@ -5,6 +5,7 @@ import com.shifthackz.aisdv1.data.mocks.mockAiGenerationResult import com.shifthackz.aisdv1.data.mocks.mockAiGenerationResults import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource import com.shifthackz.aisdv1.domain.entity.MediaStoreInfo +import com.shifthackz.aisdv1.domain.feature.MediaFileManager import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway import com.shifthackz.aisdv1.domain.preference.PreferenceManager import io.mockk.every @@ -20,12 +21,14 @@ class GenerationResultRepositoryImplTest { private val stubMediaStoreGateway = mockk() private val stubBase64ToBitmapConverter = mockk() private val stubLocalDataSource = mockk() + private val stubMediaFileManager = mockk() private val repository = GenerationResultRepositoryImpl( preferenceManager = stubPreferenceManager, mediaStoreGateway = stubMediaStoreGateway, base64ToBitmapConverter = stubBase64ToBitmapConverter, localDataSource = stubLocalDataSource, + mediaFileManager = stubMediaFileManager, ) @Test @@ -180,6 +183,10 @@ class GenerationResultRepositoryImplTest { @Test fun `given attempt to delete by id list, local delete success, expected complete value`() { + every { + stubLocalDataSource.queryByIdList(any()) + } returns Single.just(mockAiGenerationResults) + every { stubLocalDataSource.deleteByIdList(any()) } returns Completable.complete() @@ -194,6 +201,10 @@ class GenerationResultRepositoryImplTest { @Test fun `given attempt to delete by id list, local delete fails, expected error value`() { + every { + stubLocalDataSource.queryByIdList(any()) + } returns Single.just(mockAiGenerationResults) + every { stubLocalDataSource.deleteByIdList(any()) } returns Completable.error(stubException) @@ -208,6 +219,10 @@ class GenerationResultRepositoryImplTest { @Test fun `given attempt to delete by id, local delete success, expected complete value`() { + every { + stubLocalDataSource.queryById(any()) + } returns Single.just(mockAiGenerationResult) + every { stubLocalDataSource.deleteById(any()) } returns Completable.complete() @@ -222,6 +237,10 @@ class GenerationResultRepositoryImplTest { @Test fun `given attempt to delete by id, local delete fails, expected error value`() { + every { + stubLocalDataSource.queryById(any()) + } returns Single.just(mockAiGenerationResult) + every { stubLocalDataSource.deleteById(any()) } returns Completable.error(stubException) @@ -236,6 +255,10 @@ class GenerationResultRepositoryImplTest { @Test fun `given attempt to delete all, local delete success, expected complete value`() { + every { + stubLocalDataSource.queryAll() + } returns Single.just(mockAiGenerationResults) + every { stubLocalDataSource.deleteAll() } returns Completable.complete() @@ -250,6 +273,10 @@ class GenerationResultRepositoryImplTest { @Test fun `given attempt to delete all, local delete fails, expected complete value`() { + every { + stubLocalDataSource.queryAll() + } returns Single.just(mockAiGenerationResults) + every { stubLocalDataSource.deleteAll() } returns Completable.error(stubException) @@ -268,6 +295,18 @@ class GenerationResultRepositoryImplTest { stubPreferenceManager.saveToMediaStore } returns false + every { + stubMediaFileManager.isFilePath(any()) + } returns false + + every { + stubMediaFileManager.isVideoUrl(any()) + } returns false + + every { + stubMediaFileManager.migrateBase64ToFile(any(), any()) + } returns "/path/to/file.png" + every { stubLocalDataSource.insert(any()) } returns Single.just(mockAiGenerationResult.id) @@ -287,6 +326,18 @@ class GenerationResultRepositoryImplTest { stubPreferenceManager.saveToMediaStore } returns false + every { + stubMediaFileManager.isFilePath(any()) + } returns false + + every { + stubMediaFileManager.isVideoUrl(any()) + } returns false + + every { + stubMediaFileManager.migrateBase64ToFile(any(), any()) + } returns "/path/to/file.png" + every { stubLocalDataSource.insert(any()) } returns Single.error(stubException) diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/HordeGenerationRepositoryImplTest.kt b/data/src/test/java/com/shifthackz/aisdv1/data/repository/HordeGenerationRepositoryImplTest.kt index 7254c0c84..aac8a8b79 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/HordeGenerationRepositoryImplTest.kt +++ b/data/src/test/java/com/shifthackz/aisdv1/data/repository/HordeGenerationRepositoryImplTest.kt @@ -7,6 +7,7 @@ import com.shifthackz.aisdv1.data.mocks.mockTextToImagePayload import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource import com.shifthackz.aisdv1.domain.datasource.HordeGenerationDataSource import com.shifthackz.aisdv1.domain.entity.HordeProcessStatus +import com.shifthackz.aisdv1.domain.feature.MediaFileManager import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway import com.shifthackz.aisdv1.domain.preference.PreferenceManager @@ -31,15 +32,17 @@ class HordeGenerationRepositoryImplTest { private val stubRemoteDataSource = mockk() private val stubStatusSource = mockk() private val stubBackgroundWorkObserver = mockk() + private val stubMediaFileManager = mockk() private val repository = HordeGenerationRepositoryImpl( mediaStoreGateway = stubMediaStoreGateway, base64ToBitmapConverter = stubBase64ToBitmapConverter, localDataSource = stubLocalDataSource, preferenceManager = stubPreferenceManager, + backgroundWorkObserver = stubBackgroundWorkObserver, + mediaFileManager = stubMediaFileManager, remoteDataSource = stubRemoteDataSource, statusSource = stubStatusSource, - backgroundWorkObserver = stubBackgroundWorkObserver, ) @Before diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/HuggingFaceGenerationRepositoryImplTest.kt b/data/src/test/java/com/shifthackz/aisdv1/data/repository/HuggingFaceGenerationRepositoryImplTest.kt index e3fca1960..dca79e23f 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/HuggingFaceGenerationRepositoryImplTest.kt +++ b/data/src/test/java/com/shifthackz/aisdv1/data/repository/HuggingFaceGenerationRepositoryImplTest.kt @@ -6,6 +6,7 @@ import com.shifthackz.aisdv1.data.mocks.mockImageToImagePayload import com.shifthackz.aisdv1.data.mocks.mockTextToImagePayload import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource import com.shifthackz.aisdv1.domain.datasource.HuggingFaceGenerationDataSource +import com.shifthackz.aisdv1.domain.feature.MediaFileManager import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway import com.shifthackz.aisdv1.domain.preference.PreferenceManager @@ -24,14 +25,16 @@ class HuggingFaceGenerationRepositoryImplTest { private val stubPreferenceManager = mockk() private val stubRemoteDataSource = mockk() private val stubBackgroundWorkObserver = mockk() + private val stubMediaFileManager = mockk() private val repository = HuggingFaceGenerationRepositoryImpl( mediaStoreGateway = stubMediaStoreGateway, base64ToBitmapConverter = stubBase64ToBitmapConverter, localDataSource = stubLocalDataSource, preferenceManager = stubPreferenceManager, - remoteDataSource = stubRemoteDataSource, backgroundWorkObserver = stubBackgroundWorkObserver, + mediaFileManager = stubMediaFileManager, + remoteDataSource = stubRemoteDataSource, ) @Before diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/LocalDiffusionGenerationRepositoryImplTest.kt b/data/src/test/java/com/shifthackz/aisdv1/data/repository/LocalDiffusionGenerationRepositoryImplTest.kt index 126edac1d..a598bbc8e 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/LocalDiffusionGenerationRepositoryImplTest.kt +++ b/data/src/test/java/com/shifthackz/aisdv1/data/repository/LocalDiffusionGenerationRepositoryImplTest.kt @@ -11,6 +11,7 @@ import com.shifthackz.aisdv1.domain.datasource.DownloadableModelDataSource import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource import com.shifthackz.aisdv1.domain.entity.AiGenerationResult import com.shifthackz.aisdv1.domain.entity.LocalDiffusionStatus +import com.shifthackz.aisdv1.domain.feature.MediaFileManager import com.shifthackz.aisdv1.domain.feature.diffusion.LocalDiffusion import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway @@ -41,6 +42,7 @@ class LocalDiffusionGenerationRepositoryImplTest { private val stubLocalDiffusion = mockk() private val stubDownloadableLocalDataSource = mockk() private val stubBackgroundWorkObserver = mockk() + private val stubMediaFileManager = mockk() private val stubSchedulersProvider = object : SchedulersProvider { override val io: Scheduler = Schedulers.trampoline() @@ -54,11 +56,12 @@ class LocalDiffusionGenerationRepositoryImplTest { base64ToBitmapConverter = stubBase64ToBitmapConverter, localDataSource = stubLocalDataSource, preferenceManager = stubPreferenceManager, + backgroundWorkObserver = stubBackgroundWorkObserver, + mediaFileManager = stubMediaFileManager, localDiffusion = stubLocalDiffusion, downloadableLocalDataSource = stubDownloadableLocalDataSource, bitmapToBase64Converter = stubBitmapToBase64Converter, schedulersProvider = stubSchedulersProvider, - backgroundWorkObserver = stubBackgroundWorkObserver, ) @Before diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/OpenAiGenerationRepositoryImplTest.kt b/data/src/test/java/com/shifthackz/aisdv1/data/repository/OpenAiGenerationRepositoryImplTest.kt index 2e014b7d9..ee166a9a2 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/OpenAiGenerationRepositoryImplTest.kt +++ b/data/src/test/java/com/shifthackz/aisdv1/data/repository/OpenAiGenerationRepositoryImplTest.kt @@ -5,6 +5,7 @@ import com.shifthackz.aisdv1.data.mocks.mockAiGenerationResult import com.shifthackz.aisdv1.data.mocks.mockTextToImagePayload import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource import com.shifthackz.aisdv1.domain.datasource.OpenAiGenerationDataSource +import com.shifthackz.aisdv1.domain.feature.MediaFileManager import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway import com.shifthackz.aisdv1.domain.preference.PreferenceManager @@ -23,14 +24,16 @@ class OpenAiGenerationRepositoryImplTest { private val stubPreferenceManager = mockk() private val stubRemoteDataSource = mockk() private val stubBackgroundWorkObserver = mockk() + private val stubMediaFileManager = mockk() private val repository = OpenAiGenerationRepositoryImpl( mediaStoreGateway = stubMediaStoreGateway, base64ToBitmapConverter = stubBase64ToBitmapConverter, localDataSource = stubLocalDataSource, preferenceManager = stubPreferenceManager, - remoteDataSource = stubRemoteDataSource, backgroundWorkObserver = stubBackgroundWorkObserver, + mediaFileManager = stubMediaFileManager, + remoteDataSource = stubRemoteDataSource, ) @Before diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/StabilityAiGenerationRepositoryImplTest.kt b/data/src/test/java/com/shifthackz/aisdv1/data/repository/StabilityAiGenerationRepositoryImplTest.kt index e80a07c31..52a881ca3 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/StabilityAiGenerationRepositoryImplTest.kt +++ b/data/src/test/java/com/shifthackz/aisdv1/data/repository/StabilityAiGenerationRepositoryImplTest.kt @@ -8,6 +8,7 @@ import com.shifthackz.aisdv1.data.mocks.mockTextToImagePayload import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource import com.shifthackz.aisdv1.domain.datasource.StabilityAiCreditsDataSource import com.shifthackz.aisdv1.domain.datasource.StabilityAiGenerationDataSource +import com.shifthackz.aisdv1.domain.feature.MediaFileManager import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway import com.shifthackz.aisdv1.domain.preference.PreferenceManager @@ -30,16 +31,18 @@ class StabilityAiGenerationRepositoryImplTest { private val stubCreditsRds = mockk() private val stubCreditsLds = mockk() private val stubBackgroundWorkObserver = mockk() + private val stubMediaFileManager = mockk() private val repository = StabilityAiGenerationRepositoryImpl( mediaStoreGateway = stubMediaStoreGateway, base64ToBitmapConverter = stubBase64ToBitmapConverter, localDataSource = stubLocalDataSource, preferenceManager = stubPreferenceManager, + backgroundWorkObserver = stubBackgroundWorkObserver, + mediaFileManager = stubMediaFileManager, generationRds = stubRemoteDataSource, creditsRds = stubCreditsRds, creditsLds = stubCreditsLds, - backgroundWorkObserver = stubBackgroundWorkObserver, ) @Before diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/StableDiffusionGenerationRepositoryImplTest.kt b/data/src/test/java/com/shifthackz/aisdv1/data/repository/StableDiffusionGenerationRepositoryImplTest.kt index 7bd941ec0..f436fb9e3 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/StableDiffusionGenerationRepositoryImplTest.kt +++ b/data/src/test/java/com/shifthackz/aisdv1/data/repository/StableDiffusionGenerationRepositoryImplTest.kt @@ -8,6 +8,7 @@ import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource import com.shifthackz.aisdv1.domain.datasource.StableDiffusionGenerationDataSource import com.shifthackz.aisdv1.domain.demo.ImageToImageDemo import com.shifthackz.aisdv1.domain.demo.TextToImageDemo +import com.shifthackz.aisdv1.domain.feature.MediaFileManager import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway import com.shifthackz.aisdv1.domain.preference.PreferenceManager @@ -29,16 +30,18 @@ class StableDiffusionGenerationRepositoryImplTest { private val stubTextToImageDemo = mockk() private val stubImageToImageDemo = mockk() private val stubBackgroundWorkObserver = mockk() + private val stubMediaFileManager = mockk() private val repository = StableDiffusionGenerationRepositoryImpl( mediaStoreGateway = stubMediaStoreGateway, base64ToBitmapConverter = stubBase64ToBitmapConverter, localDataSource = stubLocalDataSource, - remoteDataSource = stubRemoteDataSource, preferenceManager = stubPreferenceManager, + backgroundWorkObserver = stubBackgroundWorkObserver, + mediaFileManager = stubMediaFileManager, + remoteDataSource = stubRemoteDataSource, textToImageDemo = stubTextToImageDemo, imageToImageDemo = stubImageToImageDemo, - backgroundWorkObserver = stubBackgroundWorkObserver, ) @Before diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/SwarmUiGenerationRepositoryImplTest.kt b/data/src/test/java/com/shifthackz/aisdv1/data/repository/SwarmUiGenerationRepositoryImplTest.kt index 3d0f8e771..772350d26 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/SwarmUiGenerationRepositoryImplTest.kt +++ b/data/src/test/java/com/shifthackz/aisdv1/data/repository/SwarmUiGenerationRepositoryImplTest.kt @@ -7,6 +7,7 @@ import com.shifthackz.aisdv1.data.mocks.mockTextToImagePayload import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource import com.shifthackz.aisdv1.domain.datasource.SwarmUiGenerationDataSource import com.shifthackz.aisdv1.domain.datasource.SwarmUiSessionDataSource +import com.shifthackz.aisdv1.domain.feature.MediaFileManager import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway import com.shifthackz.aisdv1.domain.preference.PreferenceManager @@ -26,15 +27,17 @@ class SwarmUiGenerationRepositoryImplTest { private val stubSession = mockk() private val stubPreferenceManager = mockk() private val stubBackgroundWorkObserver = mockk() - + private val stubMediaFileManager = mockk() + private val repository = SwarmUiGenerationRepositoryImpl( mediaStoreGateway = stubMediaStoreGateway, base64ToBitmapConverter = stubBase64ToBitmapConverter, localDataSource = stubLocalDataSource, - remoteDataSource = stubRemoteDataSource, - session = stubSession, preferenceManager = stubPreferenceManager, backgroundWorkObserver = stubBackgroundWorkObserver, + mediaFileManager = stubMediaFileManager, + remoteDataSource = stubRemoteDataSource, + session = stubSession, ) @Before diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/AiGenerationResultMocks.kt b/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/AiGenerationResultMocks.kt index 8d51f0ae9..e0b611789 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/AiGenerationResultMocks.kt +++ b/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/AiGenerationResultMocks.kt @@ -1,6 +1,7 @@ package com.shifthackz.aisdv1.domain.mocks import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import com.shifthackz.aisdv1.domain.entity.MediaType import java.util.Date val mockAiGenerationResult = AiGenerationResult( @@ -22,6 +23,9 @@ val mockAiGenerationResult = AiGenerationResult( subSeedStrength = 5598f, denoisingStrength = 1504f, hidden = false, + mediaPath = "", + inputMediaPath = "", + mediaType = MediaType.IMAGE, ) val mockAiGenerationResults = listOf(mockAiGenerationResult) diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/ConfigurationMocks.kt b/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/ConfigurationMocks.kt index da1d486ac..395141e73 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/ConfigurationMocks.kt +++ b/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/ConfigurationMocks.kt @@ -12,6 +12,9 @@ val mockConfiguration = Configuration( huggingFaceModel = "5598", stabilityAiApiKey = "5598", stabilityAiEngineId = "5598", + falAiApiKey = "5598", localOnnxModelId = "5598", localOnnxModelPath = "/storage/emulated/0/5598", + localMediaPipeModelId = "5598", + localMediaPipeModelPath = "/storage/emulated/0/5598", ) diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/FalAiMocks.kt b/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/FalAiMocks.kt new file mode 100644 index 000000000..2165e0357 --- /dev/null +++ b/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/FalAiMocks.kt @@ -0,0 +1,53 @@ +package com.shifthackz.aisdv1.domain.mocks + +import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint +import com.shifthackz.aisdv1.domain.entity.FalAiEndpointCategory +import com.shifthackz.aisdv1.domain.entity.FalAiEndpointSchema +import com.shifthackz.aisdv1.domain.entity.FalAiInputProperty +import com.shifthackz.aisdv1.domain.entity.FalAiPayload +import com.shifthackz.aisdv1.domain.entity.FalAiPropertyType + +val mockFalAiInputProperty = FalAiInputProperty( + name = "prompt", + title = "Prompt", + description = "The prompt to generate an image from", + type = FalAiPropertyType.STRING, + default = null, + minimum = null, + maximum = null, + enumValues = null, + isRequired = true, + isImageInput = false, +) + +val mockFalAiEndpointSchema = FalAiEndpointSchema( + baseUrl = "https://queue.fal.run", + submissionPath = "/fal-ai/flux/schnell", + inputProperties = listOf(mockFalAiInputProperty), + requiredProperties = listOf("prompt"), + propertyOrder = listOf("prompt"), +) + +val mockFalAiEndpoint = FalAiEndpoint( + id = "fal-ai/flux/schnell", + endpointId = "fal-ai/flux/schnell", + title = "FLUX.1 [schnell]", + description = "Fast text to image generation", + category = FalAiEndpointCategory.TEXT_TO_IMAGE, + group = "FLUX", + thumbnailUrl = "https://fal.ai/thumbnails/flux-schnell.jpg", + playgroundUrl = "https://fal.ai/models/fal-ai/flux/schnell", + documentationUrl = "https://fal.ai/models/fal-ai/flux/schnell/api", + isCustom = false, + schema = mockFalAiEndpointSchema, +) + +val mockFalAiEndpoints = listOf(mockFalAiEndpoint) + +val mockFalAiPayload = FalAiPayload( + endpointId = "fal-ai/flux/schnell", + parameters = mapOf( + "prompt" to "a beautiful sunset", + "num_inference_steps" to 4, + ), +) diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/ForgeModuleMocks.kt b/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/ForgeModuleMocks.kt new file mode 100644 index 000000000..2f2f591af --- /dev/null +++ b/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/ForgeModuleMocks.kt @@ -0,0 +1,16 @@ +package com.shifthackz.aisdv1.domain.mocks + +import com.shifthackz.aisdv1.domain.entity.ForgeModule + +val mockForgeModule = ForgeModule( + name = "ADetailer", + path = "extensions/adetailer", +) + +val mockForgeModules = listOf( + mockForgeModule, + ForgeModule( + name = "ControlNet", + path = "extensions/sd-webui-controlnet", + ), +) diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/caching/DataPreLoaderUseCaseImplTest.kt b/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/caching/DataPreLoaderUseCaseImplTest.kt index 9a9209009..80059ad61 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/caching/DataPreLoaderUseCaseImplTest.kt +++ b/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/caching/DataPreLoaderUseCaseImplTest.kt @@ -2,7 +2,10 @@ package com.shifthackz.aisdv1.domain.usecase.caching import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever +import com.shifthackz.aisdv1.domain.entity.ServerSource +import com.shifthackz.aisdv1.domain.preference.PreferenceManager import com.shifthackz.aisdv1.domain.repository.EmbeddingsRepository +import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository import com.shifthackz.aisdv1.domain.repository.LorasRepository import com.shifthackz.aisdv1.domain.repository.ServerConfigurationRepository import com.shifthackz.aisdv1.domain.repository.StableDiffusionHyperNetworksRepository @@ -13,24 +16,34 @@ import org.junit.Test class DataPreLoaderUseCaseImplTest { + private val stubPreferenceManager = mock() private val stubServerConfigurationRepository = mock() private val stubStableDiffusionModelsRepository = mock() private val stubStableDiffusionSamplersRepository = mock() private val stubLorasRepository = mock() private val stubStableDiffusionHyperNetworksRepository = mock() private val stubEmbeddingsRepository = mock() + private val stubGenerationResultRepository = mock() private val useCase = DataPreLoaderUseCaseImpl( + preferenceManager = stubPreferenceManager, serverConfigurationRepository = stubServerConfigurationRepository, sdModelsRepository = stubStableDiffusionModelsRepository, sdSamplersRepository = stubStableDiffusionSamplersRepository, sdLorasRepository = stubLorasRepository, sdHyperNetworksRepository = stubStableDiffusionHyperNetworksRepository, sdEmbeddingsRepository = stubEmbeddingsRepository, + generationResultRepository = stubGenerationResultRepository, ) @Test - fun `given all data fetched successfully, expected complete value`() { + fun `given all data fetched successfully, source is AUTOMATIC1111, expected complete value`() { + whenever(stubPreferenceManager.source) + .thenReturn(ServerSource.AUTOMATIC1111) + + whenever(stubGenerationResultRepository.migrateBase64ToFiles()) + .thenReturn(Completable.complete()) + whenever(stubServerConfigurationRepository.fetchConfiguration()) .thenReturn(Completable.complete()) @@ -56,10 +69,31 @@ class DataPreLoaderUseCaseImplTest { .assertComplete() } + @Test + fun `given source is FAL_AI, expected only migration runs and completes`() { + whenever(stubPreferenceManager.source) + .thenReturn(ServerSource.FAL_AI) + + whenever(stubGenerationResultRepository.migrateBase64ToFiles()) + .thenReturn(Completable.complete()) + + useCase() + .test() + .assertNoErrors() + .await() + .assertComplete() + } + @Test fun `given configuration fetch failed, expected error value`() { val stubException = Throwable("Can not fetch configuration.") + whenever(stubPreferenceManager.source) + .thenReturn(ServerSource.AUTOMATIC1111) + + whenever(stubGenerationResultRepository.migrateBase64ToFiles()) + .thenReturn(Completable.complete()) + whenever(stubServerConfigurationRepository.fetchConfiguration()) .thenReturn(Completable.error(stubException)) @@ -89,6 +123,12 @@ class DataPreLoaderUseCaseImplTest { fun `given models fetch failed, expected error value`() { val stubException = Throwable("Can not fetch models.") + whenever(stubPreferenceManager.source) + .thenReturn(ServerSource.AUTOMATIC1111) + + whenever(stubGenerationResultRepository.migrateBase64ToFiles()) + .thenReturn(Completable.complete()) + whenever(stubServerConfigurationRepository.fetchConfiguration()) .thenReturn(Completable.complete()) @@ -118,6 +158,12 @@ class DataPreLoaderUseCaseImplTest { fun `given samplers fetch failed, expected error value`() { val stubException = Throwable("Can not fetch samplers.") + whenever(stubPreferenceManager.source) + .thenReturn(ServerSource.AUTOMATIC1111) + + whenever(stubGenerationResultRepository.migrateBase64ToFiles()) + .thenReturn(Completable.complete()) + whenever(stubServerConfigurationRepository.fetchConfiguration()) .thenReturn(Completable.complete()) @@ -147,6 +193,12 @@ class DataPreLoaderUseCaseImplTest { fun `given loras fetch failed, expected error value`() { val stubException = Throwable("Can not fetch loras.") + whenever(stubPreferenceManager.source) + .thenReturn(ServerSource.AUTOMATIC1111) + + whenever(stubGenerationResultRepository.migrateBase64ToFiles()) + .thenReturn(Completable.complete()) + whenever(stubServerConfigurationRepository.fetchConfiguration()) .thenReturn(Completable.complete()) @@ -176,6 +228,12 @@ class DataPreLoaderUseCaseImplTest { fun `given hypernetworks fetch failed, expected error value`() { val stubException = Throwable("Can not fetch hypernetworks.") + whenever(stubPreferenceManager.source) + .thenReturn(ServerSource.AUTOMATIC1111) + + whenever(stubGenerationResultRepository.migrateBase64ToFiles()) + .thenReturn(Completable.complete()) + whenever(stubServerConfigurationRepository.fetchConfiguration()) .thenReturn(Completable.complete()) @@ -205,6 +263,12 @@ class DataPreLoaderUseCaseImplTest { fun `given embeddings fetch failed, expected error value`() { val stubException = Throwable("Can not fetch embeddings.") + whenever(stubPreferenceManager.source) + .thenReturn(ServerSource.AUTOMATIC1111) + + whenever(stubGenerationResultRepository.migrateBase64ToFiles()) + .thenReturn(Completable.complete()) + whenever(stubServerConfigurationRepository.fetchConfiguration()) .thenReturn(Completable.complete()) diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestFalAiApiKeyUseCaseImplTest.kt b/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestFalAiApiKeyUseCaseImplTest.kt new file mode 100644 index 000000000..38307be9a --- /dev/null +++ b/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestFalAiApiKeyUseCaseImplTest.kt @@ -0,0 +1,56 @@ +package com.shifthackz.aisdv1.domain.usecase.connectivity + +import com.nhaarman.mockitokotlin2.mock +import com.nhaarman.mockitokotlin2.whenever +import com.shifthackz.aisdv1.domain.repository.FalAiGenerationRepository +import io.reactivex.rxjava3.core.Single +import org.junit.Test + +class TestFalAiApiKeyUseCaseImplTest { + + private val stubException = Throwable("Failed to validate API key.") + private val stubFalAiGenerationRepository = mock() + + private val useCase = TestFalAiApiKeyUseCaseImpl( + falAiGenerationRepository = stubFalAiGenerationRepository, + ) + + @Test + fun `given attempt to validate api key, repository returns true, expected true value`() { + whenever(stubFalAiGenerationRepository.validateApiKey()) + .thenReturn(Single.just(true)) + + useCase() + .test() + .assertNoErrors() + .assertValue(true) + .await() + .assertComplete() + } + + @Test + fun `given attempt to validate api key, repository returns false, expected false value`() { + whenever(stubFalAiGenerationRepository.validateApiKey()) + .thenReturn(Single.just(false)) + + useCase() + .test() + .assertNoErrors() + .assertValue(false) + .await() + .assertComplete() + } + + @Test + fun `given attempt to validate api key, repository throws exception, expected error value`() { + whenever(stubFalAiGenerationRepository.validateApiKey()) + .thenReturn(Single.error(stubException)) + + useCase() + .test() + .assertError(stubException) + .assertNoValues() + .await() + .assertNotComplete() + } +} diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/forgemodule/GetForgeModulesUseCaseImplTest.kt b/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/forgemodule/GetForgeModulesUseCaseImplTest.kt new file mode 100644 index 000000000..cf3d4884b --- /dev/null +++ b/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/forgemodule/GetForgeModulesUseCaseImplTest.kt @@ -0,0 +1,57 @@ +package com.shifthackz.aisdv1.domain.usecase.forgemodule + +import com.nhaarman.mockitokotlin2.mock +import com.nhaarman.mockitokotlin2.whenever +import com.shifthackz.aisdv1.domain.mocks.mockForgeModules +import com.shifthackz.aisdv1.domain.repository.ForgeModulesRepository +import io.reactivex.rxjava3.core.Single +import org.junit.Test + +class GetForgeModulesUseCaseImplTest { + + private val stubException = Throwable("Failed to fetch modules.") + private val stubRepository = mock() + + private val useCase = GetForgeModulesUseCaseImpl( + repository = stubRepository, + ) + + @Test + fun `given attempt to get modules, repository returns data, expected valid list value`() { + whenever(stubRepository.fetchModules()) + .thenReturn(Single.just(mockForgeModules)) + + useCase() + .test() + .assertNoErrors() + .assertValue(mockForgeModules) + .await() + .assertComplete() + } + + @Test + fun `given attempt to get modules, repository returns empty list, expected empty list value`() { + whenever(stubRepository.fetchModules()) + .thenReturn(Single.just(emptyList())) + + useCase() + .test() + .assertNoErrors() + .assertValue(emptyList()) + .await() + .assertComplete() + } + + @Test + fun `given attempt to get modules, repository throws exception, expected error value`() { + whenever(stubRepository.fetchModules()) + .thenReturn(Single.error(stubException)) + + useCase() + .test() + .assertError(stubException) + .assertNoValues() + .await() + .assertNotComplete() + } +} diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryPagedIdsUseCaseImplTest.kt b/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryPagedIdsUseCaseImplTest.kt new file mode 100644 index 000000000..eb037a5ba --- /dev/null +++ b/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryPagedIdsUseCaseImplTest.kt @@ -0,0 +1,58 @@ +package com.shifthackz.aisdv1.domain.usecase.gallery + +import com.nhaarman.mockitokotlin2.mock +import com.nhaarman.mockitokotlin2.whenever +import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import io.reactivex.rxjava3.core.Single +import org.junit.Test + +class GetGalleryPagedIdsUseCaseImplTest { + + private val stubException = Throwable("Failed to get gallery ids.") + private val stubRepository = mock() + + private val useCase = GetGalleryPagedIdsUseCaseImpl( + repository = stubRepository, + ) + + @Test + fun `given attempt to get gallery ids, repository returns data, expected valid list value`() { + val expectedIds = listOf(1L, 2L, 3L, 5598L) + + whenever(stubRepository.getAllIds()) + .thenReturn(Single.just(expectedIds)) + + useCase() + .test() + .assertNoErrors() + .assertValue(expectedIds) + .await() + .assertComplete() + } + + @Test + fun `given attempt to get gallery ids, repository returns empty list, expected empty list value`() { + whenever(stubRepository.getAllIds()) + .thenReturn(Single.just(emptyList())) + + useCase() + .test() + .assertNoErrors() + .assertValue(emptyList()) + .await() + .assertComplete() + } + + @Test + fun `given attempt to get gallery ids, repository throws exception, expected error value`() { + whenever(stubRepository.getAllIds()) + .thenReturn(Single.error(stubException)) + + useCase() + .test() + .assertError(stubException) + .assertNoValues() + .await() + .assertNotComplete() + } +} diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/FalAiGenerationUseCaseImplTest.kt b/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/FalAiGenerationUseCaseImplTest.kt new file mode 100644 index 000000000..4a4a351c2 --- /dev/null +++ b/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/FalAiGenerationUseCaseImplTest.kt @@ -0,0 +1,113 @@ +package com.shifthackz.aisdv1.domain.usecase.generation + +import com.nhaarman.mockitokotlin2.any +import com.nhaarman.mockitokotlin2.mock +import com.nhaarman.mockitokotlin2.whenever +import com.shifthackz.aisdv1.domain.mocks.mockAiGenerationResult +import com.shifthackz.aisdv1.domain.mocks.mockFalAiEndpoint +import com.shifthackz.aisdv1.domain.mocks.mockFalAiPayload +import com.shifthackz.aisdv1.domain.repository.FalAiEndpointRepository +import com.shifthackz.aisdv1.domain.repository.FalAiGenerationRepository +import io.reactivex.rxjava3.core.Completable +import io.reactivex.rxjava3.core.Single +import org.junit.Test + +class FalAiGenerationUseCaseImplTest { + + private val stubException = Throwable("Something went wrong.") + private val stubFalAiEndpointRepository = mock() + private val stubFalAiGenerationRepository = mock() + private val stubSaveGenerationResultUseCase = mock() + + private val useCase = FalAiGenerationUseCaseImpl( + falAiEndpointRepository = stubFalAiEndpointRepository, + falAiGenerationRepository = stubFalAiGenerationRepository, + saveGenerationResultUseCase = stubSaveGenerationResultUseCase, + ) + + @Test + fun `given valid payload and endpoint found, generation succeeds, expected valid results list`() { + val expectedResults = listOf(mockAiGenerationResult) + + whenever(stubFalAiEndpointRepository.getAll()) + .thenReturn(Single.just(listOf(mockFalAiEndpoint))) + + whenever(stubFalAiGenerationRepository.generateDynamic(any(), any())) + .thenReturn(Single.just(expectedResults)) + + whenever(stubSaveGenerationResultUseCase.invoke(any())) + .thenReturn(Completable.complete()) + + useCase(mockFalAiPayload) + .test() + .assertNoErrors() + .assertValue(expectedResults) + .await() + .assertComplete() + } + + @Test + fun `given valid payload but endpoint not found, expected error value`() { + val payloadWithWrongEndpoint = mockFalAiPayload.copy(endpointId = "non-existent") + + whenever(stubFalAiEndpointRepository.getAll()) + .thenReturn(Single.just(listOf(mockFalAiEndpoint))) + + useCase(payloadWithWrongEndpoint) + .test() + .assertError { it.message?.contains("Endpoint not found") == true } + .assertNoValues() + .await() + .assertNotComplete() + } + + @Test + fun `given valid payload, endpoint repository fails, expected error value`() { + whenever(stubFalAiEndpointRepository.getAll()) + .thenReturn(Single.error(stubException)) + + useCase(mockFalAiPayload) + .test() + .assertError(stubException) + .assertNoValues() + .await() + .assertNotComplete() + } + + @Test + fun `given valid payload and endpoint found, generation fails, expected error value`() { + whenever(stubFalAiEndpointRepository.getAll()) + .thenReturn(Single.just(listOf(mockFalAiEndpoint))) + + whenever(stubFalAiGenerationRepository.generateDynamic(any(), any())) + .thenReturn(Single.error(stubException)) + + useCase(mockFalAiPayload) + .test() + .assertError(stubException) + .assertNoValues() + .await() + .assertNotComplete() + } + + @Test + fun `given valid payload and endpoint found, generation succeeds but save fails, expected error value`() { + val expectedResults = listOf(mockAiGenerationResult) + + whenever(stubFalAiEndpointRepository.getAll()) + .thenReturn(Single.just(listOf(mockFalAiEndpoint))) + + whenever(stubFalAiGenerationRepository.generateDynamic(any(), any())) + .thenReturn(Single.just(expectedResults)) + + whenever(stubSaveGenerationResultUseCase.invoke(any())) + .thenReturn(Completable.error(stubException)) + + useCase(mockFalAiPayload) + .test() + .assertError(stubException) + .assertNoValues() + .await() + .assertNotComplete() + } +} diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/TextToImageUseCaseImplTest.kt b/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/TextToImageUseCaseImplTest.kt index 98505eac2..2b9fcfa9a 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/TextToImageUseCaseImplTest.kt +++ b/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/TextToImageUseCaseImplTest.kt @@ -7,6 +7,7 @@ import com.shifthackz.aisdv1.domain.entity.ServerSource import com.shifthackz.aisdv1.domain.mocks.mockAiGenerationResult import com.shifthackz.aisdv1.domain.mocks.mockTextToImagePayload import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import com.shifthackz.aisdv1.domain.repository.FalAiGenerationRepository import com.shifthackz.aisdv1.domain.repository.HordeGenerationRepository import com.shifthackz.aisdv1.domain.repository.HuggingFaceGenerationRepository import com.shifthackz.aisdv1.domain.repository.LocalDiffusionGenerationRepository @@ -26,6 +27,7 @@ class TextToImageUseCaseImplTest { private val stubHuggingFaceGenerationRepository = mock() private val stubOpenAiGenerationRepository = mock() private val stubStabilityAiGenerationRepository = mock() + private val stubFalAiGenerationRepository = mock() private val stubSwarmUiGenerationRepository = mock() private val stubLocalDiffusionGenerationRepository = mock() private val stubMediaPipeGenerationRepository = mock() @@ -37,8 +39,9 @@ class TextToImageUseCaseImplTest { huggingFaceGenerationRepository = stubHuggingFaceGenerationRepository, openAiGenerationRepository = stubOpenAiGenerationRepository, stabilityAiGenerationRepository = stubStabilityAiGenerationRepository, - localDiffusionGenerationRepository = stubLocalDiffusionGenerationRepository, + falAiGenerationRepository = stubFalAiGenerationRepository, swarmUiGenerationRepository = stubSwarmUiGenerationRepository, + localDiffusionGenerationRepository = stubLocalDiffusionGenerationRepository, mediaPipeGenerationRepository = stubMediaPipeGenerationRepository, preferenceManager = stubPreferenceManager, ) @@ -426,4 +429,68 @@ class TextToImageUseCaseImplTest { .await() .assertNotComplete() } + + @Test + fun `given source is FAL_AI, batch count is 1, generated successfully, expected generations list with size 1`() { + whenever(stubPreferenceManager.source) + .thenReturn(ServerSource.FAL_AI) + + whenever(stubFalAiGenerationRepository.generateFromText(any())) + .thenReturn(Single.just(mockAiGenerationResult)) + + val stubBatchCount = 1 + val stubPayload = mockTextToImagePayload.copy(batchCount = stubBatchCount) + + val expectedResult = listOf(mockAiGenerationResult) + + useCase(stubPayload) + .test() + .assertNoErrors() + .assertValue { generations -> + generations.size == stubBatchCount && expectedResult == generations + } + .await() + .assertComplete() + } + + @Test + fun `given source is FAL_AI, batch count is 10, generated successfully, expected generations list with size 10`() { + whenever(stubPreferenceManager.source) + .thenReturn(ServerSource.FAL_AI) + + whenever(stubFalAiGenerationRepository.generateFromText(any())) + .thenReturn(Single.just(mockAiGenerationResult)) + + val stubBatchCount = 10 + val stubPayload = mockTextToImagePayload.copy(batchCount = stubBatchCount) + + val expectedResult = (0 until 10).map { mockAiGenerationResult } + + useCase(stubPayload) + .test() + .assertNoErrors() + .assertValue { generations -> + generations.size == stubBatchCount && expectedResult == generations + } + .await() + .assertComplete() + } + + @Test + fun `given source is FAL_AI, batch count is 1, generate failed, expected error`() { + whenever(stubPreferenceManager.source) + .thenReturn(ServerSource.FAL_AI) + + whenever(stubFalAiGenerationRepository.generateFromText(any())) + .thenReturn(Single.error(stubException)) + + val stubBatchCount = 1 + val stubPayload = mockTextToImagePayload.copy(batchCount = stubBatchCount) + + useCase(stubPayload) + .test() + .assertError(stubException) + .await() + .assertNotComplete() + } } diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToFalAiUseCaseImplTest.kt b/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToFalAiUseCaseImplTest.kt new file mode 100644 index 000000000..de7a220ad --- /dev/null +++ b/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToFalAiUseCaseImplTest.kt @@ -0,0 +1,180 @@ +package com.shifthackz.aisdv1.domain.usecase.settings + +import com.shifthackz.aisdv1.domain.mocks.mockConfiguration +import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import com.shifthackz.aisdv1.domain.usecase.connectivity.TestFalAiApiKeyUseCase +import io.mockk.every +import io.mockk.mockk +import io.mockk.verify +import io.reactivex.rxjava3.core.Completable +import io.reactivex.rxjava3.core.Single +import io.reactivex.rxjava3.plugins.RxJavaPlugins +import io.reactivex.rxjava3.schedulers.TestScheduler +import org.junit.After +import org.junit.Before +import org.junit.Test +import java.util.concurrent.TimeUnit + +class ConnectToFalAiUseCaseImplTest { + + private val stubThrowable = Throwable("Something went wrong.") + private val stubGetConfigurationUseCase = mockk() + private val stubSetServerConfigurationUseCase = mockk() + private val stubTestFalAiApiKeyUseCase = mockk() + private val stubPreferenceManager = mockk(relaxed = true) + + private val testScheduler = TestScheduler() + + private val useCase = ConnectToFalAiUseCaseImpl( + getConfigurationUseCase = stubGetConfigurationUseCase, + setServerConfigurationUseCase = stubSetServerConfigurationUseCase, + testFalAiApiKeyUseCase = stubTestFalAiApiKeyUseCase, + preferenceManager = stubPreferenceManager, + ) + + @Before + fun setUp() { + RxJavaPlugins.setComputationSchedulerHandler { testScheduler } + } + + @After + fun tearDown() { + RxJavaPlugins.reset() + } + + @Test + fun `given connection process successful, API key is valid, expected success result value`() { + every { + stubGetConfigurationUseCase() + } returns Single.just(mockConfiguration) + + every { + stubSetServerConfigurationUseCase(any()) + } returns Completable.complete() + + every { + stubTestFalAiApiKeyUseCase() + } returns Single.just(true) + + val testObserver = useCase("test-api-key", "fal-ai/flux/schnell") + .test() + + testScheduler.advanceTimeBy(3, TimeUnit.SECONDS) + + testObserver + .assertNoErrors() + .await() + .assertValue(Result.success(Unit)) + .assertComplete() + + verify { stubPreferenceManager.falAiSelectedEndpointId = "fal-ai/flux/schnell" } + } + + @Test + fun `given connection process successful, API key is NOT valid, expected failure result value with rollback`() { + every { + stubGetConfigurationUseCase() + } returns Single.just(mockConfiguration) + + every { + stubSetServerConfigurationUseCase(any()) + } returns Completable.complete() + + every { + stubTestFalAiApiKeyUseCase() + } returns Single.just(false) + + val testObserver = useCase("bad-api-key", "fal-ai/flux/schnell") + .test() + + testScheduler.advanceTimeBy(3, TimeUnit.SECONDS) + + testObserver + .assertNoErrors() + .await() + .assertValue { actual -> + actual.isFailure + && actual.exceptionOrNull() is IllegalStateException + && actual.exceptionOrNull()?.message == "Bad key" + } + .assertComplete() + } + + @Test + fun `given get configuration fails, expected failure result value`() { + every { + stubGetConfigurationUseCase() + } returns Single.error(stubThrowable) + + every { + stubSetServerConfigurationUseCase(any()) + } returns Completable.complete() + + every { + stubTestFalAiApiKeyUseCase() + } returns Single.just(true) + + val testObserver = useCase("test-api-key", "fal-ai/flux/schnell") + .test() + + testScheduler.advanceTimeBy(3, TimeUnit.SECONDS) + + testObserver + .assertNoErrors() + .await() + .assertValue(Result.failure(stubThrowable)) + .assertComplete() + } + + @Test + fun `given set configuration fails, expected failure result value with rollback`() { + every { + stubGetConfigurationUseCase() + } returns Single.just(mockConfiguration) + + every { + stubSetServerConfigurationUseCase(any()) + } returns Completable.error(stubThrowable) andThen Completable.complete() + + every { + stubTestFalAiApiKeyUseCase() + } returns Single.just(true) + + val testObserver = useCase("test-api-key", "fal-ai/flux/schnell") + .test() + + testScheduler.advanceTimeBy(3, TimeUnit.SECONDS) + + testObserver + .assertNoErrors() + .await() + .assertValue(Result.failure(stubThrowable)) + .assertComplete() + } + + @Test + fun `given API key test fails with exception, expected failure result value with rollback`() { + every { + stubGetConfigurationUseCase() + } returns Single.just(mockConfiguration) + + every { + stubSetServerConfigurationUseCase(any()) + } returns Completable.complete() + + every { + stubTestFalAiApiKeyUseCase() + } returns Single.error(stubThrowable) + + val testObserver = useCase("test-api-key", "fal-ai/flux/schnell") + .test() + + testScheduler.advanceTimeBy(3, TimeUnit.SECONDS) + + testObserver + .assertNoErrors() + .await() + .assertValue(Result.failure(stubThrowable)) + .assertComplete() + } +} diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/GetConfigurationUseCaseImplTest.kt b/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/GetConfigurationUseCaseImplTest.kt index 5a5d12bcb..68390353b 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/GetConfigurationUseCaseImplTest.kt +++ b/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/GetConfigurationUseCaseImplTest.kt @@ -84,6 +84,10 @@ class GetConfigurationUseCaseImplTest { stubPreferenceManager::localMediaPipeCustomModelPath.get() } returns mockConfiguration.localMediaPipeModelPath + every { + stubPreferenceManager::falAiApiKey.get() + } returns mockConfiguration.falAiApiKey + useCase .invoke() .test() diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/SetServerConfigurationUseCaseImplTest.kt b/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/SetServerConfigurationUseCaseImplTest.kt index a16201204..e3b3d06ed 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/SetServerConfigurationUseCaseImplTest.kt +++ b/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/SetServerConfigurationUseCaseImplTest.kt @@ -83,6 +83,10 @@ class SetServerConfigurationUseCaseImplTest { stubPreferenceManager::localMediaPipeCustomModelPath.set(any()) } returns Unit + every { + stubPreferenceManager::falAiApiKey.set(any()) + } returns Unit + useCase .invoke(mockConfiguration) .test() From d777d341df9ad5997efbf5cf11806aa703d40cf5 Mon Sep 17 00:00:00 2001 From: crim50n Date: Tue, 30 Dec 2025 11:15:45 +0300 Subject: [PATCH 08/42] feat: enable light status bar for AiSdCompose theme --- app/src/main/res/values/themes.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index 0997989ef..a178d7aaf 100755 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -8,6 +8,7 @@ @color/catppuccin_latte_mauve @color/catppuccin_latte_base @color/catppuccin_latte_mantle + true diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml index a178d7aaf..92a75edf1 100755 --- a/app/src/main/res/values/themes.xml +++ b/app/src/main/res/values/themes.xml @@ -12,7 +12,7 @@ diff --git a/build-logic/convention/src/main/kotlin/ApplicationConventionPlugin.kt b/build-logic/convention/src/main/kotlin/ApplicationConventionPlugin.kt index b1edf8f3c..af8ea6763 100644 --- a/build-logic/convention/src/main/kotlin/ApplicationConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/ApplicationConventionPlugin.kt @@ -1,9 +1,9 @@ import com.android.build.api.dsl.ApplicationExtension import com.android.build.gradle.BaseExtension -import com.shifthackz.aisdv1.buildlogic.configureApplication -import com.shifthackz.aisdv1.buildlogic.configureCompose -import com.shifthackz.aisdv1.buildlogic.configureFlavors -import com.shifthackz.aisdv1.buildlogic.libs +import dev.minios.pdaiv1.buildlogic.configureApplication +import dev.minios.pdaiv1.buildlogic.configureCompose +import dev.minios.pdaiv1.buildlogic.configureFlavors +import dev.minios.pdaiv1.buildlogic.libs import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.configure diff --git a/build-logic/convention/src/main/kotlin/ComposeConventionPlugin.kt b/build-logic/convention/src/main/kotlin/ComposeConventionPlugin.kt index 1f5845425..a4861a5c0 100644 --- a/build-logic/convention/src/main/kotlin/ComposeConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/ComposeConventionPlugin.kt @@ -1,7 +1,7 @@ import com.android.build.api.dsl.LibraryExtension -import com.shifthackz.aisdv1.buildlogic.configureCompose -import com.shifthackz.aisdv1.buildlogic.configureKotlinAndroid -import com.shifthackz.aisdv1.buildlogic.libs +import dev.minios.pdaiv1.buildlogic.configureCompose +import dev.minios.pdaiv1.buildlogic.configureKotlinAndroid +import dev.minios.pdaiv1.buildlogic.libs import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.configure diff --git a/build-logic/convention/src/main/kotlin/FlavorsConventionPlugin.kt b/build-logic/convention/src/main/kotlin/FlavorsConventionPlugin.kt index 743465f1d..e5ebfa502 100644 --- a/build-logic/convention/src/main/kotlin/FlavorsConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/FlavorsConventionPlugin.kt @@ -1,5 +1,5 @@ import com.android.build.gradle.LibraryExtension -import com.shifthackz.aisdv1.buildlogic.configureFlavorsCommon +import dev.minios.pdaiv1.buildlogic.configureFlavorsCommon import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.configure diff --git a/build-logic/convention/src/main/kotlin/JacocoConventionPlugin.kt b/build-logic/convention/src/main/kotlin/JacocoConventionPlugin.kt index 6e83a3fcb..e26cafe10 100644 --- a/build-logic/convention/src/main/kotlin/JacocoConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/JacocoConventionPlugin.kt @@ -1,5 +1,5 @@ import com.android.build.gradle.BaseExtension -import com.shifthackz.aisdv1.buildlogic.jacocoCodeCoverageReporting +import dev.minios.pdaiv1.buildlogic.jacocoCodeCoverageReporting import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.api.tasks.testing.Test diff --git a/build-logic/convention/src/main/kotlin/LibraryConventionPlugin.kt b/build-logic/convention/src/main/kotlin/LibraryConventionPlugin.kt index 60616a5e3..4718a947a 100644 --- a/build-logic/convention/src/main/kotlin/LibraryConventionPlugin.kt +++ b/build-logic/convention/src/main/kotlin/LibraryConventionPlugin.kt @@ -1,6 +1,6 @@ import com.android.build.gradle.LibraryExtension -import com.shifthackz.aisdv1.buildlogic.configureKotlinAndroid -import com.shifthackz.aisdv1.buildlogic.libs +import dev.minios.pdaiv1.buildlogic.configureKotlinAndroid +import dev.minios.pdaiv1.buildlogic.libs import org.gradle.api.Plugin import org.gradle.api.Project import org.gradle.kotlin.dsl.configure diff --git a/build-logic/convention/src/main/kotlin/com/shifthackz/aisdv1/buildlogic/Android.kt b/build-logic/convention/src/main/kotlin/dev/minios/pdaiv1/buildlogic/Android.kt similarity index 97% rename from build-logic/convention/src/main/kotlin/com/shifthackz/aisdv1/buildlogic/Android.kt rename to build-logic/convention/src/main/kotlin/dev/minios/pdaiv1/buildlogic/Android.kt index 343b5456a..83a41e45d 100644 --- a/build-logic/convention/src/main/kotlin/com/shifthackz/aisdv1/buildlogic/Android.kt +++ b/build-logic/convention/src/main/kotlin/dev/minios/pdaiv1/buildlogic/Android.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.buildlogic +package dev.minios.pdaiv1.buildlogic import com.android.build.api.dsl.CommonExtension import org.gradle.api.JavaVersion diff --git a/build-logic/convention/src/main/kotlin/com/shifthackz/aisdv1/buildlogic/Application.kt b/build-logic/convention/src/main/kotlin/dev/minios/pdaiv1/buildlogic/Application.kt similarity index 87% rename from build-logic/convention/src/main/kotlin/com/shifthackz/aisdv1/buildlogic/Application.kt rename to build-logic/convention/src/main/kotlin/dev/minios/pdaiv1/buildlogic/Application.kt index 6e1cae211..9e1a9e747 100644 --- a/build-logic/convention/src/main/kotlin/com/shifthackz/aisdv1/buildlogic/Application.kt +++ b/build-logic/convention/src/main/kotlin/dev/minios/pdaiv1/buildlogic/Application.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.buildlogic +package dev.minios.pdaiv1.buildlogic import com.android.build.api.dsl.ApplicationExtension import org.gradle.api.Project diff --git a/build-logic/convention/src/main/kotlin/com/shifthackz/aisdv1/buildlogic/Compose.kt b/build-logic/convention/src/main/kotlin/dev/minios/pdaiv1/buildlogic/Compose.kt similarity index 98% rename from build-logic/convention/src/main/kotlin/com/shifthackz/aisdv1/buildlogic/Compose.kt rename to build-logic/convention/src/main/kotlin/dev/minios/pdaiv1/buildlogic/Compose.kt index e156327bd..86b03ccd5 100644 --- a/build-logic/convention/src/main/kotlin/com/shifthackz/aisdv1/buildlogic/Compose.kt +++ b/build-logic/convention/src/main/kotlin/dev/minios/pdaiv1/buildlogic/Compose.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.buildlogic +package dev.minios.pdaiv1.buildlogic import com.android.build.api.dsl.CommonExtension import org.gradle.api.Project diff --git a/build-logic/convention/src/main/kotlin/com/shifthackz/aisdv1/buildlogic/Flavors.kt b/build-logic/convention/src/main/kotlin/dev/minios/pdaiv1/buildlogic/Flavors.kt similarity index 85% rename from build-logic/convention/src/main/kotlin/com/shifthackz/aisdv1/buildlogic/Flavors.kt rename to build-logic/convention/src/main/kotlin/dev/minios/pdaiv1/buildlogic/Flavors.kt index 6357b9ff4..c48d14798 100644 --- a/build-logic/convention/src/main/kotlin/com/shifthackz/aisdv1/buildlogic/Flavors.kt +++ b/build-logic/convention/src/main/kotlin/dev/minios/pdaiv1/buildlogic/Flavors.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.buildlogic +package dev.minios.pdaiv1.buildlogic import com.android.build.api.dsl.CommonExtension import com.android.build.gradle.BaseExtension @@ -12,20 +12,20 @@ internal fun Project.configureFlavors( productFlavors.create("full") { dimension = "type" applicationIdSuffix = ".full" - resValue("string", "app_name", "SDAI Full") + resValue("string", "app_name", "PDAI Full") buildConfigField("String", "BUILD_FLAVOR_TYPE", "\"FULL\"") } productFlavors.create("foss") { dimension = "type" applicationIdSuffix = ".foss" - resValue("string", "app_name", "SDAI FOSS") + resValue("string", "app_name", "PDAI FOSS") buildConfigField("String", "BUILD_FLAVOR_TYPE", "\"FOSS\"") } productFlavors.create("playstore") { dimension = "type" - resValue("string", "app_name", "SDAI") + resValue("string", "app_name", "PDAI") buildConfigField("String", "BUILD_FLAVOR_TYPE", "\"GOOGLE_PLAY\"") } } diff --git a/build-logic/convention/src/main/kotlin/com/shifthackz/aisdv1/buildlogic/Jacoco.kt b/build-logic/convention/src/main/kotlin/dev/minios/pdaiv1/buildlogic/Jacoco.kt similarity index 98% rename from build-logic/convention/src/main/kotlin/com/shifthackz/aisdv1/buildlogic/Jacoco.kt rename to build-logic/convention/src/main/kotlin/dev/minios/pdaiv1/buildlogic/Jacoco.kt index a62184c9d..dc9758394 100644 --- a/build-logic/convention/src/main/kotlin/com/shifthackz/aisdv1/buildlogic/Jacoco.kt +++ b/build-logic/convention/src/main/kotlin/dev/minios/pdaiv1/buildlogic/Jacoco.kt @@ -1,6 +1,6 @@ @file:Suppress("UNUSED_VARIABLE") -package com.shifthackz.aisdv1.buildlogic +package dev.minios.pdaiv1.buildlogic import com.android.build.gradle.BaseExtension import org.gradle.api.Project diff --git a/build-logic/convention/src/main/kotlin/com/shifthackz/aisdv1/buildlogic/Project.kt b/build-logic/convention/src/main/kotlin/dev/minios/pdaiv1/buildlogic/Project.kt similarity index 87% rename from build-logic/convention/src/main/kotlin/com/shifthackz/aisdv1/buildlogic/Project.kt rename to build-logic/convention/src/main/kotlin/dev/minios/pdaiv1/buildlogic/Project.kt index e95faef6f..08e12529c 100644 --- a/build-logic/convention/src/main/kotlin/com/shifthackz/aisdv1/buildlogic/Project.kt +++ b/build-logic/convention/src/main/kotlin/dev/minios/pdaiv1/buildlogic/Project.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.buildlogic +package dev.minios.pdaiv1.buildlogic import org.gradle.api.Project import org.gradle.api.artifacts.VersionCatalog diff --git a/core/common/build.gradle.kts b/core/common/build.gradle.kts index cce5a8870..ffe4470ef 100755 --- a/core/common/build.gradle.kts +++ b/core/common/build.gradle.kts @@ -3,7 +3,7 @@ plugins { } android { - namespace = "com.shifthackz.aisdv1.core.common" + namespace = "dev.minios.pdaiv1.core.common" } dependencies { diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/UnitExtensions.kt b/core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/UnitExtensions.kt deleted file mode 100644 index bc08eb7c6..000000000 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/UnitExtensions.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.shifthackz.aisdv1.core.common.extensions - -val EmptyLambda: () -> Unit = {} diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/appbuild/ActivityIntentProvider.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/appbuild/ActivityIntentProvider.kt similarity index 67% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/appbuild/ActivityIntentProvider.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/appbuild/ActivityIntentProvider.kt index 6cc003136..c0eb5ed16 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/appbuild/ActivityIntentProvider.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/appbuild/ActivityIntentProvider.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.appbuild +package dev.minios.pdaiv1.core.common.appbuild import android.content.Intent diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/appbuild/BuildInfoProvider.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/appbuild/BuildInfoProvider.kt similarity index 89% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/appbuild/BuildInfoProvider.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/appbuild/BuildInfoProvider.kt index cc97b3708..0fa8124c1 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/appbuild/BuildInfoProvider.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/appbuild/BuildInfoProvider.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.appbuild +package dev.minios.pdaiv1.core.common.appbuild interface BuildInfoProvider { val isDebug: Boolean diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/appbuild/BuildType.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/appbuild/BuildType.kt similarity index 82% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/appbuild/BuildType.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/appbuild/BuildType.kt index 2f4c4471b..65ebf0db3 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/appbuild/BuildType.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/appbuild/BuildType.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.appbuild +package dev.minios.pdaiv1.core.common.appbuild enum class BuildType { FULL, diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/appbuild/BuildVersion.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/appbuild/BuildVersion.kt similarity index 97% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/appbuild/BuildVersion.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/appbuild/BuildVersion.kt index 27386fd0f..7c72c983b 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/appbuild/BuildVersion.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/appbuild/BuildVersion.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.appbuild +package dev.minios.pdaiv1.core.common.appbuild class BuildVersion : Comparable { private var major: Int = 0 diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/contract/RxDisposableContract.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/contract/RxDisposableContract.kt similarity index 91% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/contract/RxDisposableContract.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/contract/RxDisposableContract.kt index 63265c006..e64064738 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/contract/RxDisposableContract.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/contract/RxDisposableContract.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.contract +package dev.minios.pdaiv1.core.common.contract import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.disposables.Disposable diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/device/DeviceChipsetDetector.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/device/DeviceChipsetDetector.kt similarity index 98% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/device/DeviceChipsetDetector.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/device/DeviceChipsetDetector.kt index ff4498e39..c158c531c 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/device/DeviceChipsetDetector.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/device/DeviceChipsetDetector.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.device +package dev.minios.pdaiv1.core.common.device import android.os.Build diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/AppExtensions.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/extensions/AppExtensions.kt similarity index 95% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/AppExtensions.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/extensions/AppExtensions.kt index db9aaad04..51192f1ff 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/AppExtensions.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/extensions/AppExtensions.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.extensions +package dev.minios.pdaiv1.core.common.extensions import android.app.ActivityManager import android.app.ActivityManager.RunningAppProcessInfo diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/ClipboardExtensions.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/extensions/ClipboardExtensions.kt similarity index 86% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/ClipboardExtensions.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/extensions/ClipboardExtensions.kt index 4689e0838..bef273198 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/ClipboardExtensions.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/extensions/ClipboardExtensions.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.extensions +package dev.minios.pdaiv1.core.common.extensions import android.content.ClipData import android.content.ClipboardManager diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/DateExtensions.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/extensions/DateExtensions.kt similarity index 95% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/DateExtensions.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/extensions/DateExtensions.kt index 583a353ff..a1ae4e177 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/DateExtensions.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/extensions/DateExtensions.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.extensions +package dev.minios.pdaiv1.core.common.extensions import java.text.SimpleDateFormat import java.util.Date diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/KotlinExtensions.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/extensions/KotlinExtensions.kt similarity index 71% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/KotlinExtensions.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/extensions/KotlinExtensions.kt index 837f0fc6c..054c3d47b 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/KotlinExtensions.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/extensions/KotlinExtensions.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.extensions +package dev.minios.pdaiv1.core.common.extensions inline fun T.applyIf(predicate: Boolean, block: T.() -> Unit): T { if (!predicate) return this diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/StringExtensions.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/extensions/StringExtensions.kt similarity index 89% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/StringExtensions.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/extensions/StringExtensions.kt index 0fe94bfb0..8032b86ce 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/StringExtensions.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/extensions/StringExtensions.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.extensions +package dev.minios.pdaiv1.core.common.extensions private const val PROTOCOL_DELIMITER = "://" private const val PROTOCOL_HOLDER = "[[_PROTOCOL_]]" diff --git a/core/common/src/main/java/dev/minios/pdaiv1/core/common/extensions/UnitExtensions.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/extensions/UnitExtensions.kt new file mode 100644 index 000000000..b4ee18aef --- /dev/null +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/extensions/UnitExtensions.kt @@ -0,0 +1,3 @@ +package dev.minios.pdaiv1.core.common.extensions + +val EmptyLambda: () -> Unit = {} diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/UriExtensions.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/extensions/UriExtensions.kt similarity index 93% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/UriExtensions.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/extensions/UriExtensions.kt index 04f2240d7..b9135149b 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/UriExtensions.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/extensions/UriExtensions.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.extensions +package dev.minios.pdaiv1.core.common.extensions import android.content.Context import android.content.Intent diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/file/FileExtensions.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/file/FileExtensions.kt similarity index 97% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/file/FileExtensions.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/file/FileExtensions.kt index eec3dd96c..213979d8b 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/file/FileExtensions.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/file/FileExtensions.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.file +package dev.minios.pdaiv1.core.common.file import android.graphics.Bitmap import java.io.* diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/file/FileProviderDescriptor.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/file/FileProviderDescriptor.kt similarity index 85% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/file/FileProviderDescriptor.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/file/FileProviderDescriptor.kt index 22ce7dbba..8655c0ce4 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/file/FileProviderDescriptor.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/file/FileProviderDescriptor.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.file +package dev.minios.pdaiv1.core.common.file const val LOCAL_DIFFUSION_CUSTOM_PATH = "/storage/emulated/0/Download/SDAI/model" diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/links/LinksProvider.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/links/LinksProvider.kt similarity index 89% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/links/LinksProvider.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/links/LinksProvider.kt index 487693148..925f2b943 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/links/LinksProvider.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/links/LinksProvider.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.links +package dev.minios.pdaiv1.core.common.links interface LinksProvider { val hordeUrl: String diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/log/FileLoggingTree.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/log/FileLoggingTree.kt similarity index 91% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/log/FileLoggingTree.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/log/FileLoggingTree.kt index 86ae92cde..dc6a08fff 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/log/FileLoggingTree.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/log/FileLoggingTree.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.core.common.log +package dev.minios.pdaiv1.core.common.log import android.util.Log -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider import org.koin.core.component.KoinComponent import org.koin.core.component.inject import timber.log.Timber diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/log/TimberLogging.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/log/TimberLogging.kt similarity index 96% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/log/TimberLogging.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/log/TimberLogging.kt index acbd48e41..f3044003f 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/log/TimberLogging.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/log/TimberLogging.kt @@ -1,6 +1,6 @@ @file:Suppress("NOTHING_TO_INLINE") -package com.shifthackz.aisdv1.core.common.log +package dev.minios.pdaiv1.core.common.log import timber.log.Timber diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/math/MathUtils.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/math/MathUtils.kt similarity index 89% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/math/MathUtils.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/math/MathUtils.kt index e318d1674..bbd535181 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/math/MathUtils.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/math/MathUtils.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.math +package dev.minios.pdaiv1.core.common.math import kotlin.math.pow import kotlin.math.roundToInt diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/model/Heptagonal.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/model/Heptagonal.kt similarity index 88% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/model/Heptagonal.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/model/Heptagonal.kt index 581b71b79..5576b7f45 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/model/Heptagonal.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/model/Heptagonal.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.model +package dev.minios.pdaiv1.core.common.model import java.io.Serializable diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/model/Hexagonal.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/model/Hexagonal.kt similarity index 86% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/model/Hexagonal.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/model/Hexagonal.kt index 4bc94dde4..d50ebb466 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/model/Hexagonal.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/model/Hexagonal.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.model +package dev.minios.pdaiv1.core.common.model import java.io.Serializable diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/model/Quadruple.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/model/Quadruple.kt similarity index 83% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/model/Quadruple.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/model/Quadruple.kt index 7234f7faf..ca55162a2 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/model/Quadruple.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/model/Quadruple.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.model +package dev.minios.pdaiv1.core.common.model import java.io.Serializable diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/model/Quintuple.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/model/Quintuple.kt similarity index 85% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/model/Quintuple.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/model/Quintuple.kt index e0987f1c8..facc23841 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/model/Quintuple.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/model/Quintuple.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.model +package dev.minios.pdaiv1.core.common.model import java.io.Serializable diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/reactive/RetryExtensions.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/reactive/RetryExtensions.kt similarity index 98% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/reactive/RetryExtensions.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/reactive/RetryExtensions.kt index 4159a9b44..774cc39cc 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/reactive/RetryExtensions.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/reactive/RetryExtensions.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.reactive +package dev.minios.pdaiv1.core.common.reactive import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/schedulers/DispatchersProvider.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/schedulers/DispatchersProvider.kt similarity index 77% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/schedulers/DispatchersProvider.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/schedulers/DispatchersProvider.kt index 930d56d99..d4db439c6 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/schedulers/DispatchersProvider.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/schedulers/DispatchersProvider.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.schedulers +package dev.minios.pdaiv1.core.common.schedulers import kotlinx.coroutines.CoroutineDispatcher diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/schedulers/SchedulersExtensions.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/schedulers/SchedulersExtensions.kt similarity index 93% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/schedulers/SchedulersExtensions.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/schedulers/SchedulersExtensions.kt index 1bf09dabc..eb85edec1 100755 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/schedulers/SchedulersExtensions.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/schedulers/SchedulersExtensions.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.schedulers +package dev.minios.pdaiv1.core.common.schedulers import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/schedulers/SchedulersProvider.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/schedulers/SchedulersProvider.kt similarity index 91% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/schedulers/SchedulersProvider.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/schedulers/SchedulersProvider.kt index 2e7bea78e..e8d73bd3e 100755 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/schedulers/SchedulersProvider.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/schedulers/SchedulersProvider.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.schedulers +package dev.minios.pdaiv1.core.common.schedulers import io.reactivex.rxjava3.core.Scheduler import io.reactivex.rxjava3.schedulers.Schedulers diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/schedulers/SchedulersToken.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/schedulers/SchedulersToken.kt similarity index 77% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/schedulers/SchedulersToken.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/schedulers/SchedulersToken.kt index c674d7c5d..7ecfd01de 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/schedulers/SchedulersToken.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/schedulers/SchedulersToken.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.schedulers +package dev.minios.pdaiv1.core.common.schedulers enum class SchedulersToken(val type: String) { MAIN_THREAD("Main thread"), diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/time/TimeProvider.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/time/TimeProvider.kt similarity index 74% rename from core/common/src/main/java/com/shifthackz/aisdv1/core/common/time/TimeProvider.kt rename to core/common/src/main/java/dev/minios/pdaiv1/core/common/time/TimeProvider.kt index 7564bcb1f..929ecd1aa 100644 --- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/time/TimeProvider.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/time/TimeProvider.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.time +package dev.minios.pdaiv1.core.common.time import java.util.Date diff --git a/core/common/src/test/java/com/shifthackz/aisdv1/core/common/appbuild/BuildVersionTest.kt b/core/common/src/test/java/dev/minios/pdaiv1/core/common/appbuild/BuildVersionTest.kt similarity index 96% rename from core/common/src/test/java/com/shifthackz/aisdv1/core/common/appbuild/BuildVersionTest.kt rename to core/common/src/test/java/dev/minios/pdaiv1/core/common/appbuild/BuildVersionTest.kt index 7383f94ef..8cce5c63e 100644 --- a/core/common/src/test/java/com/shifthackz/aisdv1/core/common/appbuild/BuildVersionTest.kt +++ b/core/common/src/test/java/dev/minios/pdaiv1/core/common/appbuild/BuildVersionTest.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.appbuild +package dev.minios.pdaiv1.core.common.appbuild import org.junit.Assert import org.junit.Test diff --git a/core/common/src/test/java/com/shifthackz/aisdv1/core/common/extensions/DateExtensionsTest.kt b/core/common/src/test/java/dev/minios/pdaiv1/core/common/extensions/DateExtensionsTest.kt similarity index 93% rename from core/common/src/test/java/com/shifthackz/aisdv1/core/common/extensions/DateExtensionsTest.kt rename to core/common/src/test/java/dev/minios/pdaiv1/core/common/extensions/DateExtensionsTest.kt index b4f77ff51..e5c740b5b 100644 --- a/core/common/src/test/java/com/shifthackz/aisdv1/core/common/extensions/DateExtensionsTest.kt +++ b/core/common/src/test/java/dev/minios/pdaiv1/core/common/extensions/DateExtensionsTest.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.extensions +package dev.minios.pdaiv1.core.common.extensions import org.junit.Assert import org.junit.Test diff --git a/core/common/src/test/java/com/shifthackz/aisdv1/core/common/extensions/KotlinExtensionsTest.kt b/core/common/src/test/java/dev/minios/pdaiv1/core/common/extensions/KotlinExtensionsTest.kt similarity index 95% rename from core/common/src/test/java/com/shifthackz/aisdv1/core/common/extensions/KotlinExtensionsTest.kt rename to core/common/src/test/java/dev/minios/pdaiv1/core/common/extensions/KotlinExtensionsTest.kt index 5fb165f4b..f75a23776 100644 --- a/core/common/src/test/java/com/shifthackz/aisdv1/core/common/extensions/KotlinExtensionsTest.kt +++ b/core/common/src/test/java/dev/minios/pdaiv1/core/common/extensions/KotlinExtensionsTest.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.extensions +package dev.minios.pdaiv1.core.common.extensions import org.junit.Assert import org.junit.Test diff --git a/core/common/src/test/java/com/shifthackz/aisdv1/core/common/extensions/StringExtensionsTest.kt b/core/common/src/test/java/dev/minios/pdaiv1/core/common/extensions/StringExtensionsTest.kt similarity index 94% rename from core/common/src/test/java/com/shifthackz/aisdv1/core/common/extensions/StringExtensionsTest.kt rename to core/common/src/test/java/dev/minios/pdaiv1/core/common/extensions/StringExtensionsTest.kt index 17a9c74a4..79c1d056c 100644 --- a/core/common/src/test/java/com/shifthackz/aisdv1/core/common/extensions/StringExtensionsTest.kt +++ b/core/common/src/test/java/dev/minios/pdaiv1/core/common/extensions/StringExtensionsTest.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.extensions +package dev.minios.pdaiv1.core.common.extensions import org.junit.Assert import org.junit.Test diff --git a/core/common/src/test/java/com/shifthackz/aisdv1/core/common/math/MathUtilsTest.kt b/core/common/src/test/java/dev/minios/pdaiv1/core/common/math/MathUtilsTest.kt similarity index 93% rename from core/common/src/test/java/com/shifthackz/aisdv1/core/common/math/MathUtilsTest.kt rename to core/common/src/test/java/dev/minios/pdaiv1/core/common/math/MathUtilsTest.kt index f06ceea69..50acd3343 100644 --- a/core/common/src/test/java/com/shifthackz/aisdv1/core/common/math/MathUtilsTest.kt +++ b/core/common/src/test/java/dev/minios/pdaiv1/core/common/math/MathUtilsTest.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.common.math +package dev.minios.pdaiv1.core.common.math import org.junit.Assert import org.junit.Test diff --git a/core/imageprocessing/build.gradle.kts b/core/imageprocessing/build.gradle.kts index 5a2f23bc9..8289373c3 100644 --- a/core/imageprocessing/build.gradle.kts +++ b/core/imageprocessing/build.gradle.kts @@ -3,7 +3,7 @@ plugins { } android { - namespace = "com.shifthackz.aisdv1.core.imageprocessing" + namespace = "dev.minios.pdaiv1.core.imageprocessing" } dependencies { diff --git a/core/imageprocessing/src/main/java/com/shifthackz/aisdv1/core/imageprocessing/Base64EncodingConverter.kt b/core/imageprocessing/src/main/java/dev/minios/pdaiv1/core/imageprocessing/Base64EncodingConverter.kt similarity index 67% rename from core/imageprocessing/src/main/java/com/shifthackz/aisdv1/core/imageprocessing/Base64EncodingConverter.kt rename to core/imageprocessing/src/main/java/dev/minios/pdaiv1/core/imageprocessing/Base64EncodingConverter.kt index 27542df27..632bb7a0b 100644 --- a/core/imageprocessing/src/main/java/com/shifthackz/aisdv1/core/imageprocessing/Base64EncodingConverter.kt +++ b/core/imageprocessing/src/main/java/dev/minios/pdaiv1/core/imageprocessing/Base64EncodingConverter.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.core.imageprocessing +package dev.minios.pdaiv1.core.imageprocessing -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.imageprocessing.Base64EncodingConverter.Input -import com.shifthackz.aisdv1.core.imageprocessing.Base64EncodingConverter.Output -import com.shifthackz.aisdv1.core.imageprocessing.contract.RxImageProcessor -import com.shifthackz.aisdv1.core.imageprocessing.utils.base64DefaultToNoWrap +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.imageprocessing.Base64EncodingConverter.Input +import dev.minios.pdaiv1.core.imageprocessing.Base64EncodingConverter.Output +import dev.minios.pdaiv1.core.imageprocessing.contract.RxImageProcessor +import dev.minios.pdaiv1.core.imageprocessing.utils.base64DefaultToNoWrap import io.reactivex.rxjava3.core.Scheduler import io.reactivex.rxjava3.core.Single diff --git a/core/imageprocessing/src/main/java/com/shifthackz/aisdv1/core/imageprocessing/Base64ToBitmapConverter.kt b/core/imageprocessing/src/main/java/dev/minios/pdaiv1/core/imageprocessing/Base64ToBitmapConverter.kt similarity index 70% rename from core/imageprocessing/src/main/java/com/shifthackz/aisdv1/core/imageprocessing/Base64ToBitmapConverter.kt rename to core/imageprocessing/src/main/java/dev/minios/pdaiv1/core/imageprocessing/Base64ToBitmapConverter.kt index 432b5ff90..17499c3df 100644 --- a/core/imageprocessing/src/main/java/com/shifthackz/aisdv1/core/imageprocessing/Base64ToBitmapConverter.kt +++ b/core/imageprocessing/src/main/java/dev/minios/pdaiv1/core/imageprocessing/Base64ToBitmapConverter.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.core.imageprocessing +package dev.minios.pdaiv1.core.imageprocessing import android.graphics.Bitmap -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter.Input -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter.Output -import com.shifthackz.aisdv1.core.imageprocessing.contract.RxImageProcessor -import com.shifthackz.aisdv1.core.imageprocessing.utils.base64ToBitmap +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter.Input +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter.Output +import dev.minios.pdaiv1.core.imageprocessing.contract.RxImageProcessor +import dev.minios.pdaiv1.core.imageprocessing.utils.base64ToBitmap import io.reactivex.rxjava3.core.Scheduler import io.reactivex.rxjava3.core.Single diff --git a/core/imageprocessing/src/main/java/com/shifthackz/aisdv1/core/imageprocessing/BitmapToBase64Converter.kt b/core/imageprocessing/src/main/java/dev/minios/pdaiv1/core/imageprocessing/BitmapToBase64Converter.kt similarity index 69% rename from core/imageprocessing/src/main/java/com/shifthackz/aisdv1/core/imageprocessing/BitmapToBase64Converter.kt rename to core/imageprocessing/src/main/java/dev/minios/pdaiv1/core/imageprocessing/BitmapToBase64Converter.kt index 73cbd2a26..8320a2529 100644 --- a/core/imageprocessing/src/main/java/com/shifthackz/aisdv1/core/imageprocessing/BitmapToBase64Converter.kt +++ b/core/imageprocessing/src/main/java/dev/minios/pdaiv1/core/imageprocessing/BitmapToBase64Converter.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.core.imageprocessing +package dev.minios.pdaiv1.core.imageprocessing import android.graphics.Bitmap -import com.shifthackz.aisdv1.core.imageprocessing.BitmapToBase64Converter.Input -import com.shifthackz.aisdv1.core.imageprocessing.BitmapToBase64Converter.Output -import com.shifthackz.aisdv1.core.imageprocessing.contract.RxImageProcessor -import com.shifthackz.aisdv1.core.imageprocessing.utils.bitmapToBase64 +import dev.minios.pdaiv1.core.imageprocessing.BitmapToBase64Converter.Input +import dev.minios.pdaiv1.core.imageprocessing.BitmapToBase64Converter.Output +import dev.minios.pdaiv1.core.imageprocessing.contract.RxImageProcessor +import dev.minios.pdaiv1.core.imageprocessing.utils.bitmapToBase64 import io.reactivex.rxjava3.core.Scheduler import io.reactivex.rxjava3.core.Single diff --git a/core/imageprocessing/src/main/java/com/shifthackz/aisdv1/core/imageprocessing/contract/RxImageProcessor.kt b/core/imageprocessing/src/main/java/dev/minios/pdaiv1/core/imageprocessing/contract/RxImageProcessor.kt similarity index 69% rename from core/imageprocessing/src/main/java/com/shifthackz/aisdv1/core/imageprocessing/contract/RxImageProcessor.kt rename to core/imageprocessing/src/main/java/dev/minios/pdaiv1/core/imageprocessing/contract/RxImageProcessor.kt index 75791d441..f1eae3dbf 100644 --- a/core/imageprocessing/src/main/java/com/shifthackz/aisdv1/core/imageprocessing/contract/RxImageProcessor.kt +++ b/core/imageprocessing/src/main/java/dev/minios/pdaiv1/core/imageprocessing/contract/RxImageProcessor.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.imageprocessing.contract +package dev.minios.pdaiv1.core.imageprocessing.contract import io.reactivex.rxjava3.core.Single diff --git a/core/imageprocessing/src/main/java/com/shifthackz/aisdv1/core/imageprocessing/di/ImageProcessingModule.kt b/core/imageprocessing/src/main/java/dev/minios/pdaiv1/core/imageprocessing/di/ImageProcessingModule.kt similarity index 57% rename from core/imageprocessing/src/main/java/com/shifthackz/aisdv1/core/imageprocessing/di/ImageProcessingModule.kt rename to core/imageprocessing/src/main/java/dev/minios/pdaiv1/core/imageprocessing/di/ImageProcessingModule.kt index 5608ffabf..f081f6692 100644 --- a/core/imageprocessing/src/main/java/com/shifthackz/aisdv1/core/imageprocessing/di/ImageProcessingModule.kt +++ b/core/imageprocessing/src/main/java/dev/minios/pdaiv1/core/imageprocessing/di/ImageProcessingModule.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.core.imageprocessing.di +package dev.minios.pdaiv1.core.imageprocessing.di import android.graphics.BitmapFactory -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.imageprocessing.Base64EncodingConverter -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.core.imageprocessing.BitmapToBase64Converter -import com.shifthackz.aisdv1.core.imageprocessing.R +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.imageprocessing.Base64EncodingConverter +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.core.imageprocessing.BitmapToBase64Converter +import dev.minios.pdaiv1.core.imageprocessing.R import org.koin.android.ext.koin.androidContext import org.koin.dsl.module diff --git a/core/imageprocessing/src/main/java/com/shifthackz/aisdv1/core/imageprocessing/utils/Base64ImageUtils.kt b/core/imageprocessing/src/main/java/dev/minios/pdaiv1/core/imageprocessing/utils/Base64ImageUtils.kt similarity index 92% rename from core/imageprocessing/src/main/java/com/shifthackz/aisdv1/core/imageprocessing/utils/Base64ImageUtils.kt rename to core/imageprocessing/src/main/java/dev/minios/pdaiv1/core/imageprocessing/utils/Base64ImageUtils.kt index 855578188..8f2677517 100644 --- a/core/imageprocessing/src/main/java/com/shifthackz/aisdv1/core/imageprocessing/utils/Base64ImageUtils.kt +++ b/core/imageprocessing/src/main/java/dev/minios/pdaiv1/core/imageprocessing/utils/Base64ImageUtils.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.imageprocessing.utils +package dev.minios.pdaiv1.core.imageprocessing.utils import android.graphics.Bitmap import android.graphics.BitmapFactory diff --git a/core/localization/build.gradle.kts b/core/localization/build.gradle.kts index bc03000a6..7eb6a114b 100644 --- a/core/localization/build.gradle.kts +++ b/core/localization/build.gradle.kts @@ -3,5 +3,5 @@ plugins { } android { - namespace = "com.shifthackz.aisdv1.core.localization" + namespace = "dev.minios.pdaiv1.core.localization" } diff --git a/core/localization/src/main/java/com/shifthackz/aisdv1/core/localization/Localization.kt b/core/localization/src/main/java/dev/minios/pdaiv1/core/localization/Localization.kt similarity index 90% rename from core/localization/src/main/java/com/shifthackz/aisdv1/core/localization/Localization.kt rename to core/localization/src/main/java/dev/minios/pdaiv1/core/localization/Localization.kt index 70911117e..11314bd47 100644 --- a/core/localization/src/main/java/com/shifthackz/aisdv1/core/localization/Localization.kt +++ b/core/localization/src/main/java/dev/minios/pdaiv1/core/localization/Localization.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.localization +package dev.minios.pdaiv1.core.localization object Localization { diff --git a/core/localization/src/main/java/com/shifthackz/aisdv1/core/localization/formatter/DurationFormatter.kt b/core/localization/src/main/java/dev/minios/pdaiv1/core/localization/formatter/DurationFormatter.kt similarity index 88% rename from core/localization/src/main/java/com/shifthackz/aisdv1/core/localization/formatter/DurationFormatter.kt rename to core/localization/src/main/java/dev/minios/pdaiv1/core/localization/formatter/DurationFormatter.kt index 0697b56af..f25bddfd7 100644 --- a/core/localization/src/main/java/com/shifthackz/aisdv1/core/localization/formatter/DurationFormatter.kt +++ b/core/localization/src/main/java/dev/minios/pdaiv1/core/localization/formatter/DurationFormatter.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.localization.formatter +package dev.minios.pdaiv1.core.localization.formatter import java.util.Locale import kotlin.math.abs diff --git a/core/localization/src/main/res/values-ru/strings.xml b/core/localization/src/main/res/values-ru/strings.xml index 710e3020c..a38cb0067 100644 --- a/core/localization/src/main/res/values-ru/strings.xml +++ b/core/localization/src/main/res/values-ru/strings.xml @@ -192,7 +192,7 @@ Редактор тега Выберите источник - %1$s генераций находится в Download/SDAI + %1$s генераций находится в Download/PDAI Создано Тип Запрос @@ -331,7 +331,7 @@ Загрузка кастом модели Разрешения - Чтобы иметь возможность загружать пользовательскую модель, вам необходимо разрешить приложению SDAI управлять разрешениями на хранилище, поскольку, начиная с Android 11, оно необходимо для доступа к файлам хранилища без области действия. + Чтобы иметь возможность загружать пользовательскую модель, вам необходимо разрешить приложению PDAI управлять разрешениями на хранилище, поскольку, начиная с Android 11, оно необходимо для доступа к файлам хранилища без области действия. Настроить доступ Путь к модели Путь к папке локальной модели @@ -378,7 +378,7 @@ Только маска Спасибо этим замечательным людям за поддержку ❤ - SDAI — это приложение для Android, которое: + PDAI — это приложение для Android, которое: • Предоставляет Вам возможность создавать изображения с помощью Stable Diffusion;\n• Предоставляет Вам свободу выбора провайдера генерации;\n• Нет рекламы, телеметрии, не шпионит за Вами;\n• ПО с открытым исходным кодом;\n• Вы можете использовать его бесплатно. Если программа стала Вам полезной и Вы хотите выразить благодарность и оказать небольшую поддержку, вот кнопка ниже. diff --git a/core/localization/src/main/res/values-tr/strings.xml b/core/localization/src/main/res/values-tr/strings.xml index 46492b70a..41fa45fda 100644 --- a/core/localization/src/main/res/values-tr/strings.xml +++ b/core/localization/src/main/res/values-tr/strings.xml @@ -154,10 +154,10 @@ Swarm UI URL\'nizi sağlayın Araçlara kolay erişim, yüksek performans ve genişletilebilirlik üzerine odaklanan Modüler, Kararlı Yaygın Web Kullanıcı Arayüzü. - Bu yapılandırma Microsoft ONNX çalışma zamanını kullanır ve uzak bir sunucuya/buluta bağlanmaya gerek kalmadan telefonunuzda Stable Diffusion AI nesillerini çalıştırmanıza olanak tanır. + Bu yapılandırma Microsoft ONNX çalışma zamanını kullanır ve uzak bir sunucuya/buluta bağlanmaya gerek kalmadan telefonunuzda Pocket Diffusion nesillerini çalıştırmanıza olanak tanır. Uyarı! Yerel Yayılma işlevi beta testindedir. Yerel modu kullanarak yüksek kaliteli görüntüler beklemeyin. \n\nBu uygulama, güçlü olmayan telefonlarda iyi çalışmayabilir. Oluşturma performansı ve hızı, telefonunuzun kaynaklarına (CPU, RAM) ve oluşturulan görüntünün boyutuna bağlıdır (görüntü boyutu ne kadar küçükse, oluşturma o kadar hızlı olur). - Bu yapılandırma Google AI MediaPipe çalışma zamanını kullanır ve uzak bir sunucuya/buluta bağlanmaya gerek kalmadan telefonunuzda Stable Diffusion AI nesillerini çalıştırmanıza olanak tanır. + Bu yapılandırma Google AI MediaPipe çalışma zamanını kullanır ve uzak bir sunucuya/buluta bağlanmaya gerek kalmadan telefonunuzda Pocket Diffusion nesillerini çalıştırmanıza olanak tanır. Bu yapılandırma, cihaz üzerinde hızlı Stable Diffusion üretimi için NPU hızlandırması (HTP) ve MNN arka ucu ile Qualcomm QNN SDK kullanır. Snapdragon 8 Gen 1 veya daha yenisi gerektirir. @@ -188,7 +188,7 @@ Etiketi düzenle Kaynağı seçin - Kayıtlı %1$s fotoğrafınız var Download/SDAI + Kayıtlı %1$s fotoğrafınız var Download/PDAI Oluşturulma Tür İstem @@ -323,7 +323,7 @@ Uygulamayı açmak için buraya tıklayın. Özel modeli yükle - Özel modeli yükleyebilmek için SDAI uygulamasının depolama izinlerini yönetmesine izin vermeniz gerekir; çünkü Android 11\'den itibaren kapsamlı olmayan depolama dosyalarına erişmek gerekir. + Özel modeli yükleyebilmek için PDAI uygulamasının depolama izinlerini yönetmesine izin vermeniz gerekir; çünkü Android 11\'den itibaren kapsamlı olmayan depolama dosyalarına erişmek gerekir. Kurulum izni Yerel özel modeli kullanmak için telefonunuzun depolama alanındaki yerel klasöre yerleştirin. @@ -371,8 +371,8 @@ Sadece maskeli Destekleri için bu harika insanlara teşekkürler ❤ - SDAI, şu özelliklere sahip bir Android uygulamasıdır: - • Stable Diffusion AI ile görüntü oluşturma gücü sunar;\n• Üretim sağlayıcınızı seçme özgürlüğü verir;\n• AD, telemetri içermez ve sizi gözetlemez;\n• Açık kaynaklı bir yazılımdır;\n• Ücretsiz olarak kullanabilirsiniz. + PDAI, şu özelliklere sahip bir Android uygulamasıdır: + • Pocket Diffusion ile görüntü oluşturma gücü sunar;\n• Üretim sağlayıcınızı seçme özgürlüğü verir;\n• AD, telemetri içermez ve sizi gözetlemez;\n• Açık kaynaklı bir yazılımdır;\n• Ücretsiz olarak kullanabilirsiniz. Bu yazılımı değerli bulursanız ve teşekkür etmek ve biraz destek göstermek isterseniz, aşağıdaki düğmeyi kullanabilirsiniz. Depolamak diff --git a/core/localization/src/main/res/values-uk/strings.xml b/core/localization/src/main/res/values-uk/strings.xml index 2f9466e77..0b1eaabbf 100644 --- a/core/localization/src/main/res/values-uk/strings.xml +++ b/core/localization/src/main/res/values-uk/strings.xml @@ -188,7 +188,7 @@ Редактор тегу Виберіть джерело - %1$s файли збережено в Download/SDAI + %1$s файли збережено в Download/PDAI Створене Тип Запит @@ -323,7 +323,7 @@ Натисніть щоб відкрити додаток. Завантажити кастом модель - Щоб мати можливість завантажити спеціальну модель, вам потрібно дозволити додатку SDAI керувати дозволами на зберігання, оскільки, починаючи з Android 11, це потрібно для доступу до файлів зберігання без обмежень. + Щоб мати можливість завантажити спеціальну модель, вам потрібно дозволити додатку PDAI керувати дозволами на зберігання, оскільки, починаючи з Android 11, це потрібно для доступу до файлів зберігання без обмежень. Налаштувати доступ Щоб використовувати локальну спеціальну модель, помістіть її в локальну папку в пам’яті телефону. @@ -371,8 +371,8 @@ Тільки маска Дякую цим чудовим людям за підтримку ❤ - SDAI – це програма для Android, яка: - • Надає Вам можливість створювати зображення за допомогою Stable Diffusion AI;\n• Дає Вам свободу вибору постачальника генерації;\n• Не містить реклами, телеметрії та не шпигує за вами;\n• ПО з відкритим кодом;\n• Ви можете використовувати його безкоштовно. + PDAI – це програма для Android, яка: + • Надає Вам можливість створювати зображення за допомогою Pocket Diffusion;\n• Дає Вам свободу вибору постачальника генерації;\n• Не містить реклами, телеметрії та не шпигує за вами;\n• ПО з відкритим кодом;\n• Ви можете використовувати його безкоштовно. Якщо програма була Вам корисна, та Ви бажаєте подякувати та трохи підтримати розробника, натисніть кнопку нижче. Сховище diff --git a/core/localization/src/main/res/values-zh/strings.xml b/core/localization/src/main/res/values-zh/strings.xml index cf3928e26..b9f8cc891 100644 --- a/core/localization/src/main/res/values-zh/strings.xml +++ b/core/localization/src/main/res/values-zh/strings.xml @@ -178,10 +178,10 @@ 模块化的 Stable Diffusion Web 用户界面,专注于易访问、高性能和可扩展性。 - 此配置使用 Microsoft ONNX 运行时,您可以在手机端运行 Stable Diffusion AI 的生成功能,而无需连接至远程服务器/云。 + 此配置使用 Microsoft ONNX 运行时,您可以在手机端运行 Pocket Diffusion 的生成功能,而无需连接至远程服务器/云。 警告!Local Diffusion 功能处于测试版。可能无法获得高质量图像。\n\n此功能在资源受限设备上可能不及预期。生成性能和速度取决于您的手机资源(CPU、RAM)和生成的图像大小(图像越小,生成越快)。 - 此配置使用 Google AI MediaPipe 运行时,您可以在手机端运行 Stable Diffusion AI 的生成功能,而无需连接至远程服务器/云。 + 此配置使用 Google AI MediaPipe 运行时,您可以在手机端运行 Pocket Diffusion 的生成功能,而无需连接至远程服务器/云。 此配置使用高通 QNN SDK,通过 NPU 加速(HTP)和 MNN 后端在设备上快速生成 Stable Diffusion 图像。需要骁龙 8 Gen 1 或更新版本。 @@ -217,7 +217,7 @@ 选择来源 - 您在 Download/SDAI 中保存了%1$s张照片。 + 您在 Download/PDAI 中保存了%1$s张照片。 创建日期 类型 提示文本 @@ -369,7 +369,7 @@ 加载自定义模型 - 为了能够加载自定义模型,您需要允许 SDAI 应用管理存储权限,因为从 Android 11 开始,它需要访问非范围存储文件。 + 为了能够加载自定义模型,您需要允许 PDAI 应用管理存储权限,因为从 Android 11 开始,它需要访问非范围存储文件。 设置权限 模型路径 本地模型文件夹路径 @@ -422,8 +422,8 @@ 仅掩码 感谢这些了不起的人们提供的支持 ❤ - SDAI 是一款 Android 应用程序,它: - • 赋予您使用 Stable Diffusion AI 创建图像的能力;\n• 让您自由选择生成供应商;\n• 无广告、无遥测,无监控;\n• 是一款开源软件;\n• 欢迎您免费使用。 + PDAI 是一款 Android 应用程序,它: + • 赋予您使用 Pocket Diffusion 创建图像的能力;\n• 让您自由选择生成供应商;\n• 无广告、无遥测,无监控;\n• 是一款开源软件;\n• 欢迎您免费使用。 如果您觉得这个软件有价值,想要表示感谢并给予一些支持,请点击下方的按钮。 存储 diff --git a/core/localization/src/main/res/values/strings.xml b/core/localization/src/main/res/values/strings.xml index 06d3d7fdf..6efd2c519 100755 --- a/core/localization/src/main/res/values/strings.xml +++ b/core/localization/src/main/res/values/strings.xml @@ -180,11 +180,11 @@ A Modular Stable Diffusion Web-User-Interface, with an emphasis on making tools easily accessible, high performance, and extensibility. Local Diffusion Microsoft ONNX - This configuration uses Microsoft ONNX runtime and allows to run Stable Diffusion AI generations on your phone, with no need to connect to remote server/cloud. + This configuration uses Microsoft ONNX runtime and allows to run Pocket Diffusion generations on your phone, with no need to connect to remote server/cloud. Warning! Local Diffusion functionality is in beta-test. Don\'t expect for high quality images using local mode. \n\nThis implementation may not work well on non-powerful phones. Generation performance and speed depends on your phone resources (CPU, RAM) and the size of generated image (the smaller the image size, the faster the generation). Local Diffusion Google AI MediaPipe - This configuration uses Google AI MediaPipe and allows to run Stable Diffusion AI generations on your phone, with no need to connect to remote server/cloud. + This configuration uses Google AI MediaPipe and allows to run Pocket Diffusion generations on your phone, with no need to connect to remote server/cloud. Local Diffusion Qualcomm QNN This configuration uses Qualcomm QNN SDK with NPU acceleration (HTP) and MNN backend for fast on-device Stable Diffusion generation. Requires Snapdragon 8 Gen 1 or newer. @@ -218,7 +218,7 @@ Edit tag Select source - You have %1$s photos saved in Download/SDAI + You have %1$s photos saved in Download/PDAI Created Type Model @@ -365,7 +365,7 @@ Load custom model Permissions - To be able to load custom model, you need to allow SDAI app manage storage permissions, because starting from Android 11 it is needed to access non-scoped storage files. + To be able to load custom model, you need to allow PDAI app manage storage permissions, because starting from Android 11 it is needed to access non-scoped storage files. Setup permission Model path Local model folder path @@ -414,8 +414,8 @@ Only masked Thanks to this amazing people for the support ❤ - SDAI is an Android application that: - • Brings you power of creating images with Stable Diffusion AI;\n• Gives you freedom to choose your generation provider;\n• Has no ADs, telemetry and does not spy on you;\n• Is an open source software;\n• You are welcome to use it for free. + PDAI is an Android application that: + • Brings you power of creating images with Pocket Diffusion;\n• Gives you freedom to choose your generation provider;\n• Has no ADs, telemetry and does not spy on you;\n• Is an open source software;\n• You are welcome to use it for free. In case you find this software valuable, and you\'d like to say thanks and show a little support, here is the button below. Storage diff --git a/core/notification/build.gradle.kts b/core/notification/build.gradle.kts index ab2254e71..88be6055f 100644 --- a/core/notification/build.gradle.kts +++ b/core/notification/build.gradle.kts @@ -3,7 +3,7 @@ plugins { } android { - namespace = "com.shifthackz.aisdv1.core.notification" + namespace = "dev.minios.pdaiv1.core.notification" } dependencies { diff --git a/core/notification/src/main/java/com/shifthackz/aisdv1/core/notification/PushNotificationManager.kt b/core/notification/src/main/java/dev/minios/pdaiv1/core/notification/PushNotificationManager.kt similarity index 86% rename from core/notification/src/main/java/com/shifthackz/aisdv1/core/notification/PushNotificationManager.kt rename to core/notification/src/main/java/dev/minios/pdaiv1/core/notification/PushNotificationManager.kt index 51d727cdd..11b31dd04 100644 --- a/core/notification/src/main/java/com/shifthackz/aisdv1/core/notification/PushNotificationManager.kt +++ b/core/notification/src/main/java/dev/minios/pdaiv1/core/notification/PushNotificationManager.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.core.notification +package dev.minios.pdaiv1.core.notification import android.app.Notification import androidx.core.app.NotificationCompat -import com.shifthackz.aisdv1.core.model.UiText +import dev.minios.pdaiv1.core.model.UiText interface PushNotificationManager { diff --git a/core/notification/src/main/java/com/shifthackz/aisdv1/core/notification/PushNotificationManagerImpl.kt b/core/notification/src/main/java/dev/minios/pdaiv1/core/notification/PushNotificationManagerImpl.kt similarity index 92% rename from core/notification/src/main/java/com/shifthackz/aisdv1/core/notification/PushNotificationManagerImpl.kt rename to core/notification/src/main/java/dev/minios/pdaiv1/core/notification/PushNotificationManagerImpl.kt index f1decda9f..195361344 100644 --- a/core/notification/src/main/java/com/shifthackz/aisdv1/core/notification/PushNotificationManagerImpl.kt +++ b/core/notification/src/main/java/dev/minios/pdaiv1/core/notification/PushNotificationManagerImpl.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.notification +package dev.minios.pdaiv1.core.notification import android.Manifest import android.annotation.SuppressLint @@ -11,10 +11,10 @@ import android.os.Build import androidx.core.app.ActivityCompat import androidx.core.app.NotificationCompat import androidx.core.app.NotificationManagerCompat -import com.shifthackz.aisdv1.core.common.extensions.isAppInForeground -import com.shifthackz.aisdv1.core.common.log.debugLog -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.core.model.asUiText +import dev.minios.pdaiv1.core.common.extensions.isAppInForeground +import dev.minios.pdaiv1.core.common.log.debugLog +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.core.model.asUiText internal class PushNotificationManagerImpl( private val context: Context, diff --git a/core/notification/src/main/java/com/shifthackz/aisdv1/core/notification/di/NotificationModule.kt b/core/notification/src/main/java/dev/minios/pdaiv1/core/notification/di/NotificationModule.kt similarity index 62% rename from core/notification/src/main/java/com/shifthackz/aisdv1/core/notification/di/NotificationModule.kt rename to core/notification/src/main/java/dev/minios/pdaiv1/core/notification/di/NotificationModule.kt index 8e042aad7..05014d298 100644 --- a/core/notification/src/main/java/com/shifthackz/aisdv1/core/notification/di/NotificationModule.kt +++ b/core/notification/src/main/java/dev/minios/pdaiv1/core/notification/di/NotificationModule.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.core.notification.di +package dev.minios.pdaiv1.core.notification.di import androidx.core.app.NotificationManagerCompat -import com.shifthackz.aisdv1.core.notification.PushNotificationManager -import com.shifthackz.aisdv1.core.notification.PushNotificationManagerImpl +import dev.minios.pdaiv1.core.notification.PushNotificationManager +import dev.minios.pdaiv1.core.notification.PushNotificationManagerImpl import org.koin.android.ext.koin.androidContext import org.koin.dsl.module diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts index a9cb8e048..21c1f1826 100755 --- a/core/ui/build.gradle.kts +++ b/core/ui/build.gradle.kts @@ -3,5 +3,5 @@ plugins { } android { - namespace = "com.shifthackz.aisdv1.core.ui" + namespace = "dev.minios.pdaiv1.core.ui" } diff --git a/core/ui/src/main/java/com/shifthackz/aisdv1/core/extensions/ComposableExtensions.kt b/core/ui/src/main/java/dev/minios/pdaiv1/core/extensions/ComposableExtensions.kt similarity index 94% rename from core/ui/src/main/java/com/shifthackz/aisdv1/core/extensions/ComposableExtensions.kt rename to core/ui/src/main/java/dev/minios/pdaiv1/core/extensions/ComposableExtensions.kt index 5e345763d..c19b2a7b4 100644 --- a/core/ui/src/main/java/com/shifthackz/aisdv1/core/extensions/ComposableExtensions.kt +++ b/core/ui/src/main/java/dev/minios/pdaiv1/core/extensions/ComposableExtensions.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.extensions +package dev.minios.pdaiv1.core.extensions import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource @@ -18,7 +18,7 @@ import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.rememberTextMeasurer import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.common.extensions.EmptyLambda +import dev.minios.pdaiv1.core.common.extensions.EmptyLambda @Composable fun Modifier.gesturesDisabled() = clickable( diff --git a/core/ui/src/main/java/com/shifthackz/aisdv1/core/extensions/LazyGridScopePagingItemsExtension.kt b/core/ui/src/main/java/dev/minios/pdaiv1/core/extensions/LazyGridScopePagingItemsExtension.kt similarity index 96% rename from core/ui/src/main/java/com/shifthackz/aisdv1/core/extensions/LazyGridScopePagingItemsExtension.kt rename to core/ui/src/main/java/dev/minios/pdaiv1/core/extensions/LazyGridScopePagingItemsExtension.kt index c9f87e502..7398a5877 100644 --- a/core/ui/src/main/java/com/shifthackz/aisdv1/core/extensions/LazyGridScopePagingItemsExtension.kt +++ b/core/ui/src/main/java/dev/minios/pdaiv1/core/extensions/LazyGridScopePagingItemsExtension.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.extensions +package dev.minios.pdaiv1.core.extensions import androidx.compose.foundation.lazy.grid.GridItemSpan import androidx.compose.foundation.lazy.grid.LazyGridItemScope diff --git a/core/ui/src/main/java/com/shifthackz/aisdv1/core/extensions/RealPathExtensions.kt b/core/ui/src/main/java/dev/minios/pdaiv1/core/extensions/RealPathExtensions.kt similarity index 98% rename from core/ui/src/main/java/com/shifthackz/aisdv1/core/extensions/RealPathExtensions.kt rename to core/ui/src/main/java/dev/minios/pdaiv1/core/extensions/RealPathExtensions.kt index 395f73cd9..6b958aa4d 100644 --- a/core/ui/src/main/java/com/shifthackz/aisdv1/core/extensions/RealPathExtensions.kt +++ b/core/ui/src/main/java/dev/minios/pdaiv1/core/extensions/RealPathExtensions.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.extensions +package dev.minios.pdaiv1.core.extensions import android.content.ContentUris import android.content.Context diff --git a/core/ui/src/main/java/com/shifthackz/aisdv1/core/extensions/RowScopeExtensions.kt b/core/ui/src/main/java/dev/minios/pdaiv1/core/extensions/RowScopeExtensions.kt similarity index 92% rename from core/ui/src/main/java/com/shifthackz/aisdv1/core/extensions/RowScopeExtensions.kt rename to core/ui/src/main/java/dev/minios/pdaiv1/core/extensions/RowScopeExtensions.kt index 4ae86ba75..5e1ff02e4 100644 --- a/core/ui/src/main/java/com/shifthackz/aisdv1/core/extensions/RowScopeExtensions.kt +++ b/core/ui/src/main/java/dev/minios/pdaiv1/core/extensions/RowScopeExtensions.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.extensions +package dev.minios.pdaiv1.core.extensions import androidx.compose.foundation.border import androidx.compose.foundation.layout.RowScope diff --git a/core/ui/src/main/java/com/shifthackz/aisdv1/core/extensions/ShakeExtensions.kt b/core/ui/src/main/java/dev/minios/pdaiv1/core/extensions/ShakeExtensions.kt similarity index 97% rename from core/ui/src/main/java/com/shifthackz/aisdv1/core/extensions/ShakeExtensions.kt rename to core/ui/src/main/java/dev/minios/pdaiv1/core/extensions/ShakeExtensions.kt index c092424a9..16e9505d1 100644 --- a/core/ui/src/main/java/com/shifthackz/aisdv1/core/extensions/ShakeExtensions.kt +++ b/core/ui/src/main/java/dev/minios/pdaiv1/core/extensions/ShakeExtensions.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.extensions +package dev.minios.pdaiv1.core.extensions import androidx.compose.animation.core.LinearEasing import androidx.compose.animation.core.RepeatMode diff --git a/core/ui/src/main/java/com/shifthackz/aisdv1/core/extensions/ShimmerExtensions.kt b/core/ui/src/main/java/dev/minios/pdaiv1/core/extensions/ShimmerExtensions.kt similarity index 97% rename from core/ui/src/main/java/com/shifthackz/aisdv1/core/extensions/ShimmerExtensions.kt rename to core/ui/src/main/java/dev/minios/pdaiv1/core/extensions/ShimmerExtensions.kt index 7abafeff3..b586815d4 100644 --- a/core/ui/src/main/java/com/shifthackz/aisdv1/core/extensions/ShimmerExtensions.kt +++ b/core/ui/src/main/java/dev/minios/pdaiv1/core/extensions/ShimmerExtensions.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.extensions +package dev.minios.pdaiv1.core.extensions import androidx.compose.animation.core.animateFloat import androidx.compose.animation.core.infiniteRepeatable diff --git a/core/ui/src/main/java/com/shifthackz/aisdv1/core/model/UiText.kt b/core/ui/src/main/java/dev/minios/pdaiv1/core/model/UiText.kt similarity index 98% rename from core/ui/src/main/java/com/shifthackz/aisdv1/core/model/UiText.kt rename to core/ui/src/main/java/dev/minios/pdaiv1/core/model/UiText.kt index 7cd643c19..c5768b573 100755 --- a/core/ui/src/main/java/com/shifthackz/aisdv1/core/model/UiText.kt +++ b/core/ui/src/main/java/dev/minios/pdaiv1/core/model/UiText.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.core.model +package dev.minios.pdaiv1.core.model import android.content.Context import android.content.res.Resources diff --git a/core/ui/src/main/java/com/shifthackz/aisdv1/core/sharing/SharingExtensions.kt b/core/ui/src/main/java/dev/minios/pdaiv1/core/sharing/SharingExtensions.kt similarity index 93% rename from core/ui/src/main/java/com/shifthackz/aisdv1/core/sharing/SharingExtensions.kt rename to core/ui/src/main/java/dev/minios/pdaiv1/core/sharing/SharingExtensions.kt index 94ca78526..8deaaf7aa 100644 --- a/core/ui/src/main/java/com/shifthackz/aisdv1/core/sharing/SharingExtensions.kt +++ b/core/ui/src/main/java/dev/minios/pdaiv1/core/sharing/SharingExtensions.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.core.sharing +package dev.minios.pdaiv1.core.sharing import android.content.Context import android.content.Intent import android.net.Uri -import com.shifthackz.aisdv1.core.common.extensions.uriFromFile +import dev.minios.pdaiv1.core.common.extensions.uriFromFile import java.io.File fun Context.shareText( diff --git a/core/ui/src/main/java/com/shifthackz/aisdv1/core/viewmodel/MviRxViewModel.kt b/core/ui/src/main/java/dev/minios/pdaiv1/core/viewmodel/MviRxViewModel.kt similarity index 83% rename from core/ui/src/main/java/com/shifthackz/aisdv1/core/viewmodel/MviRxViewModel.kt rename to core/ui/src/main/java/dev/minios/pdaiv1/core/viewmodel/MviRxViewModel.kt index dff49cfb6..fa712c0e3 100644 --- a/core/ui/src/main/java/com/shifthackz/aisdv1/core/viewmodel/MviRxViewModel.kt +++ b/core/ui/src/main/java/dev/minios/pdaiv1/core/viewmodel/MviRxViewModel.kt @@ -1,8 +1,8 @@ @file:Suppress("unused") -package com.shifthackz.aisdv1.core.viewmodel +package dev.minios.pdaiv1.core.viewmodel -import com.shifthackz.aisdv1.core.common.contract.RxDisposableContract +import dev.minios.pdaiv1.core.common.contract.RxDisposableContract import com.shifthackz.android.core.mvi.MviEffect import com.shifthackz.android.core.mvi.MviIntent import com.shifthackz.android.core.mvi.MviState diff --git a/core/ui/src/main/java/com/shifthackz/aisdv1/core/viewmodel/RxViewModel.kt b/core/ui/src/main/java/dev/minios/pdaiv1/core/viewmodel/RxViewModel.kt similarity index 73% rename from core/ui/src/main/java/com/shifthackz/aisdv1/core/viewmodel/RxViewModel.kt rename to core/ui/src/main/java/dev/minios/pdaiv1/core/viewmodel/RxViewModel.kt index 5eefdc736..19033ab56 100644 --- a/core/ui/src/main/java/com/shifthackz/aisdv1/core/viewmodel/RxViewModel.kt +++ b/core/ui/src/main/java/dev/minios/pdaiv1/core/viewmodel/RxViewModel.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.core.viewmodel +package dev.minios.pdaiv1.core.viewmodel import androidx.lifecycle.ViewModel -import com.shifthackz.aisdv1.core.common.contract.RxDisposableContract +import dev.minios.pdaiv1.core.common.contract.RxDisposableContract import io.reactivex.rxjava3.disposables.CompositeDisposable abstract class RxViewModel : ViewModel(), RxDisposableContract { diff --git a/core/validation/build.gradle.kts b/core/validation/build.gradle.kts index 8afadbb03..58bfd59b1 100644 --- a/core/validation/build.gradle.kts +++ b/core/validation/build.gradle.kts @@ -3,7 +3,7 @@ plugins { } android { - namespace = "com.shifthackz.aisdv1.core.validation" + namespace = "dev.minios.pdaiv1.core.validation" } dependencies { diff --git a/core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/di/ValidatorsModule.kt b/core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/di/ValidatorsModule.kt deleted file mode 100644 index 81778ad90..000000000 --- a/core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/di/ValidatorsModule.kt +++ /dev/null @@ -1,22 +0,0 @@ -package com.shifthackz.aisdv1.core.validation.di - -import com.shifthackz.aisdv1.core.validation.common.CommonStringValidator -import com.shifthackz.aisdv1.core.validation.common.CommonStringValidatorImpl -import com.shifthackz.aisdv1.core.validation.dimension.DimensionValidator -import com.shifthackz.aisdv1.core.validation.dimension.DimensionValidatorImpl -import com.shifthackz.aisdv1.core.validation.path.FilePathValidator -import com.shifthackz.aisdv1.core.validation.path.FilePathValidatorImpl -import com.shifthackz.aisdv1.core.validation.url.UrlValidator -import com.shifthackz.aisdv1.core.validation.url.UrlValidatorImpl -import org.koin.core.module.dsl.factoryOf -import org.koin.dsl.bind -import org.koin.dsl.module - -val validatorsModule = module { - // !!! Do not use [factoryOf] for DimensionValidatorImpl, it has 2 default Ints in constructor - factory { DimensionValidatorImpl() } - factory { UrlValidatorImpl() } - - factoryOf(::CommonStringValidatorImpl) bind CommonStringValidator::class - factoryOf(::FilePathValidatorImpl) bind FilePathValidator::class -} diff --git a/core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/ValidationResult.kt b/core/validation/src/main/java/dev/minios/pdaiv1/core/validation/ValidationResult.kt similarity index 80% rename from core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/ValidationResult.kt rename to core/validation/src/main/java/dev/minios/pdaiv1/core/validation/ValidationResult.kt index 94f8d53f3..a39ad0a9f 100644 --- a/core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/ValidationResult.kt +++ b/core/validation/src/main/java/dev/minios/pdaiv1/core/validation/ValidationResult.kt @@ -1,6 +1,6 @@ @file:Suppress("unused") -package com.shifthackz.aisdv1.core.validation +package dev.minios.pdaiv1.core.validation data class ValidationResult( val isValid: Boolean, diff --git a/core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/common/CommonStringValidator.kt b/core/validation/src/main/java/dev/minios/pdaiv1/core/validation/common/CommonStringValidator.kt similarity index 60% rename from core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/common/CommonStringValidator.kt rename to core/validation/src/main/java/dev/minios/pdaiv1/core/validation/common/CommonStringValidator.kt index fd9c3ac30..973d758ba 100644 --- a/core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/common/CommonStringValidator.kt +++ b/core/validation/src/main/java/dev/minios/pdaiv1/core/validation/common/CommonStringValidator.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.core.validation.common +package dev.minios.pdaiv1.core.validation.common -import com.shifthackz.aisdv1.core.validation.ValidationResult +import dev.minios.pdaiv1.core.validation.ValidationResult interface CommonStringValidator { diff --git a/core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/common/CommonStringValidatorImpl.kt b/core/validation/src/main/java/dev/minios/pdaiv1/core/validation/common/CommonStringValidatorImpl.kt similarity index 77% rename from core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/common/CommonStringValidatorImpl.kt rename to core/validation/src/main/java/dev/minios/pdaiv1/core/validation/common/CommonStringValidatorImpl.kt index bf3c69aea..a02c8535a 100644 --- a/core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/common/CommonStringValidatorImpl.kt +++ b/core/validation/src/main/java/dev/minios/pdaiv1/core/validation/common/CommonStringValidatorImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.core.validation.common +package dev.minios.pdaiv1.core.validation.common -import com.shifthackz.aisdv1.core.validation.ValidationResult +import dev.minios.pdaiv1.core.validation.ValidationResult internal class CommonStringValidatorImpl : CommonStringValidator { diff --git a/core/validation/src/main/java/dev/minios/pdaiv1/core/validation/di/ValidatorsModule.kt b/core/validation/src/main/java/dev/minios/pdaiv1/core/validation/di/ValidatorsModule.kt new file mode 100644 index 000000000..c5830563a --- /dev/null +++ b/core/validation/src/main/java/dev/minios/pdaiv1/core/validation/di/ValidatorsModule.kt @@ -0,0 +1,22 @@ +package dev.minios.pdaiv1.core.validation.di + +import dev.minios.pdaiv1.core.validation.common.CommonStringValidator +import dev.minios.pdaiv1.core.validation.common.CommonStringValidatorImpl +import dev.minios.pdaiv1.core.validation.dimension.DimensionValidator +import dev.minios.pdaiv1.core.validation.dimension.DimensionValidatorImpl +import dev.minios.pdaiv1.core.validation.path.FilePathValidator +import dev.minios.pdaiv1.core.validation.path.FilePathValidatorImpl +import dev.minios.pdaiv1.core.validation.url.UrlValidator +import dev.minios.pdaiv1.core.validation.url.UrlValidatorImpl +import org.koin.core.module.dsl.factoryOf +import org.koin.dsl.bind +import org.koin.dsl.module + +val validatorsModule = module { + // !!! Do not use [factoryOf] for DimensionValidatorImpl, it has 2 default Ints in constructor + factory { DimensionValidatorImpl() } + factory { UrlValidatorImpl() } + + factoryOf(::CommonStringValidatorImpl) bind CommonStringValidator::class + factoryOf(::FilePathValidatorImpl) bind FilePathValidator::class +} diff --git a/core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/dimension/DimensionValidator.kt b/core/validation/src/main/java/dev/minios/pdaiv1/core/validation/dimension/DimensionValidator.kt similarity index 73% rename from core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/dimension/DimensionValidator.kt rename to core/validation/src/main/java/dev/minios/pdaiv1/core/validation/dimension/DimensionValidator.kt index 0c6d5bb04..99d10481b 100644 --- a/core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/dimension/DimensionValidator.kt +++ b/core/validation/src/main/java/dev/minios/pdaiv1/core/validation/dimension/DimensionValidator.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.core.validation.dimension +package dev.minios.pdaiv1.core.validation.dimension -import com.shifthackz.aisdv1.core.validation.ValidationResult +import dev.minios.pdaiv1.core.validation.ValidationResult fun interface DimensionValidator { diff --git a/core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/dimension/DimensionValidatorImpl.kt b/core/validation/src/main/java/dev/minios/pdaiv1/core/validation/dimension/DimensionValidatorImpl.kt similarity index 91% rename from core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/dimension/DimensionValidatorImpl.kt rename to core/validation/src/main/java/dev/minios/pdaiv1/core/validation/dimension/DimensionValidatorImpl.kt index a8448d8c2..8914ae3cf 100644 --- a/core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/dimension/DimensionValidatorImpl.kt +++ b/core/validation/src/main/java/dev/minios/pdaiv1/core/validation/dimension/DimensionValidatorImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.core.validation.dimension +package dev.minios.pdaiv1.core.validation.dimension -import com.shifthackz.aisdv1.core.validation.ValidationResult +import dev.minios.pdaiv1.core.validation.ValidationResult internal class DimensionValidatorImpl( private val minimum: Int = MINIMUM, diff --git a/core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/path/FilePathValidator.kt b/core/validation/src/main/java/dev/minios/pdaiv1/core/validation/path/FilePathValidator.kt similarity index 64% rename from core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/path/FilePathValidator.kt rename to core/validation/src/main/java/dev/minios/pdaiv1/core/validation/path/FilePathValidator.kt index 6d09d4e36..4291987e7 100644 --- a/core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/path/FilePathValidator.kt +++ b/core/validation/src/main/java/dev/minios/pdaiv1/core/validation/path/FilePathValidator.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.core.validation.path +package dev.minios.pdaiv1.core.validation.path -import com.shifthackz.aisdv1.core.validation.ValidationResult +import dev.minios.pdaiv1.core.validation.ValidationResult interface FilePathValidator { diff --git a/core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/path/FilePathValidatorImpl.kt b/core/validation/src/main/java/dev/minios/pdaiv1/core/validation/path/FilePathValidatorImpl.kt similarity index 85% rename from core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/path/FilePathValidatorImpl.kt rename to core/validation/src/main/java/dev/minios/pdaiv1/core/validation/path/FilePathValidatorImpl.kt index ef3c8e968..96b9f4379 100644 --- a/core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/path/FilePathValidatorImpl.kt +++ b/core/validation/src/main/java/dev/minios/pdaiv1/core/validation/path/FilePathValidatorImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.core.validation.path +package dev.minios.pdaiv1.core.validation.path -import com.shifthackz.aisdv1.core.validation.ValidationResult +import dev.minios.pdaiv1.core.validation.ValidationResult class FilePathValidatorImpl : FilePathValidator { diff --git a/core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/url/UrlValidator.kt b/core/validation/src/main/java/dev/minios/pdaiv1/core/validation/url/UrlValidator.kt similarity index 73% rename from core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/url/UrlValidator.kt rename to core/validation/src/main/java/dev/minios/pdaiv1/core/validation/url/UrlValidator.kt index 69bd43059..b5af42407 100644 --- a/core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/url/UrlValidator.kt +++ b/core/validation/src/main/java/dev/minios/pdaiv1/core/validation/url/UrlValidator.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.core.validation.url +package dev.minios.pdaiv1.core.validation.url -import com.shifthackz.aisdv1.core.validation.ValidationResult +import dev.minios.pdaiv1.core.validation.ValidationResult interface UrlValidator { diff --git a/core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/url/UrlValidatorImpl.kt b/core/validation/src/main/java/dev/minios/pdaiv1/core/validation/url/UrlValidatorImpl.kt similarity index 95% rename from core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/url/UrlValidatorImpl.kt rename to core/validation/src/main/java/dev/minios/pdaiv1/core/validation/url/UrlValidatorImpl.kt index c6ab7e577..b1577c226 100644 --- a/core/validation/src/main/java/com/shifthackz/aisdv1/core/validation/url/UrlValidatorImpl.kt +++ b/core/validation/src/main/java/dev/minios/pdaiv1/core/validation/url/UrlValidatorImpl.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.core.validation.url +package dev.minios.pdaiv1.core.validation.url import android.util.Patterns import android.webkit.URLUtil -import com.shifthackz.aisdv1.core.validation.ValidationResult +import dev.minios.pdaiv1.core.validation.ValidationResult import java.net.URI import java.util.regex.Pattern diff --git a/core/validation/src/test/java/com/shifthackz/aisdv1/core/validation/common/CommonStringValidatorImplTest.kt b/core/validation/src/test/java/dev/minios/pdaiv1/core/validation/common/CommonStringValidatorImplTest.kt similarity index 92% rename from core/validation/src/test/java/com/shifthackz/aisdv1/core/validation/common/CommonStringValidatorImplTest.kt rename to core/validation/src/test/java/dev/minios/pdaiv1/core/validation/common/CommonStringValidatorImplTest.kt index 771f8f0c2..86a240c4f 100644 --- a/core/validation/src/test/java/com/shifthackz/aisdv1/core/validation/common/CommonStringValidatorImplTest.kt +++ b/core/validation/src/test/java/dev/minios/pdaiv1/core/validation/common/CommonStringValidatorImplTest.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.core.validation.common +package dev.minios.pdaiv1.core.validation.common -import com.shifthackz.aisdv1.core.validation.ValidationResult +import dev.minios.pdaiv1.core.validation.ValidationResult import org.junit.Assert import org.junit.Test diff --git a/core/validation/src/test/java/com/shifthackz/aisdv1/core/validation/dimension/DimensionValidatorImplTest.kt b/core/validation/src/test/java/dev/minios/pdaiv1/core/validation/dimension/DimensionValidatorImplTest.kt similarity index 95% rename from core/validation/src/test/java/com/shifthackz/aisdv1/core/validation/dimension/DimensionValidatorImplTest.kt rename to core/validation/src/test/java/dev/minios/pdaiv1/core/validation/dimension/DimensionValidatorImplTest.kt index fff6b4aed..45f6325eb 100644 --- a/core/validation/src/test/java/com/shifthackz/aisdv1/core/validation/dimension/DimensionValidatorImplTest.kt +++ b/core/validation/src/test/java/dev/minios/pdaiv1/core/validation/dimension/DimensionValidatorImplTest.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.core.validation.dimension +package dev.minios.pdaiv1.core.validation.dimension -import com.shifthackz.aisdv1.core.validation.ValidationResult +import dev.minios.pdaiv1.core.validation.ValidationResult import org.junit.Assert import org.junit.Test diff --git a/core/validation/src/test/java/com/shifthackz/aisdv1/core/validation/path/FilePathValidatorImplTest.kt b/core/validation/src/test/java/dev/minios/pdaiv1/core/validation/path/FilePathValidatorImplTest.kt similarity index 93% rename from core/validation/src/test/java/com/shifthackz/aisdv1/core/validation/path/FilePathValidatorImplTest.kt rename to core/validation/src/test/java/dev/minios/pdaiv1/core/validation/path/FilePathValidatorImplTest.kt index e33c20122..9caf272d4 100644 --- a/core/validation/src/test/java/com/shifthackz/aisdv1/core/validation/path/FilePathValidatorImplTest.kt +++ b/core/validation/src/test/java/dev/minios/pdaiv1/core/validation/path/FilePathValidatorImplTest.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.core.validation.path +package dev.minios.pdaiv1.core.validation.path -import com.shifthackz.aisdv1.core.validation.ValidationResult +import dev.minios.pdaiv1.core.validation.ValidationResult import org.junit.Assert import org.junit.Test diff --git a/core/validation/src/test/java/com/shifthackz/aisdv1/core/validation/url/UrlValidatorImplTest.kt b/core/validation/src/test/java/dev/minios/pdaiv1/core/validation/url/UrlValidatorImplTest.kt similarity index 97% rename from core/validation/src/test/java/com/shifthackz/aisdv1/core/validation/url/UrlValidatorImplTest.kt rename to core/validation/src/test/java/dev/minios/pdaiv1/core/validation/url/UrlValidatorImplTest.kt index 549f8a612..6846157ed 100644 --- a/core/validation/src/test/java/com/shifthackz/aisdv1/core/validation/url/UrlValidatorImplTest.kt +++ b/core/validation/src/test/java/dev/minios/pdaiv1/core/validation/url/UrlValidatorImplTest.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.core.validation.url +package dev.minios.pdaiv1.core.validation.url import android.webkit.URLUtil -import com.shifthackz.aisdv1.core.validation.ValidationResult +import dev.minios.pdaiv1.core.validation.ValidationResult import io.mockk.every import io.mockk.mockk import io.mockk.mockkConstructor diff --git a/data/build.gradle.kts b/data/build.gradle.kts index 7049652e3..1d79b3160 100755 --- a/data/build.gradle.kts +++ b/data/build.gradle.kts @@ -3,7 +3,7 @@ plugins { } android { - namespace = "com.shifthackz.aisdv1.data" + namespace = "dev.minios.pdaiv1.data" testOptions.unitTests.all { test -> test.jvmArgs( "--add-opens", "java.base/java.lang=ALL-UNNAMED", diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/di/LocalDataSourceModule.kt b/data/src/main/java/com/shifthackz/aisdv1/data/di/LocalDataSourceModule.kt deleted file mode 100755 index 877cdc434..000000000 --- a/data/src/main/java/com/shifthackz/aisdv1/data/di/LocalDataSourceModule.kt +++ /dev/null @@ -1,62 +0,0 @@ -package com.shifthackz.aisdv1.data.di - -import com.shifthackz.aisdv1.data.feature.MediaFileManagerImpl -import com.shifthackz.aisdv1.data.gateway.DatabaseClearGatewayImpl -import com.shifthackz.aisdv1.data.gateway.mediastore.MediaStoreGatewayFactory -import com.shifthackz.aisdv1.data.local.DownloadableModelLocalDataSource -import com.shifthackz.aisdv1.data.local.EmbeddingsLocalDataSource -import com.shifthackz.aisdv1.data.local.FalAiEndpointBuiltInDataSource -import com.shifthackz.aisdv1.data.local.FalAiEndpointLocalDataSource -import com.shifthackz.aisdv1.data.local.GenerationResultLocalDataSource -import com.shifthackz.aisdv1.data.local.HuggingFaceModelsLocalDataSource -import com.shifthackz.aisdv1.data.local.LorasLocalDataSource -import com.shifthackz.aisdv1.data.local.QnnModelsBuiltInDataSource -import com.shifthackz.aisdv1.data.local.ServerConfigurationLocalDataSource -import com.shifthackz.aisdv1.data.local.StabilityAiCreditsLocalDataSource -import com.shifthackz.aisdv1.data.local.StableDiffusionHyperNetworksLocalDataSource -import com.shifthackz.aisdv1.data.local.StableDiffusionModelsLocalDataSource -import com.shifthackz.aisdv1.data.local.StableDiffusionSamplersLocalDataSource -import com.shifthackz.aisdv1.data.local.SupportersLocalDataSource -import com.shifthackz.aisdv1.data.local.SwarmUiModelsLocalDataSource -import com.shifthackz.aisdv1.domain.datasource.DownloadableModelDataSource -import com.shifthackz.aisdv1.domain.datasource.EmbeddingsDataSource -import com.shifthackz.aisdv1.domain.datasource.FalAiEndpointDataSource -import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource -import com.shifthackz.aisdv1.domain.datasource.HuggingFaceModelsDataSource -import com.shifthackz.aisdv1.domain.datasource.LorasDataSource -import com.shifthackz.aisdv1.domain.datasource.ServerConfigurationDataSource -import com.shifthackz.aisdv1.domain.datasource.StabilityAiCreditsDataSource -import com.shifthackz.aisdv1.domain.datasource.StableDiffusionHyperNetworksDataSource -import com.shifthackz.aisdv1.domain.datasource.StableDiffusionModelsDataSource -import com.shifthackz.aisdv1.domain.datasource.StableDiffusionSamplersDataSource -import com.shifthackz.aisdv1.domain.datasource.SupportersDataSource -import com.shifthackz.aisdv1.domain.datasource.SwarmUiModelsDataSource -import com.shifthackz.aisdv1.domain.feature.MediaFileManager -import com.shifthackz.aisdv1.domain.gateway.DatabaseClearGateway -import org.koin.android.ext.koin.androidContext -import org.koin.core.module.dsl.factoryOf -import org.koin.core.module.dsl.singleOf -import org.koin.dsl.bind -import org.koin.dsl.module - -val localDataSourceModule = module { - singleOf(::DatabaseClearGatewayImpl) bind DatabaseClearGateway::class - single { MediaFileManagerImpl(androidContext(), get()) } - // !!! Do not use [factoryOf] for StabilityAiCreditsLocalDataSource, it has default constructor - single { StabilityAiCreditsLocalDataSource() } - factoryOf(::StableDiffusionModelsLocalDataSource) bind StableDiffusionModelsDataSource.Local::class - factoryOf(::StableDiffusionSamplersLocalDataSource) bind StableDiffusionSamplersDataSource.Local::class - factoryOf(::LorasLocalDataSource) bind LorasDataSource.Local::class - factoryOf(::StableDiffusionHyperNetworksLocalDataSource) bind StableDiffusionHyperNetworksDataSource.Local::class - factoryOf(::EmbeddingsLocalDataSource) bind EmbeddingsDataSource.Local::class - factoryOf(::SwarmUiModelsLocalDataSource) bind SwarmUiModelsDataSource.Local::class - factoryOf(::ServerConfigurationLocalDataSource) bind ServerConfigurationDataSource.Local::class - factoryOf(::GenerationResultLocalDataSource) bind GenerationResultDataSource.Local::class - factoryOf(::DownloadableModelLocalDataSource) bind DownloadableModelDataSource.Local::class - factoryOf(::HuggingFaceModelsLocalDataSource) bind HuggingFaceModelsDataSource.Local::class - factoryOf(::SupportersLocalDataSource) bind SupportersDataSource.Local::class - factoryOf(::FalAiEndpointLocalDataSource) bind FalAiEndpointDataSource.Local::class - factoryOf(::FalAiEndpointBuiltInDataSource) bind FalAiEndpointDataSource.BuiltIn::class - factoryOf(::QnnModelsBuiltInDataSource) - factory { MediaStoreGatewayFactory(androidContext(), get()).invoke() } -} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/di/RemoteDataSourceModule.kt b/data/src/main/java/com/shifthackz/aisdv1/data/di/RemoteDataSourceModule.kt deleted file mode 100755 index 8800bd415..000000000 --- a/data/src/main/java/com/shifthackz/aisdv1/data/di/RemoteDataSourceModule.kt +++ /dev/null @@ -1,115 +0,0 @@ -package com.shifthackz.aisdv1.data.di - -import com.shifthackz.aisdv1.core.common.extensions.fixUrlSlashes -import com.shifthackz.aisdv1.data.gateway.ServerConnectivityGatewayImpl -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.data.remote.DownloadableModelRemoteDataSource -import com.shifthackz.aisdv1.data.remote.FalAiEndpointRemoteDataSource -import com.shifthackz.aisdv1.data.remote.FalAiGenerationRemoteDataSource -import com.shifthackz.aisdv1.data.remote.HordeGenerationRemoteDataSource -import com.shifthackz.aisdv1.data.remote.HordeStatusSource -import com.shifthackz.aisdv1.data.remote.HuggingFaceGenerationRemoteDataSource -import com.shifthackz.aisdv1.data.remote.HuggingFaceModelsRemoteDataSource -import com.shifthackz.aisdv1.data.remote.OpenAiGenerationRemoteDataSource -import com.shifthackz.aisdv1.data.remote.RandomImageRemoteDataSource -import com.shifthackz.aisdv1.data.remote.ReportRemoteDataSource -import com.shifthackz.aisdv1.data.remote.ServerConfigurationRemoteDataSource -import com.shifthackz.aisdv1.data.remote.StabilityAiCreditsRemoteDataSource -import com.shifthackz.aisdv1.data.remote.StabilityAiEnginesRemoteDataSource -import com.shifthackz.aisdv1.data.remote.StabilityAiGenerationRemoteDataSource -import com.shifthackz.aisdv1.data.remote.StableDiffusionEmbeddingsRemoteDataSource -import com.shifthackz.aisdv1.data.remote.StableDiffusionGenerationRemoteDataSource -import com.shifthackz.aisdv1.data.remote.StableDiffusionHyperNetworksRemoteDataSource -import com.shifthackz.aisdv1.data.remote.StableDiffusionLorasRemoteDataSource -import com.shifthackz.aisdv1.data.remote.StableDiffusionModelsRemoteDataSource -import com.shifthackz.aisdv1.data.remote.StableDiffusionSamplersRemoteDataSource -import com.shifthackz.aisdv1.data.remote.SupportersRemoteDataSource -import com.shifthackz.aisdv1.data.remote.SwarmUiEmbeddingsRemoteDataSource -import com.shifthackz.aisdv1.data.remote.SwarmUiGenerationRemoteDataSource -import com.shifthackz.aisdv1.data.remote.SwarmUiLorasRemoteDataSource -import com.shifthackz.aisdv1.data.remote.SwarmUiModelsRemoteDataSource -import com.shifthackz.aisdv1.data.remote.SwarmUiSessionDataSourceImpl -import com.shifthackz.aisdv1.domain.datasource.DownloadableModelDataSource -import com.shifthackz.aisdv1.domain.datasource.EmbeddingsDataSource -import com.shifthackz.aisdv1.domain.datasource.FalAiEndpointDataSource -import com.shifthackz.aisdv1.domain.datasource.FalAiGenerationDataSource -import com.shifthackz.aisdv1.domain.datasource.HordeGenerationDataSource -import com.shifthackz.aisdv1.domain.datasource.HuggingFaceGenerationDataSource -import com.shifthackz.aisdv1.domain.datasource.HuggingFaceModelsDataSource -import com.shifthackz.aisdv1.domain.datasource.LorasDataSource -import com.shifthackz.aisdv1.domain.datasource.OpenAiGenerationDataSource -import com.shifthackz.aisdv1.domain.datasource.RandomImageDataSource -import com.shifthackz.aisdv1.domain.datasource.ReportDataSource -import com.shifthackz.aisdv1.domain.datasource.ServerConfigurationDataSource -import com.shifthackz.aisdv1.domain.datasource.StabilityAiCreditsDataSource -import com.shifthackz.aisdv1.domain.datasource.StabilityAiEnginesDataSource -import com.shifthackz.aisdv1.domain.datasource.StabilityAiGenerationDataSource -import com.shifthackz.aisdv1.domain.datasource.StableDiffusionGenerationDataSource -import com.shifthackz.aisdv1.domain.datasource.StableDiffusionHyperNetworksDataSource -import com.shifthackz.aisdv1.domain.datasource.StableDiffusionModelsDataSource -import com.shifthackz.aisdv1.domain.datasource.StableDiffusionSamplersDataSource -import com.shifthackz.aisdv1.domain.datasource.SupportersDataSource -import com.shifthackz.aisdv1.domain.datasource.SwarmUiGenerationDataSource -import com.shifthackz.aisdv1.domain.datasource.SwarmUiModelsDataSource -import com.shifthackz.aisdv1.domain.datasource.SwarmUiSessionDataSource -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.gateway.ServerConnectivityGateway -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.network.connectivity.ConnectivityMonitor -import io.reactivex.rxjava3.core.Single -import org.koin.core.module.dsl.factoryOf -import org.koin.core.module.dsl.singleOf -import org.koin.core.parameter.parametersOf -import org.koin.dsl.bind -import org.koin.dsl.module - -val remoteDataSourceModule = module { - single { - ServerUrlProvider { endpoint -> - val prefs = get() - val chain = if (prefs.source == ServerSource.SWARM_UI) { - Single.fromCallable(prefs::swarmUiServerUrl) - } else { - Single.fromCallable(prefs::automatic1111ServerUrl) - } - chain - .map(String::fixUrlSlashes) - .map { baseUrl -> "$baseUrl/$endpoint" } - } - } - singleOf(::HordeStatusSource) bind HordeGenerationDataSource.StatusSource::class - factoryOf(::HordeGenerationRemoteDataSource) bind HordeGenerationDataSource.Remote::class - factoryOf(::HuggingFaceGenerationRemoteDataSource) bind HuggingFaceGenerationDataSource.Remote::class - factoryOf(::OpenAiGenerationRemoteDataSource) bind OpenAiGenerationDataSource.Remote::class - factoryOf(::SwarmUiSessionDataSourceImpl) bind SwarmUiSessionDataSource::class - factoryOf(::SwarmUiGenerationRemoteDataSource) bind SwarmUiGenerationDataSource.Remote::class - factoryOf(::SwarmUiModelsRemoteDataSource) bind SwarmUiModelsDataSource.Remote::class - factoryOf(::SwarmUiLorasRemoteDataSource) bind LorasDataSource.Remote.SwarmUi::class - factoryOf(::SwarmUiEmbeddingsRemoteDataSource) bind EmbeddingsDataSource.Remote.SwarmUi::class - factoryOf(::StableDiffusionGenerationRemoteDataSource) bind StableDiffusionGenerationDataSource.Remote::class - factoryOf(::StableDiffusionSamplersRemoteDataSource) bind StableDiffusionSamplersDataSource.Remote::class - factoryOf(::StableDiffusionModelsRemoteDataSource) bind StableDiffusionModelsDataSource.Remote::class - factoryOf(::StableDiffusionLorasRemoteDataSource) bind LorasDataSource.Remote.Automatic1111::class - factoryOf(::StableDiffusionHyperNetworksRemoteDataSource) bind StableDiffusionHyperNetworksDataSource.Remote::class - factoryOf(::StableDiffusionEmbeddingsRemoteDataSource) bind EmbeddingsDataSource.Remote.Automatic1111::class - factoryOf(::ServerConfigurationRemoteDataSource) bind ServerConfigurationDataSource.Remote::class - factoryOf(::RandomImageRemoteDataSource) bind RandomImageDataSource.Remote::class - factoryOf(::DownloadableModelRemoteDataSource) bind DownloadableModelDataSource.Remote::class - factoryOf(::SupportersRemoteDataSource) bind SupportersDataSource.Remote::class - factoryOf(::HuggingFaceModelsRemoteDataSource) bind HuggingFaceModelsDataSource.Remote::class - factoryOf(::StabilityAiGenerationRemoteDataSource) bind StabilityAiGenerationDataSource.Remote::class - factoryOf(::StabilityAiCreditsRemoteDataSource) bind StabilityAiCreditsDataSource.Remote::class - factoryOf(::StabilityAiEnginesRemoteDataSource) bind StabilityAiEnginesDataSource.Remote::class - factoryOf(::FalAiGenerationRemoteDataSource) bind FalAiGenerationDataSource.Remote::class - factoryOf(::FalAiEndpointRemoteDataSource) bind FalAiEndpointDataSource.Remote::class - factoryOf(::ReportRemoteDataSource) bind ReportDataSource.Remote::class - - factory { - val lambda: () -> Boolean = { - val prefs = get() - prefs.source != ServerSource.AUTOMATIC1111 && prefs.source != ServerSource.SWARM_UI - } - val monitor = get { parametersOf(lambda) } - ServerConnectivityGatewayImpl(monitor, get()) - } -} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/di/RepositoryModule.kt b/data/src/main/java/com/shifthackz/aisdv1/data/di/RepositoryModule.kt deleted file mode 100755 index b915866e7..000000000 --- a/data/src/main/java/com/shifthackz/aisdv1/data/di/RepositoryModule.kt +++ /dev/null @@ -1,104 +0,0 @@ -package com.shifthackz.aisdv1.data.di - -import android.content.Context -import android.os.PowerManager -import com.shifthackz.aisdv1.data.repository.DownloadableModelRepositoryImpl -import com.shifthackz.aisdv1.data.repository.EmbeddingsRepositoryImpl -import com.shifthackz.aisdv1.data.repository.FalAiEndpointRepositoryImpl -import com.shifthackz.aisdv1.data.repository.FalAiGenerationRepositoryImpl -import com.shifthackz.aisdv1.data.repository.ForgeModulesRepositoryImpl -import com.shifthackz.aisdv1.data.repository.GenerationResultRepositoryImpl -import com.shifthackz.aisdv1.data.repository.HordeGenerationRepositoryImpl -import com.shifthackz.aisdv1.data.repository.HuggingFaceGenerationRepositoryImpl -import com.shifthackz.aisdv1.data.repository.HuggingFaceModelsRepositoryImpl -import com.shifthackz.aisdv1.data.repository.LocalDiffusionGenerationRepositoryImpl -import com.shifthackz.aisdv1.data.repository.LorasRepositoryImpl -import com.shifthackz.aisdv1.data.repository.MediaPipeGenerationRepositoryImpl -import com.shifthackz.aisdv1.data.repository.OpenAiGenerationRepositoryImpl -import com.shifthackz.aisdv1.data.repository.QnnGenerationRepositoryImpl -import com.shifthackz.aisdv1.data.repository.RandomImageRepositoryImpl -import com.shifthackz.aisdv1.data.repository.ReportRepositoryImpl -import com.shifthackz.aisdv1.data.repository.ServerConfigurationRepositoryImpl -import com.shifthackz.aisdv1.data.repository.StabilityAiCreditsRepositoryImpl -import com.shifthackz.aisdv1.data.repository.StabilityAiEnginesRepositoryImpl -import com.shifthackz.aisdv1.data.repository.StabilityAiGenerationRepositoryImpl -import com.shifthackz.aisdv1.data.repository.StableDiffusionGenerationRepositoryImpl -import com.shifthackz.aisdv1.data.repository.StableDiffusionHyperNetworksRepositoryImpl -import com.shifthackz.aisdv1.data.repository.StableDiffusionModelsRepositoryImpl -import com.shifthackz.aisdv1.data.repository.StableDiffusionSamplersRepositoryImpl -import com.shifthackz.aisdv1.data.repository.SupportersRepositoryImpl -import com.shifthackz.aisdv1.data.repository.SwarmUiGenerationRepositoryImpl -import com.shifthackz.aisdv1.data.repository.SwarmUiModelsRepositoryImpl -import com.shifthackz.aisdv1.data.repository.TemporaryGenerationResultRepositoryImpl -import com.shifthackz.aisdv1.data.repository.WakeLockRepositoryImpl -import com.shifthackz.aisdv1.domain.repository.DownloadableModelRepository -import com.shifthackz.aisdv1.domain.repository.EmbeddingsRepository -import com.shifthackz.aisdv1.domain.repository.FalAiEndpointRepository -import com.shifthackz.aisdv1.domain.repository.FalAiGenerationRepository -import com.shifthackz.aisdv1.domain.repository.ForgeModulesRepository -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository -import com.shifthackz.aisdv1.domain.repository.HordeGenerationRepository -import com.shifthackz.aisdv1.domain.repository.HuggingFaceGenerationRepository -import com.shifthackz.aisdv1.domain.repository.HuggingFaceModelsRepository -import com.shifthackz.aisdv1.domain.repository.LocalDiffusionGenerationRepository -import com.shifthackz.aisdv1.domain.repository.LorasRepository -import com.shifthackz.aisdv1.domain.repository.MediaPipeGenerationRepository -import com.shifthackz.aisdv1.domain.repository.OpenAiGenerationRepository -import com.shifthackz.aisdv1.domain.repository.QnnGenerationRepository -import com.shifthackz.aisdv1.domain.repository.RandomImageRepository -import com.shifthackz.aisdv1.domain.repository.ReportRepository -import com.shifthackz.aisdv1.domain.repository.ServerConfigurationRepository -import com.shifthackz.aisdv1.domain.repository.StabilityAiCreditsRepository -import com.shifthackz.aisdv1.domain.repository.StabilityAiEnginesRepository -import com.shifthackz.aisdv1.domain.repository.StabilityAiGenerationRepository -import com.shifthackz.aisdv1.domain.repository.StableDiffusionGenerationRepository -import com.shifthackz.aisdv1.domain.repository.StableDiffusionHyperNetworksRepository -import com.shifthackz.aisdv1.domain.repository.StableDiffusionModelsRepository -import com.shifthackz.aisdv1.domain.repository.StableDiffusionSamplersRepository -import com.shifthackz.aisdv1.domain.repository.SupportersRepository -import com.shifthackz.aisdv1.domain.repository.SwarmUiGenerationRepository -import com.shifthackz.aisdv1.domain.repository.SwarmUiModelsRepository -import com.shifthackz.aisdv1.domain.repository.TemporaryGenerationResultRepository -import com.shifthackz.aisdv1.domain.repository.WakeLockRepository -import org.koin.android.ext.koin.androidContext -import org.koin.core.module.dsl.factoryOf -import org.koin.core.module.dsl.singleOf -import org.koin.dsl.bind -import org.koin.dsl.module - -val repositoryModule = module { - single { - WakeLockRepositoryImpl { - androidContext().getSystemService(Context.POWER_SERVICE) as PowerManager - } - } - - singleOf(::TemporaryGenerationResultRepositoryImpl) bind TemporaryGenerationResultRepository::class - factoryOf(::LocalDiffusionGenerationRepositoryImpl) bind LocalDiffusionGenerationRepository::class - factoryOf(::MediaPipeGenerationRepositoryImpl) bind MediaPipeGenerationRepository::class - factoryOf(::QnnGenerationRepositoryImpl) bind QnnGenerationRepository::class - factoryOf(::HordeGenerationRepositoryImpl) bind HordeGenerationRepository::class - factoryOf(::HuggingFaceGenerationRepositoryImpl) bind HuggingFaceGenerationRepository::class - factoryOf(::OpenAiGenerationRepositoryImpl) bind OpenAiGenerationRepository::class - factoryOf(::SwarmUiGenerationRepositoryImpl) bind SwarmUiGenerationRepository::class - factoryOf(::SwarmUiModelsRepositoryImpl) bind SwarmUiModelsRepository::class - factoryOf(::StabilityAiGenerationRepositoryImpl) bind StabilityAiGenerationRepository::class - factoryOf(::StabilityAiCreditsRepositoryImpl) bind StabilityAiCreditsRepository::class - factoryOf(::StabilityAiEnginesRepositoryImpl) bind StabilityAiEnginesRepository::class - factoryOf(::FalAiGenerationRepositoryImpl) bind FalAiGenerationRepository::class - factoryOf(::FalAiEndpointRepositoryImpl) bind FalAiEndpointRepository::class - factoryOf(::StableDiffusionGenerationRepositoryImpl) bind StableDiffusionGenerationRepository::class - factoryOf(::StableDiffusionModelsRepositoryImpl) bind StableDiffusionModelsRepository::class - factoryOf(::StableDiffusionSamplersRepositoryImpl) bind StableDiffusionSamplersRepository::class - factoryOf(::LorasRepositoryImpl) bind LorasRepository::class - factoryOf(::StableDiffusionHyperNetworksRepositoryImpl) bind StableDiffusionHyperNetworksRepository::class - factoryOf(::EmbeddingsRepositoryImpl) bind EmbeddingsRepository::class - factoryOf(::ForgeModulesRepositoryImpl) bind ForgeModulesRepository::class - factoryOf(::ServerConfigurationRepositoryImpl) bind ServerConfigurationRepository::class - factoryOf(::GenerationResultRepositoryImpl) bind GenerationResultRepository::class - factoryOf(::RandomImageRepositoryImpl) bind RandomImageRepository::class - factoryOf(::DownloadableModelRepositoryImpl) bind DownloadableModelRepository::class - factoryOf(::HuggingFaceModelsRepositoryImpl) bind HuggingFaceModelsRepository::class - factoryOf(::SupportersRepositoryImpl) bind SupportersRepository::class - factoryOf(::ReportRepositoryImpl) bind ReportRepository::class -} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/local/EmbeddingsLocalDataSource.kt b/data/src/main/java/com/shifthackz/aisdv1/data/local/EmbeddingsLocalDataSource.kt deleted file mode 100644 index 66db4d3c3..000000000 --- a/data/src/main/java/com/shifthackz/aisdv1/data/local/EmbeddingsLocalDataSource.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.shifthackz.aisdv1.data.local - -import com.shifthackz.aisdv1.data.mappers.mapDomainToEntity -import com.shifthackz.aisdv1.data.mappers.mapEntityToDomain -import com.shifthackz.aisdv1.domain.datasource.EmbeddingsDataSource -import com.shifthackz.aisdv1.domain.entity.Embedding -import com.shifthackz.aisdv1.storage.db.cache.dao.StableDiffusionEmbeddingDao -import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionEmbeddingEntity - -internal class EmbeddingsLocalDataSource( - private val dao: StableDiffusionEmbeddingDao, -) : EmbeddingsDataSource.Local { - - override fun getEmbeddings() = dao - .queryAll() - .map(List::mapEntityToDomain) - - override fun insertEmbeddings(list: List) = dao - .deleteAll() - .andThen(dao.insertList(list.mapDomainToEntity())) -} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/local/HuggingFaceModelsLocalDataSource.kt b/data/src/main/java/com/shifthackz/aisdv1/data/local/HuggingFaceModelsLocalDataSource.kt deleted file mode 100644 index ba54a62b9..000000000 --- a/data/src/main/java/com/shifthackz/aisdv1/data/local/HuggingFaceModelsLocalDataSource.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.shifthackz.aisdv1.data.local - -import com.shifthackz.aisdv1.data.mappers.mapDomainToEntity -import com.shifthackz.aisdv1.data.mappers.mapEntityToDomain -import com.shifthackz.aisdv1.domain.datasource.HuggingFaceModelsDataSource -import com.shifthackz.aisdv1.domain.entity.HuggingFaceModel -import com.shifthackz.aisdv1.storage.db.persistent.dao.HuggingFaceModelDao -import com.shifthackz.aisdv1.storage.db.persistent.entity.HuggingFaceModelEntity - -internal class HuggingFaceModelsLocalDataSource( - private val dao: HuggingFaceModelDao, -) : HuggingFaceModelsDataSource.Local { - - override fun getAll() = dao - .query() - .map(List::mapEntityToDomain) - - override fun save(models: List) = dao - .deleteAll() - .andThen(dao.insertList(models.mapDomainToEntity())) -} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/local/LorasLocalDataSource.kt b/data/src/main/java/com/shifthackz/aisdv1/data/local/LorasLocalDataSource.kt deleted file mode 100644 index e38771e68..000000000 --- a/data/src/main/java/com/shifthackz/aisdv1/data/local/LorasLocalDataSource.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.shifthackz.aisdv1.data.local - -import com.shifthackz.aisdv1.data.mappers.mapDomainToEntity -import com.shifthackz.aisdv1.data.mappers.mapEntityToDomain -import com.shifthackz.aisdv1.domain.datasource.LorasDataSource -import com.shifthackz.aisdv1.domain.entity.LoRA -import com.shifthackz.aisdv1.storage.db.cache.dao.StableDiffusionLoraDao -import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionLoraEntity - -internal class LorasLocalDataSource( - private val dao: StableDiffusionLoraDao, -) : LorasDataSource.Local { - - override fun getLoras() = dao - .queryAll() - .map(List::mapEntityToDomain) - - override fun insertLoras(loras: List) = dao - .deleteAll() - .andThen(dao.insertList(loras.mapDomainToEntity())) -} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/local/QnnModelsBuiltInDataSource.kt b/data/src/main/java/com/shifthackz/aisdv1/data/local/QnnModelsBuiltInDataSource.kt deleted file mode 100644 index 44b16975b..000000000 --- a/data/src/main/java/com/shifthackz/aisdv1/data/local/QnnModelsBuiltInDataSource.kt +++ /dev/null @@ -1,153 +0,0 @@ -package com.shifthackz.aisdv1.data.local - -import com.shifthackz.aisdv1.core.common.device.DeviceChipsetDetector -import com.shifthackz.aisdv1.domain.entity.LocalAiModel -import io.reactivex.rxjava3.core.Single - -/** - * Built-in QNN models data source. - * Provides hardcoded QNN/MNN models from HuggingFace (xororz/sd-qnn and xororz/sd-mnn). - * Models are automatically filtered based on device chipset compatibility. - */ -internal class QnnModelsBuiltInDataSource { - - private val deviceChipsetSuffix: String by lazy { DeviceChipsetDetector.getChipsetSuffix() } - - fun getAll(): Single> = Single.fromCallable { - buildAllModels().filter { model -> - // Show models that match device chipset or have no chipset requirement (MNN/CPU models) - model.chipsetSuffix == null || model.chipsetSuffix == deviceChipsetSuffix - } - } - - /** - * Get all models without filtering by chipset. - * Useful for debugging or showing all available options. - */ - fun getAllUnfiltered(): Single> = Single.just(buildAllModels()) - - private fun buildAllModels(): List { - val npuModels = buildNpuModels() - val cpuModels = buildCpuModels() - return npuModels + cpuModels - } - - private fun buildNpuModels(): List { - return npuModelDefinitions.flatMap { (baseName, displayName, sizes) -> - listOf( - createNpuModel(baseName, displayName, "8gen2", sizes.gen2Size), - createNpuModel(baseName, displayName, "8gen1", sizes.gen1Size), - createNpuModel(baseName, displayName, "min", sizes.minSize), - ) - } - } - - private fun buildCpuModels(): List { - return cpuModelDefinitions.map { (baseName, displayName, size) -> - createCpuModel(baseName, displayName, size) - } - } - - private fun createNpuModel( - baseName: String, - displayName: String, - suffix: String, - size: String, - ): LocalAiModel { - val chipsetDisplayName = when (suffix) { - "8gen2" -> "8Gen2/3/4" - "8gen1" -> "8Gen1" - "min" -> "Other Snapdragon" - else -> suffix - } - return LocalAiModel( - id = "qnn-${baseName.lowercase()}-$suffix", - type = LocalAiModel.Type.QNN, - name = "$displayName ($chipsetDisplayName)", - size = size, - sources = listOf( - "https://huggingface.co/xororz/sd-qnn/resolve/main/${baseName}_qnn2.28_$suffix.zip?download=true" - ), - chipsetSuffix = suffix, - ) - } - - private fun createCpuModel( - baseName: String, - displayName: String, - size: String, - ): LocalAiModel { - return LocalAiModel( - id = "mnn-${baseName.lowercase()}", - type = LocalAiModel.Type.QNN, - name = "$displayName (CPU)", - size = size, - sources = listOf( - "https://huggingface.co/xororz/sd-mnn/resolve/main/$baseName.zip?download=true" - ), - runOnCpu = true, - chipsetSuffix = null, // CPU models work on all devices - ) - } - - companion object { - /** - * NPU model definitions: (baseName, displayName, ModelSizes) - */ - private data class ModelSizes( - val gen2Size: String, - val gen1Size: String, - val minSize: String, - ) - - private val npuModelDefinitions = listOf( - Triple("AbsoluteReality", "Absolute Reality", ModelSizes("1.05 GB", "1.06 GB", "993 MB")), - Triple("AnythingV5", "Anything V5", ModelSizes("1.06 GB", "1.06 GB", "995 MB")), - Triple("ChilloutMix", "ChilloutMix", ModelSizes("1.07 GB", "1.07 GB", "1.01 GB")), - Triple("CrossKemono2.5", "Cross Kemono 2.5", ModelSizes("1.06 GB", "1.06 GB", "995 MB")), - Triple("CuteYukiMix", "CuteYukiMix", ModelSizes("1.06 GB", "1.06 GB", "995 MB")), - Triple("DarkSushiV4", "Dark Sushi Mix V4", ModelSizes("1.06 GB", "1.06 GB", "995 MB")), - Triple("DreamShaperV8", "DreamShaper V8", ModelSizes("1.03 GB", "1.03 GB", "968 MB")), - Triple("HyperSpireV5", "HyperSpire V5", ModelSizes("1.06 GB", "1.06 GB", "995 MB")), - Triple("MajicmixRealisticV7", "MajicMix Realistic V7", ModelSizes("1.06 GB", "1.06 GB", "995 MB")), - Triple("MeinaMixV12", "MeinaMix V12", ModelSizes("1.06 GB", "1.06 GB", "995 MB")), - Triple("MistoonAnimeV3", "Mistoon Anime V3", ModelSizes("1.06 GB", "1.06 GB", "995 MB")), - Triple("NaiAnimeV2", "NAI Anime V2", ModelSizes("1.06 GB", "1.06 GB", "995 MB")), - Triple("NeverEndingDreamV122", "NeverEnding Dream V1.22", ModelSizes("1.06 GB", "1.06 GB", "995 MB")), - Triple("QteaMix", "QteaMix", ModelSizes("1.06 GB", "1.06 GB", "995 MB")), - Triple("RealisianV6", "Realisian V6", ModelSizes("1.06 GB", "1.06 GB", "995 MB")), - Triple("RealisticVisionHyper", "Realistic Vision Hyper", ModelSizes("1.07 GB", "1.07 GB", "1.01 GB")), - Triple("SweetMixV22Flat", "SweetMix V2.2 Flat", ModelSizes("1.06 GB", "1.06 GB", "995 MB")), - Triple("counterfeitV30", "Counterfeit V3.0", ModelSizes("1.06 GB", "1.06 GB", "995 MB")), - Triple("superinvinciblev2", "Super Invincible V2", ModelSizes("1.06 GB", "1.06 GB", "995 MB")), - Triple("unStableIllusion", "UnStable Illusion", ModelSizes("1.06 GB", "1.06 GB", "995 MB")), - ) - - /** - * CPU model definitions: (baseName, displayName, size) - * These models use MNN and work on any device via CPU/GPU. - */ - private val cpuModelDefinitions = listOf( - Triple("AbsoluteReality", "Absolute Reality", "1.05 GB"), - Triple("AnythingV5", "Anything V5", "1.05 GB"), - Triple("ChilloutMix", "ChilloutMix", "1.05 GB"), - Triple("CrossKemono2.5", "Cross Kemono 2.5", "1.05 GB"), - Triple("CuteYukiMix", "CuteYukiMix", "1.05 GB"), - Triple("DarkSushiV4", "Dark Sushi Mix V4", "1.05 GB"), - Triple("DreamShaperV8", "DreamShaper V8", "1.05 GB"), - Triple("HyperSpireV5", "HyperSpire V5", "1.05 GB"), - Triple("MajicmixRealisticV7", "MajicMix Realistic V7", "1.05 GB"), - Triple("MeinaMixV12", "MeinaMix V12", "1.05 GB"), - Triple("MistoonAnimeV3", "Mistoon Anime V3", "1.05 GB"), - Triple("NaiAnimeV2", "NAI Anime V2", "1.05 GB"), - Triple("NeverEndingDreamV122", "NeverEnding Dream V1.22", "1.05 GB"), - Triple("QteaMix", "QteaMix", "1.05 GB"), - Triple("RealisianV6", "Realisian V6", "1.05 GB"), - Triple("RealisticVisionHyper", "Realistic Vision Hyper", "1.05 GB"), - Triple("SweetMixV22Flat", "SweetMix V2.2 Flat", "1.05 GB"), - Triple("counterfeitV30", "Counterfeit V3.0", "1.05 GB"), - Triple("superinvinciblev2", "Super Invincible V2", "1.05 GB"), - Triple("unStableIllusion", "UnStable Illusion", "1.05 GB"), - ) - } -} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/local/ServerConfigurationLocalDataSource.kt b/data/src/main/java/com/shifthackz/aisdv1/data/local/ServerConfigurationLocalDataSource.kt deleted file mode 100755 index fb6219d5a..000000000 --- a/data/src/main/java/com/shifthackz/aisdv1/data/local/ServerConfigurationLocalDataSource.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.shifthackz.aisdv1.data.local - -import com.shifthackz.aisdv1.data.mappers.mapToDomain -import com.shifthackz.aisdv1.data.mappers.mapToEntity -import com.shifthackz.aisdv1.domain.datasource.ServerConfigurationDataSource -import com.shifthackz.aisdv1.domain.entity.ServerConfiguration -import com.shifthackz.aisdv1.storage.db.cache.dao.ServerConfigurationDao -import com.shifthackz.aisdv1.storage.db.cache.entity.ServerConfigurationEntity - -internal class ServerConfigurationLocalDataSource( - private val dao: ServerConfigurationDao, -) : ServerConfigurationDataSource.Local { - - override fun save(configuration: ServerConfiguration) = dao - .insert(configuration.mapToEntity()) - - override fun get() = dao - .query() - .map(ServerConfigurationEntity::mapToDomain) -} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/local/StableDiffusionHyperNetworksLocalDataSource.kt b/data/src/main/java/com/shifthackz/aisdv1/data/local/StableDiffusionHyperNetworksLocalDataSource.kt deleted file mode 100644 index d849924a3..000000000 --- a/data/src/main/java/com/shifthackz/aisdv1/data/local/StableDiffusionHyperNetworksLocalDataSource.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.shifthackz.aisdv1.data.local - -import com.shifthackz.aisdv1.data.mappers.mapDomainToEntity -import com.shifthackz.aisdv1.data.mappers.mapEntityToDomain -import com.shifthackz.aisdv1.domain.datasource.StableDiffusionHyperNetworksDataSource -import com.shifthackz.aisdv1.domain.entity.StableDiffusionHyperNetwork -import com.shifthackz.aisdv1.storage.db.cache.dao.StableDiffusionHyperNetworkDao -import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionHyperNetworkEntity - -internal class StableDiffusionHyperNetworksLocalDataSource( - private val dao: StableDiffusionHyperNetworkDao, -) : StableDiffusionHyperNetworksDataSource.Local { - - override fun getHyperNetworks() = dao - .queryAll() - .map(List::mapEntityToDomain) - - override fun insertHyperNetworks(list: List) = dao - .deleteAll() - .andThen(dao.insertList(list.mapDomainToEntity())) -} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/local/StableDiffusionModelsLocalDataSource.kt b/data/src/main/java/com/shifthackz/aisdv1/data/local/StableDiffusionModelsLocalDataSource.kt deleted file mode 100755 index b3a1012cf..000000000 --- a/data/src/main/java/com/shifthackz/aisdv1/data/local/StableDiffusionModelsLocalDataSource.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.shifthackz.aisdv1.data.local - -import com.shifthackz.aisdv1.data.mappers.mapDomainToEntity -import com.shifthackz.aisdv1.data.mappers.mapEntityToDomain -import com.shifthackz.aisdv1.domain.datasource.StableDiffusionModelsDataSource -import com.shifthackz.aisdv1.domain.entity.StableDiffusionModel -import com.shifthackz.aisdv1.storage.db.cache.dao.StableDiffusionModelDao -import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionModelEntity - -internal class StableDiffusionModelsLocalDataSource( - private val dao: StableDiffusionModelDao, -) : StableDiffusionModelsDataSource.Local { - - override fun getModels() = dao - .queryAll() - .map(List::mapEntityToDomain) - - override fun insertModels(models: List) = dao - .deleteAll() - .andThen(dao.insertList(models.mapDomainToEntity())) -} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/local/StableDiffusionSamplersLocalDataSource.kt b/data/src/main/java/com/shifthackz/aisdv1/data/local/StableDiffusionSamplersLocalDataSource.kt deleted file mode 100755 index 7cf608a9f..000000000 --- a/data/src/main/java/com/shifthackz/aisdv1/data/local/StableDiffusionSamplersLocalDataSource.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.shifthackz.aisdv1.data.local - -import com.shifthackz.aisdv1.data.mappers.mapDomainToEntity -import com.shifthackz.aisdv1.data.mappers.mapEntityToDomain -import com.shifthackz.aisdv1.domain.datasource.StableDiffusionSamplersDataSource -import com.shifthackz.aisdv1.domain.entity.StableDiffusionSampler -import com.shifthackz.aisdv1.storage.db.cache.dao.StableDiffusionSamplerDao -import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionSamplerEntity - -internal class StableDiffusionSamplersLocalDataSource( - private val dao: StableDiffusionSamplerDao, -) : StableDiffusionSamplersDataSource.Local { - - override fun getSamplers() = dao - .queryAll() - .map(List::mapEntityToDomain) - - override fun insertSamplers(samplers: List) = dao - .deleteAll() - .andThen(dao.insertList(samplers.mapDomainToEntity())) -} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/HuggingFaceModelsRemoteDataSource.kt b/data/src/main/java/com/shifthackz/aisdv1/data/remote/HuggingFaceModelsRemoteDataSource.kt deleted file mode 100644 index 73056260e..000000000 --- a/data/src/main/java/com/shifthackz/aisdv1/data/remote/HuggingFaceModelsRemoteDataSource.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.shifthackz.aisdv1.data.remote - -import com.shifthackz.aisdv1.data.mappers.mapRawToCheckpointDomain -import com.shifthackz.aisdv1.domain.datasource.HuggingFaceModelsDataSource -import com.shifthackz.aisdv1.domain.entity.HuggingFaceModel -import com.shifthackz.aisdv1.network.api.sdai.HuggingFaceModelsApi -import com.shifthackz.aisdv1.network.model.HuggingFaceModelRaw - -internal class HuggingFaceModelsRemoteDataSource( - private val api: HuggingFaceModelsApi, -) : HuggingFaceModelsDataSource.Remote { - - override fun fetchHuggingFaceModels() = api - .fetchHuggingFaceModels() - .map(List::mapRawToCheckpointDomain) - .onErrorReturn { listOf(HuggingFaceModel.default) } -} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/RandomImageRemoteDataSource.kt b/data/src/main/java/com/shifthackz/aisdv1/data/remote/RandomImageRemoteDataSource.kt deleted file mode 100644 index 14ed16b84..000000000 --- a/data/src/main/java/com/shifthackz/aisdv1/data/remote/RandomImageRemoteDataSource.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.shifthackz.aisdv1.data.remote - -import com.shifthackz.aisdv1.domain.datasource.RandomImageDataSource -import com.shifthackz.aisdv1.network.api.imagecdn.ImageCdnRestApi - -internal class RandomImageRemoteDataSource( - private val api: ImageCdnRestApi, -) : RandomImageDataSource.Remote { - - override fun fetch() = api.fetchRandomImage() -} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/StabilityAiEnginesRemoteDataSource.kt b/data/src/main/java/com/shifthackz/aisdv1/data/remote/StabilityAiEnginesRemoteDataSource.kt deleted file mode 100644 index b6d681219..000000000 --- a/data/src/main/java/com/shifthackz/aisdv1/data/remote/StabilityAiEnginesRemoteDataSource.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.shifthackz.aisdv1.data.remote - -import com.shifthackz.aisdv1.data.mappers.mapRawToCheckpointDomain -import com.shifthackz.aisdv1.domain.datasource.StabilityAiEnginesDataSource -import com.shifthackz.aisdv1.domain.entity.StabilityAiEngine -import com.shifthackz.aisdv1.network.api.stabilityai.StabilityAiApi -import com.shifthackz.aisdv1.network.model.StabilityAiEngineRaw -import io.reactivex.rxjava3.core.Single - -internal class StabilityAiEnginesRemoteDataSource( - private val api: StabilityAiApi, -) : StabilityAiEnginesDataSource.Remote { - - override fun fetch(): Single> = api - .fetchEngines() - .map(List::mapRawToCheckpointDomain) -} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/StableDiffusionEmbeddingsRemoteDataSource.kt b/data/src/main/java/com/shifthackz/aisdv1/data/remote/StableDiffusionEmbeddingsRemoteDataSource.kt deleted file mode 100644 index ae45d9621..000000000 --- a/data/src/main/java/com/shifthackz/aisdv1/data/remote/StableDiffusionEmbeddingsRemoteDataSource.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.shifthackz.aisdv1.data.remote - -import com.shifthackz.aisdv1.data.mappers.mapRawToCheckpointDomain -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.datasource.EmbeddingsDataSource -import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi -import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi.Companion.PATH_EMBEDDINGS -import com.shifthackz.aisdv1.network.response.SdEmbeddingsResponse - -internal class StableDiffusionEmbeddingsRemoteDataSource( - private val serverUrlProvider: ServerUrlProvider, - private val api: Automatic1111RestApi, -) : EmbeddingsDataSource.Remote.Automatic1111 { - - override fun fetchEmbeddings() = serverUrlProvider(PATH_EMBEDDINGS) - .flatMap(api::fetchEmbeddings) - .map(SdEmbeddingsResponse::mapRawToCheckpointDomain) -} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/StableDiffusionHyperNetworksRemoteDataSource.kt b/data/src/main/java/com/shifthackz/aisdv1/data/remote/StableDiffusionHyperNetworksRemoteDataSource.kt deleted file mode 100644 index 059d8dd75..000000000 --- a/data/src/main/java/com/shifthackz/aisdv1/data/remote/StableDiffusionHyperNetworksRemoteDataSource.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.shifthackz.aisdv1.data.remote - -import com.shifthackz.aisdv1.data.mappers.mapRawToCheckpointDomain -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.datasource.StableDiffusionHyperNetworksDataSource -import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi -import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi.Companion.PATH_HYPER_NETWORKS -import com.shifthackz.aisdv1.network.model.StableDiffusionHyperNetworkRaw - -internal class StableDiffusionHyperNetworksRemoteDataSource( - private val serverUrlProvider: ServerUrlProvider, - private val api: Automatic1111RestApi, -) : StableDiffusionHyperNetworksDataSource.Remote { - - override fun fetchHyperNetworks() = serverUrlProvider(PATH_HYPER_NETWORKS) - .flatMap(api::fetchHyperNetworks) - .map(List::mapRawToCheckpointDomain) -} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/StableDiffusionLorasRemoteDataSource.kt b/data/src/main/java/com/shifthackz/aisdv1/data/remote/StableDiffusionLorasRemoteDataSource.kt deleted file mode 100644 index dd0d546d9..000000000 --- a/data/src/main/java/com/shifthackz/aisdv1/data/remote/StableDiffusionLorasRemoteDataSource.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.shifthackz.aisdv1.data.remote - -import com.shifthackz.aisdv1.data.mappers.mapToDomain -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.datasource.LorasDataSource -import com.shifthackz.aisdv1.domain.entity.LoRA -import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi -import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi.Companion.PATH_LORAS -import com.shifthackz.aisdv1.network.model.StableDiffusionLoraRaw -import io.reactivex.rxjava3.core.Single - -internal class StableDiffusionLorasRemoteDataSource( - private val serverUrlProvider: ServerUrlProvider, - private val api: Automatic1111RestApi, -) : LorasDataSource.Remote.Automatic1111 { - - override fun fetchLoras(): Single> = serverUrlProvider(PATH_LORAS) - .flatMap(api::fetchLoras) - .map(List::mapToDomain) -} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/StableDiffusionModelsRemoteDataSource.kt b/data/src/main/java/com/shifthackz/aisdv1/data/remote/StableDiffusionModelsRemoteDataSource.kt deleted file mode 100755 index 464858578..000000000 --- a/data/src/main/java/com/shifthackz/aisdv1/data/remote/StableDiffusionModelsRemoteDataSource.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.shifthackz.aisdv1.data.remote - -import com.shifthackz.aisdv1.data.mappers.mapRawToCheckpointDomain -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.datasource.StableDiffusionModelsDataSource -import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi -import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi.Companion.PATH_SD_MODELS -import com.shifthackz.aisdv1.network.model.StableDiffusionModelRaw - -internal class StableDiffusionModelsRemoteDataSource( - private val serverUrlProvider: ServerUrlProvider, - private val api: Automatic1111RestApi, -) : StableDiffusionModelsDataSource.Remote { - - override fun fetchSdModels() = serverUrlProvider(PATH_SD_MODELS) - .flatMap(api::fetchSdModels) - .map(List::mapRawToCheckpointDomain) -} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/StableDiffusionSamplersRemoteDataSource.kt b/data/src/main/java/com/shifthackz/aisdv1/data/remote/StableDiffusionSamplersRemoteDataSource.kt deleted file mode 100755 index 44056fa77..000000000 --- a/data/src/main/java/com/shifthackz/aisdv1/data/remote/StableDiffusionSamplersRemoteDataSource.kt +++ /dev/null @@ -1,18 +0,0 @@ -package com.shifthackz.aisdv1.data.remote - -import com.shifthackz.aisdv1.data.mappers.mapRawToCheckpointDomain -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.datasource.StableDiffusionSamplersDataSource -import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi -import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi.Companion.PATH_SAMPLERS -import com.shifthackz.aisdv1.network.model.StableDiffusionSamplerRaw - -internal class StableDiffusionSamplersRemoteDataSource( - private val serverUrlProvider: ServerUrlProvider, - private val api: Automatic1111RestApi, -) : StableDiffusionSamplersDataSource.Remote { - - override fun fetchSamplers() = serverUrlProvider(PATH_SAMPLERS) - .flatMap(api::fetchSamplers) - .map(List::mapRawToCheckpointDomain) -} \ No newline at end of file diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/SupportersRemoteDataSource.kt b/data/src/main/java/com/shifthackz/aisdv1/data/remote/SupportersRemoteDataSource.kt deleted file mode 100644 index ee8efe19a..000000000 --- a/data/src/main/java/com/shifthackz/aisdv1/data/remote/SupportersRemoteDataSource.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.shifthackz.aisdv1.data.remote - -import com.shifthackz.aisdv1.data.mappers.mapRawToDomain -import com.shifthackz.aisdv1.domain.datasource.SupportersDataSource -import com.shifthackz.aisdv1.domain.entity.Supporter -import com.shifthackz.aisdv1.network.api.sdai.DonateApi -import com.shifthackz.aisdv1.network.model.SupporterRaw -import io.reactivex.rxjava3.core.Single - -internal class SupportersRemoteDataSource( - private val api: DonateApi, -) : SupportersDataSource.Remote { - - override fun fetch(): Single> = api - .fetchSupporters() - .map(List::mapRawToDomain) -} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/ForgeModulesRepositoryImpl.kt b/data/src/main/java/com/shifthackz/aisdv1/data/repository/ForgeModulesRepositoryImpl.kt deleted file mode 100644 index 28aecd067..000000000 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/ForgeModulesRepositoryImpl.kt +++ /dev/null @@ -1,21 +0,0 @@ -package com.shifthackz.aisdv1.data.repository - -import com.shifthackz.aisdv1.data.mappers.mapRawToDomain -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.entity.ForgeModule -import com.shifthackz.aisdv1.domain.repository.ForgeModulesRepository -import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi -import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi.Companion.PATH_SD_MODULES -import com.shifthackz.aisdv1.network.model.ForgeModuleRaw -import io.reactivex.rxjava3.core.Single - -internal class ForgeModulesRepositoryImpl( - private val serverUrlProvider: ServerUrlProvider, - private val api: Automatic1111RestApi, -) : ForgeModulesRepository { - - override fun fetchModules(): Single> = serverUrlProvider(PATH_SD_MODULES) - .flatMap(api::fetchForgeModules) - .map(List::mapRawToDomain) - .onErrorReturn { emptyList() } -} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/core/CoreGenerationRepository.kt b/data/src/main/java/dev/minios/pdaiv1/data/core/CoreGenerationRepository.kt similarity index 77% rename from data/src/main/java/com/shifthackz/aisdv1/data/core/CoreGenerationRepository.kt rename to data/src/main/java/dev/minios/pdaiv1/data/core/CoreGenerationRepository.kt index 43fa6535b..107215707 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/core/CoreGenerationRepository.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/core/CoreGenerationRepository.kt @@ -1,13 +1,13 @@ -package com.shifthackz.aisdv1.data.core +package dev.minios.pdaiv1.data.core -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.MediaType -import com.shifthackz.aisdv1.domain.feature.MediaFileManager -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway -import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.domain.datasource.GenerationResultDataSource +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.MediaType +import dev.minios.pdaiv1.domain.feature.MediaFileManager +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.domain.preference.PreferenceManager import io.reactivex.rxjava3.core.Single internal abstract class CoreGenerationRepository( diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/core/CoreMediaStoreRepository.kt b/data/src/main/java/dev/minios/pdaiv1/data/core/CoreMediaStoreRepository.kt similarity index 76% rename from data/src/main/java/com/shifthackz/aisdv1/data/core/CoreMediaStoreRepository.kt rename to data/src/main/java/dev/minios/pdaiv1/data/core/CoreMediaStoreRepository.kt index a88b8bd04..6608d678f 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/core/CoreMediaStoreRepository.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/core/CoreMediaStoreRepository.kt @@ -1,12 +1,12 @@ -package com.shifthackz.aisdv1.data.core +package dev.minios.pdaiv1.data.core import android.graphics.Bitmap -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.MediaStoreInfo -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway -import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.MediaStoreInfo +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.domain.preference.PreferenceManager import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single import java.io.ByteArrayOutputStream @@ -39,7 +39,7 @@ internal abstract class CoreMediaStoreRepository( val stream = ByteArrayOutputStream() bmp.compress(Bitmap.CompressFormat.PNG, 100, stream) mediaStoreGateway.exportToFile( - fileName = "sdai_${System.currentTimeMillis()}", + fileName = "pdai_${System.currentTimeMillis()}", content = stream.toByteArray(), ) } diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/di/DataModule.kt b/data/src/main/java/dev/minios/pdaiv1/data/di/DataModule.kt similarity index 73% rename from data/src/main/java/com/shifthackz/aisdv1/data/di/DataModule.kt rename to data/src/main/java/dev/minios/pdaiv1/data/di/DataModule.kt index 03c28882c..627c94237 100755 --- a/data/src/main/java/com/shifthackz/aisdv1/data/di/DataModule.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/di/DataModule.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.data.di +package dev.minios.pdaiv1.data.di val dataModule = (remoteDataSourceModule + localDataSourceModule + repositoryModule) .toTypedArray() diff --git a/data/src/main/java/dev/minios/pdaiv1/data/di/LocalDataSourceModule.kt b/data/src/main/java/dev/minios/pdaiv1/data/di/LocalDataSourceModule.kt new file mode 100755 index 000000000..381afd73e --- /dev/null +++ b/data/src/main/java/dev/minios/pdaiv1/data/di/LocalDataSourceModule.kt @@ -0,0 +1,60 @@ +package dev.minios.pdaiv1.data.di + +import dev.minios.pdaiv1.data.feature.MediaFileManagerImpl +import dev.minios.pdaiv1.data.gateway.DatabaseClearGatewayImpl +import dev.minios.pdaiv1.data.gateway.mediastore.MediaStoreGatewayFactory +import dev.minios.pdaiv1.data.local.DownloadableModelLocalDataSource +import dev.minios.pdaiv1.data.local.EmbeddingsLocalDataSource +import dev.minios.pdaiv1.data.local.FalAiEndpointBuiltInDataSource +import dev.minios.pdaiv1.data.local.FalAiEndpointLocalDataSource +import dev.minios.pdaiv1.data.local.GenerationResultLocalDataSource +import dev.minios.pdaiv1.data.local.HuggingFaceModelsLocalDataSource +import dev.minios.pdaiv1.data.local.LorasLocalDataSource +import dev.minios.pdaiv1.data.local.ServerConfigurationLocalDataSource +import dev.minios.pdaiv1.data.local.StabilityAiCreditsLocalDataSource +import dev.minios.pdaiv1.data.local.StableDiffusionHyperNetworksLocalDataSource +import dev.minios.pdaiv1.data.local.StableDiffusionModelsLocalDataSource +import dev.minios.pdaiv1.data.local.StableDiffusionSamplersLocalDataSource +import dev.minios.pdaiv1.data.local.SupportersLocalDataSource +import dev.minios.pdaiv1.data.local.SwarmUiModelsLocalDataSource +import dev.minios.pdaiv1.domain.datasource.DownloadableModelDataSource +import dev.minios.pdaiv1.domain.datasource.EmbeddingsDataSource +import dev.minios.pdaiv1.domain.datasource.FalAiEndpointDataSource +import dev.minios.pdaiv1.domain.datasource.GenerationResultDataSource +import dev.minios.pdaiv1.domain.datasource.HuggingFaceModelsDataSource +import dev.minios.pdaiv1.domain.datasource.LorasDataSource +import dev.minios.pdaiv1.domain.datasource.ServerConfigurationDataSource +import dev.minios.pdaiv1.domain.datasource.StabilityAiCreditsDataSource +import dev.minios.pdaiv1.domain.datasource.StableDiffusionHyperNetworksDataSource +import dev.minios.pdaiv1.domain.datasource.StableDiffusionModelsDataSource +import dev.minios.pdaiv1.domain.datasource.StableDiffusionSamplersDataSource +import dev.minios.pdaiv1.domain.datasource.SupportersDataSource +import dev.minios.pdaiv1.domain.datasource.SwarmUiModelsDataSource +import dev.minios.pdaiv1.domain.feature.MediaFileManager +import dev.minios.pdaiv1.domain.gateway.DatabaseClearGateway +import org.koin.android.ext.koin.androidContext +import org.koin.core.module.dsl.factoryOf +import org.koin.core.module.dsl.singleOf +import org.koin.dsl.bind +import org.koin.dsl.module + +val localDataSourceModule = module { + singleOf(::DatabaseClearGatewayImpl) bind DatabaseClearGateway::class + single { MediaFileManagerImpl(androidContext(), get()) } + // !!! Do not use [factoryOf] for StabilityAiCreditsLocalDataSource, it has default constructor + single { StabilityAiCreditsLocalDataSource() } + factoryOf(::StableDiffusionModelsLocalDataSource) bind StableDiffusionModelsDataSource.Local::class + factoryOf(::StableDiffusionSamplersLocalDataSource) bind StableDiffusionSamplersDataSource.Local::class + factoryOf(::LorasLocalDataSource) bind LorasDataSource.Local::class + factoryOf(::StableDiffusionHyperNetworksLocalDataSource) bind StableDiffusionHyperNetworksDataSource.Local::class + factoryOf(::EmbeddingsLocalDataSource) bind EmbeddingsDataSource.Local::class + factoryOf(::SwarmUiModelsLocalDataSource) bind SwarmUiModelsDataSource.Local::class + factoryOf(::ServerConfigurationLocalDataSource) bind ServerConfigurationDataSource.Local::class + factoryOf(::GenerationResultLocalDataSource) bind GenerationResultDataSource.Local::class + factoryOf(::DownloadableModelLocalDataSource) bind DownloadableModelDataSource.Local::class + factoryOf(::HuggingFaceModelsLocalDataSource) bind HuggingFaceModelsDataSource.Local::class + factoryOf(::SupportersLocalDataSource) bind SupportersDataSource.Local::class + factoryOf(::FalAiEndpointLocalDataSource) bind FalAiEndpointDataSource.Local::class + factoryOf(::FalAiEndpointBuiltInDataSource) bind FalAiEndpointDataSource.BuiltIn::class + factory { MediaStoreGatewayFactory(androidContext(), get()).invoke() } +} diff --git a/data/src/main/java/dev/minios/pdaiv1/data/di/RemoteDataSourceModule.kt b/data/src/main/java/dev/minios/pdaiv1/data/di/RemoteDataSourceModule.kt new file mode 100755 index 000000000..a002832e1 --- /dev/null +++ b/data/src/main/java/dev/minios/pdaiv1/data/di/RemoteDataSourceModule.kt @@ -0,0 +1,115 @@ +package dev.minios.pdaiv1.data.di + +import dev.minios.pdaiv1.core.common.extensions.fixUrlSlashes +import dev.minios.pdaiv1.data.gateway.ServerConnectivityGatewayImpl +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.data.remote.DownloadableModelRemoteDataSource +import dev.minios.pdaiv1.data.remote.FalAiEndpointRemoteDataSource +import dev.minios.pdaiv1.data.remote.FalAiGenerationRemoteDataSource +import dev.minios.pdaiv1.data.remote.HordeGenerationRemoteDataSource +import dev.minios.pdaiv1.data.remote.HordeStatusSource +import dev.minios.pdaiv1.data.remote.HuggingFaceGenerationRemoteDataSource +import dev.minios.pdaiv1.data.remote.HuggingFaceModelsRemoteDataSource +import dev.minios.pdaiv1.data.remote.OpenAiGenerationRemoteDataSource +import dev.minios.pdaiv1.data.remote.RandomImageRemoteDataSource +import dev.minios.pdaiv1.data.remote.ReportRemoteDataSource +import dev.minios.pdaiv1.data.remote.ServerConfigurationRemoteDataSource +import dev.minios.pdaiv1.data.remote.StabilityAiCreditsRemoteDataSource +import dev.minios.pdaiv1.data.remote.StabilityAiEnginesRemoteDataSource +import dev.minios.pdaiv1.data.remote.StabilityAiGenerationRemoteDataSource +import dev.minios.pdaiv1.data.remote.StableDiffusionEmbeddingsRemoteDataSource +import dev.minios.pdaiv1.data.remote.StableDiffusionGenerationRemoteDataSource +import dev.minios.pdaiv1.data.remote.StableDiffusionHyperNetworksRemoteDataSource +import dev.minios.pdaiv1.data.remote.StableDiffusionLorasRemoteDataSource +import dev.minios.pdaiv1.data.remote.StableDiffusionModelsRemoteDataSource +import dev.minios.pdaiv1.data.remote.StableDiffusionSamplersRemoteDataSource +import dev.minios.pdaiv1.data.remote.SupportersRemoteDataSource +import dev.minios.pdaiv1.data.remote.SwarmUiEmbeddingsRemoteDataSource +import dev.minios.pdaiv1.data.remote.SwarmUiGenerationRemoteDataSource +import dev.minios.pdaiv1.data.remote.SwarmUiLorasRemoteDataSource +import dev.minios.pdaiv1.data.remote.SwarmUiModelsRemoteDataSource +import dev.minios.pdaiv1.data.remote.SwarmUiSessionDataSourceImpl +import dev.minios.pdaiv1.domain.datasource.DownloadableModelDataSource +import dev.minios.pdaiv1.domain.datasource.EmbeddingsDataSource +import dev.minios.pdaiv1.domain.datasource.FalAiEndpointDataSource +import dev.minios.pdaiv1.domain.datasource.FalAiGenerationDataSource +import dev.minios.pdaiv1.domain.datasource.HordeGenerationDataSource +import dev.minios.pdaiv1.domain.datasource.HuggingFaceGenerationDataSource +import dev.minios.pdaiv1.domain.datasource.HuggingFaceModelsDataSource +import dev.minios.pdaiv1.domain.datasource.LorasDataSource +import dev.minios.pdaiv1.domain.datasource.OpenAiGenerationDataSource +import dev.minios.pdaiv1.domain.datasource.RandomImageDataSource +import dev.minios.pdaiv1.domain.datasource.ReportDataSource +import dev.minios.pdaiv1.domain.datasource.ServerConfigurationDataSource +import dev.minios.pdaiv1.domain.datasource.StabilityAiCreditsDataSource +import dev.minios.pdaiv1.domain.datasource.StabilityAiEnginesDataSource +import dev.minios.pdaiv1.domain.datasource.StabilityAiGenerationDataSource +import dev.minios.pdaiv1.domain.datasource.StableDiffusionGenerationDataSource +import dev.minios.pdaiv1.domain.datasource.StableDiffusionHyperNetworksDataSource +import dev.minios.pdaiv1.domain.datasource.StableDiffusionModelsDataSource +import dev.minios.pdaiv1.domain.datasource.StableDiffusionSamplersDataSource +import dev.minios.pdaiv1.domain.datasource.SupportersDataSource +import dev.minios.pdaiv1.domain.datasource.SwarmUiGenerationDataSource +import dev.minios.pdaiv1.domain.datasource.SwarmUiModelsDataSource +import dev.minios.pdaiv1.domain.datasource.SwarmUiSessionDataSource +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.gateway.ServerConnectivityGateway +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.network.connectivity.ConnectivityMonitor +import io.reactivex.rxjava3.core.Single +import org.koin.core.module.dsl.factoryOf +import org.koin.core.module.dsl.singleOf +import org.koin.core.parameter.parametersOf +import org.koin.dsl.bind +import org.koin.dsl.module + +val remoteDataSourceModule = module { + single { + ServerUrlProvider { endpoint -> + val prefs = get() + val chain = if (prefs.source == ServerSource.SWARM_UI) { + Single.fromCallable(prefs::swarmUiServerUrl) + } else { + Single.fromCallable(prefs::automatic1111ServerUrl) + } + chain + .map(String::fixUrlSlashes) + .map { baseUrl -> "$baseUrl/$endpoint" } + } + } + singleOf(::HordeStatusSource) bind HordeGenerationDataSource.StatusSource::class + factoryOf(::HordeGenerationRemoteDataSource) bind HordeGenerationDataSource.Remote::class + factoryOf(::HuggingFaceGenerationRemoteDataSource) bind HuggingFaceGenerationDataSource.Remote::class + factoryOf(::OpenAiGenerationRemoteDataSource) bind OpenAiGenerationDataSource.Remote::class + factoryOf(::SwarmUiSessionDataSourceImpl) bind SwarmUiSessionDataSource::class + factoryOf(::SwarmUiGenerationRemoteDataSource) bind SwarmUiGenerationDataSource.Remote::class + factoryOf(::SwarmUiModelsRemoteDataSource) bind SwarmUiModelsDataSource.Remote::class + factoryOf(::SwarmUiLorasRemoteDataSource) bind LorasDataSource.Remote.SwarmUi::class + factoryOf(::SwarmUiEmbeddingsRemoteDataSource) bind EmbeddingsDataSource.Remote.SwarmUi::class + factoryOf(::StableDiffusionGenerationRemoteDataSource) bind StableDiffusionGenerationDataSource.Remote::class + factoryOf(::StableDiffusionSamplersRemoteDataSource) bind StableDiffusionSamplersDataSource.Remote::class + factoryOf(::StableDiffusionModelsRemoteDataSource) bind StableDiffusionModelsDataSource.Remote::class + factoryOf(::StableDiffusionLorasRemoteDataSource) bind LorasDataSource.Remote.Automatic1111::class + factoryOf(::StableDiffusionHyperNetworksRemoteDataSource) bind StableDiffusionHyperNetworksDataSource.Remote::class + factoryOf(::StableDiffusionEmbeddingsRemoteDataSource) bind EmbeddingsDataSource.Remote.Automatic1111::class + factoryOf(::ServerConfigurationRemoteDataSource) bind ServerConfigurationDataSource.Remote::class + factoryOf(::RandomImageRemoteDataSource) bind RandomImageDataSource.Remote::class + factoryOf(::DownloadableModelRemoteDataSource) bind DownloadableModelDataSource.Remote::class + factoryOf(::SupportersRemoteDataSource) bind SupportersDataSource.Remote::class + factoryOf(::HuggingFaceModelsRemoteDataSource) bind HuggingFaceModelsDataSource.Remote::class + factoryOf(::StabilityAiGenerationRemoteDataSource) bind StabilityAiGenerationDataSource.Remote::class + factoryOf(::StabilityAiCreditsRemoteDataSource) bind StabilityAiCreditsDataSource.Remote::class + factoryOf(::StabilityAiEnginesRemoteDataSource) bind StabilityAiEnginesDataSource.Remote::class + factoryOf(::FalAiGenerationRemoteDataSource) bind FalAiGenerationDataSource.Remote::class + factoryOf(::FalAiEndpointRemoteDataSource) bind FalAiEndpointDataSource.Remote::class + factoryOf(::ReportRemoteDataSource) bind ReportDataSource.Remote::class + + factory { + val lambda: () -> Boolean = { + val prefs = get() + prefs.source != ServerSource.AUTOMATIC1111 && prefs.source != ServerSource.SWARM_UI + } + val monitor = get { parametersOf(lambda) } + ServerConnectivityGatewayImpl(monitor, get()) + } +} diff --git a/data/src/main/java/dev/minios/pdaiv1/data/di/RepositoryModule.kt b/data/src/main/java/dev/minios/pdaiv1/data/di/RepositoryModule.kt new file mode 100755 index 000000000..4a4822126 --- /dev/null +++ b/data/src/main/java/dev/minios/pdaiv1/data/di/RepositoryModule.kt @@ -0,0 +1,104 @@ +package dev.minios.pdaiv1.data.di + +import android.content.Context +import android.os.PowerManager +import dev.minios.pdaiv1.data.repository.DownloadableModelRepositoryImpl +import dev.minios.pdaiv1.data.repository.EmbeddingsRepositoryImpl +import dev.minios.pdaiv1.data.repository.FalAiEndpointRepositoryImpl +import dev.minios.pdaiv1.data.repository.FalAiGenerationRepositoryImpl +import dev.minios.pdaiv1.data.repository.ForgeModulesRepositoryImpl +import dev.minios.pdaiv1.data.repository.GenerationResultRepositoryImpl +import dev.minios.pdaiv1.data.repository.HordeGenerationRepositoryImpl +import dev.minios.pdaiv1.data.repository.HuggingFaceGenerationRepositoryImpl +import dev.minios.pdaiv1.data.repository.HuggingFaceModelsRepositoryImpl +import dev.minios.pdaiv1.data.repository.LocalDiffusionGenerationRepositoryImpl +import dev.minios.pdaiv1.data.repository.LorasRepositoryImpl +import dev.minios.pdaiv1.data.repository.MediaPipeGenerationRepositoryImpl +import dev.minios.pdaiv1.data.repository.OpenAiGenerationRepositoryImpl +import dev.minios.pdaiv1.data.repository.QnnGenerationRepositoryImpl +import dev.minios.pdaiv1.data.repository.RandomImageRepositoryImpl +import dev.minios.pdaiv1.data.repository.ReportRepositoryImpl +import dev.minios.pdaiv1.data.repository.ServerConfigurationRepositoryImpl +import dev.minios.pdaiv1.data.repository.StabilityAiCreditsRepositoryImpl +import dev.minios.pdaiv1.data.repository.StabilityAiEnginesRepositoryImpl +import dev.minios.pdaiv1.data.repository.StabilityAiGenerationRepositoryImpl +import dev.minios.pdaiv1.data.repository.StableDiffusionGenerationRepositoryImpl +import dev.minios.pdaiv1.data.repository.StableDiffusionHyperNetworksRepositoryImpl +import dev.minios.pdaiv1.data.repository.StableDiffusionModelsRepositoryImpl +import dev.minios.pdaiv1.data.repository.StableDiffusionSamplersRepositoryImpl +import dev.minios.pdaiv1.data.repository.SupportersRepositoryImpl +import dev.minios.pdaiv1.data.repository.SwarmUiGenerationRepositoryImpl +import dev.minios.pdaiv1.data.repository.SwarmUiModelsRepositoryImpl +import dev.minios.pdaiv1.data.repository.TemporaryGenerationResultRepositoryImpl +import dev.minios.pdaiv1.data.repository.WakeLockRepositoryImpl +import dev.minios.pdaiv1.domain.repository.DownloadableModelRepository +import dev.minios.pdaiv1.domain.repository.EmbeddingsRepository +import dev.minios.pdaiv1.domain.repository.FalAiEndpointRepository +import dev.minios.pdaiv1.domain.repository.FalAiGenerationRepository +import dev.minios.pdaiv1.domain.repository.ForgeModulesRepository +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.domain.repository.HordeGenerationRepository +import dev.minios.pdaiv1.domain.repository.HuggingFaceGenerationRepository +import dev.minios.pdaiv1.domain.repository.HuggingFaceModelsRepository +import dev.minios.pdaiv1.domain.repository.LocalDiffusionGenerationRepository +import dev.minios.pdaiv1.domain.repository.LorasRepository +import dev.minios.pdaiv1.domain.repository.MediaPipeGenerationRepository +import dev.minios.pdaiv1.domain.repository.OpenAiGenerationRepository +import dev.minios.pdaiv1.domain.repository.QnnGenerationRepository +import dev.minios.pdaiv1.domain.repository.RandomImageRepository +import dev.minios.pdaiv1.domain.repository.ReportRepository +import dev.minios.pdaiv1.domain.repository.ServerConfigurationRepository +import dev.minios.pdaiv1.domain.repository.StabilityAiCreditsRepository +import dev.minios.pdaiv1.domain.repository.StabilityAiEnginesRepository +import dev.minios.pdaiv1.domain.repository.StabilityAiGenerationRepository +import dev.minios.pdaiv1.domain.repository.StableDiffusionGenerationRepository +import dev.minios.pdaiv1.domain.repository.StableDiffusionHyperNetworksRepository +import dev.minios.pdaiv1.domain.repository.StableDiffusionModelsRepository +import dev.minios.pdaiv1.domain.repository.StableDiffusionSamplersRepository +import dev.minios.pdaiv1.domain.repository.SupportersRepository +import dev.minios.pdaiv1.domain.repository.SwarmUiGenerationRepository +import dev.minios.pdaiv1.domain.repository.SwarmUiModelsRepository +import dev.minios.pdaiv1.domain.repository.TemporaryGenerationResultRepository +import dev.minios.pdaiv1.domain.repository.WakeLockRepository +import org.koin.android.ext.koin.androidContext +import org.koin.core.module.dsl.factoryOf +import org.koin.core.module.dsl.singleOf +import org.koin.dsl.bind +import org.koin.dsl.module + +val repositoryModule = module { + single { + WakeLockRepositoryImpl { + androidContext().getSystemService(Context.POWER_SERVICE) as PowerManager + } + } + + singleOf(::TemporaryGenerationResultRepositoryImpl) bind TemporaryGenerationResultRepository::class + factoryOf(::LocalDiffusionGenerationRepositoryImpl) bind LocalDiffusionGenerationRepository::class + factoryOf(::MediaPipeGenerationRepositoryImpl) bind MediaPipeGenerationRepository::class + factoryOf(::QnnGenerationRepositoryImpl) bind QnnGenerationRepository::class + factoryOf(::HordeGenerationRepositoryImpl) bind HordeGenerationRepository::class + factoryOf(::HuggingFaceGenerationRepositoryImpl) bind HuggingFaceGenerationRepository::class + factoryOf(::OpenAiGenerationRepositoryImpl) bind OpenAiGenerationRepository::class + factoryOf(::SwarmUiGenerationRepositoryImpl) bind SwarmUiGenerationRepository::class + factoryOf(::SwarmUiModelsRepositoryImpl) bind SwarmUiModelsRepository::class + factoryOf(::StabilityAiGenerationRepositoryImpl) bind StabilityAiGenerationRepository::class + factoryOf(::StabilityAiCreditsRepositoryImpl) bind StabilityAiCreditsRepository::class + factoryOf(::StabilityAiEnginesRepositoryImpl) bind StabilityAiEnginesRepository::class + factoryOf(::FalAiGenerationRepositoryImpl) bind FalAiGenerationRepository::class + factoryOf(::FalAiEndpointRepositoryImpl) bind FalAiEndpointRepository::class + factoryOf(::StableDiffusionGenerationRepositoryImpl) bind StableDiffusionGenerationRepository::class + factoryOf(::StableDiffusionModelsRepositoryImpl) bind StableDiffusionModelsRepository::class + factoryOf(::StableDiffusionSamplersRepositoryImpl) bind StableDiffusionSamplersRepository::class + factoryOf(::LorasRepositoryImpl) bind LorasRepository::class + factoryOf(::StableDiffusionHyperNetworksRepositoryImpl) bind StableDiffusionHyperNetworksRepository::class + factoryOf(::EmbeddingsRepositoryImpl) bind EmbeddingsRepository::class + factoryOf(::ForgeModulesRepositoryImpl) bind ForgeModulesRepository::class + factoryOf(::ServerConfigurationRepositoryImpl) bind ServerConfigurationRepository::class + factoryOf(::GenerationResultRepositoryImpl) bind GenerationResultRepository::class + factoryOf(::RandomImageRepositoryImpl) bind RandomImageRepository::class + factoryOf(::DownloadableModelRepositoryImpl) bind DownloadableModelRepository::class + factoryOf(::HuggingFaceModelsRepositoryImpl) bind HuggingFaceModelsRepository::class + factoryOf(::SupportersRepositoryImpl) bind SupportersRepository::class + factoryOf(::ReportRepositoryImpl) bind ReportRepository::class +} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/feature/MediaFileManagerImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/feature/MediaFileManagerImpl.kt similarity index 93% rename from data/src/main/java/com/shifthackz/aisdv1/data/feature/MediaFileManagerImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/feature/MediaFileManagerImpl.kt index c070bece7..8355d6e1e 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/feature/MediaFileManagerImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/feature/MediaFileManagerImpl.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.data.feature +package dev.minios.pdaiv1.data.feature import android.content.Context import android.util.Base64 -import com.shifthackz.aisdv1.core.common.log.debugLog -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.domain.entity.MediaType -import com.shifthackz.aisdv1.domain.feature.MediaFileManager +import dev.minios.pdaiv1.core.common.log.debugLog +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.domain.entity.MediaType +import dev.minios.pdaiv1.domain.feature.MediaFileManager import okhttp3.OkHttpClient import okhttp3.Request import java.io.File diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/gateway/DatabaseClearGatewayImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/gateway/DatabaseClearGatewayImpl.kt similarity index 66% rename from data/src/main/java/com/shifthackz/aisdv1/data/gateway/DatabaseClearGatewayImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/gateway/DatabaseClearGatewayImpl.kt index a7de8798c..93cb89ed5 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/gateway/DatabaseClearGatewayImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/gateway/DatabaseClearGatewayImpl.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.gateway +package dev.minios.pdaiv1.data.gateway -import com.shifthackz.aisdv1.domain.gateway.DatabaseClearGateway -import com.shifthackz.aisdv1.storage.gateway.GatewayClearCacheDb -import com.shifthackz.aisdv1.storage.gateway.GatewayClearPersistentDb +import dev.minios.pdaiv1.domain.gateway.DatabaseClearGateway +import dev.minios.pdaiv1.storage.gateway.GatewayClearCacheDb +import dev.minios.pdaiv1.storage.gateway.GatewayClearPersistentDb import io.reactivex.rxjava3.core.Completable internal class DatabaseClearGatewayImpl( diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/gateway/ServerConnectivityGatewayImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/gateway/ServerConnectivityGatewayImpl.kt similarity index 65% rename from data/src/main/java/com/shifthackz/aisdv1/data/gateway/ServerConnectivityGatewayImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/gateway/ServerConnectivityGatewayImpl.kt index 7257cb46a..9e8771973 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/gateway/ServerConnectivityGatewayImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/gateway/ServerConnectivityGatewayImpl.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.gateway +package dev.minios.pdaiv1.data.gateway -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.gateway.ServerConnectivityGateway -import com.shifthackz.aisdv1.network.connectivity.ConnectivityMonitor +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.gateway.ServerConnectivityGateway +import dev.minios.pdaiv1.network.connectivity.ConnectivityMonitor import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.core.Flowable diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/gateway/mediastore/MediaStoreGatewayFactory.kt b/data/src/main/java/dev/minios/pdaiv1/data/gateway/mediastore/MediaStoreGatewayFactory.kt similarity index 64% rename from data/src/main/java/com/shifthackz/aisdv1/data/gateway/mediastore/MediaStoreGatewayFactory.kt rename to data/src/main/java/dev/minios/pdaiv1/data/gateway/mediastore/MediaStoreGatewayFactory.kt index 72e2d145b..f133abc16 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/gateway/mediastore/MediaStoreGatewayFactory.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/gateway/mediastore/MediaStoreGatewayFactory.kt @@ -1,12 +1,12 @@ @file:Suppress("DEPRECATION") -package com.shifthackz.aisdv1.data.gateway.mediastore +package dev.minios.pdaiv1.data.gateway.mediastore import android.content.Context -import com.shifthackz.aisdv1.core.common.extensions.shouldUseNewMediaStore -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.core.common.log.debugLog -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.core.common.extensions.shouldUseNewMediaStore +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.core.common.log.debugLog +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway internal class MediaStoreGatewayFactory( private val context: Context, diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/gateway/mediastore/MediaStoreGatewayImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/gateway/mediastore/MediaStoreGatewayImpl.kt similarity index 91% rename from data/src/main/java/com/shifthackz/aisdv1/data/gateway/mediastore/MediaStoreGatewayImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/gateway/mediastore/MediaStoreGatewayImpl.kt index 4ededa5bb..4e30152ac 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/gateway/mediastore/MediaStoreGatewayImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/gateway/mediastore/MediaStoreGatewayImpl.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.data.gateway.mediastore +package dev.minios.pdaiv1.data.gateway.mediastore import android.content.ContentUris import android.content.ContentValues @@ -7,10 +7,10 @@ import android.database.Cursor import android.net.Uri import android.os.Environment import android.provider.MediaStore -import com.shifthackz.aisdv1.core.common.extensions.uriFromFile -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.domain.entity.MediaStoreInfo -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.core.common.extensions.uriFromFile +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.domain.entity.MediaStoreInfo +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway import java.io.File /** @@ -30,7 +30,7 @@ internal class MediaStoreGatewayImpl( val contentValues = ContentValues().apply { put(MediaStore.MediaColumns.DISPLAY_NAME, fileName) put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg") - put(MediaStore.MediaColumns.RELATIVE_PATH, "${Environment.DIRECTORY_DOWNLOADS}/SDAI/") + put(MediaStore.MediaColumns.RELATIVE_PATH, "${Environment.DIRECTORY_DOWNLOADS}/PDAI/") } val extVolumeUri: Uri = MediaStore.Files.getContentUri("external") diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/gateway/mediastore/MediaStoreGatewayOldImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/gateway/mediastore/MediaStoreGatewayOldImpl.kt similarity index 85% rename from data/src/main/java/com/shifthackz/aisdv1/data/gateway/mediastore/MediaStoreGatewayOldImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/gateway/mediastore/MediaStoreGatewayOldImpl.kt index eaf8b3126..7f628af19 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/gateway/mediastore/MediaStoreGatewayOldImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/gateway/mediastore/MediaStoreGatewayOldImpl.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.data.gateway.mediastore +package dev.minios.pdaiv1.data.gateway.mediastore import android.net.Uri import android.os.Environment -import com.shifthackz.aisdv1.domain.entity.MediaStoreInfo -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.domain.entity.MediaStoreInfo +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway import java.io.File /** @@ -44,6 +44,6 @@ internal class MediaStoreGatewayOldImpl : MediaStoreGateway { } companion object { - private const val DIR_PATH = "/Download/SDAI" + private const val DIR_PATH = "/Download/PDAI" } } diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/local/DownloadableModelLocalDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/local/DownloadableModelLocalDataSource.kt similarity index 73% rename from data/src/main/java/com/shifthackz/aisdv1/data/local/DownloadableModelLocalDataSource.kt rename to data/src/main/java/dev/minios/pdaiv1/data/local/DownloadableModelLocalDataSource.kt index e6b492bd2..ce7062872 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/local/DownloadableModelLocalDataSource.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/local/DownloadableModelLocalDataSource.kt @@ -1,15 +1,16 @@ -package com.shifthackz.aisdv1.data.local - -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.core.common.appbuild.BuildType -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.data.mappers.mapDomainToEntity -import com.shifthackz.aisdv1.data.mappers.mapEntityToDomain -import com.shifthackz.aisdv1.domain.datasource.DownloadableModelDataSource -import com.shifthackz.aisdv1.domain.entity.LocalAiModel -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.storage.db.persistent.dao.LocalModelDao -import com.shifthackz.aisdv1.storage.db.persistent.entity.LocalModelEntity +package dev.minios.pdaiv1.data.local + +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.core.common.appbuild.BuildType +import dev.minios.pdaiv1.core.common.device.DeviceChipsetDetector +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.data.mappers.mapDomainToEntity +import dev.minios.pdaiv1.data.mappers.mapEntityToDomain +import dev.minios.pdaiv1.domain.datasource.DownloadableModelDataSource +import dev.minios.pdaiv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.storage.db.persistent.dao.LocalModelDao +import dev.minios.pdaiv1.storage.db.persistent.entity.LocalModelEntity import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Observable @@ -21,9 +22,10 @@ internal class DownloadableModelLocalDataSource( private val dao: LocalModelDao, private val preferenceManager: PreferenceManager, private val buildInfoProvider: BuildInfoProvider, - private val qnnModelsBuiltInDataSource: QnnModelsBuiltInDataSource, ) : DownloadableModelDataSource.Local { + private val deviceChipsetSuffix: String by lazy { DeviceChipsetDetector.getChipsetSuffix() } + override fun getAllOnnx() = dao .queryByType(LocalAiModel.Type.ONNX.key) .map(List::mapEntityToDomain) @@ -50,19 +52,16 @@ internal class DownloadableModelLocalDataSource( } .flatMap { models -> models.withLocalData() } - override fun getAllQnn(): Single> = Single.zip( - dao.queryByType(LocalAiModel.Type.QNN.key) - .map(List::mapEntityToDomain) - .onErrorReturn { emptyList() }, - qnnModelsBuiltInDataSource.getAll(), - { dbModels, builtInModels -> - // Merge: use built-in models, but override with DB models if they exist - val dbModelsMap = dbModels.associateBy { it.id } - builtInModels.map { builtIn -> - dbModelsMap[builtIn.id] ?: builtIn + override fun getAllQnn(): Single> = dao + .queryByType(LocalAiModel.Type.QNN.key) + .map(List::mapEntityToDomain) + .map { models -> + // Filter models by device chipset compatibility + // Show models that: have no chipset requirement (CPU models) OR match device chipset + models.filter { model -> + model.chipsetSuffix == null || model.chipsetSuffix == deviceChipsetSuffix } } - ) .map { models -> buildList { addAll(models) @@ -81,18 +80,6 @@ internal class DownloadableModelLocalDataSource( else -> dao .queryById(id) .map(LocalModelEntity::mapEntityToDomain) - .onErrorResumeNext { _ -> - // Fallback to built-in QNN models if not found in DB - qnnModelsBuiltInDataSource.getAll() - .flatMap { builtInModels -> - val model = builtInModels.find { it.id == id } - if (model != null) { - Single.just(model) - } else { - Single.error(NoSuchElementException("Model not found: $id")) - } - } - } } return chain.flatMap { model -> model.withLocalData() } } diff --git a/data/src/main/java/dev/minios/pdaiv1/data/local/EmbeddingsLocalDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/local/EmbeddingsLocalDataSource.kt new file mode 100644 index 000000000..f8a5ae7d0 --- /dev/null +++ b/data/src/main/java/dev/minios/pdaiv1/data/local/EmbeddingsLocalDataSource.kt @@ -0,0 +1,21 @@ +package dev.minios.pdaiv1.data.local + +import dev.minios.pdaiv1.data.mappers.mapDomainToEntity +import dev.minios.pdaiv1.data.mappers.mapEntityToDomain +import dev.minios.pdaiv1.domain.datasource.EmbeddingsDataSource +import dev.minios.pdaiv1.domain.entity.Embedding +import dev.minios.pdaiv1.storage.db.cache.dao.StableDiffusionEmbeddingDao +import dev.minios.pdaiv1.storage.db.cache.entity.StableDiffusionEmbeddingEntity + +internal class EmbeddingsLocalDataSource( + private val dao: StableDiffusionEmbeddingDao, +) : EmbeddingsDataSource.Local { + + override fun getEmbeddings() = dao + .queryAll() + .map(List::mapEntityToDomain) + + override fun insertEmbeddings(list: List) = dao + .deleteAll() + .andThen(dao.insertList(list.mapDomainToEntity())) +} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/local/FalAiEndpointBuiltInDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/local/FalAiEndpointBuiltInDataSource.kt similarity index 87% rename from data/src/main/java/com/shifthackz/aisdv1/data/local/FalAiEndpointBuiltInDataSource.kt rename to data/src/main/java/dev/minios/pdaiv1/data/local/FalAiEndpointBuiltInDataSource.kt index 47da570f0..eda77e893 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/local/FalAiEndpointBuiltInDataSource.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/local/FalAiEndpointBuiltInDataSource.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.data.local +package dev.minios.pdaiv1.data.local import android.content.Context -import com.shifthackz.aisdv1.data.mappers.FalAiOpenApiParser -import com.shifthackz.aisdv1.domain.datasource.FalAiEndpointDataSource -import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint +import dev.minios.pdaiv1.data.mappers.FalAiOpenApiParser +import dev.minios.pdaiv1.domain.datasource.FalAiEndpointDataSource +import dev.minios.pdaiv1.domain.entity.FalAiEndpoint import io.reactivex.rxjava3.core.Single /** diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/local/FalAiEndpointLocalDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/local/FalAiEndpointLocalDataSource.kt similarity index 73% rename from data/src/main/java/com/shifthackz/aisdv1/data/local/FalAiEndpointLocalDataSource.kt rename to data/src/main/java/dev/minios/pdaiv1/data/local/FalAiEndpointLocalDataSource.kt index 7624f492c..4d8996af0 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/local/FalAiEndpointLocalDataSource.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/local/FalAiEndpointLocalDataSource.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.data.local +package dev.minios.pdaiv1.data.local -import com.shifthackz.aisdv1.data.mappers.toDomain -import com.shifthackz.aisdv1.data.mappers.toEntity -import com.shifthackz.aisdv1.domain.datasource.FalAiEndpointDataSource -import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint -import com.shifthackz.aisdv1.storage.db.persistent.dao.FalAiEndpointDao +import dev.minios.pdaiv1.data.mappers.toDomain +import dev.minios.pdaiv1.data.mappers.toEntity +import dev.minios.pdaiv1.domain.datasource.FalAiEndpointDataSource +import dev.minios.pdaiv1.domain.entity.FalAiEndpoint +import dev.minios.pdaiv1.storage.db.persistent.dao.FalAiEndpointDao import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/local/GenerationResultLocalDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/local/GenerationResultLocalDataSource.kt similarity index 71% rename from data/src/main/java/com/shifthackz/aisdv1/data/local/GenerationResultLocalDataSource.kt rename to data/src/main/java/dev/minios/pdaiv1/data/local/GenerationResultLocalDataSource.kt index 8a441241e..ede221a79 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/local/GenerationResultLocalDataSource.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/local/GenerationResultLocalDataSource.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.data.local - -import com.shifthackz.aisdv1.data.mappers.mapDomainToEntity -import com.shifthackz.aisdv1.data.mappers.mapEntityToDomain -import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.storage.db.persistent.dao.GenerationResultDao -import com.shifthackz.aisdv1.storage.db.persistent.entity.GenerationResultEntity +package dev.minios.pdaiv1.data.local + +import dev.minios.pdaiv1.data.mappers.mapDomainToEntity +import dev.minios.pdaiv1.data.mappers.mapEntityToDomain +import dev.minios.pdaiv1.domain.datasource.GenerationResultDataSource +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.storage.db.persistent.dao.GenerationResultDao +import dev.minios.pdaiv1.storage.db.persistent.entity.GenerationResultEntity import io.reactivex.rxjava3.core.Single internal class GenerationResultLocalDataSource( diff --git a/data/src/main/java/dev/minios/pdaiv1/data/local/HuggingFaceModelsLocalDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/local/HuggingFaceModelsLocalDataSource.kt new file mode 100644 index 000000000..397c7ff98 --- /dev/null +++ b/data/src/main/java/dev/minios/pdaiv1/data/local/HuggingFaceModelsLocalDataSource.kt @@ -0,0 +1,21 @@ +package dev.minios.pdaiv1.data.local + +import dev.minios.pdaiv1.data.mappers.mapDomainToEntity +import dev.minios.pdaiv1.data.mappers.mapEntityToDomain +import dev.minios.pdaiv1.domain.datasource.HuggingFaceModelsDataSource +import dev.minios.pdaiv1.domain.entity.HuggingFaceModel +import dev.minios.pdaiv1.storage.db.persistent.dao.HuggingFaceModelDao +import dev.minios.pdaiv1.storage.db.persistent.entity.HuggingFaceModelEntity + +internal class HuggingFaceModelsLocalDataSource( + private val dao: HuggingFaceModelDao, +) : HuggingFaceModelsDataSource.Local { + + override fun getAll() = dao + .query() + .map(List::mapEntityToDomain) + + override fun save(models: List) = dao + .deleteAll() + .andThen(dao.insertList(models.mapDomainToEntity())) +} diff --git a/data/src/main/java/dev/minios/pdaiv1/data/local/LorasLocalDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/local/LorasLocalDataSource.kt new file mode 100644 index 000000000..4f07effd1 --- /dev/null +++ b/data/src/main/java/dev/minios/pdaiv1/data/local/LorasLocalDataSource.kt @@ -0,0 +1,21 @@ +package dev.minios.pdaiv1.data.local + +import dev.minios.pdaiv1.data.mappers.mapDomainToEntity +import dev.minios.pdaiv1.data.mappers.mapEntityToDomain +import dev.minios.pdaiv1.domain.datasource.LorasDataSource +import dev.minios.pdaiv1.domain.entity.LoRA +import dev.minios.pdaiv1.storage.db.cache.dao.StableDiffusionLoraDao +import dev.minios.pdaiv1.storage.db.cache.entity.StableDiffusionLoraEntity + +internal class LorasLocalDataSource( + private val dao: StableDiffusionLoraDao, +) : LorasDataSource.Local { + + override fun getLoras() = dao + .queryAll() + .map(List::mapEntityToDomain) + + override fun insertLoras(loras: List) = dao + .deleteAll() + .andThen(dao.insertList(loras.mapDomainToEntity())) +} diff --git a/data/src/main/java/dev/minios/pdaiv1/data/local/ServerConfigurationLocalDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/local/ServerConfigurationLocalDataSource.kt new file mode 100755 index 000000000..0ec021255 --- /dev/null +++ b/data/src/main/java/dev/minios/pdaiv1/data/local/ServerConfigurationLocalDataSource.kt @@ -0,0 +1,20 @@ +package dev.minios.pdaiv1.data.local + +import dev.minios.pdaiv1.data.mappers.mapToDomain +import dev.minios.pdaiv1.data.mappers.mapToEntity +import dev.minios.pdaiv1.domain.datasource.ServerConfigurationDataSource +import dev.minios.pdaiv1.domain.entity.ServerConfiguration +import dev.minios.pdaiv1.storage.db.cache.dao.ServerConfigurationDao +import dev.minios.pdaiv1.storage.db.cache.entity.ServerConfigurationEntity + +internal class ServerConfigurationLocalDataSource( + private val dao: ServerConfigurationDao, +) : ServerConfigurationDataSource.Local { + + override fun save(configuration: ServerConfiguration) = dao + .insert(configuration.mapToEntity()) + + override fun get() = dao + .query() + .map(ServerConfigurationEntity::mapToDomain) +} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/local/StabilityAiCreditsLocalDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/local/StabilityAiCreditsLocalDataSource.kt similarity index 84% rename from data/src/main/java/com/shifthackz/aisdv1/data/local/StabilityAiCreditsLocalDataSource.kt rename to data/src/main/java/dev/minios/pdaiv1/data/local/StabilityAiCreditsLocalDataSource.kt index 54e65ddfb..b01f3e22d 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/local/StabilityAiCreditsLocalDataSource.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/local/StabilityAiCreditsLocalDataSource.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.local +package dev.minios.pdaiv1.data.local -import com.shifthackz.aisdv1.domain.datasource.StabilityAiCreditsDataSource +import dev.minios.pdaiv1.domain.datasource.StabilityAiCreditsDataSource import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.subjects.BehaviorSubject diff --git a/data/src/main/java/dev/minios/pdaiv1/data/local/StableDiffusionHyperNetworksLocalDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/local/StableDiffusionHyperNetworksLocalDataSource.kt new file mode 100644 index 000000000..f5509385b --- /dev/null +++ b/data/src/main/java/dev/minios/pdaiv1/data/local/StableDiffusionHyperNetworksLocalDataSource.kt @@ -0,0 +1,21 @@ +package dev.minios.pdaiv1.data.local + +import dev.minios.pdaiv1.data.mappers.mapDomainToEntity +import dev.minios.pdaiv1.data.mappers.mapEntityToDomain +import dev.minios.pdaiv1.domain.datasource.StableDiffusionHyperNetworksDataSource +import dev.minios.pdaiv1.domain.entity.StableDiffusionHyperNetwork +import dev.minios.pdaiv1.storage.db.cache.dao.StableDiffusionHyperNetworkDao +import dev.minios.pdaiv1.storage.db.cache.entity.StableDiffusionHyperNetworkEntity + +internal class StableDiffusionHyperNetworksLocalDataSource( + private val dao: StableDiffusionHyperNetworkDao, +) : StableDiffusionHyperNetworksDataSource.Local { + + override fun getHyperNetworks() = dao + .queryAll() + .map(List::mapEntityToDomain) + + override fun insertHyperNetworks(list: List) = dao + .deleteAll() + .andThen(dao.insertList(list.mapDomainToEntity())) +} diff --git a/data/src/main/java/dev/minios/pdaiv1/data/local/StableDiffusionModelsLocalDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/local/StableDiffusionModelsLocalDataSource.kt new file mode 100755 index 000000000..95bf6bfa8 --- /dev/null +++ b/data/src/main/java/dev/minios/pdaiv1/data/local/StableDiffusionModelsLocalDataSource.kt @@ -0,0 +1,21 @@ +package dev.minios.pdaiv1.data.local + +import dev.minios.pdaiv1.data.mappers.mapDomainToEntity +import dev.minios.pdaiv1.data.mappers.mapEntityToDomain +import dev.minios.pdaiv1.domain.datasource.StableDiffusionModelsDataSource +import dev.minios.pdaiv1.domain.entity.StableDiffusionModel +import dev.minios.pdaiv1.storage.db.cache.dao.StableDiffusionModelDao +import dev.minios.pdaiv1.storage.db.cache.entity.StableDiffusionModelEntity + +internal class StableDiffusionModelsLocalDataSource( + private val dao: StableDiffusionModelDao, +) : StableDiffusionModelsDataSource.Local { + + override fun getModels() = dao + .queryAll() + .map(List::mapEntityToDomain) + + override fun insertModels(models: List) = dao + .deleteAll() + .andThen(dao.insertList(models.mapDomainToEntity())) +} diff --git a/data/src/main/java/dev/minios/pdaiv1/data/local/StableDiffusionSamplersLocalDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/local/StableDiffusionSamplersLocalDataSource.kt new file mode 100755 index 000000000..37aa771fc --- /dev/null +++ b/data/src/main/java/dev/minios/pdaiv1/data/local/StableDiffusionSamplersLocalDataSource.kt @@ -0,0 +1,21 @@ +package dev.minios.pdaiv1.data.local + +import dev.minios.pdaiv1.data.mappers.mapDomainToEntity +import dev.minios.pdaiv1.data.mappers.mapEntityToDomain +import dev.minios.pdaiv1.domain.datasource.StableDiffusionSamplersDataSource +import dev.minios.pdaiv1.domain.entity.StableDiffusionSampler +import dev.minios.pdaiv1.storage.db.cache.dao.StableDiffusionSamplerDao +import dev.minios.pdaiv1.storage.db.cache.entity.StableDiffusionSamplerEntity + +internal class StableDiffusionSamplersLocalDataSource( + private val dao: StableDiffusionSamplerDao, +) : StableDiffusionSamplersDataSource.Local { + + override fun getSamplers() = dao + .queryAll() + .map(List::mapEntityToDomain) + + override fun insertSamplers(samplers: List) = dao + .deleteAll() + .andThen(dao.insertList(samplers.mapDomainToEntity())) +} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/local/SupportersLocalDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/local/SupportersLocalDataSource.kt similarity index 52% rename from data/src/main/java/com/shifthackz/aisdv1/data/local/SupportersLocalDataSource.kt rename to data/src/main/java/dev/minios/pdaiv1/data/local/SupportersLocalDataSource.kt index acc60f3c5..f99939754 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/local/SupportersLocalDataSource.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/local/SupportersLocalDataSource.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.data.local +package dev.minios.pdaiv1.data.local -import com.shifthackz.aisdv1.data.mappers.mapDomainToEntity -import com.shifthackz.aisdv1.data.mappers.mapEntityToDomain -import com.shifthackz.aisdv1.domain.datasource.SupportersDataSource -import com.shifthackz.aisdv1.domain.entity.Supporter -import com.shifthackz.aisdv1.storage.db.persistent.dao.SupporterDao -import com.shifthackz.aisdv1.storage.db.persistent.entity.SupporterEntity +import dev.minios.pdaiv1.data.mappers.mapDomainToEntity +import dev.minios.pdaiv1.data.mappers.mapEntityToDomain +import dev.minios.pdaiv1.domain.datasource.SupportersDataSource +import dev.minios.pdaiv1.domain.entity.Supporter +import dev.minios.pdaiv1.storage.db.persistent.dao.SupporterDao +import dev.minios.pdaiv1.storage.db.persistent.entity.SupporterEntity import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/local/SwarmUiModelsLocalDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/local/SwarmUiModelsLocalDataSource.kt similarity index 54% rename from data/src/main/java/com/shifthackz/aisdv1/data/local/SwarmUiModelsLocalDataSource.kt rename to data/src/main/java/dev/minios/pdaiv1/data/local/SwarmUiModelsLocalDataSource.kt index a40cec23d..455daeec9 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/local/SwarmUiModelsLocalDataSource.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/local/SwarmUiModelsLocalDataSource.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.data.local +package dev.minios.pdaiv1.data.local -import com.shifthackz.aisdv1.data.mappers.mapDomainToEntity -import com.shifthackz.aisdv1.data.mappers.mapEntityToDomain -import com.shifthackz.aisdv1.domain.datasource.SwarmUiModelsDataSource -import com.shifthackz.aisdv1.domain.entity.SwarmUiModel -import com.shifthackz.aisdv1.storage.db.cache.dao.SwarmUiModelDao -import com.shifthackz.aisdv1.storage.db.cache.entity.SwarmUiModelEntity +import dev.minios.pdaiv1.data.mappers.mapDomainToEntity +import dev.minios.pdaiv1.data.mappers.mapEntityToDomain +import dev.minios.pdaiv1.domain.datasource.SwarmUiModelsDataSource +import dev.minios.pdaiv1.domain.entity.SwarmUiModel +import dev.minios.pdaiv1.storage.db.cache.dao.SwarmUiModelDao +import dev.minios.pdaiv1.storage.db.cache.entity.SwarmUiModelEntity import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/AiGenerationResultMappers.kt b/data/src/main/java/dev/minios/pdaiv1/data/mappers/AiGenerationResultMappers.kt similarity index 89% rename from data/src/main/java/com/shifthackz/aisdv1/data/mappers/AiGenerationResultMappers.kt rename to data/src/main/java/dev/minios/pdaiv1/data/mappers/AiGenerationResultMappers.kt index edaa1eda9..99608aae1 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/AiGenerationResultMappers.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/mappers/AiGenerationResultMappers.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.mappers +package dev.minios.pdaiv1.data.mappers -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.MediaType -import com.shifthackz.aisdv1.storage.db.persistent.entity.GenerationResultEntity +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.MediaType +import dev.minios.pdaiv1.storage.db.persistent.entity.GenerationResultEntity //region DOMAIN --> ENTITY fun List.mapDomainToEntity(): List = diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/FalAiEndpointMappers.kt b/data/src/main/java/dev/minios/pdaiv1/data/mappers/FalAiEndpointMappers.kt similarity index 86% rename from data/src/main/java/com/shifthackz/aisdv1/data/mappers/FalAiEndpointMappers.kt rename to data/src/main/java/dev/minios/pdaiv1/data/mappers/FalAiEndpointMappers.kt index cdb982646..b3d76f299 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/FalAiEndpointMappers.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/mappers/FalAiEndpointMappers.kt @@ -1,12 +1,12 @@ -package com.shifthackz.aisdv1.data.mappers +package dev.minios.pdaiv1.data.mappers import com.google.gson.Gson -import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint -import com.shifthackz.aisdv1.domain.entity.FalAiEndpointCategory -import com.shifthackz.aisdv1.domain.entity.FalAiEndpointSchema -import com.shifthackz.aisdv1.domain.entity.FalAiInputProperty -import com.shifthackz.aisdv1.domain.entity.FalAiPropertyType -import com.shifthackz.aisdv1.storage.db.persistent.entity.FalAiEndpointEntity +import dev.minios.pdaiv1.domain.entity.FalAiEndpoint +import dev.minios.pdaiv1.domain.entity.FalAiEndpointCategory +import dev.minios.pdaiv1.domain.entity.FalAiEndpointSchema +import dev.minios.pdaiv1.domain.entity.FalAiInputProperty +import dev.minios.pdaiv1.domain.entity.FalAiPropertyType +import dev.minios.pdaiv1.storage.db.persistent.entity.FalAiEndpointEntity private val gson = Gson() diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/FalAiOpenApiParser.kt b/data/src/main/java/dev/minios/pdaiv1/data/mappers/FalAiOpenApiParser.kt similarity index 97% rename from data/src/main/java/com/shifthackz/aisdv1/data/mappers/FalAiOpenApiParser.kt rename to data/src/main/java/dev/minios/pdaiv1/data/mappers/FalAiOpenApiParser.kt index a657501d0..4471a60a1 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/FalAiOpenApiParser.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/mappers/FalAiOpenApiParser.kt @@ -1,12 +1,12 @@ -package com.shifthackz.aisdv1.data.mappers +package dev.minios.pdaiv1.data.mappers import com.google.gson.Gson import com.google.gson.JsonObject -import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint -import com.shifthackz.aisdv1.domain.entity.FalAiEndpointCategory -import com.shifthackz.aisdv1.domain.entity.FalAiEndpointSchema -import com.shifthackz.aisdv1.domain.entity.FalAiInputProperty -import com.shifthackz.aisdv1.domain.entity.FalAiPropertyType +import dev.minios.pdaiv1.domain.entity.FalAiEndpoint +import dev.minios.pdaiv1.domain.entity.FalAiEndpointCategory +import dev.minios.pdaiv1.domain.entity.FalAiEndpointSchema +import dev.minios.pdaiv1.domain.entity.FalAiInputProperty +import dev.minios.pdaiv1.domain.entity.FalAiPropertyType import java.util.UUID /** diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/ForgeModulesMappers.kt b/data/src/main/java/dev/minios/pdaiv1/data/mappers/ForgeModulesMappers.kt similarity index 57% rename from data/src/main/java/com/shifthackz/aisdv1/data/mappers/ForgeModulesMappers.kt rename to data/src/main/java/dev/minios/pdaiv1/data/mappers/ForgeModulesMappers.kt index eb7ab8738..4970a2951 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/ForgeModulesMappers.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/mappers/ForgeModulesMappers.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.data.mappers +package dev.minios.pdaiv1.data.mappers -import com.shifthackz.aisdv1.domain.entity.ForgeModule -import com.shifthackz.aisdv1.network.model.ForgeModuleRaw +import dev.minios.pdaiv1.domain.entity.ForgeModule +import dev.minios.pdaiv1.network.model.ForgeModuleRaw fun List.mapRawToDomain(): List = map { it.mapRawToDomain() } diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/HuggingFaceModelMappers.kt b/data/src/main/java/dev/minios/pdaiv1/data/mappers/HuggingFaceModelMappers.kt similarity index 80% rename from data/src/main/java/com/shifthackz/aisdv1/data/mappers/HuggingFaceModelMappers.kt rename to data/src/main/java/dev/minios/pdaiv1/data/mappers/HuggingFaceModelMappers.kt index 3ed4ad390..f4054cf79 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/HuggingFaceModelMappers.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/mappers/HuggingFaceModelMappers.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.mappers +package dev.minios.pdaiv1.data.mappers -import com.shifthackz.aisdv1.domain.entity.HuggingFaceModel -import com.shifthackz.aisdv1.network.model.HuggingFaceModelRaw -import com.shifthackz.aisdv1.storage.db.persistent.entity.HuggingFaceModelEntity +import dev.minios.pdaiv1.domain.entity.HuggingFaceModel +import dev.minios.pdaiv1.network.model.HuggingFaceModelRaw +import dev.minios.pdaiv1.storage.db.persistent.entity.HuggingFaceModelEntity //region RAW --> DOMAIN fun List.mapRawToCheckpointDomain(): List = diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/ImageToImagePayloadMappers.kt b/data/src/main/java/dev/minios/pdaiv1/data/mappers/ImageToImagePayloadMappers.kt similarity index 89% rename from data/src/main/java/com/shifthackz/aisdv1/data/mappers/ImageToImagePayloadMappers.kt rename to data/src/main/java/dev/minios/pdaiv1/data/mappers/ImageToImagePayloadMappers.kt index 4c2e2cd86..d897ab886 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/ImageToImagePayloadMappers.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/mappers/ImageToImagePayloadMappers.kt @@ -1,16 +1,16 @@ -package com.shifthackz.aisdv1.data.mappers +package dev.minios.pdaiv1.data.mappers -import com.shifthackz.aisdv1.core.common.math.roundTo -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.Scheduler -import com.shifthackz.aisdv1.domain.entity.StabilityAiClipGuidance -import com.shifthackz.aisdv1.domain.entity.StabilityAiStylePreset -import com.shifthackz.aisdv1.network.request.HordeGenerationAsyncRequest -import com.shifthackz.aisdv1.network.request.HuggingFaceGenerationRequest -import com.shifthackz.aisdv1.network.request.ImageToImageRequest -import com.shifthackz.aisdv1.network.request.SwarmUiGenerationRequest -import com.shifthackz.aisdv1.network.response.SdGenerationResponse +import dev.minios.pdaiv1.core.common.math.roundTo +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.Scheduler +import dev.minios.pdaiv1.domain.entity.StabilityAiClipGuidance +import dev.minios.pdaiv1.domain.entity.StabilityAiStylePreset +import dev.minios.pdaiv1.network.request.HordeGenerationAsyncRequest +import dev.minios.pdaiv1.network.request.HuggingFaceGenerationRequest +import dev.minios.pdaiv1.network.request.ImageToImageRequest +import dev.minios.pdaiv1.network.request.SwarmUiGenerationRequest +import dev.minios.pdaiv1.network.response.SdGenerationResponse import java.util.Date //region PAYLOAD --> REQUEST diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/LocalAiModelMappers.kt b/data/src/main/java/dev/minios/pdaiv1/data/mappers/LocalAiModelMappers.kt similarity index 59% rename from data/src/main/java/com/shifthackz/aisdv1/data/mappers/LocalAiModelMappers.kt rename to data/src/main/java/dev/minios/pdaiv1/data/mappers/LocalAiModelMappers.kt index 7d7033aa8..e72d5d5ad 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/LocalAiModelMappers.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/mappers/LocalAiModelMappers.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.mappers +package dev.minios.pdaiv1.data.mappers -import com.shifthackz.aisdv1.domain.entity.LocalAiModel -import com.shifthackz.aisdv1.network.response.DownloadableModelResponse -import com.shifthackz.aisdv1.storage.db.persistent.entity.LocalModelEntity +import dev.minios.pdaiv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.network.response.DownloadableModelResponse +import dev.minios.pdaiv1.storage.db.persistent.entity.LocalModelEntity //region RAW --> DOMAIN fun List.mapRawToCheckpointDomain( @@ -18,6 +18,8 @@ fun DownloadableModelResponse.mapRawToCheckpointDomain( name = name ?: "", size = size ?: "", sources = sources ?: emptyList(), + chipsetSuffix = metadata?.chipset, + runOnCpu = metadata?.type == "cpu", ) } //endregion @@ -27,7 +29,7 @@ fun List.mapDomainToEntity(): List = map(LocalAiModel::mapDomainToEntity) fun LocalAiModel.mapDomainToEntity(): LocalModelEntity = with(this) { - LocalModelEntity(id, type.key, name, size, sources) + LocalModelEntity(id, type.key, name, size, sources, chipsetSuffix, runOnCpu) } //endregion @@ -36,6 +38,14 @@ fun List.mapEntityToDomain(): List = map(LocalModelEntity::mapEntityToDomain) fun LocalModelEntity.mapEntityToDomain(): LocalAiModel = with(this) { - LocalAiModel(id, LocalAiModel.Type.parse(type), name, size, sources) + LocalAiModel( + id = id, + type = LocalAiModel.Type.parse(type), + name = name, + size = size, + sources = sources, + chipsetSuffix = chipsetSuffix, + runOnCpu = runOnCpu, + ) } //endregion diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/ResponseParamsMapper.kt b/data/src/main/java/dev/minios/pdaiv1/data/mappers/ResponseParamsMapper.kt similarity index 79% rename from data/src/main/java/com/shifthackz/aisdv1/data/mappers/ResponseParamsMapper.kt rename to data/src/main/java/dev/minios/pdaiv1/data/mappers/ResponseParamsMapper.kt index 415e8d5a3..5df8c0392 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/ResponseParamsMapper.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/mappers/ResponseParamsMapper.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.data.mappers +package dev.minios.pdaiv1.data.mappers import com.google.gson.Gson import com.google.gson.reflect.TypeToken -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.network.response.SdGenerationResponse +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.network.response.SdGenerationResponse fun mapSeedFromRemote(infoString: String?): String = parseInfo(infoString).fold( onFailure = { "" }, diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/ServerConfigurationMappers.kt b/data/src/main/java/dev/minios/pdaiv1/data/mappers/ServerConfigurationMappers.kt similarity index 77% rename from data/src/main/java/com/shifthackz/aisdv1/data/mappers/ServerConfigurationMappers.kt rename to data/src/main/java/dev/minios/pdaiv1/data/mappers/ServerConfigurationMappers.kt index 5686fcfaf..ebfffa1c8 100755 --- a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/ServerConfigurationMappers.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/mappers/ServerConfigurationMappers.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.mappers +package dev.minios.pdaiv1.data.mappers -import com.shifthackz.aisdv1.domain.entity.ServerConfiguration -import com.shifthackz.aisdv1.network.model.ServerConfigurationRaw -import com.shifthackz.aisdv1.storage.db.cache.entity.ServerConfigurationEntity +import dev.minios.pdaiv1.domain.entity.ServerConfiguration +import dev.minios.pdaiv1.network.model.ServerConfigurationRaw +import dev.minios.pdaiv1.storage.db.cache.entity.ServerConfigurationEntity //region RAW --> DOMAIN fun ServerConfigurationRaw.mapToDomain(): ServerConfiguration = with(this) { diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/StabilityAiEngineMappers.kt b/data/src/main/java/dev/minios/pdaiv1/data/mappers/StabilityAiEngineMappers.kt similarity index 65% rename from data/src/main/java/com/shifthackz/aisdv1/data/mappers/StabilityAiEngineMappers.kt rename to data/src/main/java/dev/minios/pdaiv1/data/mappers/StabilityAiEngineMappers.kt index 44999ca48..3756ffd4e 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/StabilityAiEngineMappers.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/mappers/StabilityAiEngineMappers.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.data.mappers +package dev.minios.pdaiv1.data.mappers -import com.shifthackz.aisdv1.domain.entity.StabilityAiEngine -import com.shifthackz.aisdv1.network.model.StabilityAiEngineRaw +import dev.minios.pdaiv1.domain.entity.StabilityAiEngine +import dev.minios.pdaiv1.network.model.StabilityAiEngineRaw //region RAW --> DOMAIN fun List.mapRawToCheckpointDomain(): List = diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/StabilityAiPromptMappers.kt b/data/src/main/java/dev/minios/pdaiv1/data/mappers/StabilityAiPromptMappers.kt similarity index 88% rename from data/src/main/java/com/shifthackz/aisdv1/data/mappers/StabilityAiPromptMappers.kt rename to data/src/main/java/dev/minios/pdaiv1/data/mappers/StabilityAiPromptMappers.kt index 27d21f866..15f59df37 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/StabilityAiPromptMappers.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/mappers/StabilityAiPromptMappers.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mappers +package dev.minios.pdaiv1.data.mappers -import com.shifthackz.aisdv1.network.model.StabilityTextPromptRaw +import dev.minios.pdaiv1.network.model.StabilityTextPromptRaw fun String.mapToStabilityPrompt(defaultWeight: Double = 1.0): List = buildList { diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/StableDiffusionEmbeddingsMappers.kt b/data/src/main/java/dev/minios/pdaiv1/data/mappers/StableDiffusionEmbeddingsMappers.kt similarity index 75% rename from data/src/main/java/com/shifthackz/aisdv1/data/mappers/StableDiffusionEmbeddingsMappers.kt rename to data/src/main/java/dev/minios/pdaiv1/data/mappers/StableDiffusionEmbeddingsMappers.kt index 8403d4364..d190f9b07 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/StableDiffusionEmbeddingsMappers.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/mappers/StableDiffusionEmbeddingsMappers.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.mappers +package dev.minios.pdaiv1.data.mappers -import com.shifthackz.aisdv1.domain.entity.Embedding -import com.shifthackz.aisdv1.network.response.SdEmbeddingsResponse -import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionEmbeddingEntity +import dev.minios.pdaiv1.domain.entity.Embedding +import dev.minios.pdaiv1.network.response.SdEmbeddingsResponse +import dev.minios.pdaiv1.storage.db.cache.entity.StableDiffusionEmbeddingEntity //region RAW -> DOMAIN fun SdEmbeddingsResponse.mapRawToCheckpointDomain(): List = diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/StableDiffusionHyperNetworksMappers.kt b/data/src/main/java/dev/minios/pdaiv1/data/mappers/StableDiffusionHyperNetworksMappers.kt similarity index 80% rename from data/src/main/java/com/shifthackz/aisdv1/data/mappers/StableDiffusionHyperNetworksMappers.kt rename to data/src/main/java/dev/minios/pdaiv1/data/mappers/StableDiffusionHyperNetworksMappers.kt index 0690d860a..ee097c4e6 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/StableDiffusionHyperNetworksMappers.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/mappers/StableDiffusionHyperNetworksMappers.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.mappers +package dev.minios.pdaiv1.data.mappers -import com.shifthackz.aisdv1.domain.entity.StableDiffusionHyperNetwork -import com.shifthackz.aisdv1.network.model.StableDiffusionHyperNetworkRaw -import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionHyperNetworkEntity +import dev.minios.pdaiv1.domain.entity.StableDiffusionHyperNetwork +import dev.minios.pdaiv1.network.model.StableDiffusionHyperNetworkRaw +import dev.minios.pdaiv1.storage.db.cache.entity.StableDiffusionHyperNetworkEntity //region RAW -> DOMAIN fun List.mapRawToCheckpointDomain(): List = diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/StableDiffusionLorasMappers.kt b/data/src/main/java/dev/minios/pdaiv1/data/mappers/StableDiffusionLorasMappers.kt similarity index 80% rename from data/src/main/java/com/shifthackz/aisdv1/data/mappers/StableDiffusionLorasMappers.kt rename to data/src/main/java/dev/minios/pdaiv1/data/mappers/StableDiffusionLorasMappers.kt index ab3829982..a5d1eba15 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/StableDiffusionLorasMappers.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/mappers/StableDiffusionLorasMappers.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.mappers +package dev.minios.pdaiv1.data.mappers -import com.shifthackz.aisdv1.domain.entity.LoRA -import com.shifthackz.aisdv1.network.model.StableDiffusionLoraRaw -import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionLoraEntity +import dev.minios.pdaiv1.domain.entity.LoRA +import dev.minios.pdaiv1.network.model.StableDiffusionLoraRaw +import dev.minios.pdaiv1.storage.db.cache.entity.StableDiffusionLoraEntity //region RAW --> DOMAIN fun List.mapToDomain(): List = diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/StableDiffusionModelsMappers.kt b/data/src/main/java/dev/minios/pdaiv1/data/mappers/StableDiffusionModelsMappers.kt similarity index 85% rename from data/src/main/java/com/shifthackz/aisdv1/data/mappers/StableDiffusionModelsMappers.kt rename to data/src/main/java/dev/minios/pdaiv1/data/mappers/StableDiffusionModelsMappers.kt index b9d03c2d4..cd3fb8796 100755 --- a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/StableDiffusionModelsMappers.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/mappers/StableDiffusionModelsMappers.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.mappers +package dev.minios.pdaiv1.data.mappers -import com.shifthackz.aisdv1.domain.entity.StableDiffusionModel -import com.shifthackz.aisdv1.network.model.StableDiffusionModelRaw -import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionModelEntity +import dev.minios.pdaiv1.domain.entity.StableDiffusionModel +import dev.minios.pdaiv1.network.model.StableDiffusionModelRaw +import dev.minios.pdaiv1.storage.db.cache.entity.StableDiffusionModelEntity //region RAW --> DOMAIN fun List.mapRawToCheckpointDomain(): List = diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/StableDiffusionSamplersMappers.kt b/data/src/main/java/dev/minios/pdaiv1/data/mappers/StableDiffusionSamplersMappers.kt similarity index 82% rename from data/src/main/java/com/shifthackz/aisdv1/data/mappers/StableDiffusionSamplersMappers.kt rename to data/src/main/java/dev/minios/pdaiv1/data/mappers/StableDiffusionSamplersMappers.kt index dd932fa89..1ce7c7a1e 100755 --- a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/StableDiffusionSamplersMappers.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/mappers/StableDiffusionSamplersMappers.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.mappers +package dev.minios.pdaiv1.data.mappers -import com.shifthackz.aisdv1.domain.entity.StableDiffusionSampler -import com.shifthackz.aisdv1.network.model.StableDiffusionSamplerRaw -import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionSamplerEntity +import dev.minios.pdaiv1.domain.entity.StableDiffusionSampler +import dev.minios.pdaiv1.network.model.StableDiffusionSamplerRaw +import dev.minios.pdaiv1.storage.db.cache.entity.StableDiffusionSamplerEntity //region RAW --> DOMAIN fun List.mapRawToCheckpointDomain(): List = diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/SupportersMappers.kt b/data/src/main/java/dev/minios/pdaiv1/data/mappers/SupportersMappers.kt similarity index 77% rename from data/src/main/java/com/shifthackz/aisdv1/data/mappers/SupportersMappers.kt rename to data/src/main/java/dev/minios/pdaiv1/data/mappers/SupportersMappers.kt index f3559e51e..0004b607d 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/SupportersMappers.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/mappers/SupportersMappers.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.data.mappers +package dev.minios.pdaiv1.data.mappers -import com.shifthackz.aisdv1.core.common.extensions.toDate -import com.shifthackz.aisdv1.domain.entity.Supporter -import com.shifthackz.aisdv1.network.model.SupporterRaw -import com.shifthackz.aisdv1.storage.db.persistent.entity.SupporterEntity +import dev.minios.pdaiv1.core.common.extensions.toDate +import dev.minios.pdaiv1.domain.entity.Supporter +import dev.minios.pdaiv1.network.model.SupporterRaw +import dev.minios.pdaiv1.storage.db.persistent.entity.SupporterEntity import java.util.Date //region RAW --> DOMAIN diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/SwarmUiModelsMappers.kt b/data/src/main/java/dev/minios/pdaiv1/data/mappers/SwarmUiModelsMappers.kt similarity index 83% rename from data/src/main/java/com/shifthackz/aisdv1/data/mappers/SwarmUiModelsMappers.kt rename to data/src/main/java/dev/minios/pdaiv1/data/mappers/SwarmUiModelsMappers.kt index 931fa4d07..42e0382e3 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/SwarmUiModelsMappers.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/mappers/SwarmUiModelsMappers.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.data.mappers +package dev.minios.pdaiv1.data.mappers -import com.shifthackz.aisdv1.domain.entity.Embedding -import com.shifthackz.aisdv1.domain.entity.LoRA -import com.shifthackz.aisdv1.domain.entity.SwarmUiModel -import com.shifthackz.aisdv1.network.model.SwarmUiModelRaw -import com.shifthackz.aisdv1.network.response.SwarmUiModelsResponse -import com.shifthackz.aisdv1.storage.db.cache.entity.SwarmUiModelEntity +import dev.minios.pdaiv1.domain.entity.Embedding +import dev.minios.pdaiv1.domain.entity.LoRA +import dev.minios.pdaiv1.domain.entity.SwarmUiModel +import dev.minios.pdaiv1.network.model.SwarmUiModelRaw +import dev.minios.pdaiv1.network.response.SwarmUiModelsResponse +import dev.minios.pdaiv1.storage.db.cache.entity.SwarmUiModelEntity //region RAW --> CHECKPOINT DOMAIN fun SwarmUiModelsResponse.mapRawToCheckpointDomain(): List = with(this) { diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/TextToImagePayloadMappers.kt b/data/src/main/java/dev/minios/pdaiv1/data/mappers/TextToImagePayloadMappers.kt similarity index 90% rename from data/src/main/java/com/shifthackz/aisdv1/data/mappers/TextToImagePayloadMappers.kt rename to data/src/main/java/dev/minios/pdaiv1/data/mappers/TextToImagePayloadMappers.kt index aea1349db..3112dfc3a 100755 --- a/data/src/main/java/com/shifthackz/aisdv1/data/mappers/TextToImagePayloadMappers.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/mappers/TextToImagePayloadMappers.kt @@ -1,21 +1,21 @@ -package com.shifthackz.aisdv1.data.mappers +package dev.minios.pdaiv1.data.mappers -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.OpenAiModel -import com.shifthackz.aisdv1.domain.entity.Scheduler -import com.shifthackz.aisdv1.domain.entity.StabilityAiClipGuidance -import com.shifthackz.aisdv1.domain.entity.StabilityAiSampler -import com.shifthackz.aisdv1.domain.entity.StabilityAiStylePreset -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import com.shifthackz.aisdv1.network.request.HordeGenerationAsyncRequest -import com.shifthackz.aisdv1.network.request.HuggingFaceGenerationRequest -import com.shifthackz.aisdv1.network.request.OpenAiRequest -import com.shifthackz.aisdv1.network.request.OverrideSettings -import com.shifthackz.aisdv1.network.request.StabilityTextToImageRequest -import com.shifthackz.aisdv1.network.request.SwarmUiGenerationRequest -import com.shifthackz.aisdv1.network.request.TextToImageRequest -import com.shifthackz.aisdv1.network.response.SdGenerationResponse +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.OpenAiModel +import dev.minios.pdaiv1.domain.entity.Scheduler +import dev.minios.pdaiv1.domain.entity.StabilityAiClipGuidance +import dev.minios.pdaiv1.domain.entity.StabilityAiSampler +import dev.minios.pdaiv1.domain.entity.StabilityAiStylePreset +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.network.request.HordeGenerationAsyncRequest +import dev.minios.pdaiv1.network.request.HuggingFaceGenerationRequest +import dev.minios.pdaiv1.network.request.OpenAiRequest +import dev.minios.pdaiv1.network.request.OverrideSettings +import dev.minios.pdaiv1.network.request.StabilityTextToImageRequest +import dev.minios.pdaiv1.network.request.SwarmUiGenerationRequest +import dev.minios.pdaiv1.network.request.TextToImageRequest +import dev.minios.pdaiv1.network.response.SdGenerationResponse import java.util.Date //region PAYLOAD --> REQUEST diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/preference/PreferenceManagerImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/preference/PreferenceManagerImpl.kt similarity index 94% rename from data/src/main/java/com/shifthackz/aisdv1/data/preference/PreferenceManagerImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/preference/PreferenceManagerImpl.kt index 5f27f0717..cfd65d40b 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/preference/PreferenceManagerImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/preference/PreferenceManagerImpl.kt @@ -1,21 +1,21 @@ -package com.shifthackz.aisdv1.data.preference +package dev.minios.pdaiv1.data.preference import android.content.SharedPreferences import com.google.gson.Gson import com.google.gson.reflect.TypeToken -import com.shifthackz.aisdv1.core.common.extensions.fixUrlSlashes -import com.shifthackz.aisdv1.core.common.extensions.shouldUseNewMediaStore -import com.shifthackz.aisdv1.core.common.file.LOCAL_DIFFUSION_CUSTOM_PATH -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersToken -import com.shifthackz.aisdv1.domain.entity.ColorToken -import com.shifthackz.aisdv1.domain.entity.DarkThemeToken -import com.shifthackz.aisdv1.domain.entity.FeatureTag -import com.shifthackz.aisdv1.domain.entity.Grid -import com.shifthackz.aisdv1.domain.entity.HuggingFaceModel -import com.shifthackz.aisdv1.domain.entity.ModelType -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.entity.Settings -import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.core.common.extensions.fixUrlSlashes +import dev.minios.pdaiv1.core.common.extensions.shouldUseNewMediaStore +import dev.minios.pdaiv1.core.common.file.LOCAL_DIFFUSION_CUSTOM_PATH +import dev.minios.pdaiv1.core.common.schedulers.SchedulersToken +import dev.minios.pdaiv1.domain.entity.ColorToken +import dev.minios.pdaiv1.domain.entity.DarkThemeToken +import dev.minios.pdaiv1.domain.entity.FeatureTag +import dev.minios.pdaiv1.domain.entity.Grid +import dev.minios.pdaiv1.domain.entity.HuggingFaceModel +import dev.minios.pdaiv1.domain.entity.ModelType +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.entity.Settings +import dev.minios.pdaiv1.domain.preference.PreferenceManager import com.shifthackz.android.core.preferences.delegates import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.core.Completable diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/preference/SessionPreferenceImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/preference/SessionPreferenceImpl.kt similarity index 69% rename from data/src/main/java/com/shifthackz/aisdv1/data/preference/SessionPreferenceImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/preference/SessionPreferenceImpl.kt index 00be950de..94df8fc70 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/preference/SessionPreferenceImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/preference/SessionPreferenceImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.preference +package dev.minios.pdaiv1.data.preference -import com.shifthackz.aisdv1.domain.preference.SessionPreference +import dev.minios.pdaiv1.domain.preference.SessionPreference class SessionPreferenceImpl : SessionPreference { diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/provider/ServerUrlProvider.kt b/data/src/main/java/dev/minios/pdaiv1/data/provider/ServerUrlProvider.kt similarity index 75% rename from data/src/main/java/com/shifthackz/aisdv1/data/provider/ServerUrlProvider.kt rename to data/src/main/java/dev/minios/pdaiv1/data/provider/ServerUrlProvider.kt index 33ff94186..d8a206477 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/provider/ServerUrlProvider.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/provider/ServerUrlProvider.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.data.provider +package dev.minios.pdaiv1.data.provider import io.reactivex.rxjava3.core.Single diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/DownloadableModelRemoteDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/remote/DownloadableModelRemoteDataSource.kt similarity index 81% rename from data/src/main/java/com/shifthackz/aisdv1/data/remote/DownloadableModelRemoteDataSource.kt rename to data/src/main/java/dev/minios/pdaiv1/data/remote/DownloadableModelRemoteDataSource.kt index c1cbb93ed..6c18b24e0 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/remote/DownloadableModelRemoteDataSource.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/remote/DownloadableModelRemoteDataSource.kt @@ -1,13 +1,13 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.core.common.file.unzip -import com.shifthackz.aisdv1.data.mappers.mapRawToCheckpointDomain -import com.shifthackz.aisdv1.domain.datasource.DownloadableModelDataSource -import com.shifthackz.aisdv1.domain.entity.DownloadState -import com.shifthackz.aisdv1.domain.entity.LocalAiModel -import com.shifthackz.aisdv1.network.api.sdai.DownloadableModelsApi -import com.shifthackz.aisdv1.network.response.DownloadableModelResponse +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.core.common.file.unzip +import dev.minios.pdaiv1.data.mappers.mapRawToCheckpointDomain +import dev.minios.pdaiv1.domain.datasource.DownloadableModelDataSource +import dev.minios.pdaiv1.domain.entity.DownloadState +import dev.minios.pdaiv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.network.api.pdai.DownloadableModelsApi +import dev.minios.pdaiv1.network.response.DownloadableModelResponse import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/FalAiEndpointRemoteDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/remote/FalAiEndpointRemoteDataSource.kt similarity index 78% rename from data/src/main/java/com/shifthackz/aisdv1/data/remote/FalAiEndpointRemoteDataSource.kt rename to data/src/main/java/dev/minios/pdaiv1/data/remote/FalAiEndpointRemoteDataSource.kt index 3cf9460e3..7a6bd01fb 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/remote/FalAiEndpointRemoteDataSource.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/remote/FalAiEndpointRemoteDataSource.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.data.mappers.FalAiOpenApiParser -import com.shifthackz.aisdv1.domain.datasource.FalAiEndpointDataSource -import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint +import dev.minios.pdaiv1.data.mappers.FalAiOpenApiParser +import dev.minios.pdaiv1.domain.datasource.FalAiEndpointDataSource +import dev.minios.pdaiv1.domain.entity.FalAiEndpoint import io.reactivex.rxjava3.core.Single import okhttp3.OkHttpClient import okhttp3.Request diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/FalAiGenerationRemoteDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/remote/FalAiGenerationRemoteDataSource.kt similarity index 95% rename from data/src/main/java/com/shifthackz/aisdv1/data/remote/FalAiGenerationRemoteDataSource.kt rename to data/src/main/java/dev/minios/pdaiv1/data/remote/FalAiGenerationRemoteDataSource.kt index 1fd5a6ed4..ac779aeb7 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/remote/FalAiGenerationRemoteDataSource.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/remote/FalAiGenerationRemoteDataSource.kt @@ -1,23 +1,23 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote import android.graphics.Bitmap import android.graphics.BitmapFactory import android.util.Base64 -import com.shifthackz.aisdv1.core.common.log.debugLog -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.domain.datasource.FalAiGenerationDataSource -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint -import com.shifthackz.aisdv1.domain.entity.FalAiEndpointCategory -import com.shifthackz.aisdv1.domain.entity.MediaType -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import com.shifthackz.aisdv1.domain.feature.MediaFileManager -import com.shifthackz.aisdv1.network.api.falai.FalAiApi -import com.shifthackz.aisdv1.network.request.FalAiImageSize -import com.shifthackz.aisdv1.network.request.FalAiTextToImageRequest -import com.shifthackz.aisdv1.network.response.FalAiGenerationResponse -import com.shifthackz.aisdv1.network.response.FalAiImage -import com.shifthackz.aisdv1.network.response.FalAiQueueResponse +import dev.minios.pdaiv1.core.common.log.debugLog +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.domain.datasource.FalAiGenerationDataSource +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.FalAiEndpoint +import dev.minios.pdaiv1.domain.entity.FalAiEndpointCategory +import dev.minios.pdaiv1.domain.entity.MediaType +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.feature.MediaFileManager +import dev.minios.pdaiv1.network.api.falai.FalAiApi +import dev.minios.pdaiv1.network.request.FalAiImageSize +import dev.minios.pdaiv1.network.request.FalAiTextToImageRequest +import dev.minios.pdaiv1.network.response.FalAiGenerationResponse +import dev.minios.pdaiv1.network.response.FalAiImage +import dev.minios.pdaiv1.network.response.FalAiQueueResponse import io.reactivex.rxjava3.core.Single import okhttp3.OkHttpClient import okhttp3.Request diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/HordeGenerationRemoteDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/remote/HordeGenerationRemoteDataSource.kt similarity index 86% rename from data/src/main/java/com/shifthackz/aisdv1/data/remote/HordeGenerationRemoteDataSource.kt rename to data/src/main/java/dev/minios/pdaiv1/data/remote/HordeGenerationRemoteDataSource.kt index 86b447da2..5ef2e6657 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/remote/HordeGenerationRemoteDataSource.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/remote/HordeGenerationRemoteDataSource.kt @@ -1,16 +1,16 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote import android.graphics.BitmapFactory -import com.shifthackz.aisdv1.core.common.log.debugLog -import com.shifthackz.aisdv1.core.imageprocessing.BitmapToBase64Converter -import com.shifthackz.aisdv1.data.mappers.mapCloudToAiGenResult -import com.shifthackz.aisdv1.data.mappers.mapToHordeRequest -import com.shifthackz.aisdv1.domain.datasource.HordeGenerationDataSource -import com.shifthackz.aisdv1.domain.entity.HordeProcessStatus -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import com.shifthackz.aisdv1.network.api.horde.HordeRestApi -import com.shifthackz.aisdv1.network.request.HordeGenerationAsyncRequest +import dev.minios.pdaiv1.core.common.log.debugLog +import dev.minios.pdaiv1.core.imageprocessing.BitmapToBase64Converter +import dev.minios.pdaiv1.data.mappers.mapCloudToAiGenResult +import dev.minios.pdaiv1.data.mappers.mapToHordeRequest +import dev.minios.pdaiv1.domain.datasource.HordeGenerationDataSource +import dev.minios.pdaiv1.domain.entity.HordeProcessStatus +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.network.api.horde.HordeRestApi +import dev.minios.pdaiv1.network.request.HordeGenerationAsyncRequest import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/HuggingFaceGenerationRemoteDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/remote/HuggingFaceGenerationRemoteDataSource.kt similarity index 67% rename from data/src/main/java/com/shifthackz/aisdv1/data/remote/HuggingFaceGenerationRemoteDataSource.kt rename to data/src/main/java/dev/minios/pdaiv1/data/remote/HuggingFaceGenerationRemoteDataSource.kt index cd0488e84..41b74918c 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/remote/HuggingFaceGenerationRemoteDataSource.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/remote/HuggingFaceGenerationRemoteDataSource.kt @@ -1,15 +1,15 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.imageprocessing.BitmapToBase64Converter -import com.shifthackz.aisdv1.data.mappers.mapCloudToAiGenResult -import com.shifthackz.aisdv1.data.mappers.mapToHuggingFaceRequest -import com.shifthackz.aisdv1.domain.datasource.HuggingFaceGenerationDataSource -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import com.shifthackz.aisdv1.network.api.huggingface.HuggingFaceApi -import com.shifthackz.aisdv1.network.api.huggingface.HuggingFaceInferenceApi +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.imageprocessing.BitmapToBase64Converter +import dev.minios.pdaiv1.data.mappers.mapCloudToAiGenResult +import dev.minios.pdaiv1.data.mappers.mapToHuggingFaceRequest +import dev.minios.pdaiv1.domain.datasource.HuggingFaceGenerationDataSource +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.network.api.huggingface.HuggingFaceApi +import dev.minios.pdaiv1.network.api.huggingface.HuggingFaceInferenceApi import io.reactivex.rxjava3.core.Single internal class HuggingFaceGenerationRemoteDataSource( diff --git a/data/src/main/java/dev/minios/pdaiv1/data/remote/HuggingFaceModelsRemoteDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/remote/HuggingFaceModelsRemoteDataSource.kt new file mode 100644 index 000000000..df17ed594 --- /dev/null +++ b/data/src/main/java/dev/minios/pdaiv1/data/remote/HuggingFaceModelsRemoteDataSource.kt @@ -0,0 +1,17 @@ +package dev.minios.pdaiv1.data.remote + +import dev.minios.pdaiv1.data.mappers.mapRawToCheckpointDomain +import dev.minios.pdaiv1.domain.datasource.HuggingFaceModelsDataSource +import dev.minios.pdaiv1.domain.entity.HuggingFaceModel +import dev.minios.pdaiv1.network.api.pdai.HuggingFaceModelsApi +import dev.minios.pdaiv1.network.model.HuggingFaceModelRaw + +internal class HuggingFaceModelsRemoteDataSource( + private val api: HuggingFaceModelsApi, +) : HuggingFaceModelsDataSource.Remote { + + override fun fetchHuggingFaceModels() = api + .fetchHuggingFaceModels() + .map(List::mapRawToCheckpointDomain) + .onErrorReturn { listOf(HuggingFaceModel.default) } +} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/OpenAiGenerationRemoteDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/remote/OpenAiGenerationRemoteDataSource.kt similarity index 68% rename from data/src/main/java/com/shifthackz/aisdv1/data/remote/OpenAiGenerationRemoteDataSource.kt rename to data/src/main/java/dev/minios/pdaiv1/data/remote/OpenAiGenerationRemoteDataSource.kt index 0f4f1e375..800bafd33 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/remote/OpenAiGenerationRemoteDataSource.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/remote/OpenAiGenerationRemoteDataSource.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.data.mappers.mapCloudToAiGenResult -import com.shifthackz.aisdv1.data.mappers.mapToOpenAiRequest -import com.shifthackz.aisdv1.domain.datasource.OpenAiGenerationDataSource -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import com.shifthackz.aisdv1.network.api.openai.OpenAiApi +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.data.mappers.mapCloudToAiGenResult +import dev.minios.pdaiv1.data.mappers.mapToOpenAiRequest +import dev.minios.pdaiv1.domain.datasource.OpenAiGenerationDataSource +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.network.api.openai.OpenAiApi import io.reactivex.rxjava3.core.Single import java.lang.IllegalStateException diff --git a/data/src/main/java/dev/minios/pdaiv1/data/remote/RandomImageRemoteDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/remote/RandomImageRemoteDataSource.kt new file mode 100644 index 000000000..266d45061 --- /dev/null +++ b/data/src/main/java/dev/minios/pdaiv1/data/remote/RandomImageRemoteDataSource.kt @@ -0,0 +1,11 @@ +package dev.minios.pdaiv1.data.remote + +import dev.minios.pdaiv1.domain.datasource.RandomImageDataSource +import dev.minios.pdaiv1.network.api.imagecdn.ImageCdnRestApi + +internal class RandomImageRemoteDataSource( + private val api: ImageCdnRestApi, +) : RandomImageDataSource.Remote { + + override fun fetch() = api.fetchRandomImage() +} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/ReportRemoteDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/remote/ReportRemoteDataSource.kt similarity index 61% rename from data/src/main/java/com/shifthackz/aisdv1/data/remote/ReportRemoteDataSource.kt rename to data/src/main/java/dev/minios/pdaiv1/data/remote/ReportRemoteDataSource.kt index a7ec462dc..aa8435089 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/remote/ReportRemoteDataSource.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/remote/ReportRemoteDataSource.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.domain.datasource.ReportDataSource -import com.shifthackz.aisdv1.domain.entity.ReportReason -import com.shifthackz.aisdv1.network.api.sdai.ReportApi -import com.shifthackz.aisdv1.network.request.ReportRequest +import dev.minios.pdaiv1.domain.datasource.ReportDataSource +import dev.minios.pdaiv1.domain.entity.ReportReason +import dev.minios.pdaiv1.network.api.pdai.ReportApi +import dev.minios.pdaiv1.network.request.ReportRequest import io.reactivex.rxjava3.core.Completable internal class ReportRemoteDataSource(private val api: ReportApi) : ReportDataSource.Remote { diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/ServerConfigurationRemoteDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/remote/ServerConfigurationRemoteDataSource.kt similarity index 50% rename from data/src/main/java/com/shifthackz/aisdv1/data/remote/ServerConfigurationRemoteDataSource.kt rename to data/src/main/java/dev/minios/pdaiv1/data/remote/ServerConfigurationRemoteDataSource.kt index 42e1d8c99..2e465c50f 100755 --- a/data/src/main/java/com/shifthackz/aisdv1/data/remote/ServerConfigurationRemoteDataSource.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/remote/ServerConfigurationRemoteDataSource.kt @@ -1,13 +1,13 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.data.mappers.mapToDomain -import com.shifthackz.aisdv1.data.mappers.mapToRequest -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.datasource.ServerConfigurationDataSource -import com.shifthackz.aisdv1.domain.entity.ServerConfiguration -import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi -import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi.Companion.PATH_SD_OPTIONS -import com.shifthackz.aisdv1.network.model.ServerConfigurationRaw +import dev.minios.pdaiv1.data.mappers.mapToDomain +import dev.minios.pdaiv1.data.mappers.mapToRequest +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.datasource.ServerConfigurationDataSource +import dev.minios.pdaiv1.domain.entity.ServerConfiguration +import dev.minios.pdaiv1.network.api.automatic1111.Automatic1111RestApi +import dev.minios.pdaiv1.network.api.automatic1111.Automatic1111RestApi.Companion.PATH_SD_OPTIONS +import dev.minios.pdaiv1.network.model.ServerConfigurationRaw internal class ServerConfigurationRemoteDataSource( private val serverUrlProvider: ServerUrlProvider, diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/StabilityAiCreditsRemoteDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/remote/StabilityAiCreditsRemoteDataSource.kt similarity index 60% rename from data/src/main/java/com/shifthackz/aisdv1/data/remote/StabilityAiCreditsRemoteDataSource.kt rename to data/src/main/java/dev/minios/pdaiv1/data/remote/StabilityAiCreditsRemoteDataSource.kt index a7e6f30ad..7b411e82e 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/remote/StabilityAiCreditsRemoteDataSource.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/remote/StabilityAiCreditsRemoteDataSource.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.domain.datasource.StabilityAiCreditsDataSource -import com.shifthackz.aisdv1.network.api.stabilityai.StabilityAiApi +import dev.minios.pdaiv1.domain.datasource.StabilityAiCreditsDataSource +import dev.minios.pdaiv1.network.api.stabilityai.StabilityAiApi import io.reactivex.rxjava3.core.Single internal class StabilityAiCreditsRemoteDataSource( diff --git a/data/src/main/java/dev/minios/pdaiv1/data/remote/StabilityAiEnginesRemoteDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/remote/StabilityAiEnginesRemoteDataSource.kt new file mode 100644 index 000000000..845ccaa49 --- /dev/null +++ b/data/src/main/java/dev/minios/pdaiv1/data/remote/StabilityAiEnginesRemoteDataSource.kt @@ -0,0 +1,17 @@ +package dev.minios.pdaiv1.data.remote + +import dev.minios.pdaiv1.data.mappers.mapRawToCheckpointDomain +import dev.minios.pdaiv1.domain.datasource.StabilityAiEnginesDataSource +import dev.minios.pdaiv1.domain.entity.StabilityAiEngine +import dev.minios.pdaiv1.network.api.stabilityai.StabilityAiApi +import dev.minios.pdaiv1.network.model.StabilityAiEngineRaw +import io.reactivex.rxjava3.core.Single + +internal class StabilityAiEnginesRemoteDataSource( + private val api: StabilityAiApi, +) : StabilityAiEnginesDataSource.Remote { + + override fun fetch(): Single> = api + .fetchEngines() + .map(List::mapRawToCheckpointDomain) +} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/StabilityAiGenerationRemoteDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/remote/StabilityAiGenerationRemoteDataSource.kt similarity index 77% rename from data/src/main/java/com/shifthackz/aisdv1/data/remote/StabilityAiGenerationRemoteDataSource.kt rename to data/src/main/java/dev/minios/pdaiv1/data/remote/StabilityAiGenerationRemoteDataSource.kt index b3f3d9e59..9572f1170 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/remote/StabilityAiGenerationRemoteDataSource.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/remote/StabilityAiGenerationRemoteDataSource.kt @@ -1,15 +1,15 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.data.mappers.mapCloudToAiGenResult -import com.shifthackz.aisdv1.data.mappers.mapToStabilityAiRequest -import com.shifthackz.aisdv1.domain.datasource.StabilityAiGenerationDataSource -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import com.shifthackz.aisdv1.network.api.stabilityai.StabilityAiApi -import com.shifthackz.aisdv1.network.error.StabilityAiErrorMapper -import com.shifthackz.aisdv1.network.response.StabilityGenerationResponse +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.data.mappers.mapCloudToAiGenResult +import dev.minios.pdaiv1.data.mappers.mapToStabilityAiRequest +import dev.minios.pdaiv1.domain.datasource.StabilityAiGenerationDataSource +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.network.api.stabilityai.StabilityAiApi +import dev.minios.pdaiv1.network.error.StabilityAiErrorMapper +import dev.minios.pdaiv1.network.response.StabilityGenerationResponse import io.reactivex.rxjava3.core.Single import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.MultipartBody diff --git a/data/src/main/java/dev/minios/pdaiv1/data/remote/StableDiffusionEmbeddingsRemoteDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/remote/StableDiffusionEmbeddingsRemoteDataSource.kt new file mode 100644 index 000000000..ebafabb71 --- /dev/null +++ b/data/src/main/java/dev/minios/pdaiv1/data/remote/StableDiffusionEmbeddingsRemoteDataSource.kt @@ -0,0 +1,18 @@ +package dev.minios.pdaiv1.data.remote + +import dev.minios.pdaiv1.data.mappers.mapRawToCheckpointDomain +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.datasource.EmbeddingsDataSource +import dev.minios.pdaiv1.network.api.automatic1111.Automatic1111RestApi +import dev.minios.pdaiv1.network.api.automatic1111.Automatic1111RestApi.Companion.PATH_EMBEDDINGS +import dev.minios.pdaiv1.network.response.SdEmbeddingsResponse + +internal class StableDiffusionEmbeddingsRemoteDataSource( + private val serverUrlProvider: ServerUrlProvider, + private val api: Automatic1111RestApi, +) : EmbeddingsDataSource.Remote.Automatic1111 { + + override fun fetchEmbeddings() = serverUrlProvider(PATH_EMBEDDINGS) + .flatMap(api::fetchEmbeddings) + .map(SdEmbeddingsResponse::mapRawToCheckpointDomain) +} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/StableDiffusionGenerationRemoteDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/remote/StableDiffusionGenerationRemoteDataSource.kt similarity index 57% rename from data/src/main/java/com/shifthackz/aisdv1/data/remote/StableDiffusionGenerationRemoteDataSource.kt rename to data/src/main/java/dev/minios/pdaiv1/data/remote/StableDiffusionGenerationRemoteDataSource.kt index 9da06ca23..79f6329b8 100755 --- a/data/src/main/java/com/shifthackz/aisdv1/data/remote/StableDiffusionGenerationRemoteDataSource.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/remote/StableDiffusionGenerationRemoteDataSource.kt @@ -1,16 +1,16 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.core.common.extensions.fixUrlSlashes -import com.shifthackz.aisdv1.data.mappers.mapToAiGenResult -import com.shifthackz.aisdv1.data.mappers.mapToRequest -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.datasource.StableDiffusionGenerationDataSource -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi -import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi.Companion.PATH_IMG_TO_IMG -import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi.Companion.PATH_TXT_TO_IMG -import com.shifthackz.aisdv1.network.response.SdGenerationResponse +import dev.minios.pdaiv1.core.common.extensions.fixUrlSlashes +import dev.minios.pdaiv1.data.mappers.mapToAiGenResult +import dev.minios.pdaiv1.data.mappers.mapToRequest +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.datasource.StableDiffusionGenerationDataSource +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.network.api.automatic1111.Automatic1111RestApi +import dev.minios.pdaiv1.network.api.automatic1111.Automatic1111RestApi.Companion.PATH_IMG_TO_IMG +import dev.minios.pdaiv1.network.api.automatic1111.Automatic1111RestApi.Companion.PATH_TXT_TO_IMG +import dev.minios.pdaiv1.network.response.SdGenerationResponse internal class StableDiffusionGenerationRemoteDataSource( private val serverUrlProvider: ServerUrlProvider, diff --git a/data/src/main/java/dev/minios/pdaiv1/data/remote/StableDiffusionHyperNetworksRemoteDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/remote/StableDiffusionHyperNetworksRemoteDataSource.kt new file mode 100644 index 000000000..35eabb040 --- /dev/null +++ b/data/src/main/java/dev/minios/pdaiv1/data/remote/StableDiffusionHyperNetworksRemoteDataSource.kt @@ -0,0 +1,18 @@ +package dev.minios.pdaiv1.data.remote + +import dev.minios.pdaiv1.data.mappers.mapRawToCheckpointDomain +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.datasource.StableDiffusionHyperNetworksDataSource +import dev.minios.pdaiv1.network.api.automatic1111.Automatic1111RestApi +import dev.minios.pdaiv1.network.api.automatic1111.Automatic1111RestApi.Companion.PATH_HYPER_NETWORKS +import dev.minios.pdaiv1.network.model.StableDiffusionHyperNetworkRaw + +internal class StableDiffusionHyperNetworksRemoteDataSource( + private val serverUrlProvider: ServerUrlProvider, + private val api: Automatic1111RestApi, +) : StableDiffusionHyperNetworksDataSource.Remote { + + override fun fetchHyperNetworks() = serverUrlProvider(PATH_HYPER_NETWORKS) + .flatMap(api::fetchHyperNetworks) + .map(List::mapRawToCheckpointDomain) +} diff --git a/data/src/main/java/dev/minios/pdaiv1/data/remote/StableDiffusionLorasRemoteDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/remote/StableDiffusionLorasRemoteDataSource.kt new file mode 100644 index 000000000..917d6ed95 --- /dev/null +++ b/data/src/main/java/dev/minios/pdaiv1/data/remote/StableDiffusionLorasRemoteDataSource.kt @@ -0,0 +1,20 @@ +package dev.minios.pdaiv1.data.remote + +import dev.minios.pdaiv1.data.mappers.mapToDomain +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.datasource.LorasDataSource +import dev.minios.pdaiv1.domain.entity.LoRA +import dev.minios.pdaiv1.network.api.automatic1111.Automatic1111RestApi +import dev.minios.pdaiv1.network.api.automatic1111.Automatic1111RestApi.Companion.PATH_LORAS +import dev.minios.pdaiv1.network.model.StableDiffusionLoraRaw +import io.reactivex.rxjava3.core.Single + +internal class StableDiffusionLorasRemoteDataSource( + private val serverUrlProvider: ServerUrlProvider, + private val api: Automatic1111RestApi, +) : LorasDataSource.Remote.Automatic1111 { + + override fun fetchLoras(): Single> = serverUrlProvider(PATH_LORAS) + .flatMap(api::fetchLoras) + .map(List::mapToDomain) +} diff --git a/data/src/main/java/dev/minios/pdaiv1/data/remote/StableDiffusionModelsRemoteDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/remote/StableDiffusionModelsRemoteDataSource.kt new file mode 100755 index 000000000..1dd9cec41 --- /dev/null +++ b/data/src/main/java/dev/minios/pdaiv1/data/remote/StableDiffusionModelsRemoteDataSource.kt @@ -0,0 +1,18 @@ +package dev.minios.pdaiv1.data.remote + +import dev.minios.pdaiv1.data.mappers.mapRawToCheckpointDomain +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.datasource.StableDiffusionModelsDataSource +import dev.minios.pdaiv1.network.api.automatic1111.Automatic1111RestApi +import dev.minios.pdaiv1.network.api.automatic1111.Automatic1111RestApi.Companion.PATH_SD_MODELS +import dev.minios.pdaiv1.network.model.StableDiffusionModelRaw + +internal class StableDiffusionModelsRemoteDataSource( + private val serverUrlProvider: ServerUrlProvider, + private val api: Automatic1111RestApi, +) : StableDiffusionModelsDataSource.Remote { + + override fun fetchSdModels() = serverUrlProvider(PATH_SD_MODELS) + .flatMap(api::fetchSdModels) + .map(List::mapRawToCheckpointDomain) +} diff --git a/data/src/main/java/dev/minios/pdaiv1/data/remote/StableDiffusionSamplersRemoteDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/remote/StableDiffusionSamplersRemoteDataSource.kt new file mode 100755 index 000000000..f3be2257b --- /dev/null +++ b/data/src/main/java/dev/minios/pdaiv1/data/remote/StableDiffusionSamplersRemoteDataSource.kt @@ -0,0 +1,18 @@ +package dev.minios.pdaiv1.data.remote + +import dev.minios.pdaiv1.data.mappers.mapRawToCheckpointDomain +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.datasource.StableDiffusionSamplersDataSource +import dev.minios.pdaiv1.network.api.automatic1111.Automatic1111RestApi +import dev.minios.pdaiv1.network.api.automatic1111.Automatic1111RestApi.Companion.PATH_SAMPLERS +import dev.minios.pdaiv1.network.model.StableDiffusionSamplerRaw + +internal class StableDiffusionSamplersRemoteDataSource( + private val serverUrlProvider: ServerUrlProvider, + private val api: Automatic1111RestApi, +) : StableDiffusionSamplersDataSource.Remote { + + override fun fetchSamplers() = serverUrlProvider(PATH_SAMPLERS) + .flatMap(api::fetchSamplers) + .map(List::mapRawToCheckpointDomain) +} \ No newline at end of file diff --git a/data/src/main/java/dev/minios/pdaiv1/data/remote/SupportersRemoteDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/remote/SupportersRemoteDataSource.kt new file mode 100644 index 000000000..804ac59a0 --- /dev/null +++ b/data/src/main/java/dev/minios/pdaiv1/data/remote/SupportersRemoteDataSource.kt @@ -0,0 +1,17 @@ +package dev.minios.pdaiv1.data.remote + +import dev.minios.pdaiv1.data.mappers.mapRawToDomain +import dev.minios.pdaiv1.domain.datasource.SupportersDataSource +import dev.minios.pdaiv1.domain.entity.Supporter +import dev.minios.pdaiv1.network.api.pdai.DonateApi +import dev.minios.pdaiv1.network.model.SupporterRaw +import io.reactivex.rxjava3.core.Single + +internal class SupportersRemoteDataSource( + private val api: DonateApi, +) : SupportersDataSource.Remote { + + override fun fetch(): Single> = api + .fetchSupporters() + .map(List::mapRawToDomain) +} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/SwarmUiEmbeddingsRemoteDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/remote/SwarmUiEmbeddingsRemoteDataSource.kt similarity index 53% rename from data/src/main/java/com/shifthackz/aisdv1/data/remote/SwarmUiEmbeddingsRemoteDataSource.kt rename to data/src/main/java/dev/minios/pdaiv1/data/remote/SwarmUiEmbeddingsRemoteDataSource.kt index 6909ff538..97ef97016 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/remote/SwarmUiEmbeddingsRemoteDataSource.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/remote/SwarmUiEmbeddingsRemoteDataSource.kt @@ -1,13 +1,13 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.data.mappers.mapRawToEmbeddingDomain -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.datasource.EmbeddingsDataSource -import com.shifthackz.aisdv1.domain.entity.Embedding -import com.shifthackz.aisdv1.network.api.swarmui.SwarmUiApi -import com.shifthackz.aisdv1.network.api.swarmui.SwarmUiApi.Companion.PATH_MODELS -import com.shifthackz.aisdv1.network.request.SwarmUiModelsRequest -import com.shifthackz.aisdv1.network.response.SwarmUiModelsResponse +import dev.minios.pdaiv1.data.mappers.mapRawToEmbeddingDomain +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.datasource.EmbeddingsDataSource +import dev.minios.pdaiv1.domain.entity.Embedding +import dev.minios.pdaiv1.network.api.swarmui.SwarmUiApi +import dev.minios.pdaiv1.network.api.swarmui.SwarmUiApi.Companion.PATH_MODELS +import dev.minios.pdaiv1.network.request.SwarmUiModelsRequest +import dev.minios.pdaiv1.network.response.SwarmUiModelsResponse import io.reactivex.rxjava3.core.Single class SwarmUiEmbeddingsRemoteDataSource( diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/SwarmUiGenerationRemoteDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/remote/SwarmUiGenerationRemoteDataSource.kt similarity index 71% rename from data/src/main/java/com/shifthackz/aisdv1/data/remote/SwarmUiGenerationRemoteDataSource.kt rename to data/src/main/java/dev/minios/pdaiv1/data/remote/SwarmUiGenerationRemoteDataSource.kt index 958be2e36..a60224fff 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/remote/SwarmUiGenerationRemoteDataSource.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/remote/SwarmUiGenerationRemoteDataSource.kt @@ -1,18 +1,18 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.core.common.extensions.fixUrlSlashes -import com.shifthackz.aisdv1.core.imageprocessing.Base64EncodingConverter -import com.shifthackz.aisdv1.core.imageprocessing.BitmapToBase64Converter -import com.shifthackz.aisdv1.data.mappers.mapCloudToAiGenResult -import com.shifthackz.aisdv1.data.mappers.mapToSwarmUiRequest -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.datasource.SwarmUiGenerationDataSource -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import com.shifthackz.aisdv1.network.api.swarmui.SwarmUiApi -import com.shifthackz.aisdv1.network.api.swarmui.SwarmUiApi.Companion.PATH_GENERATE -import com.shifthackz.aisdv1.network.request.SwarmUiGenerationRequest +import dev.minios.pdaiv1.core.common.extensions.fixUrlSlashes +import dev.minios.pdaiv1.core.imageprocessing.Base64EncodingConverter +import dev.minios.pdaiv1.core.imageprocessing.BitmapToBase64Converter +import dev.minios.pdaiv1.data.mappers.mapCloudToAiGenResult +import dev.minios.pdaiv1.data.mappers.mapToSwarmUiRequest +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.datasource.SwarmUiGenerationDataSource +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.network.api.swarmui.SwarmUiApi +import dev.minios.pdaiv1.network.api.swarmui.SwarmUiApi.Companion.PATH_GENERATE +import dev.minios.pdaiv1.network.request.SwarmUiGenerationRequest import io.reactivex.rxjava3.core.Single class SwarmUiGenerationRemoteDataSource( diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/SwarmUiLorasRemoteDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/remote/SwarmUiLorasRemoteDataSource.kt similarity index 53% rename from data/src/main/java/com/shifthackz/aisdv1/data/remote/SwarmUiLorasRemoteDataSource.kt rename to data/src/main/java/dev/minios/pdaiv1/data/remote/SwarmUiLorasRemoteDataSource.kt index 0b6b14df3..951be546e 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/remote/SwarmUiLorasRemoteDataSource.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/remote/SwarmUiLorasRemoteDataSource.kt @@ -1,13 +1,13 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.data.mappers.mapRawToLoraDomain -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.datasource.LorasDataSource -import com.shifthackz.aisdv1.domain.entity.LoRA -import com.shifthackz.aisdv1.network.api.swarmui.SwarmUiApi -import com.shifthackz.aisdv1.network.api.swarmui.SwarmUiApi.Companion.PATH_MODELS -import com.shifthackz.aisdv1.network.request.SwarmUiModelsRequest -import com.shifthackz.aisdv1.network.response.SwarmUiModelsResponse +import dev.minios.pdaiv1.data.mappers.mapRawToLoraDomain +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.datasource.LorasDataSource +import dev.minios.pdaiv1.domain.entity.LoRA +import dev.minios.pdaiv1.network.api.swarmui.SwarmUiApi +import dev.minios.pdaiv1.network.api.swarmui.SwarmUiApi.Companion.PATH_MODELS +import dev.minios.pdaiv1.network.request.SwarmUiModelsRequest +import dev.minios.pdaiv1.network.response.SwarmUiModelsResponse import io.reactivex.rxjava3.core.Single internal class SwarmUiLorasRemoteDataSource( diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/SwarmUiModelsRemoteDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/remote/SwarmUiModelsRemoteDataSource.kt similarity index 54% rename from data/src/main/java/com/shifthackz/aisdv1/data/remote/SwarmUiModelsRemoteDataSource.kt rename to data/src/main/java/dev/minios/pdaiv1/data/remote/SwarmUiModelsRemoteDataSource.kt index c2e57c04d..6d8861df2 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/remote/SwarmUiModelsRemoteDataSource.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/remote/SwarmUiModelsRemoteDataSource.kt @@ -1,13 +1,13 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.data.mappers.mapRawToCheckpointDomain -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.datasource.SwarmUiModelsDataSource -import com.shifthackz.aisdv1.domain.entity.SwarmUiModel -import com.shifthackz.aisdv1.network.api.swarmui.SwarmUiApi -import com.shifthackz.aisdv1.network.api.swarmui.SwarmUiApi.Companion.PATH_MODELS -import com.shifthackz.aisdv1.network.request.SwarmUiModelsRequest -import com.shifthackz.aisdv1.network.response.SwarmUiModelsResponse +import dev.minios.pdaiv1.data.mappers.mapRawToCheckpointDomain +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.datasource.SwarmUiModelsDataSource +import dev.minios.pdaiv1.domain.entity.SwarmUiModel +import dev.minios.pdaiv1.network.api.swarmui.SwarmUiApi +import dev.minios.pdaiv1.network.api.swarmui.SwarmUiApi.Companion.PATH_MODELS +import dev.minios.pdaiv1.network.request.SwarmUiModelsRequest +import dev.minios.pdaiv1.network.response.SwarmUiModelsResponse import io.reactivex.rxjava3.core.Single internal class SwarmUiModelsRemoteDataSource( diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/remote/SwarmUiSessionDataSourceImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/remote/SwarmUiSessionDataSourceImpl.kt similarity index 73% rename from data/src/main/java/com/shifthackz/aisdv1/data/remote/SwarmUiSessionDataSourceImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/remote/SwarmUiSessionDataSourceImpl.kt index 8c191c306..3fc32ac91 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/remote/SwarmUiSessionDataSourceImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/remote/SwarmUiSessionDataSourceImpl.kt @@ -1,12 +1,12 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.core.common.extensions.fixUrlSlashes -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.datasource.SwarmUiSessionDataSource -import com.shifthackz.aisdv1.domain.preference.SessionPreference -import com.shifthackz.aisdv1.network.api.swarmui.SwarmUiApi -import com.shifthackz.aisdv1.network.api.swarmui.SwarmUiApi.Companion.PATH_SESSION -import com.shifthackz.aisdv1.network.exception.BadSessionException +import dev.minios.pdaiv1.core.common.extensions.fixUrlSlashes +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.datasource.SwarmUiSessionDataSource +import dev.minios.pdaiv1.domain.preference.SessionPreference +import dev.minios.pdaiv1.network.api.swarmui.SwarmUiApi +import dev.minios.pdaiv1.network.api.swarmui.SwarmUiApi.Companion.PATH_SESSION +import dev.minios.pdaiv1.network.exception.BadSessionException import io.reactivex.rxjava3.core.Single internal class SwarmUiSessionDataSourceImpl( diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/DownloadableModelRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/DownloadableModelRepositoryImpl.kt similarity index 79% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/DownloadableModelRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/DownloadableModelRepositoryImpl.kt index bdd3c71b2..6f307a9f4 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/DownloadableModelRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/DownloadableModelRepositoryImpl.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.core.common.appbuild.BuildType -import com.shifthackz.aisdv1.domain.datasource.DownloadableModelDataSource -import com.shifthackz.aisdv1.domain.entity.LocalAiModel -import com.shifthackz.aisdv1.domain.repository.DownloadableModelRepository +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.core.common.appbuild.BuildType +import dev.minios.pdaiv1.domain.datasource.DownloadableModelDataSource +import dev.minios.pdaiv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.domain.repository.DownloadableModelRepository import io.reactivex.rxjava3.core.Single internal class DownloadableModelRepositoryImpl( diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/EmbeddingsRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/EmbeddingsRepositoryImpl.kt similarity index 73% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/EmbeddingsRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/EmbeddingsRepositoryImpl.kt index d29315387..8c9622094 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/EmbeddingsRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/EmbeddingsRepositoryImpl.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.domain.datasource.EmbeddingsDataSource -import com.shifthackz.aisdv1.domain.datasource.SwarmUiSessionDataSource -import com.shifthackz.aisdv1.domain.entity.Embedding -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.EmbeddingsRepository +import dev.minios.pdaiv1.domain.datasource.EmbeddingsDataSource +import dev.minios.pdaiv1.domain.datasource.SwarmUiSessionDataSource +import dev.minios.pdaiv1.domain.entity.Embedding +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.EmbeddingsRepository import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/FalAiEndpointRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/FalAiEndpointRepositoryImpl.kt similarity index 87% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/FalAiEndpointRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/FalAiEndpointRepositoryImpl.kt index 333a42ae5..fb1fa1df1 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/FalAiEndpointRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/FalAiEndpointRepositoryImpl.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.data.mappers.FalAiOpenApiParser -import com.shifthackz.aisdv1.domain.datasource.FalAiEndpointDataSource -import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.FalAiEndpointRepository +import dev.minios.pdaiv1.data.mappers.FalAiOpenApiParser +import dev.minios.pdaiv1.domain.datasource.FalAiEndpointDataSource +import dev.minios.pdaiv1.domain.entity.FalAiEndpoint +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.FalAiEndpointRepository import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/FalAiGenerationRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/FalAiGenerationRepositoryImpl.kt similarity index 64% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/FalAiGenerationRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/FalAiGenerationRepositoryImpl.kt index 284be68d5..140dba0ae 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/FalAiGenerationRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/FalAiGenerationRepositoryImpl.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.domain.datasource.FalAiGenerationDataSource -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import com.shifthackz.aisdv1.domain.repository.FalAiEndpointRepository -import com.shifthackz.aisdv1.domain.repository.FalAiGenerationRepository +import dev.minios.pdaiv1.domain.datasource.FalAiGenerationDataSource +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.FalAiEndpoint +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.repository.FalAiEndpointRepository +import dev.minios.pdaiv1.domain.repository.FalAiGenerationRepository import io.reactivex.rxjava3.core.Single internal class FalAiGenerationRepositoryImpl( diff --git a/data/src/main/java/dev/minios/pdaiv1/data/repository/ForgeModulesRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/ForgeModulesRepositoryImpl.kt new file mode 100644 index 000000000..8466954ec --- /dev/null +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/ForgeModulesRepositoryImpl.kt @@ -0,0 +1,21 @@ +package dev.minios.pdaiv1.data.repository + +import dev.minios.pdaiv1.data.mappers.mapRawToDomain +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.entity.ForgeModule +import dev.minios.pdaiv1.domain.repository.ForgeModulesRepository +import dev.minios.pdaiv1.network.api.automatic1111.Automatic1111RestApi +import dev.minios.pdaiv1.network.api.automatic1111.Automatic1111RestApi.Companion.PATH_SD_MODULES +import dev.minios.pdaiv1.network.model.ForgeModuleRaw +import io.reactivex.rxjava3.core.Single + +internal class ForgeModulesRepositoryImpl( + private val serverUrlProvider: ServerUrlProvider, + private val api: Automatic1111RestApi, +) : ForgeModulesRepository { + + override fun fetchModules(): Single> = serverUrlProvider(PATH_SD_MODULES) + .flatMap(api::fetchForgeModules) + .map(List::mapRawToDomain) + .onErrorReturn { emptyList() } +} diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/GenerationResultRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/GenerationResultRepositoryImpl.kt similarity index 91% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/GenerationResultRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/GenerationResultRepositoryImpl.kt index cc22abe26..ff8cf1b31 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/GenerationResultRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/GenerationResultRepositoryImpl.kt @@ -1,15 +1,15 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository import android.util.Base64 -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.data.core.CoreMediaStoreRepository -import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.MediaType -import com.shifthackz.aisdv1.domain.feature.MediaFileManager -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.data.core.CoreMediaStoreRepository +import dev.minios.pdaiv1.domain.datasource.GenerationResultDataSource +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.MediaType +import dev.minios.pdaiv1.domain.feature.MediaFileManager +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/HordeGenerationRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/HordeGenerationRepositoryImpl.kt similarity index 62% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/HordeGenerationRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/HordeGenerationRepositoryImpl.kt index 5dc5d3127..470e86717 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/HordeGenerationRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/HordeGenerationRepositoryImpl.kt @@ -1,16 +1,16 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.data.core.CoreGenerationRepository -import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource -import com.shifthackz.aisdv1.domain.datasource.HordeGenerationDataSource -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import com.shifthackz.aisdv1.domain.feature.MediaFileManager -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.HordeGenerationRepository +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.data.core.CoreGenerationRepository +import dev.minios.pdaiv1.domain.datasource.GenerationResultDataSource +import dev.minios.pdaiv1.domain.datasource.HordeGenerationDataSource +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.feature.MediaFileManager +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.HordeGenerationRepository internal class HordeGenerationRepositoryImpl( mediaStoreGateway: MediaStoreGateway, diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/HuggingFaceGenerationRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/HuggingFaceGenerationRepositoryImpl.kt similarity index 60% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/HuggingFaceGenerationRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/HuggingFaceGenerationRepositoryImpl.kt index 4a2dc48b8..0860c546e 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/HuggingFaceGenerationRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/HuggingFaceGenerationRepositoryImpl.kt @@ -1,16 +1,16 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.data.core.CoreGenerationRepository -import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource -import com.shifthackz.aisdv1.domain.datasource.HuggingFaceGenerationDataSource -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import com.shifthackz.aisdv1.domain.feature.MediaFileManager -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.HuggingFaceGenerationRepository +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.data.core.CoreGenerationRepository +import dev.minios.pdaiv1.domain.datasource.GenerationResultDataSource +import dev.minios.pdaiv1.domain.datasource.HuggingFaceGenerationDataSource +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.feature.MediaFileManager +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.HuggingFaceGenerationRepository internal class HuggingFaceGenerationRepositoryImpl( mediaStoreGateway: MediaStoreGateway, diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/HuggingFaceModelsRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/HuggingFaceModelsRepositoryImpl.kt similarity index 74% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/HuggingFaceModelsRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/HuggingFaceModelsRepositoryImpl.kt index abf2e578e..c80efa8c5 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/HuggingFaceModelsRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/HuggingFaceModelsRepositoryImpl.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.domain.datasource.HuggingFaceModelsDataSource -import com.shifthackz.aisdv1.domain.repository.HuggingFaceModelsRepository +import dev.minios.pdaiv1.domain.datasource.HuggingFaceModelsDataSource +import dev.minios.pdaiv1.domain.repository.HuggingFaceModelsRepository internal class HuggingFaceModelsRepositoryImpl( private val remoteDataSource: HuggingFaceModelsDataSource.Remote, diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/LocalDiffusionGenerationRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/LocalDiffusionGenerationRepositoryImpl.kt similarity index 65% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/LocalDiffusionGenerationRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/LocalDiffusionGenerationRepositoryImpl.kt index c54dcb701..b2791ea1d 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/LocalDiffusionGenerationRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/LocalDiffusionGenerationRepositoryImpl.kt @@ -1,19 +1,19 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.core.imageprocessing.BitmapToBase64Converter -import com.shifthackz.aisdv1.data.core.CoreGenerationRepository -import com.shifthackz.aisdv1.data.mappers.mapLocalDiffusionToAiGenResult -import com.shifthackz.aisdv1.domain.datasource.DownloadableModelDataSource -import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import com.shifthackz.aisdv1.domain.feature.MediaFileManager -import com.shifthackz.aisdv1.domain.feature.diffusion.LocalDiffusion -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.LocalDiffusionGenerationRepository +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.core.imageprocessing.BitmapToBase64Converter +import dev.minios.pdaiv1.data.core.CoreGenerationRepository +import dev.minios.pdaiv1.data.mappers.mapLocalDiffusionToAiGenResult +import dev.minios.pdaiv1.domain.datasource.DownloadableModelDataSource +import dev.minios.pdaiv1.domain.datasource.GenerationResultDataSource +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.feature.MediaFileManager +import dev.minios.pdaiv1.domain.feature.diffusion.LocalDiffusion +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.LocalDiffusionGenerationRepository import io.reactivex.rxjava3.core.Single internal class LocalDiffusionGenerationRepositoryImpl( diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/LorasRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/LorasRepositoryImpl.kt similarity index 72% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/LorasRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/LorasRepositoryImpl.kt index 745657e22..aa55f6df3 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/LorasRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/LorasRepositoryImpl.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.domain.datasource.LorasDataSource -import com.shifthackz.aisdv1.domain.datasource.SwarmUiSessionDataSource -import com.shifthackz.aisdv1.domain.entity.LoRA -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.LorasRepository +import dev.minios.pdaiv1.domain.datasource.LorasDataSource +import dev.minios.pdaiv1.domain.datasource.SwarmUiSessionDataSource +import dev.minios.pdaiv1.domain.entity.LoRA +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.LorasRepository import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/MediaPipeGenerationRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/MediaPipeGenerationRepositoryImpl.kt similarity index 59% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/MediaPipeGenerationRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/MediaPipeGenerationRepositoryImpl.kt index 9e592ba7b..e12c0d60e 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/MediaPipeGenerationRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/MediaPipeGenerationRepositoryImpl.kt @@ -1,19 +1,19 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.core.imageprocessing.BitmapToBase64Converter -import com.shifthackz.aisdv1.data.core.CoreGenerationRepository -import com.shifthackz.aisdv1.data.mappers.mapLocalDiffusionToAiGenResult -import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import com.shifthackz.aisdv1.domain.feature.MediaFileManager -import com.shifthackz.aisdv1.domain.feature.mediapipe.MediaPipe -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.MediaPipeGenerationRepository +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.core.imageprocessing.BitmapToBase64Converter +import dev.minios.pdaiv1.data.core.CoreGenerationRepository +import dev.minios.pdaiv1.data.mappers.mapLocalDiffusionToAiGenResult +import dev.minios.pdaiv1.domain.datasource.GenerationResultDataSource +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.feature.MediaFileManager +import dev.minios.pdaiv1.domain.feature.mediapipe.MediaPipe +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.MediaPipeGenerationRepository import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.schedulers.Schedulers diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/OpenAiGenerationRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/OpenAiGenerationRepositoryImpl.kt similarity index 57% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/OpenAiGenerationRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/OpenAiGenerationRepositoryImpl.kt index a2b3b2769..d910b398f 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/OpenAiGenerationRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/OpenAiGenerationRepositoryImpl.kt @@ -1,15 +1,15 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.data.core.CoreGenerationRepository -import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource -import com.shifthackz.aisdv1.domain.datasource.OpenAiGenerationDataSource -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import com.shifthackz.aisdv1.domain.feature.MediaFileManager -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.OpenAiGenerationRepository +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.data.core.CoreGenerationRepository +import dev.minios.pdaiv1.domain.datasource.GenerationResultDataSource +import dev.minios.pdaiv1.domain.datasource.OpenAiGenerationDataSource +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.feature.MediaFileManager +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.OpenAiGenerationRepository internal class OpenAiGenerationRepositoryImpl( mediaStoreGateway: MediaStoreGateway, diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/QnnGenerationRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/QnnGenerationRepositoryImpl.kt similarity index 70% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/QnnGenerationRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/QnnGenerationRepositoryImpl.kt index 4c47a5264..3ec39eba7 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/QnnGenerationRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/QnnGenerationRepositoryImpl.kt @@ -1,20 +1,20 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.core.imageprocessing.BitmapToBase64Converter -import com.shifthackz.aisdv1.data.core.CoreGenerationRepository -import com.shifthackz.aisdv1.data.mappers.QnnGenerationData -import com.shifthackz.aisdv1.data.mappers.mapQnnResultToAiGenResult -import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import com.shifthackz.aisdv1.domain.feature.MediaFileManager -import com.shifthackz.aisdv1.domain.feature.qnn.LocalQnn -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.QnnGenerationRepository +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.core.imageprocessing.BitmapToBase64Converter +import dev.minios.pdaiv1.data.core.CoreGenerationRepository +import dev.minios.pdaiv1.data.mappers.QnnGenerationData +import dev.minios.pdaiv1.data.mappers.mapQnnResultToAiGenResult +import dev.minios.pdaiv1.domain.datasource.GenerationResultDataSource +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.feature.MediaFileManager +import dev.minios.pdaiv1.domain.feature.qnn.LocalQnn +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.QnnGenerationRepository import io.reactivex.rxjava3.core.Completable internal class QnnGenerationRepositoryImpl( diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/RandomImageRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/RandomImageRepositoryImpl.kt similarity index 51% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/RandomImageRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/RandomImageRepositoryImpl.kt index c734ddb97..760fb220e 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/RandomImageRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/RandomImageRepositoryImpl.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.domain.datasource.RandomImageDataSource -import com.shifthackz.aisdv1.domain.repository.RandomImageRepository +import dev.minios.pdaiv1.domain.datasource.RandomImageDataSource +import dev.minios.pdaiv1.domain.repository.RandomImageRepository internal class RandomImageRepositoryImpl( private val remoteDataSource: RandomImageDataSource.Remote, diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/ReportRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/ReportRepositoryImpl.kt similarity index 70% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/ReportRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/ReportRepositoryImpl.kt index 0abfd08bb..9a5fd6385 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/ReportRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/ReportRepositoryImpl.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.domain.datasource.ReportDataSource -import com.shifthackz.aisdv1.domain.entity.ReportReason -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.ReportRepository +import dev.minios.pdaiv1.domain.datasource.ReportDataSource +import dev.minios.pdaiv1.domain.entity.ReportReason +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.ReportRepository import io.reactivex.rxjava3.core.Completable internal class ReportRepositoryImpl( diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/ServerConfigurationRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/ServerConfigurationRepositoryImpl.kt similarity index 72% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/ServerConfigurationRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/ServerConfigurationRepositoryImpl.kt index f7c205673..f77763413 100755 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/ServerConfigurationRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/ServerConfigurationRepositoryImpl.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.domain.datasource.ServerConfigurationDataSource -import com.shifthackz.aisdv1.domain.entity.ServerConfiguration -import com.shifthackz.aisdv1.domain.repository.ServerConfigurationRepository +import dev.minios.pdaiv1.domain.datasource.ServerConfigurationDataSource +import dev.minios.pdaiv1.domain.entity.ServerConfiguration +import dev.minios.pdaiv1.domain.repository.ServerConfigurationRepository internal class ServerConfigurationRepositoryImpl( private val remoteDataSource: ServerConfigurationDataSource.Remote, diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/StabilityAiCreditsRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/StabilityAiCreditsRepositoryImpl.kt similarity index 84% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/StabilityAiCreditsRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/StabilityAiCreditsRepositoryImpl.kt index ed9ef0d6b..2e70052db 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/StabilityAiCreditsRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/StabilityAiCreditsRepositoryImpl.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.domain.datasource.StabilityAiCreditsDataSource -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.StabilityAiCreditsRepository +import dev.minios.pdaiv1.domain.datasource.StabilityAiCreditsDataSource +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.StabilityAiCreditsRepository import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Single diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/StabilityAiEnginesRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/StabilityAiEnginesRepositoryImpl.kt similarity index 52% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/StabilityAiEnginesRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/StabilityAiEnginesRepositoryImpl.kt index 551661168..feeda7a52 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/StabilityAiEnginesRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/StabilityAiEnginesRepositoryImpl.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.domain.datasource.StabilityAiEnginesDataSource -import com.shifthackz.aisdv1.domain.repository.StabilityAiEnginesRepository +import dev.minios.pdaiv1.domain.datasource.StabilityAiEnginesDataSource +import dev.minios.pdaiv1.domain.repository.StabilityAiEnginesRepository internal class StabilityAiEnginesRepositoryImpl( private val remoteDataSource: StabilityAiEnginesDataSource.Remote, diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/StabilityAiGenerationRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/StabilityAiGenerationRepositoryImpl.kt similarity index 70% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/StabilityAiGenerationRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/StabilityAiGenerationRepositoryImpl.kt index 6334d4569..234af545c 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/StabilityAiGenerationRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/StabilityAiGenerationRepositoryImpl.kt @@ -1,19 +1,19 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository import android.graphics.Bitmap -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.data.core.CoreGenerationRepository -import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource -import com.shifthackz.aisdv1.domain.datasource.StabilityAiCreditsDataSource -import com.shifthackz.aisdv1.domain.datasource.StabilityAiGenerationDataSource -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import com.shifthackz.aisdv1.domain.feature.MediaFileManager -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.StabilityAiGenerationRepository +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.data.core.CoreGenerationRepository +import dev.minios.pdaiv1.domain.datasource.GenerationResultDataSource +import dev.minios.pdaiv1.domain.datasource.StabilityAiCreditsDataSource +import dev.minios.pdaiv1.domain.datasource.StabilityAiGenerationDataSource +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.feature.MediaFileManager +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.StabilityAiGenerationRepository import io.reactivex.rxjava3.core.Single import java.io.ByteArrayOutputStream diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/StableDiffusionGenerationRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/StableDiffusionGenerationRepositoryImpl.kt similarity index 64% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/StableDiffusionGenerationRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/StableDiffusionGenerationRepositoryImpl.kt index 3613afb25..3d071b6ad 100755 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/StableDiffusionGenerationRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/StableDiffusionGenerationRepositoryImpl.kt @@ -1,19 +1,19 @@ -package com.shifthackz.aisdv1.data.repository - -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.data.core.CoreGenerationRepository -import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource -import com.shifthackz.aisdv1.domain.datasource.StableDiffusionGenerationDataSource -import com.shifthackz.aisdv1.domain.demo.ImageToImageDemo -import com.shifthackz.aisdv1.domain.demo.TextToImageDemo -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import com.shifthackz.aisdv1.domain.feature.MediaFileManager -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.StableDiffusionGenerationRepository +package dev.minios.pdaiv1.data.repository + +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.data.core.CoreGenerationRepository +import dev.minios.pdaiv1.domain.datasource.GenerationResultDataSource +import dev.minios.pdaiv1.domain.datasource.StableDiffusionGenerationDataSource +import dev.minios.pdaiv1.domain.demo.ImageToImageDemo +import dev.minios.pdaiv1.domain.demo.TextToImageDemo +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.feature.MediaFileManager +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.StableDiffusionGenerationRepository import io.reactivex.rxjava3.core.Single internal class StableDiffusionGenerationRepositoryImpl( diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/StableDiffusionHyperNetworksRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/StableDiffusionHyperNetworksRepositoryImpl.kt similarity index 74% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/StableDiffusionHyperNetworksRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/StableDiffusionHyperNetworksRepositoryImpl.kt index de4992949..c67649ccb 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/StableDiffusionHyperNetworksRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/StableDiffusionHyperNetworksRepositoryImpl.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.domain.datasource.StableDiffusionHyperNetworksDataSource -import com.shifthackz.aisdv1.domain.repository.StableDiffusionHyperNetworksRepository +import dev.minios.pdaiv1.domain.datasource.StableDiffusionHyperNetworksDataSource +import dev.minios.pdaiv1.domain.repository.StableDiffusionHyperNetworksRepository internal class StableDiffusionHyperNetworksRepositoryImpl( private val remoteDataSource: StableDiffusionHyperNetworksDataSource.Remote, diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/StableDiffusionModelsRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/StableDiffusionModelsRepositoryImpl.kt similarity index 72% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/StableDiffusionModelsRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/StableDiffusionModelsRepositoryImpl.kt index 8f79d4620..fe127791b 100755 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/StableDiffusionModelsRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/StableDiffusionModelsRepositoryImpl.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.domain.datasource.StableDiffusionModelsDataSource -import com.shifthackz.aisdv1.domain.entity.StableDiffusionModel -import com.shifthackz.aisdv1.domain.repository.StableDiffusionModelsRepository +import dev.minios.pdaiv1.domain.datasource.StableDiffusionModelsDataSource +import dev.minios.pdaiv1.domain.entity.StableDiffusionModel +import dev.minios.pdaiv1.domain.repository.StableDiffusionModelsRepository import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/StableDiffusionSamplersRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/StableDiffusionSamplersRepositoryImpl.kt similarity index 68% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/StableDiffusionSamplersRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/StableDiffusionSamplersRepositoryImpl.kt index aace29997..eac416392 100755 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/StableDiffusionSamplersRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/StableDiffusionSamplersRepositoryImpl.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.domain.datasource.StableDiffusionSamplersDataSource -import com.shifthackz.aisdv1.domain.repository.StableDiffusionSamplersRepository +import dev.minios.pdaiv1.domain.datasource.StableDiffusionSamplersDataSource +import dev.minios.pdaiv1.domain.repository.StableDiffusionSamplersRepository internal class StableDiffusionSamplersRepositoryImpl( private val remoteDataSource: StableDiffusionSamplersDataSource.Remote, diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/SupportersRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/SupportersRepositoryImpl.kt similarity index 71% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/SupportersRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/SupportersRepositoryImpl.kt index d9abd5d68..704bbe6e2 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/SupportersRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/SupportersRepositoryImpl.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.domain.datasource.SupportersDataSource -import com.shifthackz.aisdv1.domain.entity.Supporter -import com.shifthackz.aisdv1.domain.repository.SupportersRepository +import dev.minios.pdaiv1.domain.datasource.SupportersDataSource +import dev.minios.pdaiv1.domain.entity.Supporter +import dev.minios.pdaiv1.domain.repository.SupportersRepository import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/SwarmUiGenerationRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/SwarmUiGenerationRepositoryImpl.kt similarity index 68% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/SwarmUiGenerationRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/SwarmUiGenerationRepositoryImpl.kt index fbb87f64f..901be4b49 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/SwarmUiGenerationRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/SwarmUiGenerationRepositoryImpl.kt @@ -1,18 +1,18 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.data.core.CoreGenerationRepository -import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource -import com.shifthackz.aisdv1.domain.datasource.SwarmUiGenerationDataSource -import com.shifthackz.aisdv1.domain.datasource.SwarmUiSessionDataSource -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import com.shifthackz.aisdv1.domain.feature.MediaFileManager -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.SwarmUiGenerationRepository +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.data.core.CoreGenerationRepository +import dev.minios.pdaiv1.domain.datasource.GenerationResultDataSource +import dev.minios.pdaiv1.domain.datasource.SwarmUiGenerationDataSource +import dev.minios.pdaiv1.domain.datasource.SwarmUiSessionDataSource +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.feature.MediaFileManager +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.SwarmUiGenerationRepository import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/SwarmUiModelsRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/SwarmUiModelsRepositoryImpl.kt similarity index 70% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/SwarmUiModelsRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/SwarmUiModelsRepositoryImpl.kt index e2d6ca4cd..1d6822cd5 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/SwarmUiModelsRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/SwarmUiModelsRepositoryImpl.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.domain.datasource.SwarmUiModelsDataSource -import com.shifthackz.aisdv1.domain.datasource.SwarmUiSessionDataSource -import com.shifthackz.aisdv1.domain.entity.SwarmUiModel -import com.shifthackz.aisdv1.domain.repository.SwarmUiModelsRepository +import dev.minios.pdaiv1.domain.datasource.SwarmUiModelsDataSource +import dev.minios.pdaiv1.domain.datasource.SwarmUiSessionDataSource +import dev.minios.pdaiv1.domain.entity.SwarmUiModel +import dev.minios.pdaiv1.domain.repository.SwarmUiModelsRepository import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/TemporaryGenerationResultRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/TemporaryGenerationResultRepositoryImpl.kt similarity index 74% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/TemporaryGenerationResultRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/TemporaryGenerationResultRepositoryImpl.kt index e53acfa75..e993f39f0 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/TemporaryGenerationResultRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/TemporaryGenerationResultRepositoryImpl.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.repository.TemporaryGenerationResultRepository +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.repository.TemporaryGenerationResultRepository import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/data/src/main/java/com/shifthackz/aisdv1/data/repository/WakeLockRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/WakeLockRepositoryImpl.kt similarity index 73% rename from data/src/main/java/com/shifthackz/aisdv1/data/repository/WakeLockRepositoryImpl.kt rename to data/src/main/java/dev/minios/pdaiv1/data/repository/WakeLockRepositoryImpl.kt index 902637071..192c44369 100644 --- a/data/src/main/java/com/shifthackz/aisdv1/data/repository/WakeLockRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/WakeLockRepositoryImpl.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository import android.os.PowerManager -import com.shifthackz.aisdv1.domain.repository.WakeLockRepository +import dev.minios.pdaiv1.domain.repository.WakeLockRepository internal class WakeLockRepositoryImpl( val powerManager: () -> PowerManager, @@ -16,6 +16,6 @@ internal class WakeLockRepositoryImpl( } companion object { - private const val TAG = "SDAI:WakeLock" + private const val TAG = "PDAI:WakeLock" } } diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SdGenerationResponseMocks.kt b/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SdGenerationResponseMocks.kt deleted file mode 100644 index fa6aec9ca..000000000 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SdGenerationResponseMocks.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.shifthackz.aisdv1.data.mocks - -import com.shifthackz.aisdv1.network.response.SdGenerationResponse - -val mockSdGenerationResponse = SdGenerationResponse( - images = listOf("base64"), - info = "info", -) diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/ServerConfigurationMocks.kt b/data/src/test/java/com/shifthackz/aisdv1/data/mocks/ServerConfigurationMocks.kt deleted file mode 100644 index f6a0fb6fc..000000000 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/ServerConfigurationMocks.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.shifthackz.aisdv1.data.mocks - -import com.shifthackz.aisdv1.domain.entity.ServerConfiguration - -val mockServerConfiguration = ServerConfiguration("checkpoint") diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/ServerConfigurationRawMocks.kt b/data/src/test/java/com/shifthackz/aisdv1/data/mocks/ServerConfigurationRawMocks.kt deleted file mode 100644 index 885f7969d..000000000 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/ServerConfigurationRawMocks.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.shifthackz.aisdv1.data.mocks - -import com.shifthackz.aisdv1.network.model.ServerConfigurationRaw - -val mockServerConfigurationRaw = ServerConfigurationRaw("5598") diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SwarmUiGenerationResponseMocks.kt b/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SwarmUiGenerationResponseMocks.kt deleted file mode 100644 index e92ab5618..000000000 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SwarmUiGenerationResponseMocks.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.shifthackz.aisdv1.data.mocks - -import com.shifthackz.aisdv1.network.response.SwarmUiGenerationResponse - -val mockSwarmUiGenerationResponse = SwarmUiGenerationResponse( - images = listOf("/tmp/img.jpg"), -) diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/gateway/DatabaseClearGatewayImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/gateway/DatabaseClearGatewayImplTest.kt similarity index 91% rename from data/src/test/java/com/shifthackz/aisdv1/data/gateway/DatabaseClearGatewayImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/gateway/DatabaseClearGatewayImplTest.kt index 6bd644832..912591be7 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/gateway/DatabaseClearGatewayImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/gateway/DatabaseClearGatewayImplTest.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.data.gateway +package dev.minios.pdaiv1.data.gateway -import com.shifthackz.aisdv1.storage.gateway.GatewayClearCacheDb -import com.shifthackz.aisdv1.storage.gateway.GatewayClearPersistentDb +import dev.minios.pdaiv1.storage.gateway.GatewayClearCacheDb +import dev.minios.pdaiv1.storage.gateway.GatewayClearPersistentDb import io.mockk.every import io.mockk.mockk import org.junit.Test diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/gateway/ServerConnectivityGatewayImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/gateway/ServerConnectivityGatewayImplTest.kt similarity index 94% rename from data/src/test/java/com/shifthackz/aisdv1/data/gateway/ServerConnectivityGatewayImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/gateway/ServerConnectivityGatewayImplTest.kt index 572b308eb..0e6327c71 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/gateway/ServerConnectivityGatewayImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/gateway/ServerConnectivityGatewayImplTest.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.data.gateway +package dev.minios.pdaiv1.data.gateway -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.network.connectivity.ConnectivityMonitor +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.network.connectivity.ConnectivityMonitor import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Observable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/gateway/mediastore/MediaStoreGatewayFactoryTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/gateway/mediastore/MediaStoreGatewayFactoryTest.kt similarity index 95% rename from data/src/test/java/com/shifthackz/aisdv1/data/gateway/mediastore/MediaStoreGatewayFactoryTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/gateway/mediastore/MediaStoreGatewayFactoryTest.kt index a4cbefe4f..2ba1fa15d 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/gateway/mediastore/MediaStoreGatewayFactoryTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/gateway/mediastore/MediaStoreGatewayFactoryTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.gateway.mediastore +package dev.minios.pdaiv1.data.gateway.mediastore import android.content.Context import android.os.Build -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor import io.mockk.mockk import org.junit.Assert import org.junit.Test diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/local/DownloadableModelLocalDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/local/DownloadableModelLocalDataSourceTest.kt similarity index 90% rename from data/src/test/java/com/shifthackz/aisdv1/data/local/DownloadableModelLocalDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/local/DownloadableModelLocalDataSourceTest.kt index dc96abb29..6e3893498 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/local/DownloadableModelLocalDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/local/DownloadableModelLocalDataSourceTest.kt @@ -1,17 +1,16 @@ -package com.shifthackz.aisdv1.data.local - -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.core.common.appbuild.BuildType -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.data.mappers.mapEntityToDomain -import com.shifthackz.aisdv1.data.mocks.mockLocalAiModels -import com.shifthackz.aisdv1.data.mocks.mockLocalModelEntities -import com.shifthackz.aisdv1.data.mocks.mockLocalModelEntity -import com.shifthackz.aisdv1.data.local.QnnModelsBuiltInDataSource -import com.shifthackz.aisdv1.domain.entity.LocalAiModel -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.storage.db.persistent.dao.LocalModelDao -import com.shifthackz.aisdv1.storage.db.persistent.entity.LocalModelEntity +package dev.minios.pdaiv1.data.local + +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.core.common.appbuild.BuildType +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.data.mappers.mapEntityToDomain +import dev.minios.pdaiv1.data.mocks.mockLocalAiModels +import dev.minios.pdaiv1.data.mocks.mockLocalModelEntities +import dev.minios.pdaiv1.data.mocks.mockLocalModelEntity +import dev.minios.pdaiv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.storage.db.persistent.dao.LocalModelDao +import dev.minios.pdaiv1.storage.db.persistent.entity.LocalModelEntity import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.BackpressureStrategy @@ -30,14 +29,12 @@ class DownloadableModelLocalDataSourceTest { private val stubDao = mockk() private val stubPreferenceManager = mockk() private val stubBuildInfoProvider = mockk() - private val stubQnnModelsBuiltInDataSource = mockk() private val localDataSource = DownloadableModelLocalDataSource( fileProviderDescriptor = stubFileProviderDescriptor, dao = stubDao, preferenceManager = stubPreferenceManager, buildInfoProvider = stubBuildInfoProvider, - qnnModelsBuiltInDataSource = stubQnnModelsBuiltInDataSource, ) @Test @@ -217,19 +214,15 @@ class DownloadableModelLocalDataSourceTest { } @Test - fun `given attempt to get model by id, dao throws exception and no builtin model found, expected error`() { + fun `given attempt to get model by id, dao throws exception, expected error`() { every { stubDao.queryById(any()) } returns Single.error(stubException) - every { - stubQnnModelsBuiltInDataSource.getAll() - } returns Single.just(emptyList()) - localDataSource .getById("5598") .test() - .assertError { it is NoSuchElementException } + .assertError(stubException) .assertNoValues() .await() .assertNotComplete() diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/local/EmbeddingsLocalDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/local/EmbeddingsLocalDataSourceTest.kt similarity index 92% rename from data/src/test/java/com/shifthackz/aisdv1/data/local/EmbeddingsLocalDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/local/EmbeddingsLocalDataSourceTest.kt index f5a8c652f..f0d97c8d6 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/local/EmbeddingsLocalDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/local/EmbeddingsLocalDataSourceTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.local +package dev.minios.pdaiv1.data.local -import com.shifthackz.aisdv1.data.mocks.mockEmbeddings -import com.shifthackz.aisdv1.data.mocks.mockStableDiffusionEmbeddingEntities -import com.shifthackz.aisdv1.storage.db.cache.dao.StableDiffusionEmbeddingDao +import dev.minios.pdaiv1.data.mocks.mockEmbeddings +import dev.minios.pdaiv1.data.mocks.mockStableDiffusionEmbeddingEntities +import dev.minios.pdaiv1.storage.db.cache.dao.StableDiffusionEmbeddingDao import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/local/GenerationResultLocalDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/local/GenerationResultLocalDataSourceTest.kt similarity index 93% rename from data/src/test/java/com/shifthackz/aisdv1/data/local/GenerationResultLocalDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/local/GenerationResultLocalDataSourceTest.kt index 7b561a748..4531d5b47 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/local/GenerationResultLocalDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/local/GenerationResultLocalDataSourceTest.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.data.local - -import com.shifthackz.aisdv1.data.mocks.mockAiGenerationResult -import com.shifthackz.aisdv1.data.mocks.mockAiGenerationResults -import com.shifthackz.aisdv1.data.mocks.mockGenerationResultEntities -import com.shifthackz.aisdv1.data.mocks.mockGenerationResultEntity -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.storage.db.persistent.dao.GenerationResultDao +package dev.minios.pdaiv1.data.local + +import dev.minios.pdaiv1.data.mocks.mockAiGenerationResult +import dev.minios.pdaiv1.data.mocks.mockAiGenerationResults +import dev.minios.pdaiv1.data.mocks.mockGenerationResultEntities +import dev.minios.pdaiv1.data.mocks.mockGenerationResultEntity +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.storage.db.persistent.dao.GenerationResultDao import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/local/HuggingFaceModelsLocalDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/local/HuggingFaceModelsLocalDataSourceTest.kt similarity index 87% rename from data/src/test/java/com/shifthackz/aisdv1/data/local/HuggingFaceModelsLocalDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/local/HuggingFaceModelsLocalDataSourceTest.kt index 5248a1de0..e67a809fa 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/local/HuggingFaceModelsLocalDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/local/HuggingFaceModelsLocalDataSourceTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.data.local +package dev.minios.pdaiv1.data.local -import com.shifthackz.aisdv1.data.mappers.mapEntityToDomain -import com.shifthackz.aisdv1.data.mocks.mockHuggingFaceModelEntities -import com.shifthackz.aisdv1.data.mocks.mockHuggingFaceModels -import com.shifthackz.aisdv1.storage.db.persistent.dao.HuggingFaceModelDao +import dev.minios.pdaiv1.data.mappers.mapEntityToDomain +import dev.minios.pdaiv1.data.mocks.mockHuggingFaceModelEntities +import dev.minios.pdaiv1.data.mocks.mockHuggingFaceModels +import dev.minios.pdaiv1.storage.db.persistent.dao.HuggingFaceModelDao import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/local/LorasLocalDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/local/LorasLocalDataSourceTest.kt similarity index 92% rename from data/src/test/java/com/shifthackz/aisdv1/data/local/LorasLocalDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/local/LorasLocalDataSourceTest.kt index 20c265eb2..06d65e3ac 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/local/LorasLocalDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/local/LorasLocalDataSourceTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.local +package dev.minios.pdaiv1.data.local -import com.shifthackz.aisdv1.data.mocks.mockStableDiffusionLoraEntities -import com.shifthackz.aisdv1.data.mocks.mockStableDiffusionLoras -import com.shifthackz.aisdv1.storage.db.cache.dao.StableDiffusionLoraDao +import dev.minios.pdaiv1.data.mocks.mockStableDiffusionLoraEntities +import dev.minios.pdaiv1.data.mocks.mockStableDiffusionLoras +import dev.minios.pdaiv1.storage.db.cache.dao.StableDiffusionLoraDao import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/local/ServerConfigurationLocalDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/local/ServerConfigurationLocalDataSourceTest.kt similarity index 88% rename from data/src/test/java/com/shifthackz/aisdv1/data/local/ServerConfigurationLocalDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/local/ServerConfigurationLocalDataSourceTest.kt index 8edcd977f..f54a6457a 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/local/ServerConfigurationLocalDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/local/ServerConfigurationLocalDataSourceTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.local +package dev.minios.pdaiv1.data.local -import com.shifthackz.aisdv1.data.mocks.mockServerConfiguration -import com.shifthackz.aisdv1.data.mocks.mockServerConfigurationEntity -import com.shifthackz.aisdv1.storage.db.cache.dao.ServerConfigurationDao +import dev.minios.pdaiv1.data.mocks.mockServerConfiguration +import dev.minios.pdaiv1.data.mocks.mockServerConfigurationEntity +import dev.minios.pdaiv1.storage.db.cache.dao.ServerConfigurationDao import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/local/StabilityAiCreditsLocalDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/local/StabilityAiCreditsLocalDataSourceTest.kt similarity index 97% rename from data/src/test/java/com/shifthackz/aisdv1/data/local/StabilityAiCreditsLocalDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/local/StabilityAiCreditsLocalDataSourceTest.kt index b703cb986..74ea4cd3f 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/local/StabilityAiCreditsLocalDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/local/StabilityAiCreditsLocalDataSourceTest.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.data.local +package dev.minios.pdaiv1.data.local import io.reactivex.rxjava3.subjects.BehaviorSubject import org.junit.Test diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/local/StableDiffusionHyperNetworksLocalDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/local/StableDiffusionHyperNetworksLocalDataSourceTest.kt similarity index 92% rename from data/src/test/java/com/shifthackz/aisdv1/data/local/StableDiffusionHyperNetworksLocalDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/local/StableDiffusionHyperNetworksLocalDataSourceTest.kt index be9daa461..067eb7d7d 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/local/StableDiffusionHyperNetworksLocalDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/local/StableDiffusionHyperNetworksLocalDataSourceTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.local +package dev.minios.pdaiv1.data.local -import com.shifthackz.aisdv1.data.mocks.mockStableDiffusionHyperNetworkEntities -import com.shifthackz.aisdv1.data.mocks.mockStableDiffusionHyperNetworks -import com.shifthackz.aisdv1.storage.db.cache.dao.StableDiffusionHyperNetworkDao +import dev.minios.pdaiv1.data.mocks.mockStableDiffusionHyperNetworkEntities +import dev.minios.pdaiv1.data.mocks.mockStableDiffusionHyperNetworks +import dev.minios.pdaiv1.storage.db.cache.dao.StableDiffusionHyperNetworkDao import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/local/StableDiffusionModelsLocalDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/local/StableDiffusionModelsLocalDataSourceTest.kt similarity index 92% rename from data/src/test/java/com/shifthackz/aisdv1/data/local/StableDiffusionModelsLocalDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/local/StableDiffusionModelsLocalDataSourceTest.kt index c51db3fc9..c01a4e8ba 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/local/StableDiffusionModelsLocalDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/local/StableDiffusionModelsLocalDataSourceTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.local +package dev.minios.pdaiv1.data.local -import com.shifthackz.aisdv1.data.mocks.mockStableDiffusionModelEntities -import com.shifthackz.aisdv1.data.mocks.mockStableDiffusionModels -import com.shifthackz.aisdv1.storage.db.cache.dao.StableDiffusionModelDao +import dev.minios.pdaiv1.data.mocks.mockStableDiffusionModelEntities +import dev.minios.pdaiv1.data.mocks.mockStableDiffusionModels +import dev.minios.pdaiv1.storage.db.cache.dao.StableDiffusionModelDao import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/local/StableDiffusionSamplersLocalDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/local/StableDiffusionSamplersLocalDataSourceTest.kt similarity index 92% rename from data/src/test/java/com/shifthackz/aisdv1/data/local/StableDiffusionSamplersLocalDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/local/StableDiffusionSamplersLocalDataSourceTest.kt index b7376d68c..cdb01ac5a 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/local/StableDiffusionSamplersLocalDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/local/StableDiffusionSamplersLocalDataSourceTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.local +package dev.minios.pdaiv1.data.local -import com.shifthackz.aisdv1.data.mocks.mockStableDiffusionSamplerEntities -import com.shifthackz.aisdv1.data.mocks.mockStableDiffusionSamplers -import com.shifthackz.aisdv1.storage.db.cache.dao.StableDiffusionSamplerDao +import dev.minios.pdaiv1.data.mocks.mockStableDiffusionSamplerEntities +import dev.minios.pdaiv1.data.mocks.mockStableDiffusionSamplers +import dev.minios.pdaiv1.storage.db.cache.dao.StableDiffusionSamplerDao import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/local/SupportersLocalDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/local/SupportersLocalDataSourceTest.kt similarity index 93% rename from data/src/test/java/com/shifthackz/aisdv1/data/local/SupportersLocalDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/local/SupportersLocalDataSourceTest.kt index f9a2aea99..f9c94b4a2 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/local/SupportersLocalDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/local/SupportersLocalDataSourceTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.local +package dev.minios.pdaiv1.data.local -import com.shifthackz.aisdv1.data.mocks.mockSupporterEntities -import com.shifthackz.aisdv1.data.mocks.mockSupporters -import com.shifthackz.aisdv1.storage.db.persistent.dao.SupporterDao +import dev.minios.pdaiv1.data.mocks.mockSupporterEntities +import dev.minios.pdaiv1.data.mocks.mockSupporters +import dev.minios.pdaiv1.storage.db.persistent.dao.SupporterDao import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/local/SwarmUiModelsLocalDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/local/SwarmUiModelsLocalDataSourceTest.kt similarity index 93% rename from data/src/test/java/com/shifthackz/aisdv1/data/local/SwarmUiModelsLocalDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/local/SwarmUiModelsLocalDataSourceTest.kt index 34ebbe564..7a1ad01b4 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/local/SwarmUiModelsLocalDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/local/SwarmUiModelsLocalDataSourceTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.local +package dev.minios.pdaiv1.data.local -import com.shifthackz.aisdv1.data.mocks.mockSwarmUiModelEntities -import com.shifthackz.aisdv1.data.mocks.mockSwarmUiModels -import com.shifthackz.aisdv1.storage.db.cache.dao.SwarmUiModelDao +import dev.minios.pdaiv1.data.mocks.mockSwarmUiModelEntities +import dev.minios.pdaiv1.data.mocks.mockSwarmUiModels +import dev.minios.pdaiv1.storage.db.cache.dao.SwarmUiModelDao import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/AiGenerationResultMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/AiGenerationResultMocks.kt similarity index 81% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/AiGenerationResultMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/AiGenerationResultMocks.kt index a96ee0004..ac8fe2f0b 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/AiGenerationResultMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/AiGenerationResultMocks.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.MediaType +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.MediaType import java.util.Date val mockAiGenerationResult = AiGenerationResult( diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/DownloadableModelResponseMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/DownloadableModelResponseMocks.kt similarity index 64% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/DownloadableModelResponseMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/DownloadableModelResponseMocks.kt index deb6dd4d6..142b70197 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/DownloadableModelResponseMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/DownloadableModelResponseMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.network.response.DownloadableModelResponse +import dev.minios.pdaiv1.network.response.DownloadableModelResponse val mockDownloadableModelsResponse = listOf( DownloadableModelResponse( diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/FalAiMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/FalAiMocks.kt similarity index 77% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/FalAiMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/FalAiMocks.kt index 553ea1d07..7067f6a3f 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/FalAiMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/FalAiMocks.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint -import com.shifthackz.aisdv1.domain.entity.FalAiEndpointCategory -import com.shifthackz.aisdv1.domain.entity.FalAiEndpointSchema -import com.shifthackz.aisdv1.domain.entity.FalAiInputProperty -import com.shifthackz.aisdv1.domain.entity.FalAiPayload -import com.shifthackz.aisdv1.domain.entity.FalAiPropertyType +import dev.minios.pdaiv1.domain.entity.FalAiEndpoint +import dev.minios.pdaiv1.domain.entity.FalAiEndpointCategory +import dev.minios.pdaiv1.domain.entity.FalAiEndpointSchema +import dev.minios.pdaiv1.domain.entity.FalAiInputProperty +import dev.minios.pdaiv1.domain.entity.FalAiPayload +import dev.minios.pdaiv1.domain.entity.FalAiPropertyType val mockFalAiInputProperty = FalAiInputProperty( name = "prompt", diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/ForgeModuleMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/ForgeModuleMocks.kt similarity index 72% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/ForgeModuleMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/ForgeModuleMocks.kt index 79311a349..3c4c1d8a4 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/ForgeModuleMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/ForgeModuleMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.domain.entity.ForgeModule +import dev.minios.pdaiv1.domain.entity.ForgeModule val mockForgeModule = ForgeModule( name = "ADetailer", diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/GenerationResultEntityMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/GenerationResultEntityMocks.kt similarity index 79% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/GenerationResultEntityMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/GenerationResultEntityMocks.kt index 143dc48f7..b7b621c80 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/GenerationResultEntityMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/GenerationResultEntityMocks.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.storage.db.persistent.entity.GenerationResultEntity +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.storage.db.persistent.entity.GenerationResultEntity import java.util.Date val mockGenerationResultEntity = GenerationResultEntity( diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/HuggingFaceModelEntityMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/HuggingFaceModelEntityMocks.kt similarity index 68% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/HuggingFaceModelEntityMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/HuggingFaceModelEntityMocks.kt index 259228974..d0c2e3605 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/HuggingFaceModelEntityMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/HuggingFaceModelEntityMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.storage.db.persistent.entity.HuggingFaceModelEntity +import dev.minios.pdaiv1.storage.db.persistent.entity.HuggingFaceModelEntity val mockHuggingFaceModelEntity = HuggingFaceModelEntity( id = "050598", diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/HuggingFaceModelMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/HuggingFaceModelMocks.kt similarity index 69% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/HuggingFaceModelMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/HuggingFaceModelMocks.kt index 21ad6d07f..3ec0055e1 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/HuggingFaceModelMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/HuggingFaceModelMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.domain.entity.HuggingFaceModel +import dev.minios.pdaiv1.domain.entity.HuggingFaceModel val mockHuggingFaceModel = HuggingFaceModel( id = "050598", diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/HuggingFaceModelRawMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/HuggingFaceModelRawMocks.kt similarity index 79% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/HuggingFaceModelRawMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/HuggingFaceModelRawMocks.kt index efb83fcf5..22f339d7b 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/HuggingFaceModelRawMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/HuggingFaceModelRawMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.network.model.HuggingFaceModelRaw +import dev.minios.pdaiv1.network.model.HuggingFaceModelRaw val mockHuggingFaceModelsRaw = listOf( HuggingFaceModelRaw( diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/ImageToImagePayloadMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/ImageToImagePayloadMocks.kt similarity index 85% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/ImageToImagePayloadMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/ImageToImagePayloadMocks.kt index 3138ce979..5b8a5f883 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/ImageToImagePayloadMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/ImageToImagePayloadMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload val mockImageToImagePayload = ImageToImagePayload( base64Image = "", diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/LocalAiModelMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/LocalAiModelMocks.kt similarity index 74% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/LocalAiModelMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/LocalAiModelMocks.kt index 9aaa20a8b..e6574cdbe 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/LocalAiModelMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/LocalAiModelMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.domain.entity.LocalAiModel val mockLocalAiModel = LocalAiModel( id = "5598", diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/LocalModelEntityMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/LocalModelEntityMocks.kt similarity index 79% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/LocalModelEntityMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/LocalModelEntityMocks.kt index 7beaa4beb..6aae5ca7d 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/LocalModelEntityMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/LocalModelEntityMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.storage.db.persistent.entity.LocalModelEntity +import dev.minios.pdaiv1.storage.db.persistent.entity.LocalModelEntity val mockLocalModelEntity = LocalModelEntity( id = "5598", diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/OpenAiResponseMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/OpenAiResponseMocks.kt similarity index 68% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/OpenAiResponseMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/OpenAiResponseMocks.kt index adb54d034..8a435f396 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/OpenAiResponseMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/OpenAiResponseMocks.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.network.model.OpenAiImageRaw -import com.shifthackz.aisdv1.network.response.OpenAiResponse +import dev.minios.pdaiv1.network.model.OpenAiImageRaw +import dev.minios.pdaiv1.network.response.OpenAiResponse val mockSuccessOpenAiResponse = OpenAiResponse( created = System.currentTimeMillis(), diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SdEmbeddingsResponseMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/SdEmbeddingsResponseMocks.kt similarity index 62% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/SdEmbeddingsResponseMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/SdEmbeddingsResponseMocks.kt index d2250d174..a4c3e90f1 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SdEmbeddingsResponseMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/SdEmbeddingsResponseMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.network.response.SdEmbeddingsResponse +import dev.minios.pdaiv1.network.response.SdEmbeddingsResponse val mockSdEmbeddingsResponse = SdEmbeddingsResponse( loaded = mapOf("1504" to "5598"), diff --git a/data/src/test/java/dev/minios/pdaiv1/data/mocks/SdGenerationResponseMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/SdGenerationResponseMocks.kt new file mode 100644 index 000000000..900f38c25 --- /dev/null +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/SdGenerationResponseMocks.kt @@ -0,0 +1,8 @@ +package dev.minios.pdaiv1.data.mocks + +import dev.minios.pdaiv1.network.response.SdGenerationResponse + +val mockSdGenerationResponse = SdGenerationResponse( + images = listOf("base64"), + info = "info", +) diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/ServerConfigurationEntityMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/ServerConfigurationEntityMocks.kt similarity index 51% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/ServerConfigurationEntityMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/ServerConfigurationEntityMocks.kt index a649dc5bc..1a7c68550 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/ServerConfigurationEntityMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/ServerConfigurationEntityMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.storage.db.cache.entity.ServerConfigurationEntity +import dev.minios.pdaiv1.storage.db.cache.entity.ServerConfigurationEntity val mockServerConfigurationEntity = ServerConfigurationEntity( serverId = "5598", diff --git a/data/src/test/java/dev/minios/pdaiv1/data/mocks/ServerConfigurationMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/ServerConfigurationMocks.kt new file mode 100644 index 000000000..c537421f7 --- /dev/null +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/ServerConfigurationMocks.kt @@ -0,0 +1,5 @@ +package dev.minios.pdaiv1.data.mocks + +import dev.minios.pdaiv1.domain.entity.ServerConfiguration + +val mockServerConfiguration = ServerConfiguration("checkpoint") diff --git a/data/src/test/java/dev/minios/pdaiv1/data/mocks/ServerConfigurationRawMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/ServerConfigurationRawMocks.kt new file mode 100644 index 000000000..3bfd8cfa7 --- /dev/null +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/ServerConfigurationRawMocks.kt @@ -0,0 +1,5 @@ +package dev.minios.pdaiv1.data.mocks + +import dev.minios.pdaiv1.network.model.ServerConfigurationRaw + +val mockServerConfigurationRaw = ServerConfigurationRaw("5598") diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StabilityAiEngineMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StabilityAiEngineMocks.kt similarity index 54% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/StabilityAiEngineMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/StabilityAiEngineMocks.kt index 1616763ff..c7f14641c 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StabilityAiEngineMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StabilityAiEngineMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.domain.entity.StabilityAiEngine +import dev.minios.pdaiv1.domain.entity.StabilityAiEngine val mockStabilityAiEngines = listOf( StabilityAiEngine( diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StabilityAiEngineRawMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StabilityAiEngineRawMocks.kt similarity index 63% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/StabilityAiEngineRawMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/StabilityAiEngineRawMocks.kt index 9dcd03055..6452877a9 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StabilityAiEngineRawMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StabilityAiEngineRawMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.network.model.StabilityAiEngineRaw +import dev.minios.pdaiv1.network.model.StabilityAiEngineRaw val mockStabilityAiEnginesRaw = listOf( StabilityAiEngineRaw( diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StabilityGenerationResponseMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StabilityGenerationResponseMocks.kt similarity index 75% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/StabilityGenerationResponseMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/StabilityGenerationResponseMocks.kt index 5199d5198..fd621d026 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StabilityGenerationResponseMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StabilityGenerationResponseMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.network.response.StabilityGenerationResponse +import dev.minios.pdaiv1.network.response.StabilityGenerationResponse val mockStabilityGenerationResponse = StabilityGenerationResponse( artifacts = listOf( diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionEmbeddingEntityMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionEmbeddingEntityMocks.kt similarity index 67% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionEmbeddingEntityMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionEmbeddingEntityMocks.kt index 904054894..fb7388255 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionEmbeddingEntityMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionEmbeddingEntityMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionEmbeddingEntity +import dev.minios.pdaiv1.storage.db.cache.entity.StableDiffusionEmbeddingEntity val mockStableDiffusionEmbeddingEntities = listOf( StableDiffusionEmbeddingEntity( diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionEmbeddingMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionEmbeddingMocks.kt similarity index 50% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionEmbeddingMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionEmbeddingMocks.kt index c4a5e9d27..16edbc7d6 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionEmbeddingMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionEmbeddingMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.domain.entity.Embedding +import dev.minios.pdaiv1.domain.entity.Embedding val mockEmbeddings = listOf( Embedding("keyword_5598"), diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionHyperNetworkEntityMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionHyperNetworkEntityMocks.kt similarity index 70% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionHyperNetworkEntityMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionHyperNetworkEntityMocks.kt index 9d6181113..7965534d2 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionHyperNetworkEntityMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionHyperNetworkEntityMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionHyperNetworkEntity +import dev.minios.pdaiv1.storage.db.cache.entity.StableDiffusionHyperNetworkEntity val mockStableDiffusionHyperNetworkEntities = listOf( StableDiffusionHyperNetworkEntity( diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionHyperNetworkMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionHyperNetworkMocks.kt similarity index 68% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionHyperNetworkMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionHyperNetworkMocks.kt index 6e4c5931e..654affa17 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionHyperNetworkMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionHyperNetworkMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.domain.entity.StableDiffusionHyperNetwork +import dev.minios.pdaiv1.domain.entity.StableDiffusionHyperNetwork val mockStableDiffusionHyperNetworks = listOf( StableDiffusionHyperNetwork( diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionHyperNetworkRawMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionHyperNetworkRawMocks.kt similarity index 55% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionHyperNetworkRawMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionHyperNetworkRawMocks.kt index d3de9fb20..59577d98f 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionHyperNetworkRawMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionHyperNetworkRawMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.network.model.StableDiffusionHyperNetworkRaw +import dev.minios.pdaiv1.network.model.StableDiffusionHyperNetworkRaw val mockStableDiffusionHyperNetworkRaw = listOf( StableDiffusionHyperNetworkRaw( diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionLoraEntityMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionLoraEntityMocks.kt similarity index 74% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionLoraEntityMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionLoraEntityMocks.kt index d0ed99856..bc7e79b2e 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionLoraEntityMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionLoraEntityMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionLoraEntity +import dev.minios.pdaiv1.storage.db.cache.entity.StableDiffusionLoraEntity val mockStableDiffusionLoraEntities = listOf( StableDiffusionLoraEntity( diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionLoraMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionLoraMocks.kt similarity index 73% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionLoraMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionLoraMocks.kt index a6531aa22..86020afce 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionLoraMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionLoraMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.domain.entity.LoRA +import dev.minios.pdaiv1.domain.entity.LoRA val mockStableDiffusionLoras = listOf( LoRA( diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionLoraRawMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionLoraRawMocks.kt similarity index 59% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionLoraRawMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionLoraRawMocks.kt index 0f2e8bea1..ce2e4ae04 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionLoraRawMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionLoraRawMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.network.model.StableDiffusionLoraRaw +import dev.minios.pdaiv1.network.model.StableDiffusionLoraRaw val mockStableDiffusionLoraRaw = listOf( StableDiffusionLoraRaw( diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionModelEntityMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionModelEntityMocks.kt similarity index 81% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionModelEntityMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionModelEntityMocks.kt index 51e9496ca..380772a8d 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionModelEntityMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionModelEntityMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionModelEntity +import dev.minios.pdaiv1.storage.db.cache.entity.StableDiffusionModelEntity val mockStableDiffusionModelEntities = listOf( StableDiffusionModelEntity( diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionModelMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionModelMocks.kt similarity index 82% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionModelMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionModelMocks.kt index 25222e867..ff9d97141 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionModelMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionModelMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.domain.entity.StableDiffusionModel +import dev.minios.pdaiv1.domain.entity.StableDiffusionModel val mockStableDiffusionModels = listOf( StableDiffusionModel( diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionModelRawMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionModelRawMocks.kt similarity index 70% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionModelRawMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionModelRawMocks.kt index c93328862..51ddc847d 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionModelRawMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionModelRawMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.network.model.StableDiffusionModelRaw +import dev.minios.pdaiv1.network.model.StableDiffusionModelRaw val mockStableDiffusionModelRaw = listOf( StableDiffusionModelRaw( diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionSamplerEntityMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionSamplerEntityMocks.kt similarity index 74% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionSamplerEntityMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionSamplerEntityMocks.kt index 860e72838..9be32f7a6 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionSamplerEntityMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionSamplerEntityMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionSamplerEntity +import dev.minios.pdaiv1.storage.db.cache.entity.StableDiffusionSamplerEntity val mockStableDiffusionSamplerEntities = listOf( StableDiffusionSamplerEntity( diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionSamplerMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionSamplerMocks.kt similarity index 73% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionSamplerMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionSamplerMocks.kt index f8640a7ac..dadda0c53 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionSamplerMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionSamplerMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.domain.entity.StableDiffusionSampler +import dev.minios.pdaiv1.domain.entity.StableDiffusionSampler val mockStableDiffusionSamplers = listOf( StableDiffusionSampler( diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionSamplerRawMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionSamplerRawMocks.kt similarity index 55% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionSamplerRawMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionSamplerRawMocks.kt index f92d5abcd..337557e9e 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/StableDiffusionSamplerRawMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/StableDiffusionSamplerRawMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.network.model.StableDiffusionSamplerRaw +import dev.minios.pdaiv1.network.model.StableDiffusionSamplerRaw val mockStableDiffusionSamplerRaw = listOf( StableDiffusionSamplerRaw( diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SupporterEntityMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/SupporterEntityMocks.kt similarity index 65% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/SupporterEntityMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/SupporterEntityMocks.kt index 2db1be7cf..9bff43da0 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SupporterEntityMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/SupporterEntityMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.storage.db.persistent.entity.SupporterEntity +import dev.minios.pdaiv1.storage.db.persistent.entity.SupporterEntity import java.util.Date val mockSupporterEntities = listOf( diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SupporterMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/SupporterMocks.kt similarity index 71% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/SupporterMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/SupporterMocks.kt index a82ddc15e..b1ac6a1b2 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SupporterMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/SupporterMocks.kt @@ -1,8 +1,8 @@ @file:Suppress("DEPRECATION") -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.domain.entity.Supporter +import dev.minios.pdaiv1.domain.entity.Supporter import java.util.Date val mockSupporters = listOf( diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SupporterRawMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/SupporterRawMocks.kt similarity index 72% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/SupporterRawMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/SupporterRawMocks.kt index e65e8624e..2063bb77f 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SupporterRawMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/SupporterRawMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.network.model.SupporterRaw +import dev.minios.pdaiv1.network.model.SupporterRaw val mockSupportersRaw = listOf( SupporterRaw( diff --git a/data/src/test/java/dev/minios/pdaiv1/data/mocks/SwarmUiGenerationResponseMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/SwarmUiGenerationResponseMocks.kt new file mode 100644 index 000000000..ba95780b5 --- /dev/null +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/SwarmUiGenerationResponseMocks.kt @@ -0,0 +1,7 @@ +package dev.minios.pdaiv1.data.mocks + +import dev.minios.pdaiv1.network.response.SwarmUiGenerationResponse + +val mockSwarmUiGenerationResponse = SwarmUiGenerationResponse( + images = listOf("/tmp/img.jpg"), +) diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SwarmUiModelEntityMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/SwarmUiModelEntityMocks.kt similarity index 59% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/SwarmUiModelEntityMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/SwarmUiModelEntityMocks.kt index 1f1513170..b280b8518 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SwarmUiModelEntityMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/SwarmUiModelEntityMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.storage.db.cache.entity.SwarmUiModelEntity +import dev.minios.pdaiv1.storage.db.cache.entity.SwarmUiModelEntity val mockSwarmUiModelEntities = listOf( SwarmUiModelEntity( diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SwarmUiModelMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/SwarmUiModelMocks.kt similarity index 57% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/SwarmUiModelMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/SwarmUiModelMocks.kt index 2917e3bd7..266a778fb 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SwarmUiModelMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/SwarmUiModelMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.domain.entity.SwarmUiModel +import dev.minios.pdaiv1.domain.entity.SwarmUiModel val mockSwarmUiModels = listOf( SwarmUiModel( diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SwarmUiModelRawMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/SwarmUiModelRawMocks.kt similarity index 58% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/SwarmUiModelRawMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/SwarmUiModelRawMocks.kt index 19c9218a8..64b2bfab7 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/SwarmUiModelRawMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/SwarmUiModelRawMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.network.model.SwarmUiModelRaw +import dev.minios.pdaiv1.network.model.SwarmUiModelRaw val mockSwarmUiModelsRaw = listOf( SwarmUiModelRaw( diff --git a/demo/src/test/java/com/shifthackz/aisdv1/demo/mocks/TextToImagePayloadMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/TextToImagePayloadMocks.kt similarity index 82% rename from demo/src/test/java/com/shifthackz/aisdv1/demo/mocks/TextToImagePayloadMocks.kt rename to data/src/test/java/dev/minios/pdaiv1/data/mocks/TextToImagePayloadMocks.kt index 819dc51c2..b16de74e7 100644 --- a/demo/src/test/java/com/shifthackz/aisdv1/demo/mocks/TextToImagePayloadMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/TextToImagePayloadMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.demo.mocks +package dev.minios.pdaiv1.data.mocks -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload val mockTextToImagePayload = TextToImagePayload( prompt = "prompt", diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/preference/PreferenceManagerImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/preference/PreferenceManagerImplTest.kt similarity index 87% rename from data/src/test/java/com/shifthackz/aisdv1/data/preference/PreferenceManagerImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/preference/PreferenceManagerImplTest.kt index 5f68e23b3..16081be27 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/preference/PreferenceManagerImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/preference/PreferenceManagerImplTest.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.data.preference +package dev.minios.pdaiv1.data.preference import android.content.SharedPreferences import com.nhaarman.mockitokotlin2.any @@ -6,33 +6,33 @@ import com.nhaarman.mockitokotlin2.doNothing import com.nhaarman.mockitokotlin2.eq import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.data.preference.PreferenceManagerImpl.Companion.KEY_AI_AUTO_SAVE -import com.shifthackz.aisdv1.data.preference.PreferenceManagerImpl.Companion.KEY_DEMO_MODE -import com.shifthackz.aisdv1.data.preference.PreferenceManagerImpl.Companion.KEY_DESIGN_COLOR_TOKEN -import com.shifthackz.aisdv1.data.preference.PreferenceManagerImpl.Companion.KEY_DESIGN_DARK_THEME -import com.shifthackz.aisdv1.data.preference.PreferenceManagerImpl.Companion.KEY_DESIGN_DARK_TOKEN -import com.shifthackz.aisdv1.data.preference.PreferenceManagerImpl.Companion.KEY_DESIGN_DYNAMIC_COLORS -import com.shifthackz.aisdv1.data.preference.PreferenceManagerImpl.Companion.KEY_DESIGN_SYSTEM_DARK_THEME -import com.shifthackz.aisdv1.data.preference.PreferenceManagerImpl.Companion.KEY_FORCE_SETUP_AFTER_UPDATE -import com.shifthackz.aisdv1.data.preference.PreferenceManagerImpl.Companion.KEY_FORM_ALWAYS_SHOW_ADVANCED_OPTIONS -import com.shifthackz.aisdv1.data.preference.PreferenceManagerImpl.Companion.KEY_FORM_PROMPT_TAGGED_INPUT -import com.shifthackz.aisdv1.data.preference.PreferenceManagerImpl.Companion.KEY_HORDE_API_KEY -import com.shifthackz.aisdv1.data.preference.PreferenceManagerImpl.Companion.KEY_HUGGING_FACE_API_KEY -import com.shifthackz.aisdv1.data.preference.PreferenceManagerImpl.Companion.KEY_HUGGING_FACE_MODEL_KEY -import com.shifthackz.aisdv1.data.preference.PreferenceManagerImpl.Companion.KEY_LOCAL_MODEL_ID -import com.shifthackz.aisdv1.data.preference.PreferenceManagerImpl.Companion.KEY_LOCAL_NN_API -import com.shifthackz.aisdv1.data.preference.PreferenceManagerImpl.Companion.KEY_MONITOR_CONNECTIVITY -import com.shifthackz.aisdv1.data.preference.PreferenceManagerImpl.Companion.KEY_OPEN_AI_API_KEY -import com.shifthackz.aisdv1.data.preference.PreferenceManagerImpl.Companion.KEY_SAVE_TO_MEDIA_STORE -import com.shifthackz.aisdv1.data.preference.PreferenceManagerImpl.Companion.KEY_SD_MODEL -import com.shifthackz.aisdv1.data.preference.PreferenceManagerImpl.Companion.KEY_SERVER_SOURCE -import com.shifthackz.aisdv1.data.preference.PreferenceManagerImpl.Companion.KEY_SERVER_URL -import com.shifthackz.aisdv1.data.preference.PreferenceManagerImpl.Companion.KEY_STABILITY_AI_API_KEY -import com.shifthackz.aisdv1.data.preference.PreferenceManagerImpl.Companion.KEY_STABILITY_AI_ENGINE_ID_KEY -import com.shifthackz.aisdv1.domain.entity.ColorToken -import com.shifthackz.aisdv1.domain.entity.DarkThemeToken -import com.shifthackz.aisdv1.domain.entity.HuggingFaceModel -import com.shifthackz.aisdv1.domain.entity.ServerSource +import dev.minios.pdaiv1.data.preference.PreferenceManagerImpl.Companion.KEY_AI_AUTO_SAVE +import dev.minios.pdaiv1.data.preference.PreferenceManagerImpl.Companion.KEY_DEMO_MODE +import dev.minios.pdaiv1.data.preference.PreferenceManagerImpl.Companion.KEY_DESIGN_COLOR_TOKEN +import dev.minios.pdaiv1.data.preference.PreferenceManagerImpl.Companion.KEY_DESIGN_DARK_THEME +import dev.minios.pdaiv1.data.preference.PreferenceManagerImpl.Companion.KEY_DESIGN_DARK_TOKEN +import dev.minios.pdaiv1.data.preference.PreferenceManagerImpl.Companion.KEY_DESIGN_DYNAMIC_COLORS +import dev.minios.pdaiv1.data.preference.PreferenceManagerImpl.Companion.KEY_DESIGN_SYSTEM_DARK_THEME +import dev.minios.pdaiv1.data.preference.PreferenceManagerImpl.Companion.KEY_FORCE_SETUP_AFTER_UPDATE +import dev.minios.pdaiv1.data.preference.PreferenceManagerImpl.Companion.KEY_FORM_ALWAYS_SHOW_ADVANCED_OPTIONS +import dev.minios.pdaiv1.data.preference.PreferenceManagerImpl.Companion.KEY_FORM_PROMPT_TAGGED_INPUT +import dev.minios.pdaiv1.data.preference.PreferenceManagerImpl.Companion.KEY_HORDE_API_KEY +import dev.minios.pdaiv1.data.preference.PreferenceManagerImpl.Companion.KEY_HUGGING_FACE_API_KEY +import dev.minios.pdaiv1.data.preference.PreferenceManagerImpl.Companion.KEY_HUGGING_FACE_MODEL_KEY +import dev.minios.pdaiv1.data.preference.PreferenceManagerImpl.Companion.KEY_LOCAL_MODEL_ID +import dev.minios.pdaiv1.data.preference.PreferenceManagerImpl.Companion.KEY_LOCAL_NN_API +import dev.minios.pdaiv1.data.preference.PreferenceManagerImpl.Companion.KEY_MONITOR_CONNECTIVITY +import dev.minios.pdaiv1.data.preference.PreferenceManagerImpl.Companion.KEY_OPEN_AI_API_KEY +import dev.minios.pdaiv1.data.preference.PreferenceManagerImpl.Companion.KEY_SAVE_TO_MEDIA_STORE +import dev.minios.pdaiv1.data.preference.PreferenceManagerImpl.Companion.KEY_SD_MODEL +import dev.minios.pdaiv1.data.preference.PreferenceManagerImpl.Companion.KEY_SERVER_SOURCE +import dev.minios.pdaiv1.data.preference.PreferenceManagerImpl.Companion.KEY_SERVER_URL +import dev.minios.pdaiv1.data.preference.PreferenceManagerImpl.Companion.KEY_STABILITY_AI_API_KEY +import dev.minios.pdaiv1.data.preference.PreferenceManagerImpl.Companion.KEY_STABILITY_AI_ENGINE_ID_KEY +import dev.minios.pdaiv1.domain.entity.ColorToken +import dev.minios.pdaiv1.domain.entity.DarkThemeToken +import dev.minios.pdaiv1.domain.entity.HuggingFaceModel +import dev.minios.pdaiv1.domain.entity.ServerSource import org.junit.Assert import org.junit.Before import org.junit.Test diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/preference/SessionPreferenceImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/preference/SessionPreferenceImplTest.kt similarity index 93% rename from data/src/test/java/com/shifthackz/aisdv1/data/preference/SessionPreferenceImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/preference/SessionPreferenceImplTest.kt index 2e645a64e..4dcd63a23 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/preference/SessionPreferenceImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/preference/SessionPreferenceImplTest.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.data.preference +package dev.minios.pdaiv1.data.preference import org.junit.Assert import org.junit.Test diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/remote/DownloadableModelRemoteDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/remote/DownloadableModelRemoteDataSourceTest.kt similarity index 88% rename from data/src/test/java/com/shifthackz/aisdv1/data/remote/DownloadableModelRemoteDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/remote/DownloadableModelRemoteDataSourceTest.kt index 2e1380e13..c8588d647 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/remote/DownloadableModelRemoteDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/remote/DownloadableModelRemoteDataSourceTest.kt @@ -1,12 +1,12 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.data.mappers.mapRawToCheckpointDomain -import com.shifthackz.aisdv1.data.mocks.mockDownloadableModelsResponse -import com.shifthackz.aisdv1.domain.entity.LocalAiModel -import com.shifthackz.aisdv1.network.api.sdai.DownloadableModelsApi +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.data.mappers.mapRawToCheckpointDomain +import dev.minios.pdaiv1.data.mocks.mockDownloadableModelsResponse +import dev.minios.pdaiv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.network.api.pdai.DownloadableModelsApi import io.reactivex.rxjava3.core.Single import org.junit.Test diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/remote/HordeGenerationRemoteDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/remote/HordeGenerationRemoteDataSourceTest.kt similarity index 85% rename from data/src/test/java/com/shifthackz/aisdv1/data/remote/HordeGenerationRemoteDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/remote/HordeGenerationRemoteDataSourceTest.kt index fe6cc4a01..8a6e7f16d 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/remote/HordeGenerationRemoteDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/remote/HordeGenerationRemoteDataSourceTest.kt @@ -1,16 +1,16 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote import android.graphics.Bitmap import android.graphics.BitmapFactory -import com.shifthackz.aisdv1.data.mocks.mockTextToImagePayload -import com.shifthackz.aisdv1.core.imageprocessing.BitmapToBase64Converter -import com.shifthackz.aisdv1.domain.datasource.HordeGenerationDataSource -import com.shifthackz.aisdv1.network.api.horde.HordeRestApi -import com.shifthackz.aisdv1.network.response.HordeGenerationAsyncResponse -import com.shifthackz.aisdv1.network.response.HordeGenerationCheckFullResponse -import com.shifthackz.aisdv1.network.response.HordeGenerationCheckResponse -import com.shifthackz.aisdv1.network.response.HordeUserResponse +import dev.minios.pdaiv1.data.mocks.mockTextToImagePayload +import dev.minios.pdaiv1.core.imageprocessing.BitmapToBase64Converter +import dev.minios.pdaiv1.domain.datasource.HordeGenerationDataSource +import dev.minios.pdaiv1.network.api.horde.HordeRestApi +import dev.minios.pdaiv1.network.response.HordeGenerationAsyncResponse +import dev.minios.pdaiv1.network.response.HordeGenerationCheckFullResponse +import dev.minios.pdaiv1.network.response.HordeGenerationCheckResponse +import dev.minios.pdaiv1.network.response.HordeUserResponse import io.mockk.every import io.mockk.mockk import io.mockk.mockkConstructor diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/remote/HuggingFaceGenerationRemoteDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/remote/HuggingFaceGenerationRemoteDataSourceTest.kt similarity index 91% rename from data/src/test/java/com/shifthackz/aisdv1/data/remote/HuggingFaceGenerationRemoteDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/remote/HuggingFaceGenerationRemoteDataSourceTest.kt index 43606065f..828b3a622 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/remote/HuggingFaceGenerationRemoteDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/remote/HuggingFaceGenerationRemoteDataSourceTest.kt @@ -1,12 +1,12 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote import android.graphics.Bitmap -import com.shifthackz.aisdv1.core.imageprocessing.BitmapToBase64Converter -import com.shifthackz.aisdv1.data.mocks.mockTextToImagePayload -import com.shifthackz.aisdv1.data.mocks.mockImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.network.api.huggingface.HuggingFaceApi -import com.shifthackz.aisdv1.network.api.huggingface.HuggingFaceInferenceApi +import dev.minios.pdaiv1.core.imageprocessing.BitmapToBase64Converter +import dev.minios.pdaiv1.data.mocks.mockTextToImagePayload +import dev.minios.pdaiv1.data.mocks.mockImageToImagePayload +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.network.api.huggingface.HuggingFaceApi +import dev.minios.pdaiv1.network.api.huggingface.HuggingFaceInferenceApi import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/remote/HuggingFaceModelsRemoteDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/remote/HuggingFaceModelsRemoteDataSourceTest.kt similarity index 88% rename from data/src/test/java/com/shifthackz/aisdv1/data/remote/HuggingFaceModelsRemoteDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/remote/HuggingFaceModelsRemoteDataSourceTest.kt index 4588f1147..19834de2f 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/remote/HuggingFaceModelsRemoteDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/remote/HuggingFaceModelsRemoteDataSourceTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.data.mocks.mockHuggingFaceModelsRaw -import com.shifthackz.aisdv1.domain.entity.HuggingFaceModel -import com.shifthackz.aisdv1.network.api.sdai.HuggingFaceModelsApi +import dev.minios.pdaiv1.data.mocks.mockHuggingFaceModelsRaw +import dev.minios.pdaiv1.domain.entity.HuggingFaceModel +import dev.minios.pdaiv1.network.api.pdai.HuggingFaceModelsApi import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Single diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/remote/OpenAiGenerationRemoteDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/remote/OpenAiGenerationRemoteDataSourceTest.kt similarity index 86% rename from data/src/test/java/com/shifthackz/aisdv1/data/remote/OpenAiGenerationRemoteDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/remote/OpenAiGenerationRemoteDataSourceTest.kt index a4f7069f0..54948ba39 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/remote/OpenAiGenerationRemoteDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/remote/OpenAiGenerationRemoteDataSourceTest.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.data.mocks.mockBadOpenAiResponse -import com.shifthackz.aisdv1.data.mocks.mockSuccessOpenAiResponse -import com.shifthackz.aisdv1.data.mocks.mockTextToImagePayload -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.network.api.openai.OpenAiApi -import com.shifthackz.aisdv1.network.response.OpenAiResponse +import dev.minios.pdaiv1.data.mocks.mockBadOpenAiResponse +import dev.minios.pdaiv1.data.mocks.mockSuccessOpenAiResponse +import dev.minios.pdaiv1.data.mocks.mockTextToImagePayload +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.network.api.openai.OpenAiApi +import dev.minios.pdaiv1.network.response.OpenAiResponse import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/remote/RandomImageRemoteDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/remote/RandomImageRemoteDataSourceTest.kt similarity index 92% rename from data/src/test/java/com/shifthackz/aisdv1/data/remote/RandomImageRemoteDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/remote/RandomImageRemoteDataSourceTest.kt index c8cf8151b..4c07db8f2 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/remote/RandomImageRemoteDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/remote/RandomImageRemoteDataSourceTest.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote import android.graphics.Bitmap -import com.shifthackz.aisdv1.network.api.imagecdn.ImageCdnRestApi +import dev.minios.pdaiv1.network.api.imagecdn.ImageCdnRestApi import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Single diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/remote/ServerConfigurationRemoteDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/remote/ServerConfigurationRemoteDataSourceTest.kt similarity index 88% rename from data/src/test/java/com/shifthackz/aisdv1/data/remote/ServerConfigurationRemoteDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/remote/ServerConfigurationRemoteDataSourceTest.kt index b3edaaccf..cb3017913 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/remote/ServerConfigurationRemoteDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/remote/ServerConfigurationRemoteDataSourceTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.data.mocks.mockServerConfigurationRaw -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.entity.ServerConfiguration -import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi +import dev.minios.pdaiv1.data.mocks.mockServerConfigurationRaw +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.entity.ServerConfiguration +import dev.minios.pdaiv1.network.api.automatic1111.Automatic1111RestApi import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/remote/StabilityAiCreditsRemoteDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/remote/StabilityAiCreditsRemoteDataSourceTest.kt similarity index 91% rename from data/src/test/java/com/shifthackz/aisdv1/data/remote/StabilityAiCreditsRemoteDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/remote/StabilityAiCreditsRemoteDataSourceTest.kt index c621f5fbf..cf496b582 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/remote/StabilityAiCreditsRemoteDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/remote/StabilityAiCreditsRemoteDataSourceTest.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.network.api.stabilityai.StabilityAiApi -import com.shifthackz.aisdv1.network.response.StabilityCreditsResponse +import dev.minios.pdaiv1.network.api.stabilityai.StabilityAiApi +import dev.minios.pdaiv1.network.response.StabilityCreditsResponse import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Single diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/remote/StabilityAiEnginesRemoteDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/remote/StabilityAiEnginesRemoteDataSourceTest.kt similarity index 88% rename from data/src/test/java/com/shifthackz/aisdv1/data/remote/StabilityAiEnginesRemoteDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/remote/StabilityAiEnginesRemoteDataSourceTest.kt index 57f97915a..d337da1af 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/remote/StabilityAiEnginesRemoteDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/remote/StabilityAiEnginesRemoteDataSourceTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.data.mocks.mockStabilityAiEnginesRaw -import com.shifthackz.aisdv1.domain.entity.StabilityAiEngine -import com.shifthackz.aisdv1.network.api.stabilityai.StabilityAiApi +import dev.minios.pdaiv1.data.mocks.mockStabilityAiEnginesRaw +import dev.minios.pdaiv1.domain.entity.StabilityAiEngine +import dev.minios.pdaiv1.network.api.stabilityai.StabilityAiApi import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Single diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/remote/StabilityAiGenerationRemoteDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/remote/StabilityAiGenerationRemoteDataSourceTest.kt similarity index 86% rename from data/src/test/java/com/shifthackz/aisdv1/data/remote/StabilityAiGenerationRemoteDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/remote/StabilityAiGenerationRemoteDataSourceTest.kt index 04665a148..20e44a27c 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/remote/StabilityAiGenerationRemoteDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/remote/StabilityAiGenerationRemoteDataSourceTest.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.data.mocks.mockBadStabilityGenerationResponse -import com.shifthackz.aisdv1.data.mocks.mockStabilityGenerationResponse -import com.shifthackz.aisdv1.data.mocks.mockTextToImagePayload -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.network.api.stabilityai.StabilityAiApi -import com.shifthackz.aisdv1.network.error.StabilityAiErrorMapper +import dev.minios.pdaiv1.data.mocks.mockBadStabilityGenerationResponse +import dev.minios.pdaiv1.data.mocks.mockStabilityGenerationResponse +import dev.minios.pdaiv1.data.mocks.mockTextToImagePayload +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.network.api.stabilityai.StabilityAiApi +import dev.minios.pdaiv1.network.error.StabilityAiErrorMapper import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/remote/StableDiffusionEmbeddingsRemoteDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/remote/StableDiffusionEmbeddingsRemoteDataSourceTest.kt similarity index 84% rename from data/src/test/java/com/shifthackz/aisdv1/data/remote/StableDiffusionEmbeddingsRemoteDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/remote/StableDiffusionEmbeddingsRemoteDataSourceTest.kt index 945287115..aee2e8912 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/remote/StableDiffusionEmbeddingsRemoteDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/remote/StableDiffusionEmbeddingsRemoteDataSourceTest.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.data.mocks.mockEmptySdEmbeddingsResponse -import com.shifthackz.aisdv1.data.mocks.mockSdEmbeddingsResponse -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.entity.Embedding -import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi +import dev.minios.pdaiv1.data.mocks.mockEmptySdEmbeddingsResponse +import dev.minios.pdaiv1.data.mocks.mockSdEmbeddingsResponse +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.entity.Embedding +import dev.minios.pdaiv1.network.api.automatic1111.Automatic1111RestApi import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Single diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/remote/StableDiffusionGenerationRemoteDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/remote/StableDiffusionGenerationRemoteDataSourceTest.kt similarity index 89% rename from data/src/test/java/com/shifthackz/aisdv1/data/remote/StableDiffusionGenerationRemoteDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/remote/StableDiffusionGenerationRemoteDataSourceTest.kt index b38b133f8..f9d1a6251 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/remote/StableDiffusionGenerationRemoteDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/remote/StableDiffusionGenerationRemoteDataSourceTest.kt @@ -1,12 +1,12 @@ -package com.shifthackz.aisdv1.data.remote - -import com.shifthackz.aisdv1.data.mocks.mockImageToImagePayload -import com.shifthackz.aisdv1.data.mocks.mockSdGenerationResponse -import com.shifthackz.aisdv1.data.mocks.mockTextToImagePayload -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi -import com.shifthackz.aisdv1.network.response.SdGenerationResponse +package dev.minios.pdaiv1.data.remote + +import dev.minios.pdaiv1.data.mocks.mockImageToImagePayload +import dev.minios.pdaiv1.data.mocks.mockSdGenerationResponse +import dev.minios.pdaiv1.data.mocks.mockTextToImagePayload +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.network.api.automatic1111.Automatic1111RestApi +import dev.minios.pdaiv1.network.response.SdGenerationResponse import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/remote/StableDiffusionHyperNetworksRemoteDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/remote/StableDiffusionHyperNetworksRemoteDataSourceTest.kt similarity index 84% rename from data/src/test/java/com/shifthackz/aisdv1/data/remote/StableDiffusionHyperNetworksRemoteDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/remote/StableDiffusionHyperNetworksRemoteDataSourceTest.kt index 610b95d7f..93fd4e76f 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/remote/StableDiffusionHyperNetworksRemoteDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/remote/StableDiffusionHyperNetworksRemoteDataSourceTest.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.data.mocks.mockStableDiffusionHyperNetworkRaw -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.entity.StableDiffusionHyperNetwork -import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi -import com.shifthackz.aisdv1.network.model.StableDiffusionHyperNetworkRaw +import dev.minios.pdaiv1.data.mocks.mockStableDiffusionHyperNetworkRaw +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.entity.StableDiffusionHyperNetwork +import dev.minios.pdaiv1.network.api.automatic1111.Automatic1111RestApi +import dev.minios.pdaiv1.network.model.StableDiffusionHyperNetworkRaw import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Single diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/remote/StableDiffusionLorasRemoteDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/remote/StableDiffusionLorasRemoteDataSourceTest.kt similarity index 87% rename from data/src/test/java/com/shifthackz/aisdv1/data/remote/StableDiffusionLorasRemoteDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/remote/StableDiffusionLorasRemoteDataSourceTest.kt index a3e129ef3..68e044f4f 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/remote/StableDiffusionLorasRemoteDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/remote/StableDiffusionLorasRemoteDataSourceTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.data.mocks.mockStableDiffusionLoraRaw -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.entity.LoRA -import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi +import dev.minios.pdaiv1.data.mocks.mockStableDiffusionLoraRaw +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.entity.LoRA +import dev.minios.pdaiv1.network.api.automatic1111.Automatic1111RestApi import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Single diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/remote/StableDiffusionModelsRemoteDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/remote/StableDiffusionModelsRemoteDataSourceTest.kt similarity index 86% rename from data/src/test/java/com/shifthackz/aisdv1/data/remote/StableDiffusionModelsRemoteDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/remote/StableDiffusionModelsRemoteDataSourceTest.kt index 6cbb03c67..d4c5cc73f 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/remote/StableDiffusionModelsRemoteDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/remote/StableDiffusionModelsRemoteDataSourceTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.data.mocks.mockStableDiffusionModelRaw -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.entity.StableDiffusionModel -import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi +import dev.minios.pdaiv1.data.mocks.mockStableDiffusionModelRaw +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.entity.StableDiffusionModel +import dev.minios.pdaiv1.network.api.automatic1111.Automatic1111RestApi import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Single diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/remote/StableDiffusionSamplersRemoteDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/remote/StableDiffusionSamplersRemoteDataSourceTest.kt similarity index 86% rename from data/src/test/java/com/shifthackz/aisdv1/data/remote/StableDiffusionSamplersRemoteDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/remote/StableDiffusionSamplersRemoteDataSourceTest.kt index f8a757ebc..39e5d309d 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/remote/StableDiffusionSamplersRemoteDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/remote/StableDiffusionSamplersRemoteDataSourceTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.data.mocks.mockStableDiffusionSamplerRaw -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.entity.StableDiffusionSampler -import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi +import dev.minios.pdaiv1.data.mocks.mockStableDiffusionSamplerRaw +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.entity.StableDiffusionSampler +import dev.minios.pdaiv1.network.api.automatic1111.Automatic1111RestApi import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Single diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/remote/SupportersRemoteDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/remote/SupportersRemoteDataSourceTest.kt similarity index 87% rename from data/src/test/java/com/shifthackz/aisdv1/data/remote/SupportersRemoteDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/remote/SupportersRemoteDataSourceTest.kt index 5430eaf5f..f890390cb 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/remote/SupportersRemoteDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/remote/SupportersRemoteDataSourceTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.data.mocks.mockSupporters -import com.shifthackz.aisdv1.data.mocks.mockSupportersRaw -import com.shifthackz.aisdv1.network.api.sdai.DonateApi +import dev.minios.pdaiv1.data.mocks.mockSupporters +import dev.minios.pdaiv1.data.mocks.mockSupportersRaw +import dev.minios.pdaiv1.network.api.pdai.DonateApi import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Single diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/remote/SwarmUiEmbeddingsRemoteDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/remote/SwarmUiEmbeddingsRemoteDataSourceTest.kt similarity index 86% rename from data/src/test/java/com/shifthackz/aisdv1/data/remote/SwarmUiEmbeddingsRemoteDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/remote/SwarmUiEmbeddingsRemoteDataSourceTest.kt index d0fbe69d9..761043829 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/remote/SwarmUiEmbeddingsRemoteDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/remote/SwarmUiEmbeddingsRemoteDataSourceTest.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.data.mocks.mockSwarmUiModelsRaw -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.entity.Embedding -import com.shifthackz.aisdv1.network.api.swarmui.SwarmUiApi -import com.shifthackz.aisdv1.network.response.SwarmUiModelsResponse +import dev.minios.pdaiv1.data.mocks.mockSwarmUiModelsRaw +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.entity.Embedding +import dev.minios.pdaiv1.network.api.swarmui.SwarmUiApi +import dev.minios.pdaiv1.network.response.SwarmUiModelsResponse import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Single diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/remote/SwarmUiGenerationRemoteDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/remote/SwarmUiGenerationRemoteDataSourceTest.kt similarity index 86% rename from data/src/test/java/com/shifthackz/aisdv1/data/remote/SwarmUiGenerationRemoteDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/remote/SwarmUiGenerationRemoteDataSourceTest.kt index 29c431f4b..1b5f8583e 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/remote/SwarmUiGenerationRemoteDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/remote/SwarmUiGenerationRemoteDataSourceTest.kt @@ -1,14 +1,14 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote import android.graphics.Bitmap -import com.shifthackz.aisdv1.core.imageprocessing.Base64EncodingConverter -import com.shifthackz.aisdv1.core.imageprocessing.BitmapToBase64Converter -import com.shifthackz.aisdv1.data.mocks.mockImageToImagePayload -import com.shifthackz.aisdv1.data.mocks.mockSwarmUiGenerationResponse -import com.shifthackz.aisdv1.data.mocks.mockTextToImagePayload -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.network.api.swarmui.SwarmUiApi +import dev.minios.pdaiv1.core.imageprocessing.Base64EncodingConverter +import dev.minios.pdaiv1.core.imageprocessing.BitmapToBase64Converter +import dev.minios.pdaiv1.data.mocks.mockImageToImagePayload +import dev.minios.pdaiv1.data.mocks.mockSwarmUiGenerationResponse +import dev.minios.pdaiv1.data.mocks.mockTextToImagePayload +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.network.api.swarmui.SwarmUiApi import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Single diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/remote/SwarmUiLorasRemoteDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/remote/SwarmUiLorasRemoteDataSourceTest.kt similarity index 86% rename from data/src/test/java/com/shifthackz/aisdv1/data/remote/SwarmUiLorasRemoteDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/remote/SwarmUiLorasRemoteDataSourceTest.kt index ed70d23e3..e85e907fd 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/remote/SwarmUiLorasRemoteDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/remote/SwarmUiLorasRemoteDataSourceTest.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.data.mocks.mockSwarmUiModelsRaw -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.entity.LoRA -import com.shifthackz.aisdv1.network.api.swarmui.SwarmUiApi -import com.shifthackz.aisdv1.network.response.SwarmUiModelsResponse +import dev.minios.pdaiv1.data.mocks.mockSwarmUiModelsRaw +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.entity.LoRA +import dev.minios.pdaiv1.network.api.swarmui.SwarmUiApi +import dev.minios.pdaiv1.network.response.SwarmUiModelsResponse import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Single diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/remote/SwarmUiModelsRemoteDataSourceTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/remote/SwarmUiModelsRemoteDataSourceTest.kt similarity index 85% rename from data/src/test/java/com/shifthackz/aisdv1/data/remote/SwarmUiModelsRemoteDataSourceTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/remote/SwarmUiModelsRemoteDataSourceTest.kt index e4a68d0d6..a8524f3d6 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/remote/SwarmUiModelsRemoteDataSourceTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/remote/SwarmUiModelsRemoteDataSourceTest.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.data.mocks.mockSwarmUiModelsRaw -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.entity.SwarmUiModel -import com.shifthackz.aisdv1.network.api.swarmui.SwarmUiApi -import com.shifthackz.aisdv1.network.response.SwarmUiModelsResponse +import dev.minios.pdaiv1.data.mocks.mockSwarmUiModelsRaw +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.entity.SwarmUiModel +import dev.minios.pdaiv1.network.api.swarmui.SwarmUiApi +import dev.minios.pdaiv1.network.response.SwarmUiModelsResponse import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Single diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/remote/SwarmUiSessionDataSourceImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/remote/SwarmUiSessionDataSourceImplTest.kt similarity index 89% rename from data/src/test/java/com/shifthackz/aisdv1/data/remote/SwarmUiSessionDataSourceImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/remote/SwarmUiSessionDataSourceImplTest.kt index 6a1a3aa37..463caacc4 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/remote/SwarmUiSessionDataSourceImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/remote/SwarmUiSessionDataSourceImplTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.data.remote +package dev.minios.pdaiv1.data.remote -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.preference.SessionPreference -import com.shifthackz.aisdv1.network.api.swarmui.SwarmUiApi -import com.shifthackz.aisdv1.network.response.SwarmUiSessionResponse +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.preference.SessionPreference +import dev.minios.pdaiv1.network.api.swarmui.SwarmUiApi +import dev.minios.pdaiv1.network.response.SwarmUiSessionResponse import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Single diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/DownloadableModelRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/DownloadableModelRepositoryImplTest.kt similarity index 93% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/DownloadableModelRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/DownloadableModelRepositoryImplTest.kt index b246a019f..863f76150 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/DownloadableModelRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/DownloadableModelRepositoryImplTest.kt @@ -1,12 +1,12 @@ -package com.shifthackz.aisdv1.data.repository - -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.core.common.appbuild.BuildType -import com.shifthackz.aisdv1.data.mocks.mockLocalAiModel -import com.shifthackz.aisdv1.data.mocks.mockLocalAiModels -import com.shifthackz.aisdv1.domain.datasource.DownloadableModelDataSource -import com.shifthackz.aisdv1.domain.entity.DownloadState -import com.shifthackz.aisdv1.domain.entity.LocalAiModel +package dev.minios.pdaiv1.data.repository + +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.core.common.appbuild.BuildType +import dev.minios.pdaiv1.data.mocks.mockLocalAiModel +import dev.minios.pdaiv1.data.mocks.mockLocalAiModels +import dev.minios.pdaiv1.domain.datasource.DownloadableModelDataSource +import dev.minios.pdaiv1.domain.entity.DownloadState +import dev.minios.pdaiv1.domain.entity.LocalAiModel import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.BackpressureStrategy @@ -226,7 +226,7 @@ class DownloadableModelRepositoryImplTest { } returns Single.just(mockLocalAiModel) val stubObserver = repository - .download("5598", "https://moroz.cc/stub.zip") + .download("5598", "https://example.com/stub.zip") .test() stubDownloadState.onNext(DownloadState.Unknown) @@ -261,7 +261,7 @@ class DownloadableModelRepositoryImplTest { } returns Single.just(mockLocalAiModel) val stubObserver = repository - .download("5598", "https://moroz.cc/stub.zip") + .download("5598", "https://example.com/stub.zip") .test() stubDownloadState.onNext(DownloadState.Unknown) @@ -294,7 +294,7 @@ class DownloadableModelRepositoryImplTest { } returns Observable.error(stubException) repository - .download("5598", "https://moroz.cc/stub.zip") + .download("5598", "https://example.com/stub.zip") .test() .assertError(stubException) .assertNoValues() diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/EmbeddingsRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/EmbeddingsRepositoryImplTest.kt similarity index 97% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/EmbeddingsRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/EmbeddingsRepositoryImplTest.kt index 74e044b10..1ff3f5f63 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/EmbeddingsRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/EmbeddingsRepositoryImplTest.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.data.mocks.mockEmbeddings -import com.shifthackz.aisdv1.domain.datasource.EmbeddingsDataSource -import com.shifthackz.aisdv1.domain.datasource.SwarmUiSessionDataSource -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.data.mocks.mockEmbeddings +import dev.minios.pdaiv1.domain.datasource.EmbeddingsDataSource +import dev.minios.pdaiv1.domain.datasource.SwarmUiSessionDataSource +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.preference.PreferenceManager import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/FalAiEndpointRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/FalAiEndpointRepositoryImplTest.kt similarity index 96% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/FalAiEndpointRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/FalAiEndpointRepositoryImplTest.kt index 8d054db16..018f39e63 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/FalAiEndpointRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/FalAiEndpointRepositoryImplTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.data.mocks.mockFalAiEndpoint -import com.shifthackz.aisdv1.data.mocks.mockFalAiEndpoints -import com.shifthackz.aisdv1.domain.datasource.FalAiEndpointDataSource -import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.data.mocks.mockFalAiEndpoint +import dev.minios.pdaiv1.data.mocks.mockFalAiEndpoints +import dev.minios.pdaiv1.domain.datasource.FalAiEndpointDataSource +import dev.minios.pdaiv1.domain.preference.PreferenceManager import io.mockk.every import io.mockk.mockk import io.mockk.verify diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/FalAiGenerationRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/FalAiGenerationRepositoryImplTest.kt similarity index 90% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/FalAiGenerationRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/FalAiGenerationRepositoryImplTest.kt index 63b75cc5a..705c6d58a 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/FalAiGenerationRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/FalAiGenerationRepositoryImplTest.kt @@ -1,13 +1,13 @@ -package com.shifthackz.aisdv1.data.repository - -import com.shifthackz.aisdv1.data.mocks.mockAiGenerationResult -import com.shifthackz.aisdv1.data.mocks.mockAiGenerationResults -import com.shifthackz.aisdv1.data.mocks.mockTextToImagePayload -import com.shifthackz.aisdv1.domain.datasource.FalAiGenerationDataSource -import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint -import com.shifthackz.aisdv1.domain.entity.FalAiEndpointCategory -import com.shifthackz.aisdv1.domain.entity.FalAiEndpointSchema -import com.shifthackz.aisdv1.domain.repository.FalAiEndpointRepository +package dev.minios.pdaiv1.data.repository + +import dev.minios.pdaiv1.data.mocks.mockAiGenerationResult +import dev.minios.pdaiv1.data.mocks.mockAiGenerationResults +import dev.minios.pdaiv1.data.mocks.mockTextToImagePayload +import dev.minios.pdaiv1.domain.datasource.FalAiGenerationDataSource +import dev.minios.pdaiv1.domain.entity.FalAiEndpoint +import dev.minios.pdaiv1.domain.entity.FalAiEndpointCategory +import dev.minios.pdaiv1.domain.entity.FalAiEndpointSchema +import dev.minios.pdaiv1.domain.repository.FalAiEndpointRepository import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Single diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/ForgeModulesRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/ForgeModulesRepositoryImplTest.kt similarity index 90% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/ForgeModulesRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/ForgeModulesRepositoryImplTest.kt index 30ade2e6c..af557dc40 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/ForgeModulesRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/ForgeModulesRepositoryImplTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.data.provider.ServerUrlProvider -import com.shifthackz.aisdv1.domain.entity.ForgeModule -import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi -import com.shifthackz.aisdv1.network.model.ForgeModuleRaw +import dev.minios.pdaiv1.data.provider.ServerUrlProvider +import dev.minios.pdaiv1.domain.entity.ForgeModule +import dev.minios.pdaiv1.network.api.automatic1111.Automatic1111RestApi +import dev.minios.pdaiv1.network.model.ForgeModuleRaw import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Single diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/GenerationResultRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/GenerationResultRepositoryImplTest.kt similarity index 95% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/GenerationResultRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/GenerationResultRepositoryImplTest.kt index 60733643f..e2236d820 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/GenerationResultRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/GenerationResultRepositoryImplTest.kt @@ -1,13 +1,13 @@ -package com.shifthackz.aisdv1.data.repository - -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.data.mocks.mockAiGenerationResult -import com.shifthackz.aisdv1.data.mocks.mockAiGenerationResults -import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource -import com.shifthackz.aisdv1.domain.entity.MediaStoreInfo -import com.shifthackz.aisdv1.domain.feature.MediaFileManager -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway -import com.shifthackz.aisdv1.domain.preference.PreferenceManager +package dev.minios.pdaiv1.data.repository + +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.data.mocks.mockAiGenerationResult +import dev.minios.pdaiv1.data.mocks.mockAiGenerationResults +import dev.minios.pdaiv1.domain.datasource.GenerationResultDataSource +import dev.minios.pdaiv1.domain.entity.MediaStoreInfo +import dev.minios.pdaiv1.domain.feature.MediaFileManager +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.domain.preference.PreferenceManager import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/HordeGenerationRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/HordeGenerationRepositoryImplTest.kt similarity index 89% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/HordeGenerationRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/HordeGenerationRepositoryImplTest.kt index aac8a8b79..d0eaad8c9 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/HordeGenerationRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/HordeGenerationRepositoryImplTest.kt @@ -1,16 +1,16 @@ -package com.shifthackz.aisdv1.data.repository - -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.data.mocks.mockAiGenerationResult -import com.shifthackz.aisdv1.data.mocks.mockImageToImagePayload -import com.shifthackz.aisdv1.data.mocks.mockTextToImagePayload -import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource -import com.shifthackz.aisdv1.domain.datasource.HordeGenerationDataSource -import com.shifthackz.aisdv1.domain.entity.HordeProcessStatus -import com.shifthackz.aisdv1.domain.feature.MediaFileManager -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway -import com.shifthackz.aisdv1.domain.preference.PreferenceManager +package dev.minios.pdaiv1.data.repository + +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.data.mocks.mockAiGenerationResult +import dev.minios.pdaiv1.data.mocks.mockImageToImagePayload +import dev.minios.pdaiv1.data.mocks.mockTextToImagePayload +import dev.minios.pdaiv1.domain.datasource.GenerationResultDataSource +import dev.minios.pdaiv1.domain.datasource.HordeGenerationDataSource +import dev.minios.pdaiv1.domain.entity.HordeProcessStatus +import dev.minios.pdaiv1.domain.feature.MediaFileManager +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.domain.preference.PreferenceManager import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.BackpressureStrategy diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/HuggingFaceGenerationRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/HuggingFaceGenerationRepositoryImplTest.kt similarity index 86% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/HuggingFaceGenerationRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/HuggingFaceGenerationRepositoryImplTest.kt index dca79e23f..b4d2b709d 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/HuggingFaceGenerationRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/HuggingFaceGenerationRepositoryImplTest.kt @@ -1,15 +1,15 @@ -package com.shifthackz.aisdv1.data.repository - -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.data.mocks.mockAiGenerationResult -import com.shifthackz.aisdv1.data.mocks.mockImageToImagePayload -import com.shifthackz.aisdv1.data.mocks.mockTextToImagePayload -import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource -import com.shifthackz.aisdv1.domain.datasource.HuggingFaceGenerationDataSource -import com.shifthackz.aisdv1.domain.feature.MediaFileManager -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway -import com.shifthackz.aisdv1.domain.preference.PreferenceManager +package dev.minios.pdaiv1.data.repository + +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.data.mocks.mockAiGenerationResult +import dev.minios.pdaiv1.data.mocks.mockImageToImagePayload +import dev.minios.pdaiv1.data.mocks.mockTextToImagePayload +import dev.minios.pdaiv1.domain.datasource.GenerationResultDataSource +import dev.minios.pdaiv1.domain.datasource.HuggingFaceGenerationDataSource +import dev.minios.pdaiv1.domain.feature.MediaFileManager +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.domain.preference.PreferenceManager import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Single diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/HuggingFaceModelsRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/HuggingFaceModelsRepositoryImplTest.kt similarity index 96% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/HuggingFaceModelsRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/HuggingFaceModelsRepositoryImplTest.kt index e6cb8716c..bc282bb50 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/HuggingFaceModelsRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/HuggingFaceModelsRepositoryImplTest.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.data.mocks.mockHuggingFaceModels -import com.shifthackz.aisdv1.domain.datasource.HuggingFaceModelsDataSource +import dev.minios.pdaiv1.data.mocks.mockHuggingFaceModels +import dev.minios.pdaiv1.domain.datasource.HuggingFaceModelsDataSource import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/LocalDiffusionGenerationRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/LocalDiffusionGenerationRepositoryImplTest.kt similarity index 87% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/LocalDiffusionGenerationRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/LocalDiffusionGenerationRepositoryImplTest.kt index a598bbc8e..db2628a08 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/LocalDiffusionGenerationRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/LocalDiffusionGenerationRepositoryImplTest.kt @@ -1,21 +1,21 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository import android.graphics.Bitmap -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersToken -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.core.imageprocessing.BitmapToBase64Converter -import com.shifthackz.aisdv1.data.mocks.mockLocalAiModel -import com.shifthackz.aisdv1.data.mocks.mockTextToImagePayload -import com.shifthackz.aisdv1.domain.datasource.DownloadableModelDataSource -import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.LocalDiffusionStatus -import com.shifthackz.aisdv1.domain.feature.MediaFileManager -import com.shifthackz.aisdv1.domain.feature.diffusion.LocalDiffusion -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway -import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.schedulers.SchedulersToken +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.core.imageprocessing.BitmapToBase64Converter +import dev.minios.pdaiv1.data.mocks.mockLocalAiModel +import dev.minios.pdaiv1.data.mocks.mockTextToImagePayload +import dev.minios.pdaiv1.domain.datasource.DownloadableModelDataSource +import dev.minios.pdaiv1.domain.datasource.GenerationResultDataSource +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.LocalDiffusionStatus +import dev.minios.pdaiv1.domain.feature.MediaFileManager +import dev.minios.pdaiv1.domain.feature.diffusion.LocalDiffusion +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.domain.preference.PreferenceManager import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/LorasRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/LorasRepositoryImplTest.kt similarity index 96% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/LorasRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/LorasRepositoryImplTest.kt index 3bff4b372..e9dca1e2f 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/LorasRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/LorasRepositoryImplTest.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.data.mocks.mockStableDiffusionLoras -import com.shifthackz.aisdv1.domain.datasource.LorasDataSource -import com.shifthackz.aisdv1.domain.datasource.SwarmUiSessionDataSource -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.data.mocks.mockStableDiffusionLoras +import dev.minios.pdaiv1.domain.datasource.LorasDataSource +import dev.minios.pdaiv1.domain.datasource.SwarmUiSessionDataSource +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.preference.PreferenceManager import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/OpenAiGenerationRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/OpenAiGenerationRepositoryImplTest.kt similarity index 84% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/OpenAiGenerationRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/OpenAiGenerationRepositoryImplTest.kt index ee166a9a2..875de8cb0 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/OpenAiGenerationRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/OpenAiGenerationRepositoryImplTest.kt @@ -1,14 +1,14 @@ -package com.shifthackz.aisdv1.data.repository - -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.data.mocks.mockAiGenerationResult -import com.shifthackz.aisdv1.data.mocks.mockTextToImagePayload -import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource -import com.shifthackz.aisdv1.domain.datasource.OpenAiGenerationDataSource -import com.shifthackz.aisdv1.domain.feature.MediaFileManager -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway -import com.shifthackz.aisdv1.domain.preference.PreferenceManager +package dev.minios.pdaiv1.data.repository + +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.data.mocks.mockAiGenerationResult +import dev.minios.pdaiv1.data.mocks.mockTextToImagePayload +import dev.minios.pdaiv1.domain.datasource.GenerationResultDataSource +import dev.minios.pdaiv1.domain.datasource.OpenAiGenerationDataSource +import dev.minios.pdaiv1.domain.feature.MediaFileManager +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.domain.preference.PreferenceManager import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Single diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/QnnGenerationRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/QnnGenerationRepositoryImplTest.kt similarity index 86% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/QnnGenerationRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/QnnGenerationRepositoryImplTest.kt index 9f727611b..798ebbf94 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/QnnGenerationRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/QnnGenerationRepositoryImplTest.kt @@ -1,20 +1,20 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository import android.graphics.Bitmap -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.core.imageprocessing.BitmapToBase64Converter -import com.shifthackz.aisdv1.data.mocks.mockImageToImagePayload -import com.shifthackz.aisdv1.data.mocks.mockTextToImagePayload -import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.LocalDiffusionStatus -import com.shifthackz.aisdv1.domain.feature.MediaFileManager -import com.shifthackz.aisdv1.domain.feature.qnn.LocalQnn -import com.shifthackz.aisdv1.domain.feature.qnn.QnnGenerationResult -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.core.imageprocessing.BitmapToBase64Converter +import dev.minios.pdaiv1.data.mocks.mockImageToImagePayload +import dev.minios.pdaiv1.data.mocks.mockTextToImagePayload +import dev.minios.pdaiv1.domain.datasource.GenerationResultDataSource +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.LocalDiffusionStatus +import dev.minios.pdaiv1.domain.feature.MediaFileManager +import dev.minios.pdaiv1.domain.feature.qnn.LocalQnn +import dev.minios.pdaiv1.domain.feature.qnn.QnnGenerationResult +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/RandomImageRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/RandomImageRepositoryImplTest.kt similarity index 91% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/RandomImageRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/RandomImageRepositoryImplTest.kt index 4bbef387d..4ec4b8548 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/RandomImageRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/RandomImageRepositoryImplTest.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository import android.graphics.Bitmap -import com.shifthackz.aisdv1.domain.datasource.RandomImageDataSource +import dev.minios.pdaiv1.domain.datasource.RandomImageDataSource import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Single diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/ServerConfigurationRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/ServerConfigurationRepositoryImplTest.kt similarity index 96% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/ServerConfigurationRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/ServerConfigurationRepositoryImplTest.kt index 4667890c8..418e26fe2 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/ServerConfigurationRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/ServerConfigurationRepositoryImplTest.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.data.mocks.mockServerConfiguration -import com.shifthackz.aisdv1.domain.datasource.ServerConfigurationDataSource +import dev.minios.pdaiv1.data.mocks.mockServerConfiguration +import dev.minios.pdaiv1.domain.datasource.ServerConfigurationDataSource import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/StabilityAiCreditsRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/StabilityAiCreditsRepositoryImplTest.kt similarity index 98% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/StabilityAiCreditsRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/StabilityAiCreditsRepositoryImplTest.kt index 7ef7f17a9..9934cd1ee 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/StabilityAiCreditsRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/StabilityAiCreditsRepositoryImplTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.domain.datasource.StabilityAiCreditsDataSource -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.datasource.StabilityAiCreditsDataSource +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.preference.PreferenceManager import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.BackpressureStrategy diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/StabilityAiEnginesRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/StabilityAiEnginesRepositoryImplTest.kt similarity index 90% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/StabilityAiEnginesRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/StabilityAiEnginesRepositoryImplTest.kt index 24a1b3194..00b5d4f37 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/StabilityAiEnginesRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/StabilityAiEnginesRepositoryImplTest.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.data.mocks.mockStabilityAiEngines -import com.shifthackz.aisdv1.domain.datasource.StabilityAiEnginesDataSource +import dev.minios.pdaiv1.data.mocks.mockStabilityAiEngines +import dev.minios.pdaiv1.domain.datasource.StabilityAiEnginesDataSource import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Single diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/StabilityAiGenerationRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/StabilityAiGenerationRepositoryImplTest.kt similarity index 87% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/StabilityAiGenerationRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/StabilityAiGenerationRepositoryImplTest.kt index 52a881ca3..851639ab8 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/StabilityAiGenerationRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/StabilityAiGenerationRepositoryImplTest.kt @@ -1,17 +1,17 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository import android.graphics.Bitmap -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.data.mocks.mockAiGenerationResult -import com.shifthackz.aisdv1.data.mocks.mockImageToImagePayload -import com.shifthackz.aisdv1.data.mocks.mockTextToImagePayload -import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource -import com.shifthackz.aisdv1.domain.datasource.StabilityAiCreditsDataSource -import com.shifthackz.aisdv1.domain.datasource.StabilityAiGenerationDataSource -import com.shifthackz.aisdv1.domain.feature.MediaFileManager -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway -import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.data.mocks.mockAiGenerationResult +import dev.minios.pdaiv1.data.mocks.mockImageToImagePayload +import dev.minios.pdaiv1.data.mocks.mockTextToImagePayload +import dev.minios.pdaiv1.domain.datasource.GenerationResultDataSource +import dev.minios.pdaiv1.domain.datasource.StabilityAiCreditsDataSource +import dev.minios.pdaiv1.domain.datasource.StabilityAiGenerationDataSource +import dev.minios.pdaiv1.domain.feature.MediaFileManager +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.domain.preference.PreferenceManager import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/StableDiffusionGenerationRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/StableDiffusionGenerationRepositoryImplTest.kt similarity index 91% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/StableDiffusionGenerationRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/StableDiffusionGenerationRepositoryImplTest.kt index f436fb9e3..e8a1dd1fb 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/StableDiffusionGenerationRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/StableDiffusionGenerationRepositoryImplTest.kt @@ -1,17 +1,17 @@ -package com.shifthackz.aisdv1.data.repository - -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.data.mocks.mockAiGenerationResult -import com.shifthackz.aisdv1.data.mocks.mockImageToImagePayload -import com.shifthackz.aisdv1.data.mocks.mockTextToImagePayload -import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource -import com.shifthackz.aisdv1.domain.datasource.StableDiffusionGenerationDataSource -import com.shifthackz.aisdv1.domain.demo.ImageToImageDemo -import com.shifthackz.aisdv1.domain.demo.TextToImageDemo -import com.shifthackz.aisdv1.domain.feature.MediaFileManager -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway -import com.shifthackz.aisdv1.domain.preference.PreferenceManager +package dev.minios.pdaiv1.data.repository + +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.data.mocks.mockAiGenerationResult +import dev.minios.pdaiv1.data.mocks.mockImageToImagePayload +import dev.minios.pdaiv1.data.mocks.mockTextToImagePayload +import dev.minios.pdaiv1.domain.datasource.GenerationResultDataSource +import dev.minios.pdaiv1.domain.datasource.StableDiffusionGenerationDataSource +import dev.minios.pdaiv1.domain.demo.ImageToImageDemo +import dev.minios.pdaiv1.domain.demo.TextToImageDemo +import dev.minios.pdaiv1.domain.feature.MediaFileManager +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.domain.preference.PreferenceManager import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/StableDiffusionHyperNetworksRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/StableDiffusionHyperNetworksRepositoryImplTest.kt similarity index 96% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/StableDiffusionHyperNetworksRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/StableDiffusionHyperNetworksRepositoryImplTest.kt index 7764e2c53..02bed4c07 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/StableDiffusionHyperNetworksRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/StableDiffusionHyperNetworksRepositoryImplTest.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.data.mocks.mockStableDiffusionHyperNetworks -import com.shifthackz.aisdv1.domain.datasource.StableDiffusionHyperNetworksDataSource +import dev.minios.pdaiv1.data.mocks.mockStableDiffusionHyperNetworks +import dev.minios.pdaiv1.domain.datasource.StableDiffusionHyperNetworksDataSource import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/StableDiffusionModelsRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/StableDiffusionModelsRepositoryImplTest.kt similarity index 95% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/StableDiffusionModelsRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/StableDiffusionModelsRepositoryImplTest.kt index 6ab990f65..c9ea4a756 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/StableDiffusionModelsRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/StableDiffusionModelsRepositoryImplTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository import com.nhaarman.mockitokotlin2.mock -import com.shifthackz.aisdv1.data.mocks.mockStableDiffusionModels -import com.shifthackz.aisdv1.data.mocks.mockStableDiffusionSamplers -import com.shifthackz.aisdv1.domain.datasource.StableDiffusionModelsDataSource +import dev.minios.pdaiv1.data.mocks.mockStableDiffusionModels +import dev.minios.pdaiv1.data.mocks.mockStableDiffusionSamplers +import dev.minios.pdaiv1.domain.datasource.StableDiffusionModelsDataSource import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/StableDiffusionSamplersRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/StableDiffusionSamplersRepositoryImplTest.kt similarity index 94% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/StableDiffusionSamplersRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/StableDiffusionSamplersRepositoryImplTest.kt index d703e3b13..084c331ec 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/StableDiffusionSamplersRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/StableDiffusionSamplersRepositoryImplTest.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.data.mocks.mockStableDiffusionSamplers -import com.shifthackz.aisdv1.domain.datasource.StableDiffusionSamplersDataSource +import dev.minios.pdaiv1.data.mocks.mockStableDiffusionSamplers +import dev.minios.pdaiv1.domain.datasource.StableDiffusionSamplersDataSource import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/SupportersRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/SupportersRepositoryImplTest.kt similarity index 96% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/SupportersRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/SupportersRepositoryImplTest.kt index c1eaa7799..968401f8b 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/SupportersRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/SupportersRepositoryImplTest.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.data.mocks.mockSupporters -import com.shifthackz.aisdv1.domain.datasource.SupportersDataSource +import dev.minios.pdaiv1.data.mocks.mockSupporters +import dev.minios.pdaiv1.domain.datasource.SupportersDataSource import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/SwarmUiGenerationRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/SwarmUiGenerationRepositoryImplTest.kt similarity index 88% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/SwarmUiGenerationRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/SwarmUiGenerationRepositoryImplTest.kt index 772350d26..9d6790684 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/SwarmUiGenerationRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/SwarmUiGenerationRepositoryImplTest.kt @@ -1,16 +1,16 @@ -package com.shifthackz.aisdv1.data.repository - -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.data.mocks.mockAiGenerationResult -import com.shifthackz.aisdv1.data.mocks.mockImageToImagePayload -import com.shifthackz.aisdv1.data.mocks.mockTextToImagePayload -import com.shifthackz.aisdv1.domain.datasource.GenerationResultDataSource -import com.shifthackz.aisdv1.domain.datasource.SwarmUiGenerationDataSource -import com.shifthackz.aisdv1.domain.datasource.SwarmUiSessionDataSource -import com.shifthackz.aisdv1.domain.feature.MediaFileManager -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway -import com.shifthackz.aisdv1.domain.preference.PreferenceManager +package dev.minios.pdaiv1.data.repository + +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.data.mocks.mockAiGenerationResult +import dev.minios.pdaiv1.data.mocks.mockImageToImagePayload +import dev.minios.pdaiv1.data.mocks.mockTextToImagePayload +import dev.minios.pdaiv1.domain.datasource.GenerationResultDataSource +import dev.minios.pdaiv1.domain.datasource.SwarmUiGenerationDataSource +import dev.minios.pdaiv1.domain.datasource.SwarmUiSessionDataSource +import dev.minios.pdaiv1.domain.feature.MediaFileManager +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.domain.preference.PreferenceManager import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Single diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/SwarmUiModelsRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/SwarmUiModelsRepositoryImplTest.kt similarity index 95% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/SwarmUiModelsRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/SwarmUiModelsRepositoryImplTest.kt index ca6cb6cf8..182cc692c 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/SwarmUiModelsRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/SwarmUiModelsRepositoryImplTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.data.mocks.mockSwarmUiModels -import com.shifthackz.aisdv1.domain.datasource.SwarmUiModelsDataSource -import com.shifthackz.aisdv1.domain.datasource.SwarmUiSessionDataSource +import dev.minios.pdaiv1.data.mocks.mockSwarmUiModels +import dev.minios.pdaiv1.domain.datasource.SwarmUiModelsDataSource +import dev.minios.pdaiv1.domain.datasource.SwarmUiSessionDataSource import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/TemporaryGenerationResultRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/TemporaryGenerationResultRepositoryImplTest.kt similarity index 89% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/TemporaryGenerationResultRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/TemporaryGenerationResultRepositoryImplTest.kt index 989f80600..f0a67692e 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/TemporaryGenerationResultRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/TemporaryGenerationResultRepositoryImplTest.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository -import com.shifthackz.aisdv1.data.mocks.mockAiGenerationResult +import dev.minios.pdaiv1.data.mocks.mockAiGenerationResult import org.junit.Test class TemporaryGenerationResultRepositoryImplTest { diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/repository/WakeLockRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/WakeLockRepositoryImplTest.kt similarity index 96% rename from data/src/test/java/com/shifthackz/aisdv1/data/repository/WakeLockRepositoryImplTest.kt rename to data/src/test/java/dev/minios/pdaiv1/data/repository/WakeLockRepositoryImplTest.kt index 6e7964828..47bab5c7c 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/repository/WakeLockRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/WakeLockRepositoryImplTest.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.data.repository +package dev.minios.pdaiv1.data.repository import android.os.PowerManager import io.mockk.every diff --git a/demo/build.gradle.kts b/demo/build.gradle.kts index 5f4b0b294..13890a847 100644 --- a/demo/build.gradle.kts +++ b/demo/build.gradle.kts @@ -3,7 +3,7 @@ plugins { } android { - namespace = "com.shifthackz.aisdv1.demo" + namespace = "dev.minios.pdaiv1.demo" } dependencies { diff --git a/demo/src/main/java/com/shifthackz/aisdv1/demo/DemoFeature.kt b/demo/src/main/java/dev/minios/pdaiv1/demo/DemoFeature.kt similarity index 82% rename from demo/src/main/java/com/shifthackz/aisdv1/demo/DemoFeature.kt rename to demo/src/main/java/dev/minios/pdaiv1/demo/DemoFeature.kt index 44e623c35..9c5bb4a32 100644 --- a/demo/src/main/java/com/shifthackz/aisdv1/demo/DemoFeature.kt +++ b/demo/src/main/java/dev/minios/pdaiv1/demo/DemoFeature.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.demo +package dev.minios.pdaiv1.demo -import com.shifthackz.aisdv1.demo.serialize.DemoDataSerializer -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.demo.serialize.DemoDataSerializer +import dev.minios.pdaiv1.domain.entity.AiGenerationResult import io.reactivex.rxjava3.core.Single import java.util.concurrent.TimeUnit import kotlin.random.Random diff --git a/demo/src/main/java/com/shifthackz/aisdv1/demo/ImageToImageDemoImpl.kt b/demo/src/main/java/dev/minios/pdaiv1/demo/ImageToImageDemoImpl.kt similarity index 76% rename from demo/src/main/java/com/shifthackz/aisdv1/demo/ImageToImageDemoImpl.kt rename to demo/src/main/java/dev/minios/pdaiv1/demo/ImageToImageDemoImpl.kt index 128582ffa..bb63cee7b 100644 --- a/demo/src/main/java/com/shifthackz/aisdv1/demo/ImageToImageDemoImpl.kt +++ b/demo/src/main/java/dev/minios/pdaiv1/demo/ImageToImageDemoImpl.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.demo +package dev.minios.pdaiv1.demo -import com.shifthackz.aisdv1.core.common.time.TimeProvider -import com.shifthackz.aisdv1.demo.serialize.DemoDataSerializer -import com.shifthackz.aisdv1.domain.demo.ImageToImageDemo -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.core.common.time.TimeProvider +import dev.minios.pdaiv1.demo.serialize.DemoDataSerializer +import dev.minios.pdaiv1.domain.demo.ImageToImageDemo +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload internal class ImageToImageDemoImpl( override val demoDataSerializer: DemoDataSerializer, diff --git a/demo/src/main/java/com/shifthackz/aisdv1/demo/TextToImageDemoImpl.kt b/demo/src/main/java/dev/minios/pdaiv1/demo/TextToImageDemoImpl.kt similarity index 76% rename from demo/src/main/java/com/shifthackz/aisdv1/demo/TextToImageDemoImpl.kt rename to demo/src/main/java/dev/minios/pdaiv1/demo/TextToImageDemoImpl.kt index 429e5aea2..9f219c8f9 100644 --- a/demo/src/main/java/com/shifthackz/aisdv1/demo/TextToImageDemoImpl.kt +++ b/demo/src/main/java/dev/minios/pdaiv1/demo/TextToImageDemoImpl.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.demo +package dev.minios.pdaiv1.demo -import com.shifthackz.aisdv1.core.common.time.TimeProvider -import com.shifthackz.aisdv1.demo.serialize.DemoDataSerializer -import com.shifthackz.aisdv1.domain.demo.TextToImageDemo -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.core.common.time.TimeProvider +import dev.minios.pdaiv1.demo.serialize.DemoDataSerializer +import dev.minios.pdaiv1.domain.demo.TextToImageDemo +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.TextToImagePayload internal class TextToImageDemoImpl( override val demoDataSerializer: DemoDataSerializer, diff --git a/demo/src/main/java/com/shifthackz/aisdv1/demo/di/DemoModule.kt b/demo/src/main/java/dev/minios/pdaiv1/demo/di/DemoModule.kt similarity index 50% rename from demo/src/main/java/com/shifthackz/aisdv1/demo/di/DemoModule.kt rename to demo/src/main/java/dev/minios/pdaiv1/demo/di/DemoModule.kt index b1f57c648..3a98d2bc7 100644 --- a/demo/src/main/java/com/shifthackz/aisdv1/demo/di/DemoModule.kt +++ b/demo/src/main/java/dev/minios/pdaiv1/demo/di/DemoModule.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.demo.di +package dev.minios.pdaiv1.demo.di -import com.shifthackz.aisdv1.demo.ImageToImageDemoImpl -import com.shifthackz.aisdv1.demo.TextToImageDemoImpl -import com.shifthackz.aisdv1.demo.serialize.DemoDataSerializer -import com.shifthackz.aisdv1.domain.demo.ImageToImageDemo -import com.shifthackz.aisdv1.domain.demo.TextToImageDemo +import dev.minios.pdaiv1.demo.ImageToImageDemoImpl +import dev.minios.pdaiv1.demo.TextToImageDemoImpl +import dev.minios.pdaiv1.demo.serialize.DemoDataSerializer +import dev.minios.pdaiv1.domain.demo.ImageToImageDemo +import dev.minios.pdaiv1.domain.demo.TextToImageDemo import org.koin.core.module.dsl.factoryOf import org.koin.core.module.dsl.singleOf import org.koin.dsl.bind diff --git a/demo/src/main/java/com/shifthackz/aisdv1/demo/serialize/DemoDataSerializer.kt b/demo/src/main/java/dev/minios/pdaiv1/demo/serialize/DemoDataSerializer.kt similarity index 99% rename from demo/src/main/java/com/shifthackz/aisdv1/demo/serialize/DemoDataSerializer.kt rename to demo/src/main/java/dev/minios/pdaiv1/demo/serialize/DemoDataSerializer.kt index 7d2d25412..998dc37b5 100644 --- a/demo/src/main/java/com/shifthackz/aisdv1/demo/serialize/DemoDataSerializer.kt +++ b/demo/src/main/java/dev/minios/pdaiv1/demo/serialize/DemoDataSerializer.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.demo.serialize +package dev.minios.pdaiv1.demo.serialize internal class DemoDataSerializer { diff --git a/demo/src/test/java/com/shifthackz/aisdv1/demo/ImageToImageDemoImplTest.kt b/demo/src/test/java/dev/minios/pdaiv1/demo/ImageToImageDemoImplTest.kt similarity index 82% rename from demo/src/test/java/com/shifthackz/aisdv1/demo/ImageToImageDemoImplTest.kt rename to demo/src/test/java/dev/minios/pdaiv1/demo/ImageToImageDemoImplTest.kt index 77b5c39c3..b0454f7ed 100644 --- a/demo/src/test/java/com/shifthackz/aisdv1/demo/ImageToImageDemoImplTest.kt +++ b/demo/src/test/java/dev/minios/pdaiv1/demo/ImageToImageDemoImplTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.demo +package dev.minios.pdaiv1.demo -import com.shifthackz.aisdv1.core.common.time.TimeProvider -import com.shifthackz.aisdv1.demo.mocks.mockImageToImagePayload -import com.shifthackz.aisdv1.demo.serialize.DemoDataSerializer +import dev.minios.pdaiv1.core.common.time.TimeProvider +import dev.minios.pdaiv1.demo.mocks.mockImageToImagePayload +import dev.minios.pdaiv1.demo.serialize.DemoDataSerializer import io.mockk.every import io.mockk.mockk import org.junit.Before diff --git a/demo/src/test/java/com/shifthackz/aisdv1/demo/TextToImageDemoImplTest.kt b/demo/src/test/java/dev/minios/pdaiv1/demo/TextToImageDemoImplTest.kt similarity index 82% rename from demo/src/test/java/com/shifthackz/aisdv1/demo/TextToImageDemoImplTest.kt rename to demo/src/test/java/dev/minios/pdaiv1/demo/TextToImageDemoImplTest.kt index a96626e4b..be4b4ec56 100644 --- a/demo/src/test/java/com/shifthackz/aisdv1/demo/TextToImageDemoImplTest.kt +++ b/demo/src/test/java/dev/minios/pdaiv1/demo/TextToImageDemoImplTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.demo +package dev.minios.pdaiv1.demo -import com.shifthackz.aisdv1.core.common.time.TimeProvider -import com.shifthackz.aisdv1.demo.mocks.mockTextToImagePayload -import com.shifthackz.aisdv1.demo.serialize.DemoDataSerializer +import dev.minios.pdaiv1.core.common.time.TimeProvider +import dev.minios.pdaiv1.demo.mocks.mockTextToImagePayload +import dev.minios.pdaiv1.demo.serialize.DemoDataSerializer import io.mockk.every import io.mockk.mockk import org.junit.Before diff --git a/demo/src/test/java/com/shifthackz/aisdv1/demo/mocks/ImageToImagePayloadMocks.kt b/demo/src/test/java/dev/minios/pdaiv1/demo/mocks/ImageToImagePayloadMocks.kt similarity index 85% rename from demo/src/test/java/com/shifthackz/aisdv1/demo/mocks/ImageToImagePayloadMocks.kt rename to demo/src/test/java/dev/minios/pdaiv1/demo/mocks/ImageToImagePayloadMocks.kt index 1da3962ed..61c099175 100644 --- a/demo/src/test/java/com/shifthackz/aisdv1/demo/mocks/ImageToImagePayloadMocks.kt +++ b/demo/src/test/java/dev/minios/pdaiv1/demo/mocks/ImageToImagePayloadMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.demo.mocks +package dev.minios.pdaiv1.demo.mocks -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload val mockImageToImagePayload = ImageToImagePayload( base64Image = "", diff --git a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/TextToImagePayloadMocks.kt b/demo/src/test/java/dev/minios/pdaiv1/demo/mocks/TextToImagePayloadMocks.kt similarity index 82% rename from data/src/test/java/com/shifthackz/aisdv1/data/mocks/TextToImagePayloadMocks.kt rename to demo/src/test/java/dev/minios/pdaiv1/demo/mocks/TextToImagePayloadMocks.kt index ea38da27c..2523a26e3 100644 --- a/data/src/test/java/com/shifthackz/aisdv1/data/mocks/TextToImagePayloadMocks.kt +++ b/demo/src/test/java/dev/minios/pdaiv1/demo/mocks/TextToImagePayloadMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.data.mocks +package dev.minios.pdaiv1.demo.mocks -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload val mockTextToImagePayload = TextToImagePayload( prompt = "prompt", diff --git a/domain/build.gradle.kts b/domain/build.gradle.kts index bf96cdcdb..78bafa489 100755 --- a/domain/build.gradle.kts +++ b/domain/build.gradle.kts @@ -3,7 +3,7 @@ plugins { } android { - namespace = "com.shifthackz.aisdv1.domain" + namespace = "dev.minios.pdaiv1.domain" } dependencies { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/demo/ImageToImageDemo.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/demo/ImageToImageDemo.kt deleted file mode 100644 index 4f7e3c946..000000000 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/demo/ImageToImageDemo.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.shifthackz.aisdv1.domain.demo - -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import io.reactivex.rxjava3.core.Single - -fun interface ImageToImageDemo { - fun getDemoBase64(payload: ImageToImagePayload): Single -} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/demo/TextToImageDemo.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/demo/TextToImageDemo.kt deleted file mode 100644 index 73b46ae1f..000000000 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/demo/TextToImageDemo.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.shifthackz.aisdv1.domain.demo - -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import io.reactivex.rxjava3.core.Single - -fun interface TextToImageDemo { - fun getDemoBase64(payload: TextToImagePayload): Single -} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/di/DomainModule.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/di/DomainModule.kt deleted file mode 100755 index 2172c4f71..000000000 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/di/DomainModule.kt +++ /dev/null @@ -1,226 +0,0 @@ -package com.shifthackz.aisdv1.domain.di - -import com.shifthackz.aisdv1.domain.interactor.settings.SetupConnectionInterActor -import com.shifthackz.aisdv1.domain.interactor.settings.SetupConnectionInterActorImpl -import com.shifthackz.aisdv1.domain.interactor.wakelock.WakeLockInterActor -import com.shifthackz.aisdv1.domain.interactor.wakelock.WakeLockInterActorImpl -import com.shifthackz.aisdv1.domain.usecase.caching.ClearAppCacheUseCase -import com.shifthackz.aisdv1.domain.usecase.caching.ClearAppCacheUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.caching.DataPreLoaderUseCase -import com.shifthackz.aisdv1.domain.usecase.caching.DataPreLoaderUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.caching.GetLastResultFromCacheUseCase -import com.shifthackz.aisdv1.domain.usecase.caching.GetLastResultFromCacheUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.caching.SaveLastResultToCacheUseCase -import com.shifthackz.aisdv1.domain.usecase.caching.SaveLastResultToCacheUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.connectivity.ObserveSeverConnectivityUseCase -import com.shifthackz.aisdv1.domain.usecase.connectivity.ObserveSeverConnectivityUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.connectivity.PingStableDiffusionServiceUseCase -import com.shifthackz.aisdv1.domain.usecase.connectivity.PingStableDiffusionServiceUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestConnectivityUseCase -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestConnectivityUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestHordeApiKeyUseCase -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestHordeApiKeyUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestHuggingFaceApiKeyUseCase -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestHuggingFaceApiKeyUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestOpenAiApiKeyUseCase -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestOpenAiApiKeyUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestFalAiApiKeyUseCase -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestFalAiApiKeyUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestStabilityAiApiKeyUseCase -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestStabilityAiApiKeyUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestSwarmUiConnectivityUseCase -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestSwarmUiConnectivityUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.debug.DebugInsertBadBase64UseCase -import com.shifthackz.aisdv1.domain.usecase.debug.DebugInsertBadBase64UseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.donate.FetchAndGetSupportersUseCase -import com.shifthackz.aisdv1.domain.usecase.donate.FetchAndGetSupportersUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.downloadable.DeleteModelUseCase -import com.shifthackz.aisdv1.domain.usecase.downloadable.DeleteModelUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.downloadable.DownloadModelUseCase -import com.shifthackz.aisdv1.domain.usecase.downloadable.DownloadModelUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.downloadable.GetLocalMediaPipeModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.downloadable.GetLocalMediaPipeModelsUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.downloadable.GetLocalModelUseCase -import com.shifthackz.aisdv1.domain.usecase.downloadable.GetLocalModelUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.downloadable.GetLocalOnnxModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.downloadable.GetLocalOnnxModelsUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.downloadable.GetLocalQnnModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.downloadable.GetLocalQnnModelsUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.downloadable.ObserveLocalOnnxModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.downloadable.ObserveLocalOnnxModelsUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.downloadable.ScanCustomModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.downloadable.ScanCustomModelsUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.forgemodule.GetForgeModulesUseCase -import com.shifthackz.aisdv1.domain.usecase.forgemodule.GetForgeModulesUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.gallery.DeleteAllGalleryUseCase -import com.shifthackz.aisdv1.domain.usecase.gallery.DeleteAllGalleryUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.gallery.DeleteGalleryItemUseCase -import com.shifthackz.aisdv1.domain.usecase.gallery.DeleteGalleryItemUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.gallery.DeleteGalleryItemsUseCase -import com.shifthackz.aisdv1.domain.usecase.gallery.DeleteGalleryItemsUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.gallery.GetAllGalleryUseCase -import com.shifthackz.aisdv1.domain.usecase.gallery.GetAllGalleryUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.gallery.GetGalleryItemsUseCase -import com.shifthackz.aisdv1.domain.usecase.gallery.GetGalleryItemsUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.gallery.GetGalleryPagedIdsUseCase -import com.shifthackz.aisdv1.domain.usecase.gallery.GetGalleryPagedIdsUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.gallery.GetMediaStoreInfoUseCase -import com.shifthackz.aisdv1.domain.usecase.gallery.GetMediaStoreInfoUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.gallery.ToggleImageVisibilityUseCase -import com.shifthackz.aisdv1.domain.usecase.gallery.ToggleImageVisibilityUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.generation.FalAiGenerationUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.FalAiGenerationUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.generation.GetGenerationResultPagedUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.GetGenerationResultPagedUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.generation.GetGenerationResultUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.GetGenerationResultUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.generation.GetRandomImageUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.GetRandomImageUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.generation.ImageToImageUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.ImageToImageUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.generation.InterruptGenerationUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.InterruptGenerationUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.generation.ObserveHordeProcessStatusUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.ObserveHordeProcessStatusUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.generation.ObserveLocalDiffusionProcessStatusUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.ObserveLocalDiffusionProcessStatusUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.generation.SaveGenerationResultUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.SaveGenerationResultUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.generation.TextToImageUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.TextToImageUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.huggingface.FetchAndGetHuggingFaceModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.huggingface.FetchAndGetHuggingFaceModelsUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.report.SendReportUseCase -import com.shifthackz.aisdv1.domain.usecase.report.SendReportUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.sdembedding.FetchAndGetEmbeddingsUseCase -import com.shifthackz.aisdv1.domain.usecase.sdembedding.FetchAndGetEmbeddingsUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.sdhypernet.FetchAndGetHyperNetworksUseCase -import com.shifthackz.aisdv1.domain.usecase.sdhypernet.FetchAndGetHyperNetworksUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.sdlora.FetchAndGetLorasUseCase -import com.shifthackz.aisdv1.domain.usecase.sdlora.FetchAndGetLorasUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.sdmodel.GetStableDiffusionModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.sdmodel.GetStableDiffusionModelsUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.sdmodel.SelectStableDiffusionModelUseCase -import com.shifthackz.aisdv1.domain.usecase.sdmodel.SelectStableDiffusionModelUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.sdsampler.GetStableDiffusionSamplersUseCase -import com.shifthackz.aisdv1.domain.usecase.sdsampler.GetStableDiffusionSamplersUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToA1111UseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToA1111UseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToHordeUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToHordeUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToHuggingFaceUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToHuggingFaceUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToLocalDiffusionUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToLocalDiffusionUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToMediaPipeUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToMediaPipeUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToQnnUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToQnnUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToOpenAiUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToOpenAiUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToFalAiUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToFalAiUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToStabilityAiUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToStabilityAiUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToSwarmUiUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToSwarmUiUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.settings.GetConfigurationUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.GetConfigurationUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.settings.SetServerConfigurationUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.SetServerConfigurationUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.splash.SplashNavigationUseCase -import com.shifthackz.aisdv1.domain.usecase.splash.SplashNavigationUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.stabilityai.FetchAndGetStabilityAiEnginesUseCase -import com.shifthackz.aisdv1.domain.usecase.stabilityai.FetchAndGetStabilityAiEnginesUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.stabilityai.ObserveStabilityAiCreditsUseCase -import com.shifthackz.aisdv1.domain.usecase.stabilityai.ObserveStabilityAiCreditsUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.swarmmodel.FetchAndGetSwarmUiModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.swarmmodel.FetchAndGetSwarmUiModelsUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.wakelock.AcquireWakelockUseCase -import com.shifthackz.aisdv1.domain.usecase.wakelock.AcquireWakelockUseCaseImpl -import com.shifthackz.aisdv1.domain.usecase.wakelock.ReleaseWakeLockUseCase -import com.shifthackz.aisdv1.domain.usecase.wakelock.ReleaseWakeLockUseCaseImpl -import org.koin.core.module.dsl.factoryOf -import org.koin.dsl.bind -import org.koin.dsl.module - -internal val useCasesModule = module { - factoryOf(::TextToImageUseCaseImpl) bind TextToImageUseCase::class - factoryOf(::ImageToImageUseCaseImpl) bind ImageToImageUseCase::class - factoryOf(::FalAiGenerationUseCaseImpl) bind FalAiGenerationUseCase::class - factoryOf(::PingStableDiffusionServiceUseCaseImpl) bind PingStableDiffusionServiceUseCase::class - factoryOf(::ClearAppCacheUseCaseImpl) bind ClearAppCacheUseCase::class - factoryOf(::DataPreLoaderUseCaseImpl) bind DataPreLoaderUseCase::class - factoryOf(::FetchAndGetSwarmUiModelsUseCaseImpl) bind FetchAndGetSwarmUiModelsUseCase::class - factoryOf(::GetStableDiffusionModelsUseCaseImpl) bind GetStableDiffusionModelsUseCase::class - factoryOf(::SelectStableDiffusionModelUseCaseImpl) bind SelectStableDiffusionModelUseCase::class - factoryOf(::GetGenerationResultPagedUseCaseImpl) bind GetGenerationResultPagedUseCase::class - factoryOf(::GetAllGalleryUseCaseImpl) bind GetAllGalleryUseCase::class - factoryOf(::GetGalleryItemsUseCaseImpl) bind GetGalleryItemsUseCase::class - factoryOf(::GetGalleryPagedIdsUseCaseImpl) bind GetGalleryPagedIdsUseCase::class - factoryOf(::GetGenerationResultUseCaseImpl) bind GetGenerationResultUseCase::class - factoryOf(::DeleteGalleryItemUseCaseImpl) bind DeleteGalleryItemUseCase::class - factoryOf(::DeleteGalleryItemsUseCaseImpl) bind DeleteGalleryItemsUseCase::class - factoryOf(::DeleteAllGalleryUseCaseImpl) bind DeleteAllGalleryUseCase::class - factoryOf(::GetStableDiffusionSamplersUseCaseImpl) bind GetStableDiffusionSamplersUseCase::class - factoryOf(::FetchAndGetLorasUseCaseImpl) bind FetchAndGetLorasUseCase::class - factoryOf(::FetchAndGetHyperNetworksUseCaseImpl) bind FetchAndGetHyperNetworksUseCase::class - factoryOf(::FetchAndGetEmbeddingsUseCaseImpl) bind FetchAndGetEmbeddingsUseCase::class - factoryOf(::GetForgeModulesUseCaseImpl) bind GetForgeModulesUseCase::class - factoryOf(::SplashNavigationUseCaseImpl) bind SplashNavigationUseCase::class - factoryOf(::GetConfigurationUseCaseImpl) bind GetConfigurationUseCase::class - factoryOf(::SetServerConfigurationUseCaseImpl) bind SetServerConfigurationUseCase::class - factoryOf(::TestConnectivityUseCaseImpl) bind TestConnectivityUseCase::class - factoryOf(::TestHordeApiKeyUseCaseImpl) bind TestHordeApiKeyUseCase::class - factoryOf(::TestHuggingFaceApiKeyUseCaseImpl) bind TestHuggingFaceApiKeyUseCase::class - factoryOf(::TestOpenAiApiKeyUseCaseImpl) bind TestOpenAiApiKeyUseCase::class - factoryOf(::TestStabilityAiApiKeyUseCaseImpl) bind TestStabilityAiApiKeyUseCase::class - factoryOf(::TestFalAiApiKeyUseCaseImpl) bind TestFalAiApiKeyUseCase::class - factoryOf(::TestSwarmUiConnectivityUseCaseImpl) bind TestSwarmUiConnectivityUseCase::class - factoryOf(::SaveGenerationResultUseCaseImpl) bind SaveGenerationResultUseCase::class - factoryOf(::ObserveSeverConnectivityUseCaseImpl) bind ObserveSeverConnectivityUseCase::class - factoryOf(::ObserveHordeProcessStatusUseCaseImpl) bind ObserveHordeProcessStatusUseCase::class - factoryOf(::GetMediaStoreInfoUseCaseImpl) bind GetMediaStoreInfoUseCase::class - factoryOf(::ToggleImageVisibilityUseCaseImpl) bind ToggleImageVisibilityUseCase::class - factoryOf(::GetRandomImageUseCaseImpl) bind GetRandomImageUseCase::class - factoryOf(::SaveLastResultToCacheUseCaseImpl) bind SaveLastResultToCacheUseCase::class - factoryOf(::GetLastResultFromCacheUseCaseImpl) bind GetLastResultFromCacheUseCase::class - factoryOf(::ObserveLocalDiffusionProcessStatusUseCaseImpl) bind ObserveLocalDiffusionProcessStatusUseCase::class - factoryOf(::GetLocalOnnxModelsUseCaseImpl) bind GetLocalOnnxModelsUseCase::class - factoryOf(::GetLocalMediaPipeModelsUseCaseImpl) bind GetLocalMediaPipeModelsUseCase::class - factoryOf(::GetLocalQnnModelsUseCaseImpl) bind GetLocalQnnModelsUseCase::class - factoryOf(::ScanCustomModelsUseCaseImpl) bind ScanCustomModelsUseCase::class - factoryOf(::DownloadModelUseCaseImpl) bind DownloadModelUseCase::class - factoryOf(::ObserveLocalOnnxModelsUseCaseImpl) bind ObserveLocalOnnxModelsUseCase::class - factoryOf(::DeleteModelUseCaseImpl) bind DeleteModelUseCase::class - factoryOf(::AcquireWakelockUseCaseImpl) bind AcquireWakelockUseCase::class - factoryOf(::ReleaseWakeLockUseCaseImpl) bind ReleaseWakeLockUseCase::class - factoryOf(::InterruptGenerationUseCaseImpl) bind InterruptGenerationUseCase::class - factoryOf(::ConnectToHordeUseCaseImpl) bind ConnectToHordeUseCase::class - factoryOf(::ConnectToLocalDiffusionUseCaseImpl) bind ConnectToLocalDiffusionUseCase::class - factoryOf(::ConnectToMediaPipeUseCaseImpl) bind ConnectToMediaPipeUseCase::class - factoryOf(::ConnectToQnnUseCaseImpl) bind ConnectToQnnUseCase::class - factoryOf(::ConnectToA1111UseCaseImpl) bind ConnectToA1111UseCase::class - factoryOf(::ConnectToSwarmUiUseCaseImpl) bind ConnectToSwarmUiUseCase::class - factoryOf(::ConnectToHuggingFaceUseCaseImpl) bind ConnectToHuggingFaceUseCase::class - factoryOf(::ConnectToOpenAiUseCaseImpl) bind ConnectToOpenAiUseCase::class - factoryOf(::ConnectToStabilityAiUseCaseImpl) bind ConnectToStabilityAiUseCase::class - factoryOf(::ConnectToFalAiUseCaseImpl) bind ConnectToFalAiUseCase::class - factoryOf(::FetchAndGetHuggingFaceModelsUseCaseImpl) bind FetchAndGetHuggingFaceModelsUseCase::class - factoryOf(::ObserveStabilityAiCreditsUseCaseImpl) bind ObserveStabilityAiCreditsUseCase::class - factoryOf(::FetchAndGetStabilityAiEnginesUseCaseImpl) bind FetchAndGetStabilityAiEnginesUseCase::class - factoryOf(::FetchAndGetSupportersUseCaseImpl) bind FetchAndGetSupportersUseCase::class - factoryOf(::SendReportUseCaseImpl) bind SendReportUseCase::class - factoryOf(::GetLocalModelUseCaseImpl) bind GetLocalModelUseCase::class -} - -internal val interActorsModule = module { - factoryOf(::WakeLockInterActorImpl) bind WakeLockInterActor::class - factoryOf(::SetupConnectionInterActorImpl) bind SetupConnectionInterActor::class -} - -internal val debugModule = module { - factoryOf(::DebugInsertBadBase64UseCaseImpl) bind DebugInsertBadBase64UseCase::class -} - -val domainModule = (useCasesModule + interActorsModule + debugModule).toTypedArray() diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/interactor/settings/SetupConnectionInterActor.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/interactor/settings/SetupConnectionInterActor.kt deleted file mode 100644 index 78350ed09..000000000 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/interactor/settings/SetupConnectionInterActor.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.shifthackz.aisdv1.domain.interactor.settings - -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToA1111UseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToFalAiUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToHordeUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToHuggingFaceUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToLocalDiffusionUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToMediaPipeUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToQnnUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToOpenAiUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToStabilityAiUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToSwarmUiUseCase - -interface SetupConnectionInterActor { - val connectToHorde: ConnectToHordeUseCase - val connectToLocal: ConnectToLocalDiffusionUseCase - val connectToMediaPipe: ConnectToMediaPipeUseCase - val connectToQnn: ConnectToQnnUseCase - val connectToA1111: ConnectToA1111UseCase - val connectToHuggingFace: ConnectToHuggingFaceUseCase - val connectToOpenAi: ConnectToOpenAiUseCase - val connectToStabilityAi: ConnectToStabilityAiUseCase - val connectToSwarmUi: ConnectToSwarmUiUseCase - val connectToFalAi: ConnectToFalAiUseCase -} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/interactor/settings/SetupConnectionInterActorImpl.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/interactor/settings/SetupConnectionInterActorImpl.kt deleted file mode 100644 index 5269d4cd8..000000000 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/interactor/settings/SetupConnectionInterActorImpl.kt +++ /dev/null @@ -1,25 +0,0 @@ -package com.shifthackz.aisdv1.domain.interactor.settings - -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToA1111UseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToFalAiUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToHordeUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToHuggingFaceUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToLocalDiffusionUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToMediaPipeUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToQnnUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToOpenAiUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToStabilityAiUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.ConnectToSwarmUiUseCase - -internal data class SetupConnectionInterActorImpl( - override val connectToHorde: ConnectToHordeUseCase, - override val connectToLocal: ConnectToLocalDiffusionUseCase, - override val connectToMediaPipe: ConnectToMediaPipeUseCase, - override val connectToQnn: ConnectToQnnUseCase, - override val connectToA1111: ConnectToA1111UseCase, - override val connectToHuggingFace: ConnectToHuggingFaceUseCase, - override val connectToOpenAi: ConnectToOpenAiUseCase, - override val connectToStabilityAi: ConnectToStabilityAiUseCase, - override val connectToSwarmUi: ConnectToSwarmUiUseCase, - override val connectToFalAi: ConnectToFalAiUseCase, -) : SetupConnectionInterActor diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/interactor/wakelock/WakeLockInterActor.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/interactor/wakelock/WakeLockInterActor.kt deleted file mode 100644 index 3f77a7c48..000000000 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/interactor/wakelock/WakeLockInterActor.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.shifthackz.aisdv1.domain.interactor.wakelock - -import com.shifthackz.aisdv1.domain.usecase.wakelock.AcquireWakelockUseCase -import com.shifthackz.aisdv1.domain.usecase.wakelock.ReleaseWakeLockUseCase - -interface WakeLockInterActor { - val acquireWakelockUseCase: AcquireWakelockUseCase - val releaseWakeLockUseCase: ReleaseWakeLockUseCase -} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/interactor/wakelock/WakeLockInterActorImpl.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/interactor/wakelock/WakeLockInterActorImpl.kt deleted file mode 100644 index be0d66c7d..000000000 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/interactor/wakelock/WakeLockInterActorImpl.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.shifthackz.aisdv1.domain.interactor.wakelock - -import com.shifthackz.aisdv1.domain.usecase.wakelock.AcquireWakelockUseCase -import com.shifthackz.aisdv1.domain.usecase.wakelock.ReleaseWakeLockUseCase - -internal data class WakeLockInterActorImpl( - override val acquireWakelockUseCase: AcquireWakelockUseCase, - override val releaseWakeLockUseCase: ReleaseWakeLockUseCase -) : WakeLockInterActor diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/MediaPipeGenerationRepository.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/MediaPipeGenerationRepository.kt deleted file mode 100644 index a7b65fb5b..000000000 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/MediaPipeGenerationRepository.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.shifthackz.aisdv1.domain.repository - -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.LocalDiffusionStatus -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import io.reactivex.rxjava3.core.Observable -import io.reactivex.rxjava3.core.Single - -interface MediaPipeGenerationRepository { - fun generateFromText(payload: TextToImagePayload): Single -} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/FalAiGenerationUseCase.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/FalAiGenerationUseCase.kt deleted file mode 100644 index 5b592453e..000000000 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/FalAiGenerationUseCase.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.shifthackz.aisdv1.domain.usecase.generation - -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.FalAiPayload -import io.reactivex.rxjava3.core.Single - -interface FalAiGenerationUseCase { - operator fun invoke(payload: FalAiPayload): Single> -} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/ImageToImageUseCase.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/ImageToImageUseCase.kt deleted file mode 100644 index c3d1c02d9..000000000 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/ImageToImageUseCase.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.shifthackz.aisdv1.domain.usecase.generation - -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import io.reactivex.rxjava3.core.Single - -interface ImageToImageUseCase { - operator fun invoke(payload: ImageToImagePayload): Single> -} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/TextToImageUseCase.kt b/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/TextToImageUseCase.kt deleted file mode 100755 index 2dfe4f24b..000000000 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/TextToImageUseCase.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.shifthackz.aisdv1.domain.usecase.generation - -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import io.reactivex.rxjava3.core.Single - -interface TextToImageUseCase { - operator fun invoke(payload: TextToImagePayload): Single> -} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/DownloadableModelDataSource.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/DownloadableModelDataSource.kt similarity index 84% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/DownloadableModelDataSource.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/datasource/DownloadableModelDataSource.kt index 6d51b2f3b..a4c380d80 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/DownloadableModelDataSource.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/DownloadableModelDataSource.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.datasource +package dev.minios.pdaiv1.domain.datasource -import com.shifthackz.aisdv1.domain.entity.DownloadState -import com.shifthackz.aisdv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.domain.entity.DownloadState +import dev.minios.pdaiv1.domain.entity.LocalAiModel import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Observable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/EmbeddingsDataSource.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/EmbeddingsDataSource.kt similarity index 85% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/EmbeddingsDataSource.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/datasource/EmbeddingsDataSource.kt index cadd6b43b..4712a990e 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/EmbeddingsDataSource.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/EmbeddingsDataSource.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.datasource +package dev.minios.pdaiv1.domain.datasource -import com.shifthackz.aisdv1.domain.entity.Embedding +import dev.minios.pdaiv1.domain.entity.Embedding import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/FalAiEndpointDataSource.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/FalAiEndpointDataSource.kt similarity index 88% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/FalAiEndpointDataSource.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/datasource/FalAiEndpointDataSource.kt index 1a61f3325..16c65f34b 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/FalAiEndpointDataSource.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/FalAiEndpointDataSource.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.datasource +package dev.minios.pdaiv1.domain.datasource -import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint +import dev.minios.pdaiv1.domain.entity.FalAiEndpoint import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/FalAiGenerationDataSource.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/FalAiGenerationDataSource.kt similarity index 66% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/FalAiGenerationDataSource.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/datasource/FalAiGenerationDataSource.kt index 920d55050..013be7e24 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/FalAiGenerationDataSource.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/FalAiGenerationDataSource.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.datasource +package dev.minios.pdaiv1.domain.datasource -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.FalAiEndpoint +import dev.minios.pdaiv1.domain.entity.TextToImagePayload import io.reactivex.rxjava3.core.Single sealed interface FalAiGenerationDataSource { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/GenerationResultDataSource.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/GenerationResultDataSource.kt similarity index 86% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/GenerationResultDataSource.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/datasource/GenerationResultDataSource.kt index 4ea640db3..9ace673ba 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/GenerationResultDataSource.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/GenerationResultDataSource.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.datasource +package dev.minios.pdaiv1.domain.datasource -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.AiGenerationResult import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/HordeGenerationDataSource.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/HordeGenerationDataSource.kt similarity index 69% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/HordeGenerationDataSource.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/datasource/HordeGenerationDataSource.kt index 10c650b26..a29a4c25a 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/HordeGenerationDataSource.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/HordeGenerationDataSource.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.datasource +package dev.minios.pdaiv1.domain.datasource -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.HordeProcessStatus -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.HordeProcessStatus +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/HuggingFaceGenerationDataSource.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/HuggingFaceGenerationDataSource.kt similarity index 66% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/HuggingFaceGenerationDataSource.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/datasource/HuggingFaceGenerationDataSource.kt index 36a42fa9c..f82d3050a 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/HuggingFaceGenerationDataSource.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/HuggingFaceGenerationDataSource.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.datasource +package dev.minios.pdaiv1.domain.datasource -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload import io.reactivex.rxjava3.core.Single sealed interface HuggingFaceGenerationDataSource { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/HuggingFaceModelsDataSource.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/HuggingFaceModelsDataSource.kt similarity index 80% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/HuggingFaceModelsDataSource.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/datasource/HuggingFaceModelsDataSource.kt index fe4ca05ab..d1fcb424b 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/HuggingFaceModelsDataSource.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/HuggingFaceModelsDataSource.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.datasource +package dev.minios.pdaiv1.domain.datasource -import com.shifthackz.aisdv1.domain.entity.HuggingFaceModel +import dev.minios.pdaiv1.domain.entity.HuggingFaceModel import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/LorasDataSource.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/LorasDataSource.kt similarity index 84% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/LorasDataSource.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/datasource/LorasDataSource.kt index fd61ed0fb..d44204010 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/LorasDataSource.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/LorasDataSource.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.datasource +package dev.minios.pdaiv1.domain.datasource -import com.shifthackz.aisdv1.domain.entity.LoRA +import dev.minios.pdaiv1.domain.entity.LoRA import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/OpenAiGenerationDataSource.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/OpenAiGenerationDataSource.kt similarity index 61% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/OpenAiGenerationDataSource.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/datasource/OpenAiGenerationDataSource.kt index 9262c880d..100859033 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/OpenAiGenerationDataSource.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/OpenAiGenerationDataSource.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.datasource +package dev.minios.pdaiv1.domain.datasource -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.TextToImagePayload import io.reactivex.rxjava3.core.Single sealed interface OpenAiGenerationDataSource { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/RandomImageDataSource.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/RandomImageDataSource.kt similarity index 81% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/RandomImageDataSource.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/datasource/RandomImageDataSource.kt index 16ad2fc72..a739ee03d 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/RandomImageDataSource.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/RandomImageDataSource.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.datasource +package dev.minios.pdaiv1.domain.datasource import android.graphics.Bitmap import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/ReportDataSource.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/ReportDataSource.kt similarity index 75% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/ReportDataSource.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/datasource/ReportDataSource.kt index 7547588db..5f892c631 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/ReportDataSource.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/ReportDataSource.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.datasource +package dev.minios.pdaiv1.domain.datasource -import com.shifthackz.aisdv1.domain.entity.ReportReason +import dev.minios.pdaiv1.domain.entity.ReportReason import io.reactivex.rxjava3.core.Completable sealed interface ReportDataSource { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/ServerConfigurationDataSource.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/ServerConfigurationDataSource.kt similarity index 82% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/ServerConfigurationDataSource.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/datasource/ServerConfigurationDataSource.kt index 09b0698e1..741528253 100755 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/ServerConfigurationDataSource.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/ServerConfigurationDataSource.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.datasource +package dev.minios.pdaiv1.domain.datasource -import com.shifthackz.aisdv1.domain.entity.ServerConfiguration +import dev.minios.pdaiv1.domain.entity.ServerConfiguration import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/StabilityAiCreditsDataSource.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/StabilityAiCreditsDataSource.kt similarity index 90% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/StabilityAiCreditsDataSource.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/datasource/StabilityAiCreditsDataSource.kt index f12cd6391..ca96cb18e 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/StabilityAiCreditsDataSource.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/StabilityAiCreditsDataSource.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.datasource +package dev.minios.pdaiv1.domain.datasource import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/StabilityAiEnginesDataSource.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/StabilityAiEnginesDataSource.kt similarity index 65% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/StabilityAiEnginesDataSource.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/datasource/StabilityAiEnginesDataSource.kt index 9fa2406a6..0d4af4ffc 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/StabilityAiEnginesDataSource.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/StabilityAiEnginesDataSource.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.datasource +package dev.minios.pdaiv1.domain.datasource -import com.shifthackz.aisdv1.domain.entity.StabilityAiEngine +import dev.minios.pdaiv1.domain.entity.StabilityAiEngine import io.reactivex.rxjava3.core.Single sealed interface StabilityAiEnginesDataSource { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/StabilityAiGenerationDataSource.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/StabilityAiGenerationDataSource.kt similarity index 67% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/StabilityAiGenerationDataSource.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/datasource/StabilityAiGenerationDataSource.kt index 99f758d80..160e7c76b 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/StabilityAiGenerationDataSource.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/StabilityAiGenerationDataSource.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.datasource +package dev.minios.pdaiv1.domain.datasource -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload import io.reactivex.rxjava3.core.Single sealed interface StabilityAiGenerationDataSource { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/StableDiffusionGenerationDataSource.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/StableDiffusionGenerationDataSource.kt similarity index 68% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/StableDiffusionGenerationDataSource.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/datasource/StableDiffusionGenerationDataSource.kt index ffddaf23c..c4318e78c 100755 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/StableDiffusionGenerationDataSource.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/StableDiffusionGenerationDataSource.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.datasource +package dev.minios.pdaiv1.domain.datasource -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/StableDiffusionHyperNetworksDataSource.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/StableDiffusionHyperNetworksDataSource.kt similarity index 81% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/StableDiffusionHyperNetworksDataSource.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/datasource/StableDiffusionHyperNetworksDataSource.kt index 55f217d06..0712b7932 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/StableDiffusionHyperNetworksDataSource.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/StableDiffusionHyperNetworksDataSource.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.datasource +package dev.minios.pdaiv1.domain.datasource -import com.shifthackz.aisdv1.domain.entity.StableDiffusionHyperNetwork +import dev.minios.pdaiv1.domain.entity.StableDiffusionHyperNetwork import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/StableDiffusionModelsDataSource.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/StableDiffusionModelsDataSource.kt similarity index 80% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/StableDiffusionModelsDataSource.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/datasource/StableDiffusionModelsDataSource.kt index bd11b77ac..cb5cd90c6 100755 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/StableDiffusionModelsDataSource.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/StableDiffusionModelsDataSource.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.datasource +package dev.minios.pdaiv1.domain.datasource -import com.shifthackz.aisdv1.domain.entity.StableDiffusionModel +import dev.minios.pdaiv1.domain.entity.StableDiffusionModel import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/StableDiffusionSamplersDataSource.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/StableDiffusionSamplersDataSource.kt similarity index 80% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/StableDiffusionSamplersDataSource.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/datasource/StableDiffusionSamplersDataSource.kt index ad49c8267..e1026aceb 100755 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/StableDiffusionSamplersDataSource.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/StableDiffusionSamplersDataSource.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.datasource +package dev.minios.pdaiv1.domain.datasource -import com.shifthackz.aisdv1.domain.entity.StableDiffusionSampler +import dev.minios.pdaiv1.domain.entity.StableDiffusionSampler import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/SupportersDataSource.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/SupportersDataSource.kt similarity index 78% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/SupportersDataSource.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/datasource/SupportersDataSource.kt index 754646061..41faa04a1 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/SupportersDataSource.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/SupportersDataSource.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.datasource +package dev.minios.pdaiv1.domain.datasource -import com.shifthackz.aisdv1.domain.entity.Supporter +import dev.minios.pdaiv1.domain.entity.Supporter import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/SwarmUiGenerationDataSource.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/SwarmUiGenerationDataSource.kt similarity index 67% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/SwarmUiGenerationDataSource.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/datasource/SwarmUiGenerationDataSource.kt index 88c388a06..1db66951f 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/SwarmUiGenerationDataSource.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/SwarmUiGenerationDataSource.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.datasource +package dev.minios.pdaiv1.domain.datasource -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload import io.reactivex.rxjava3.core.Single sealed interface SwarmUiGenerationDataSource { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/SwarmUiModelsDataSource.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/SwarmUiModelsDataSource.kt similarity index 80% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/SwarmUiModelsDataSource.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/datasource/SwarmUiModelsDataSource.kt index f47f21c77..200eb596b 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/SwarmUiModelsDataSource.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/SwarmUiModelsDataSource.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.datasource +package dev.minios.pdaiv1.domain.datasource -import com.shifthackz.aisdv1.domain.entity.SwarmUiModel +import dev.minios.pdaiv1.domain.entity.SwarmUiModel import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/SwarmUiSessionDataSource.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/SwarmUiSessionDataSource.kt similarity index 85% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/SwarmUiSessionDataSource.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/datasource/SwarmUiSessionDataSource.kt index af6807db1..812a49085 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/datasource/SwarmUiSessionDataSource.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/SwarmUiSessionDataSource.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.datasource +package dev.minios.pdaiv1.domain.datasource import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/dev/minios/pdaiv1/domain/demo/ImageToImageDemo.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/demo/ImageToImageDemo.kt new file mode 100644 index 000000000..dc78da539 --- /dev/null +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/demo/ImageToImageDemo.kt @@ -0,0 +1,9 @@ +package dev.minios.pdaiv1.domain.demo + +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import io.reactivex.rxjava3.core.Single + +fun interface ImageToImageDemo { + fun getDemoBase64(payload: ImageToImagePayload): Single +} diff --git a/domain/src/main/java/dev/minios/pdaiv1/domain/demo/TextToImageDemo.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/demo/TextToImageDemo.kt new file mode 100644 index 000000000..e21735759 --- /dev/null +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/demo/TextToImageDemo.kt @@ -0,0 +1,9 @@ +package dev.minios.pdaiv1.domain.demo + +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import io.reactivex.rxjava3.core.Single + +fun interface TextToImageDemo { + fun getDemoBase64(payload: TextToImagePayload): Single +} diff --git a/domain/src/main/java/dev/minios/pdaiv1/domain/di/DomainModule.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/di/DomainModule.kt new file mode 100755 index 000000000..d50c6b12d --- /dev/null +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/di/DomainModule.kt @@ -0,0 +1,226 @@ +package dev.minios.pdaiv1.domain.di + +import dev.minios.pdaiv1.domain.interactor.settings.SetupConnectionInterActor +import dev.minios.pdaiv1.domain.interactor.settings.SetupConnectionInterActorImpl +import dev.minios.pdaiv1.domain.interactor.wakelock.WakeLockInterActor +import dev.minios.pdaiv1.domain.interactor.wakelock.WakeLockInterActorImpl +import dev.minios.pdaiv1.domain.usecase.caching.ClearAppCacheUseCase +import dev.minios.pdaiv1.domain.usecase.caching.ClearAppCacheUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.caching.DataPreLoaderUseCase +import dev.minios.pdaiv1.domain.usecase.caching.DataPreLoaderUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.caching.GetLastResultFromCacheUseCase +import dev.minios.pdaiv1.domain.usecase.caching.GetLastResultFromCacheUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.caching.SaveLastResultToCacheUseCase +import dev.minios.pdaiv1.domain.usecase.caching.SaveLastResultToCacheUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.connectivity.ObserveSeverConnectivityUseCase +import dev.minios.pdaiv1.domain.usecase.connectivity.ObserveSeverConnectivityUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.connectivity.PingStableDiffusionServiceUseCase +import dev.minios.pdaiv1.domain.usecase.connectivity.PingStableDiffusionServiceUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.connectivity.TestConnectivityUseCase +import dev.minios.pdaiv1.domain.usecase.connectivity.TestConnectivityUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.connectivity.TestHordeApiKeyUseCase +import dev.minios.pdaiv1.domain.usecase.connectivity.TestHordeApiKeyUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.connectivity.TestHuggingFaceApiKeyUseCase +import dev.minios.pdaiv1.domain.usecase.connectivity.TestHuggingFaceApiKeyUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.connectivity.TestOpenAiApiKeyUseCase +import dev.minios.pdaiv1.domain.usecase.connectivity.TestOpenAiApiKeyUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.connectivity.TestFalAiApiKeyUseCase +import dev.minios.pdaiv1.domain.usecase.connectivity.TestFalAiApiKeyUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.connectivity.TestStabilityAiApiKeyUseCase +import dev.minios.pdaiv1.domain.usecase.connectivity.TestStabilityAiApiKeyUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.connectivity.TestSwarmUiConnectivityUseCase +import dev.minios.pdaiv1.domain.usecase.connectivity.TestSwarmUiConnectivityUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.debug.DebugInsertBadBase64UseCase +import dev.minios.pdaiv1.domain.usecase.debug.DebugInsertBadBase64UseCaseImpl +import dev.minios.pdaiv1.domain.usecase.donate.FetchAndGetSupportersUseCase +import dev.minios.pdaiv1.domain.usecase.donate.FetchAndGetSupportersUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.downloadable.DeleteModelUseCase +import dev.minios.pdaiv1.domain.usecase.downloadable.DeleteModelUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.downloadable.DownloadModelUseCase +import dev.minios.pdaiv1.domain.usecase.downloadable.DownloadModelUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.downloadable.GetLocalMediaPipeModelsUseCase +import dev.minios.pdaiv1.domain.usecase.downloadable.GetLocalMediaPipeModelsUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.downloadable.GetLocalModelUseCase +import dev.minios.pdaiv1.domain.usecase.downloadable.GetLocalModelUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.downloadable.GetLocalOnnxModelsUseCase +import dev.minios.pdaiv1.domain.usecase.downloadable.GetLocalOnnxModelsUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.downloadable.GetLocalQnnModelsUseCase +import dev.minios.pdaiv1.domain.usecase.downloadable.GetLocalQnnModelsUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.downloadable.ObserveLocalOnnxModelsUseCase +import dev.minios.pdaiv1.domain.usecase.downloadable.ObserveLocalOnnxModelsUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.downloadable.ScanCustomModelsUseCase +import dev.minios.pdaiv1.domain.usecase.downloadable.ScanCustomModelsUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.forgemodule.GetForgeModulesUseCase +import dev.minios.pdaiv1.domain.usecase.forgemodule.GetForgeModulesUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.gallery.DeleteAllGalleryUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.DeleteAllGalleryUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.gallery.DeleteGalleryItemUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.DeleteGalleryItemUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.gallery.DeleteGalleryItemsUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.DeleteGalleryItemsUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.gallery.GetAllGalleryUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.GetAllGalleryUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.gallery.GetGalleryItemsUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.GetGalleryItemsUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.gallery.GetGalleryPagedIdsUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.GetGalleryPagedIdsUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.gallery.GetMediaStoreInfoUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.GetMediaStoreInfoUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.gallery.ToggleImageVisibilityUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.ToggleImageVisibilityUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.generation.FalAiGenerationUseCase +import dev.minios.pdaiv1.domain.usecase.generation.FalAiGenerationUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.generation.GetGenerationResultPagedUseCase +import dev.minios.pdaiv1.domain.usecase.generation.GetGenerationResultPagedUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.generation.GetGenerationResultUseCase +import dev.minios.pdaiv1.domain.usecase.generation.GetGenerationResultUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.generation.GetRandomImageUseCase +import dev.minios.pdaiv1.domain.usecase.generation.GetRandomImageUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.generation.ImageToImageUseCase +import dev.minios.pdaiv1.domain.usecase.generation.ImageToImageUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.generation.InterruptGenerationUseCase +import dev.minios.pdaiv1.domain.usecase.generation.InterruptGenerationUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.generation.ObserveHordeProcessStatusUseCase +import dev.minios.pdaiv1.domain.usecase.generation.ObserveHordeProcessStatusUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.generation.ObserveLocalDiffusionProcessStatusUseCase +import dev.minios.pdaiv1.domain.usecase.generation.ObserveLocalDiffusionProcessStatusUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.generation.SaveGenerationResultUseCase +import dev.minios.pdaiv1.domain.usecase.generation.SaveGenerationResultUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.generation.TextToImageUseCase +import dev.minios.pdaiv1.domain.usecase.generation.TextToImageUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.huggingface.FetchAndGetHuggingFaceModelsUseCase +import dev.minios.pdaiv1.domain.usecase.huggingface.FetchAndGetHuggingFaceModelsUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.report.SendReportUseCase +import dev.minios.pdaiv1.domain.usecase.report.SendReportUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.sdembedding.FetchAndGetEmbeddingsUseCase +import dev.minios.pdaiv1.domain.usecase.sdembedding.FetchAndGetEmbeddingsUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.sdhypernet.FetchAndGetHyperNetworksUseCase +import dev.minios.pdaiv1.domain.usecase.sdhypernet.FetchAndGetHyperNetworksUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.sdlora.FetchAndGetLorasUseCase +import dev.minios.pdaiv1.domain.usecase.sdlora.FetchAndGetLorasUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.sdmodel.GetStableDiffusionModelsUseCase +import dev.minios.pdaiv1.domain.usecase.sdmodel.GetStableDiffusionModelsUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.sdmodel.SelectStableDiffusionModelUseCase +import dev.minios.pdaiv1.domain.usecase.sdmodel.SelectStableDiffusionModelUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.sdsampler.GetStableDiffusionSamplersUseCase +import dev.minios.pdaiv1.domain.usecase.sdsampler.GetStableDiffusionSamplersUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToA1111UseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToA1111UseCaseImpl +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToHordeUseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToHordeUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToHuggingFaceUseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToHuggingFaceUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToLocalDiffusionUseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToLocalDiffusionUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToMediaPipeUseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToMediaPipeUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToQnnUseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToQnnUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToOpenAiUseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToOpenAiUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToFalAiUseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToFalAiUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToStabilityAiUseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToStabilityAiUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToSwarmUiUseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToSwarmUiUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.settings.GetConfigurationUseCase +import dev.minios.pdaiv1.domain.usecase.settings.GetConfigurationUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.settings.SetServerConfigurationUseCase +import dev.minios.pdaiv1.domain.usecase.settings.SetServerConfigurationUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.splash.SplashNavigationUseCase +import dev.minios.pdaiv1.domain.usecase.splash.SplashNavigationUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.stabilityai.FetchAndGetStabilityAiEnginesUseCase +import dev.minios.pdaiv1.domain.usecase.stabilityai.FetchAndGetStabilityAiEnginesUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.stabilityai.ObserveStabilityAiCreditsUseCase +import dev.minios.pdaiv1.domain.usecase.stabilityai.ObserveStabilityAiCreditsUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.swarmmodel.FetchAndGetSwarmUiModelsUseCase +import dev.minios.pdaiv1.domain.usecase.swarmmodel.FetchAndGetSwarmUiModelsUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.wakelock.AcquireWakelockUseCase +import dev.minios.pdaiv1.domain.usecase.wakelock.AcquireWakelockUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.wakelock.ReleaseWakeLockUseCase +import dev.minios.pdaiv1.domain.usecase.wakelock.ReleaseWakeLockUseCaseImpl +import org.koin.core.module.dsl.factoryOf +import org.koin.dsl.bind +import org.koin.dsl.module + +internal val useCasesModule = module { + factoryOf(::TextToImageUseCaseImpl) bind TextToImageUseCase::class + factoryOf(::ImageToImageUseCaseImpl) bind ImageToImageUseCase::class + factoryOf(::FalAiGenerationUseCaseImpl) bind FalAiGenerationUseCase::class + factoryOf(::PingStableDiffusionServiceUseCaseImpl) bind PingStableDiffusionServiceUseCase::class + factoryOf(::ClearAppCacheUseCaseImpl) bind ClearAppCacheUseCase::class + factoryOf(::DataPreLoaderUseCaseImpl) bind DataPreLoaderUseCase::class + factoryOf(::FetchAndGetSwarmUiModelsUseCaseImpl) bind FetchAndGetSwarmUiModelsUseCase::class + factoryOf(::GetStableDiffusionModelsUseCaseImpl) bind GetStableDiffusionModelsUseCase::class + factoryOf(::SelectStableDiffusionModelUseCaseImpl) bind SelectStableDiffusionModelUseCase::class + factoryOf(::GetGenerationResultPagedUseCaseImpl) bind GetGenerationResultPagedUseCase::class + factoryOf(::GetAllGalleryUseCaseImpl) bind GetAllGalleryUseCase::class + factoryOf(::GetGalleryItemsUseCaseImpl) bind GetGalleryItemsUseCase::class + factoryOf(::GetGalleryPagedIdsUseCaseImpl) bind GetGalleryPagedIdsUseCase::class + factoryOf(::GetGenerationResultUseCaseImpl) bind GetGenerationResultUseCase::class + factoryOf(::DeleteGalleryItemUseCaseImpl) bind DeleteGalleryItemUseCase::class + factoryOf(::DeleteGalleryItemsUseCaseImpl) bind DeleteGalleryItemsUseCase::class + factoryOf(::DeleteAllGalleryUseCaseImpl) bind DeleteAllGalleryUseCase::class + factoryOf(::GetStableDiffusionSamplersUseCaseImpl) bind GetStableDiffusionSamplersUseCase::class + factoryOf(::FetchAndGetLorasUseCaseImpl) bind FetchAndGetLorasUseCase::class + factoryOf(::FetchAndGetHyperNetworksUseCaseImpl) bind FetchAndGetHyperNetworksUseCase::class + factoryOf(::FetchAndGetEmbeddingsUseCaseImpl) bind FetchAndGetEmbeddingsUseCase::class + factoryOf(::GetForgeModulesUseCaseImpl) bind GetForgeModulesUseCase::class + factoryOf(::SplashNavigationUseCaseImpl) bind SplashNavigationUseCase::class + factoryOf(::GetConfigurationUseCaseImpl) bind GetConfigurationUseCase::class + factoryOf(::SetServerConfigurationUseCaseImpl) bind SetServerConfigurationUseCase::class + factoryOf(::TestConnectivityUseCaseImpl) bind TestConnectivityUseCase::class + factoryOf(::TestHordeApiKeyUseCaseImpl) bind TestHordeApiKeyUseCase::class + factoryOf(::TestHuggingFaceApiKeyUseCaseImpl) bind TestHuggingFaceApiKeyUseCase::class + factoryOf(::TestOpenAiApiKeyUseCaseImpl) bind TestOpenAiApiKeyUseCase::class + factoryOf(::TestStabilityAiApiKeyUseCaseImpl) bind TestStabilityAiApiKeyUseCase::class + factoryOf(::TestFalAiApiKeyUseCaseImpl) bind TestFalAiApiKeyUseCase::class + factoryOf(::TestSwarmUiConnectivityUseCaseImpl) bind TestSwarmUiConnectivityUseCase::class + factoryOf(::SaveGenerationResultUseCaseImpl) bind SaveGenerationResultUseCase::class + factoryOf(::ObserveSeverConnectivityUseCaseImpl) bind ObserveSeverConnectivityUseCase::class + factoryOf(::ObserveHordeProcessStatusUseCaseImpl) bind ObserveHordeProcessStatusUseCase::class + factoryOf(::GetMediaStoreInfoUseCaseImpl) bind GetMediaStoreInfoUseCase::class + factoryOf(::ToggleImageVisibilityUseCaseImpl) bind ToggleImageVisibilityUseCase::class + factoryOf(::GetRandomImageUseCaseImpl) bind GetRandomImageUseCase::class + factoryOf(::SaveLastResultToCacheUseCaseImpl) bind SaveLastResultToCacheUseCase::class + factoryOf(::GetLastResultFromCacheUseCaseImpl) bind GetLastResultFromCacheUseCase::class + factoryOf(::ObserveLocalDiffusionProcessStatusUseCaseImpl) bind ObserveLocalDiffusionProcessStatusUseCase::class + factoryOf(::GetLocalOnnxModelsUseCaseImpl) bind GetLocalOnnxModelsUseCase::class + factoryOf(::GetLocalMediaPipeModelsUseCaseImpl) bind GetLocalMediaPipeModelsUseCase::class + factoryOf(::GetLocalQnnModelsUseCaseImpl) bind GetLocalQnnModelsUseCase::class + factoryOf(::ScanCustomModelsUseCaseImpl) bind ScanCustomModelsUseCase::class + factoryOf(::DownloadModelUseCaseImpl) bind DownloadModelUseCase::class + factoryOf(::ObserveLocalOnnxModelsUseCaseImpl) bind ObserveLocalOnnxModelsUseCase::class + factoryOf(::DeleteModelUseCaseImpl) bind DeleteModelUseCase::class + factoryOf(::AcquireWakelockUseCaseImpl) bind AcquireWakelockUseCase::class + factoryOf(::ReleaseWakeLockUseCaseImpl) bind ReleaseWakeLockUseCase::class + factoryOf(::InterruptGenerationUseCaseImpl) bind InterruptGenerationUseCase::class + factoryOf(::ConnectToHordeUseCaseImpl) bind ConnectToHordeUseCase::class + factoryOf(::ConnectToLocalDiffusionUseCaseImpl) bind ConnectToLocalDiffusionUseCase::class + factoryOf(::ConnectToMediaPipeUseCaseImpl) bind ConnectToMediaPipeUseCase::class + factoryOf(::ConnectToQnnUseCaseImpl) bind ConnectToQnnUseCase::class + factoryOf(::ConnectToA1111UseCaseImpl) bind ConnectToA1111UseCase::class + factoryOf(::ConnectToSwarmUiUseCaseImpl) bind ConnectToSwarmUiUseCase::class + factoryOf(::ConnectToHuggingFaceUseCaseImpl) bind ConnectToHuggingFaceUseCase::class + factoryOf(::ConnectToOpenAiUseCaseImpl) bind ConnectToOpenAiUseCase::class + factoryOf(::ConnectToStabilityAiUseCaseImpl) bind ConnectToStabilityAiUseCase::class + factoryOf(::ConnectToFalAiUseCaseImpl) bind ConnectToFalAiUseCase::class + factoryOf(::FetchAndGetHuggingFaceModelsUseCaseImpl) bind FetchAndGetHuggingFaceModelsUseCase::class + factoryOf(::ObserveStabilityAiCreditsUseCaseImpl) bind ObserveStabilityAiCreditsUseCase::class + factoryOf(::FetchAndGetStabilityAiEnginesUseCaseImpl) bind FetchAndGetStabilityAiEnginesUseCase::class + factoryOf(::FetchAndGetSupportersUseCaseImpl) bind FetchAndGetSupportersUseCase::class + factoryOf(::SendReportUseCaseImpl) bind SendReportUseCase::class + factoryOf(::GetLocalModelUseCaseImpl) bind GetLocalModelUseCase::class +} + +internal val interActorsModule = module { + factoryOf(::WakeLockInterActorImpl) bind WakeLockInterActor::class + factoryOf(::SetupConnectionInterActorImpl) bind SetupConnectionInterActor::class +} + +internal val debugModule = module { + factoryOf(::DebugInsertBadBase64UseCaseImpl) bind DebugInsertBadBase64UseCase::class +} + +val domainModule = (useCasesModule + interActorsModule + debugModule).toTypedArray() diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ADetailerConfig.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/ADetailerConfig.kt similarity index 98% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ADetailerConfig.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/ADetailerConfig.kt index e39fe5d9d..14b7e7c7d 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ADetailerConfig.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/ADetailerConfig.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity import java.io.Serializable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/AiGenerationResult.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/AiGenerationResult.kt similarity index 95% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/AiGenerationResult.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/AiGenerationResult.kt index 68b97a95a..1a90bdba4 100755 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/AiGenerationResult.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/AiGenerationResult.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity import java.util.Date diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/BackgroundWorkResult.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/BackgroundWorkResult.kt similarity index 83% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/BackgroundWorkResult.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/BackgroundWorkResult.kt index 88f197d56..5d0986fc3 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/BackgroundWorkResult.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/BackgroundWorkResult.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity sealed interface BackgroundWorkResult { data object None : BackgroundWorkResult diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/BackgroundWorkStatus.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/BackgroundWorkStatus.kt similarity index 73% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/BackgroundWorkStatus.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/BackgroundWorkStatus.kt index 4f0a28c0f..cb2c3fb65 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/BackgroundWorkStatus.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/BackgroundWorkStatus.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity data class BackgroundWorkStatus( val running: Boolean, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ColorToken.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/ColorToken.kt similarity index 87% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ColorToken.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/ColorToken.kt index e06593488..9b46cce0a 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ColorToken.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/ColorToken.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity enum class ColorToken { ROSEWATER, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Configuration.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/Configuration.kt similarity index 87% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Configuration.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/Configuration.kt index 8ff1f56af..f8ded8ce7 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Configuration.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/Configuration.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity -import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationCredentials +import dev.minios.pdaiv1.domain.feature.auth.AuthorizationCredentials data class Configuration( val serverUrl: String = "", diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/DarkThemeToken.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/DarkThemeToken.kt similarity index 79% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/DarkThemeToken.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/DarkThemeToken.kt index 60fb4bc93..c1a541244 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/DarkThemeToken.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/DarkThemeToken.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity enum class DarkThemeToken { FRAPPE, MACCHIATO, MOCHA; diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/DownloadState.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/DownloadState.kt similarity index 86% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/DownloadState.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/DownloadState.kt index 0f7c668fc..f6f978aba 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/DownloadState.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/DownloadState.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity import java.io.File diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Embedding.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/Embedding.kt similarity index 53% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Embedding.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/Embedding.kt index 6e2d1b90b..0e0d68f75 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Embedding.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/Embedding.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity data class Embedding( val keyword: String, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/FalAiEndpoint.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/FalAiEndpoint.kt similarity index 98% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/FalAiEndpoint.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/FalAiEndpoint.kt index 33ca301ad..3f9a8ca1a 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/FalAiEndpoint.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/FalAiEndpoint.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity /** * Represents a fal.ai endpoint loaded from OpenAPI schema. diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/FalAiPayload.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/FalAiPayload.kt similarity index 68% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/FalAiPayload.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/FalAiPayload.kt index aeb64e7a1..faec99f38 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/FalAiPayload.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/FalAiPayload.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity data class FalAiPayload( val endpointId: String, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/FeatureTag.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/FeatureTag.kt similarity index 78% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/FeatureTag.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/FeatureTag.kt index d4c7db9b3..020571bdd 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/FeatureTag.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/FeatureTag.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity enum class FeatureTag { Txt2Img, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ForgeModule.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/ForgeModule.kt similarity index 72% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ForgeModule.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/ForgeModule.kt index fd33ca237..1849b49cb 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ForgeModule.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/ForgeModule.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity import java.io.Serializable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Grid.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/Grid.kt similarity index 68% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Grid.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/Grid.kt index 64b50671d..0b6843535 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Grid.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/Grid.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity enum class Grid(val size: Int) { Fixed2(2), diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/HiresConfig.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/HiresConfig.kt similarity index 97% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/HiresConfig.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/HiresConfig.kt index 1c16258de..19697cdc7 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/HiresConfig.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/HiresConfig.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity import java.io.Serializable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/HordeProcessStatus.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/HordeProcessStatus.kt similarity index 67% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/HordeProcessStatus.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/HordeProcessStatus.kt index f64991189..ab29ecbca 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/HordeProcessStatus.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/HordeProcessStatus.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity data class HordeProcessStatus( val waitTimeSeconds: Int, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/HuggingFaceModel.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/HuggingFaceModel.kt similarity index 90% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/HuggingFaceModel.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/HuggingFaceModel.kt index e71fc8287..37e6d7d01 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/HuggingFaceModel.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/HuggingFaceModel.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity data class HuggingFaceModel( val id: String, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ImageToImagePayload.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/ImageToImagePayload.kt similarity index 95% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ImageToImagePayload.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/ImageToImagePayload.kt index 3c45cd07c..3d75cd749 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ImageToImagePayload.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/ImageToImagePayload.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity import java.io.Serializable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/LoRA.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/LoRA.kt similarity index 66% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/LoRA.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/LoRA.kt index 54017459e..1aa64a22b 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/LoRA.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/LoRA.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity data class LoRA( val name: String, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/LocalAiModel.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/LocalAiModel.kt similarity index 96% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/LocalAiModel.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/LocalAiModel.kt index 6831c6d3e..6bd965086 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/LocalAiModel.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/LocalAiModel.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity data class LocalAiModel( val id: String, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/LocalDiffusionStatus.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/LocalDiffusionStatus.kt similarity index 77% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/LocalDiffusionStatus.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/LocalDiffusionStatus.kt index d9367aa8d..bdc2bfa29 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/LocalDiffusionStatus.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/LocalDiffusionStatus.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity import android.graphics.Bitmap diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/MediaStoreInfo.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/MediaStoreInfo.kt similarity index 84% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/MediaStoreInfo.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/MediaStoreInfo.kt index 41694bc67..df1aae78a 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/MediaStoreInfo.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/MediaStoreInfo.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity import android.net.Uri diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/MediaType.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/MediaType.kt similarity index 93% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/MediaType.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/MediaType.kt index 767691f9b..45050152c 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/MediaType.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/MediaType.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity enum class MediaType(val key: String, val extension: String, val mimeType: String) { IMAGE("IMAGE", "png", "image/png"), diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ModelType.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/ModelType.kt similarity index 98% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ModelType.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/ModelType.kt index 2a48124c2..b28b4dbed 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ModelType.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/ModelType.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity /** * Represents the type of Stable Diffusion model being used. diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/OpenAiModel.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/OpenAiModel.kt similarity index 85% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/OpenAiModel.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/OpenAiModel.kt index 8bbce6e1c..dacb3d4a4 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/OpenAiModel.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/OpenAiModel.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity import java.io.Serializable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/OpenAiQuality.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/OpenAiQuality.kt similarity index 66% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/OpenAiQuality.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/OpenAiQuality.kt index be379024d..4325784f4 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/OpenAiQuality.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/OpenAiQuality.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity enum class OpenAiQuality(val key: String) { STANDARD("standard"), diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/OpenAiSize.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/OpenAiSize.kt similarity index 94% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/OpenAiSize.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/OpenAiSize.kt index 454351b17..0c8b80a82 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/OpenAiSize.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/OpenAiSize.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity enum class OpenAiSize( val key: String, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/OpenAiStyle.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/OpenAiStyle.kt similarity index 66% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/OpenAiStyle.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/OpenAiStyle.kt index 0d85627e9..8630e72c9 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/OpenAiStyle.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/OpenAiStyle.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity enum class OpenAiStyle(val key: String) { VIVID("vivid"), diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ReportReason.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/ReportReason.kt similarity index 77% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ReportReason.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/ReportReason.kt index bda8a4569..ad97d62c1 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ReportReason.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/ReportReason.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity enum class ReportReason { IntellectualPropertyInfringement, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Scheduler.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/Scheduler.kt similarity index 96% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Scheduler.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/Scheduler.kt index 2e109daf2..6dd092922 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Scheduler.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/Scheduler.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity /** * Scheduler types supported by Stable Diffusion and Flux models. diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ServerConfiguration.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/ServerConfiguration.kt similarity index 61% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ServerConfiguration.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/ServerConfiguration.kt index 1e9632c87..a41bd21b2 100755 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ServerConfiguration.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/ServerConfiguration.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity data class ServerConfiguration( val sdModelCheckpoint: String, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ServerSource.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/ServerSource.kt similarity index 96% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ServerSource.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/ServerSource.kt index 6f7114e46..1f379aa5d 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/ServerSource.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/ServerSource.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity -import com.shifthackz.aisdv1.core.common.appbuild.BuildType +import dev.minios.pdaiv1.core.common.appbuild.BuildType enum class ServerSource( val key: String, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Settings.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/Settings.kt similarity index 90% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Settings.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/Settings.kt index b9e7a681c..f9826984d 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Settings.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/Settings.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersToken +import dev.minios.pdaiv1.core.common.schedulers.SchedulersToken data class Settings( val serverUrl: String = "", diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StabilityAiClipGuidance.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/StabilityAiClipGuidance.kt similarity index 79% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StabilityAiClipGuidance.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/StabilityAiClipGuidance.kt index d67d1f81f..246a594f3 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StabilityAiClipGuidance.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/StabilityAiClipGuidance.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity import java.io.Serializable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StabilityAiEngine.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/StabilityAiEngine.kt similarity index 63% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StabilityAiEngine.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/StabilityAiEngine.kt index f55b088df..5889a71d9 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StabilityAiEngine.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/StabilityAiEngine.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity data class StabilityAiEngine( val id: String, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StabilityAiSampler.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/StabilityAiSampler.kt similarity index 82% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StabilityAiSampler.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/StabilityAiSampler.kt index bb086f9b2..dca153649 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StabilityAiSampler.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/StabilityAiSampler.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity enum class StabilityAiSampler { NONE, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StabilityAiStylePreset.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/StabilityAiStylePreset.kt similarity index 93% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StabilityAiStylePreset.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/StabilityAiStylePreset.kt index edc89d220..26e84be6a 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StabilityAiStylePreset.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/StabilityAiStylePreset.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity import java.io.Serializable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StableDiffusionHyperNetwork.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/StableDiffusionHyperNetwork.kt similarity index 66% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StableDiffusionHyperNetwork.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/StableDiffusionHyperNetwork.kt index ae2e49743..819e900c9 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StableDiffusionHyperNetwork.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/StableDiffusionHyperNetwork.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity data class StableDiffusionHyperNetwork( val name: String, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StableDiffusionModel.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/StableDiffusionModel.kt similarity index 80% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StableDiffusionModel.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/StableDiffusionModel.kt index 855b60a89..498288ccb 100755 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StableDiffusionModel.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/StableDiffusionModel.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity data class StableDiffusionModel( val title: String, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StableDiffusionSampler.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/StableDiffusionSampler.kt similarity index 74% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StableDiffusionSampler.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/StableDiffusionSampler.kt index 912ddd9e5..53a6e1fdd 100755 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/StableDiffusionSampler.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/StableDiffusionSampler.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity data class StableDiffusionSampler( val name: String, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Supporter.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/Supporter.kt similarity index 75% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Supporter.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/Supporter.kt index eaffbeaf3..90c7e4bbf 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/Supporter.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/Supporter.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity import java.util.Date diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/SwarmUiModel.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/SwarmUiModel.kt similarity index 67% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/SwarmUiModel.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/SwarmUiModel.kt index e79e26735..d136c9e20 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/SwarmUiModel.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/SwarmUiModel.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity class SwarmUiModel( val name: String, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/TextToImagePayload.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/TextToImagePayload.kt similarity index 95% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/entity/TextToImagePayload.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/entity/TextToImagePayload.kt index afa1c9e07..3a558fe71 100755 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/entity/TextToImagePayload.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/entity/TextToImagePayload.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.entity +package dev.minios.pdaiv1.domain.entity import java.io.Serializable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/extensions/RxRetry.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/extensions/RxRetry.kt similarity index 96% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/extensions/RxRetry.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/extensions/RxRetry.kt index 3e64d7030..a9ca4e9fa 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/extensions/RxRetry.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/extensions/RxRetry.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.extensions +package dev.minios.pdaiv1.domain.extensions import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.functions.Function diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/feature/MediaFileManager.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/feature/MediaFileManager.kt similarity index 96% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/feature/MediaFileManager.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/feature/MediaFileManager.kt index 64d2485e0..ece0b3722 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/feature/MediaFileManager.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/feature/MediaFileManager.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.feature +package dev.minios.pdaiv1.domain.feature -import com.shifthackz.aisdv1.domain.entity.MediaType +import dev.minios.pdaiv1.domain.entity.MediaType import java.io.File /** diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/feature/auth/AuthorizationCredentials.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/feature/auth/AuthorizationCredentials.kt similarity index 91% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/feature/auth/AuthorizationCredentials.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/feature/auth/AuthorizationCredentials.kt index 7821099c2..512bd600f 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/feature/auth/AuthorizationCredentials.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/feature/auth/AuthorizationCredentials.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.feature.auth +package dev.minios.pdaiv1.domain.feature.auth sealed interface AuthorizationCredentials { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/feature/auth/AuthorizationStore.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/feature/auth/AuthorizationStore.kt similarity index 77% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/feature/auth/AuthorizationStore.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/feature/auth/AuthorizationStore.kt index 11d954790..f0dc520ca 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/feature/auth/AuthorizationStore.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/feature/auth/AuthorizationStore.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.feature.auth +package dev.minios.pdaiv1.domain.feature.auth interface AuthorizationStore { fun getAuthorizationCredentials(): AuthorizationCredentials diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/feature/diffusion/LocalDiffusion.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/feature/diffusion/LocalDiffusion.kt similarity index 65% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/feature/diffusion/LocalDiffusion.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/feature/diffusion/LocalDiffusion.kt index afcdefd03..3f9898131 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/feature/diffusion/LocalDiffusion.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/feature/diffusion/LocalDiffusion.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.feature.diffusion +package dev.minios.pdaiv1.domain.feature.diffusion import android.graphics.Bitmap -import com.shifthackz.aisdv1.domain.entity.LocalDiffusionStatus -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.entity.LocalDiffusionStatus +import dev.minios.pdaiv1.domain.entity.TextToImagePayload import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/feature/mediapipe/MediaPipe.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/feature/mediapipe/MediaPipe.kt similarity index 57% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/feature/mediapipe/MediaPipe.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/feature/mediapipe/MediaPipe.kt index d27e0502d..8da67a0f8 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/feature/mediapipe/MediaPipe.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/feature/mediapipe/MediaPipe.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.feature.mediapipe +package dev.minios.pdaiv1.domain.feature.mediapipe import android.graphics.Bitmap -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload import io.reactivex.rxjava3.core.Single interface MediaPipe { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/feature/qnn/LocalQnn.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/feature/qnn/LocalQnn.kt similarity index 85% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/feature/qnn/LocalQnn.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/feature/qnn/LocalQnn.kt index 222e3e46a..7a69ecc6d 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/feature/qnn/LocalQnn.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/feature/qnn/LocalQnn.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.feature.qnn +package dev.minios.pdaiv1.domain.feature.qnn import android.graphics.Bitmap -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.LocalDiffusionStatus -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.LocalDiffusionStatus +import dev.minios.pdaiv1.domain.entity.TextToImagePayload import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/feature/work/BackgroundTaskManager.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/feature/work/BackgroundTaskManager.kt similarity index 62% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/feature/work/BackgroundTaskManager.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/feature/work/BackgroundTaskManager.kt index e905c93d3..c4cee1235 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/feature/work/BackgroundTaskManager.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/feature/work/BackgroundTaskManager.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.feature.work +package dev.minios.pdaiv1.domain.feature.work -import com.shifthackz.aisdv1.domain.entity.FalAiPayload -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.entity.FalAiPayload +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload interface BackgroundTaskManager { fun scheduleTextToImageTask(payload: TextToImagePayload) diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/feature/work/BackgroundWorkObserver.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/feature/work/BackgroundWorkObserver.kt similarity index 65% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/feature/work/BackgroundWorkObserver.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/feature/work/BackgroundWorkObserver.kt index bffb2577e..83761f4c3 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/feature/work/BackgroundWorkObserver.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/feature/work/BackgroundWorkObserver.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.feature.work +package dev.minios.pdaiv1.domain.feature.work -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.BackgroundWorkResult -import com.shifthackz.aisdv1.domain.entity.BackgroundWorkStatus +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.BackgroundWorkResult +import dev.minios.pdaiv1.domain.entity.BackgroundWorkStatus import io.reactivex.rxjava3.core.Flowable interface BackgroundWorkObserver { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/gateway/DatabaseClearGateway.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/gateway/DatabaseClearGateway.kt similarity index 78% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/gateway/DatabaseClearGateway.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/gateway/DatabaseClearGateway.kt index 3b9ee198b..906e22b06 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/gateway/DatabaseClearGateway.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/gateway/DatabaseClearGateway.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.gateway +package dev.minios.pdaiv1.domain.gateway import io.reactivex.rxjava3.core.Completable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/gateway/MediaStoreGateway.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/gateway/MediaStoreGateway.kt similarity index 55% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/gateway/MediaStoreGateway.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/gateway/MediaStoreGateway.kt index 4a9b7aa0b..6c65aeafa 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/gateway/MediaStoreGateway.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/gateway/MediaStoreGateway.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.gateway +package dev.minios.pdaiv1.domain.gateway -import com.shifthackz.aisdv1.domain.entity.MediaStoreInfo +import dev.minios.pdaiv1.domain.entity.MediaStoreInfo interface MediaStoreGateway { fun exportToFile(fileName: String, content: ByteArray) diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/gateway/ServerConnectivityGateway.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/gateway/ServerConnectivityGateway.kt similarity index 73% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/gateway/ServerConnectivityGateway.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/gateway/ServerConnectivityGateway.kt index 807b5677e..82118d9ea 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/gateway/ServerConnectivityGateway.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/gateway/ServerConnectivityGateway.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.gateway +package dev.minios.pdaiv1.domain.gateway import io.reactivex.rxjava3.core.Flowable diff --git a/domain/src/main/java/dev/minios/pdaiv1/domain/interactor/settings/SetupConnectionInterActor.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/interactor/settings/SetupConnectionInterActor.kt new file mode 100644 index 000000000..87cfd7237 --- /dev/null +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/interactor/settings/SetupConnectionInterActor.kt @@ -0,0 +1,25 @@ +package dev.minios.pdaiv1.domain.interactor.settings + +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToA1111UseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToFalAiUseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToHordeUseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToHuggingFaceUseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToLocalDiffusionUseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToMediaPipeUseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToQnnUseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToOpenAiUseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToStabilityAiUseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToSwarmUiUseCase + +interface SetupConnectionInterActor { + val connectToHorde: ConnectToHordeUseCase + val connectToLocal: ConnectToLocalDiffusionUseCase + val connectToMediaPipe: ConnectToMediaPipeUseCase + val connectToQnn: ConnectToQnnUseCase + val connectToA1111: ConnectToA1111UseCase + val connectToHuggingFace: ConnectToHuggingFaceUseCase + val connectToOpenAi: ConnectToOpenAiUseCase + val connectToStabilityAi: ConnectToStabilityAiUseCase + val connectToSwarmUi: ConnectToSwarmUiUseCase + val connectToFalAi: ConnectToFalAiUseCase +} diff --git a/domain/src/main/java/dev/minios/pdaiv1/domain/interactor/settings/SetupConnectionInterActorImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/interactor/settings/SetupConnectionInterActorImpl.kt new file mode 100644 index 000000000..68d3ac675 --- /dev/null +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/interactor/settings/SetupConnectionInterActorImpl.kt @@ -0,0 +1,25 @@ +package dev.minios.pdaiv1.domain.interactor.settings + +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToA1111UseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToFalAiUseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToHordeUseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToHuggingFaceUseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToLocalDiffusionUseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToMediaPipeUseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToQnnUseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToOpenAiUseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToStabilityAiUseCase +import dev.minios.pdaiv1.domain.usecase.settings.ConnectToSwarmUiUseCase + +internal data class SetupConnectionInterActorImpl( + override val connectToHorde: ConnectToHordeUseCase, + override val connectToLocal: ConnectToLocalDiffusionUseCase, + override val connectToMediaPipe: ConnectToMediaPipeUseCase, + override val connectToQnn: ConnectToQnnUseCase, + override val connectToA1111: ConnectToA1111UseCase, + override val connectToHuggingFace: ConnectToHuggingFaceUseCase, + override val connectToOpenAi: ConnectToOpenAiUseCase, + override val connectToStabilityAi: ConnectToStabilityAiUseCase, + override val connectToSwarmUi: ConnectToSwarmUiUseCase, + override val connectToFalAi: ConnectToFalAiUseCase, +) : SetupConnectionInterActor diff --git a/domain/src/main/java/dev/minios/pdaiv1/domain/interactor/wakelock/WakeLockInterActor.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/interactor/wakelock/WakeLockInterActor.kt new file mode 100644 index 000000000..160b7b0a3 --- /dev/null +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/interactor/wakelock/WakeLockInterActor.kt @@ -0,0 +1,9 @@ +package dev.minios.pdaiv1.domain.interactor.wakelock + +import dev.minios.pdaiv1.domain.usecase.wakelock.AcquireWakelockUseCase +import dev.minios.pdaiv1.domain.usecase.wakelock.ReleaseWakeLockUseCase + +interface WakeLockInterActor { + val acquireWakelockUseCase: AcquireWakelockUseCase + val releaseWakeLockUseCase: ReleaseWakeLockUseCase +} diff --git a/domain/src/main/java/dev/minios/pdaiv1/domain/interactor/wakelock/WakeLockInterActorImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/interactor/wakelock/WakeLockInterActorImpl.kt new file mode 100644 index 000000000..9f974f003 --- /dev/null +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/interactor/wakelock/WakeLockInterActorImpl.kt @@ -0,0 +1,9 @@ +package dev.minios.pdaiv1.domain.interactor.wakelock + +import dev.minios.pdaiv1.domain.usecase.wakelock.AcquireWakelockUseCase +import dev.minios.pdaiv1.domain.usecase.wakelock.ReleaseWakeLockUseCase + +internal data class WakeLockInterActorImpl( + override val acquireWakelockUseCase: AcquireWakelockUseCase, + override val releaseWakeLockUseCase: ReleaseWakeLockUseCase +) : WakeLockInterActor diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/preference/PreferenceManager.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/preference/PreferenceManager.kt similarity index 85% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/preference/PreferenceManager.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/preference/PreferenceManager.kt index ef5524763..e24439fbb 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/preference/PreferenceManager.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/preference/PreferenceManager.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.domain.preference +package dev.minios.pdaiv1.domain.preference -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersToken -import com.shifthackz.aisdv1.domain.entity.Grid -import com.shifthackz.aisdv1.domain.entity.ModelType -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.entity.Settings +import dev.minios.pdaiv1.core.common.schedulers.SchedulersToken +import dev.minios.pdaiv1.domain.entity.Grid +import dev.minios.pdaiv1.domain.entity.ModelType +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.entity.Settings import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/preference/SessionPreference.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/preference/SessionPreference.kt similarity index 57% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/preference/SessionPreference.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/preference/SessionPreference.kt index 79aadadb8..9dba2743b 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/preference/SessionPreference.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/preference/SessionPreference.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.preference +package dev.minios.pdaiv1.domain.preference interface SessionPreference { var swarmUiSessionId: String diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/DownloadableModelRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/DownloadableModelRepository.kt similarity index 76% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/DownloadableModelRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/DownloadableModelRepository.kt index a19860f8e..a3f04394b 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/DownloadableModelRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/DownloadableModelRepository.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository -import com.shifthackz.aisdv1.domain.entity.DownloadState -import com.shifthackz.aisdv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.domain.entity.DownloadState +import dev.minios.pdaiv1.domain.entity.LocalAiModel import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Observable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/EmbeddingsRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/EmbeddingsRepository.kt similarity index 72% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/EmbeddingsRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/EmbeddingsRepository.kt index e641225ec..6181701b9 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/EmbeddingsRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/EmbeddingsRepository.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository -import com.shifthackz.aisdv1.domain.entity.Embedding +import dev.minios.pdaiv1.domain.entity.Embedding import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/FalAiEndpointRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/FalAiEndpointRepository.kt similarity index 90% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/FalAiEndpointRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/FalAiEndpointRepository.kt index 58112b025..d2394aa4d 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/FalAiEndpointRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/FalAiEndpointRepository.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository -import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint +import dev.minios.pdaiv1.domain.entity.FalAiEndpoint import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/FalAiGenerationRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/FalAiGenerationRepository.kt similarity index 58% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/FalAiGenerationRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/FalAiGenerationRepository.kt index 34982b6e3..a336751e8 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/FalAiGenerationRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/FalAiGenerationRepository.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.FalAiEndpoint +import dev.minios.pdaiv1.domain.entity.TextToImagePayload import io.reactivex.rxjava3.core.Single interface FalAiGenerationRepository { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/ForgeModulesRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/ForgeModulesRepository.kt similarity index 55% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/ForgeModulesRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/ForgeModulesRepository.kt index 7bb098388..5b893b8ea 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/ForgeModulesRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/ForgeModulesRepository.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository -import com.shifthackz.aisdv1.domain.entity.ForgeModule +import dev.minios.pdaiv1.domain.entity.ForgeModule import io.reactivex.rxjava3.core.Single interface ForgeModulesRepository { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/GenerationResultRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/GenerationResultRepository.kt similarity index 84% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/GenerationResultRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/GenerationResultRepository.kt index 20911e84c..46d5c6e73 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/GenerationResultRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/GenerationResultRepository.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.MediaStoreInfo +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.MediaStoreInfo import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/HordeGenerationRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/HordeGenerationRepository.kt similarity index 61% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/HordeGenerationRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/HordeGenerationRepository.kt index 27f6f6eb3..5e56994eb 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/HordeGenerationRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/HordeGenerationRepository.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.HordeProcessStatus -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.HordeProcessStatus +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/HuggingFaceGenerationRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/HuggingFaceGenerationRepository.kt similarity index 55% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/HuggingFaceGenerationRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/HuggingFaceGenerationRepository.kt index 81280aa07..4c855d84d 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/HuggingFaceGenerationRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/HuggingFaceGenerationRepository.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload import io.reactivex.rxjava3.core.Single interface HuggingFaceGenerationRepository { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/HuggingFaceModelsRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/HuggingFaceModelsRepository.kt similarity index 74% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/HuggingFaceModelsRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/HuggingFaceModelsRepository.kt index a6d2c88d3..7700748a6 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/HuggingFaceModelsRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/HuggingFaceModelsRepository.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository -import com.shifthackz.aisdv1.domain.entity.HuggingFaceModel +import dev.minios.pdaiv1.domain.entity.HuggingFaceModel import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/LocalDiffusionGenerationRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/LocalDiffusionGenerationRepository.kt similarity index 60% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/LocalDiffusionGenerationRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/LocalDiffusionGenerationRepository.kt index 3ed5c3709..eb4ac85df 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/LocalDiffusionGenerationRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/LocalDiffusionGenerationRepository.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.LocalDiffusionStatus -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.LocalDiffusionStatus +import dev.minios.pdaiv1.domain.entity.TextToImagePayload import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/LorasRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/LorasRepository.kt similarity index 71% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/LorasRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/LorasRepository.kt index 4beff1098..a34998885 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/LorasRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/LorasRepository.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository -import com.shifthackz.aisdv1.domain.entity.LoRA +import dev.minios.pdaiv1.domain.entity.LoRA import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/dev/minios/pdaiv1/domain/repository/MediaPipeGenerationRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/MediaPipeGenerationRepository.kt new file mode 100644 index 000000000..da33e1cb3 --- /dev/null +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/MediaPipeGenerationRepository.kt @@ -0,0 +1,11 @@ +package dev.minios.pdaiv1.domain.repository + +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.LocalDiffusionStatus +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import io.reactivex.rxjava3.core.Observable +import io.reactivex.rxjava3.core.Single + +interface MediaPipeGenerationRepository { + fun generateFromText(payload: TextToImagePayload): Single +} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/OpenAiGenerationRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/OpenAiGenerationRepository.kt similarity index 54% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/OpenAiGenerationRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/OpenAiGenerationRepository.kt index 22abdc152..db8299bf5 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/OpenAiGenerationRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/OpenAiGenerationRepository.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.TextToImagePayload import io.reactivex.rxjava3.core.Single interface OpenAiGenerationRepository { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/QnnGenerationRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/QnnGenerationRepository.kt similarity index 63% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/QnnGenerationRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/QnnGenerationRepository.kt index da5231bd9..2190965c1 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/QnnGenerationRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/QnnGenerationRepository.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.LocalDiffusionStatus -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.LocalDiffusionStatus +import dev.minios.pdaiv1.domain.entity.TextToImagePayload import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/RandomImageRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/RandomImageRepository.kt similarity index 75% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/RandomImageRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/RandomImageRepository.kt index e975d378b..55fbbeac7 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/RandomImageRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/RandomImageRepository.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository import android.graphics.Bitmap import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/ReportRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/ReportRepository.kt similarity index 59% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/ReportRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/ReportRepository.kt index dc4ae339f..8163e3e6e 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/ReportRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/ReportRepository.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository -import com.shifthackz.aisdv1.domain.entity.ReportReason +import dev.minios.pdaiv1.domain.entity.ReportReason import io.reactivex.rxjava3.core.Completable interface ReportRepository { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/ServerConfigurationRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/ServerConfigurationRepository.kt similarity index 76% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/ServerConfigurationRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/ServerConfigurationRepository.kt index de59111d5..4d014ba5a 100755 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/ServerConfigurationRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/ServerConfigurationRepository.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository -import com.shifthackz.aisdv1.domain.entity.ServerConfiguration +import dev.minios.pdaiv1.domain.entity.ServerConfiguration import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/StabilityAiCreditsRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/StabilityAiCreditsRepository.kt similarity index 87% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/StabilityAiCreditsRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/StabilityAiCreditsRepository.kt index 5235532bb..5d0881450 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/StabilityAiCreditsRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/StabilityAiCreditsRepository.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/StabilityAiEnginesRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/StabilityAiEnginesRepository.kt similarity index 56% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/StabilityAiEnginesRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/StabilityAiEnginesRepository.kt index 25aba1f2c..dd637edbd 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/StabilityAiEnginesRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/StabilityAiEnginesRepository.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository -import com.shifthackz.aisdv1.domain.entity.StabilityAiEngine +import dev.minios.pdaiv1.domain.entity.StabilityAiEngine import io.reactivex.rxjava3.core.Single interface StabilityAiEnginesRepository { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/StabilityAiGenerationRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/StabilityAiGenerationRepository.kt similarity index 55% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/StabilityAiGenerationRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/StabilityAiGenerationRepository.kt index 1de223e18..bcd0c11a5 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/StabilityAiGenerationRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/StabilityAiGenerationRepository.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload import io.reactivex.rxjava3.core.Single interface StabilityAiGenerationRepository { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/StableDiffusionGenerationRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/StableDiffusionGenerationRepository.kt similarity index 65% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/StableDiffusionGenerationRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/StableDiffusionGenerationRepository.kt index adfaa885d..5c5ced09b 100755 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/StableDiffusionGenerationRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/StableDiffusionGenerationRepository.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/StableDiffusionHyperNetworksRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/StableDiffusionHyperNetworksRepository.kt similarity index 73% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/StableDiffusionHyperNetworksRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/StableDiffusionHyperNetworksRepository.kt index c6b01cc16..0daa822a9 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/StableDiffusionHyperNetworksRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/StableDiffusionHyperNetworksRepository.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository -import com.shifthackz.aisdv1.domain.entity.StableDiffusionHyperNetwork +import dev.minios.pdaiv1.domain.entity.StableDiffusionHyperNetwork import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/StableDiffusionModelsRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/StableDiffusionModelsRepository.kt similarity index 72% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/StableDiffusionModelsRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/StableDiffusionModelsRepository.kt index 6b89d0c4d..25767153e 100755 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/StableDiffusionModelsRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/StableDiffusionModelsRepository.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository -import com.shifthackz.aisdv1.domain.entity.StableDiffusionModel +import dev.minios.pdaiv1.domain.entity.StableDiffusionModel import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/StableDiffusionSamplersRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/StableDiffusionSamplersRepository.kt similarity index 67% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/StableDiffusionSamplersRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/StableDiffusionSamplersRepository.kt index c2125f8ef..d76df3fdb 100755 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/StableDiffusionSamplersRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/StableDiffusionSamplersRepository.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository -import com.shifthackz.aisdv1.domain.entity.StableDiffusionSampler +import dev.minios.pdaiv1.domain.entity.StableDiffusionSampler import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/SupportersRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/SupportersRepository.kt similarity index 72% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/SupportersRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/SupportersRepository.kt index 1042f7ffa..d6d4776e3 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/SupportersRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/SupportersRepository.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository -import com.shifthackz.aisdv1.domain.entity.Supporter +import dev.minios.pdaiv1.domain.entity.Supporter import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/SwarmUiGenerationRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/SwarmUiGenerationRepository.kt similarity index 62% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/SwarmUiGenerationRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/SwarmUiGenerationRepository.kt index 824ccb34c..70209e918 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/SwarmUiGenerationRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/SwarmUiGenerationRepository.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/SwarmUiModelsRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/SwarmUiModelsRepository.kt similarity index 71% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/SwarmUiModelsRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/SwarmUiModelsRepository.kt index 5e97c9ab3..c637bfbf0 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/SwarmUiModelsRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/SwarmUiModelsRepository.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository -import com.shifthackz.aisdv1.domain.entity.SwarmUiModel +import dev.minios.pdaiv1.domain.entity.SwarmUiModel import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/TemporaryGenerationResultRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/TemporaryGenerationResultRepository.kt similarity index 87% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/TemporaryGenerationResultRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/TemporaryGenerationResultRepository.kt index 0d9ae6d58..83c73f1ad 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/TemporaryGenerationResultRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/TemporaryGenerationResultRepository.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.AiGenerationResult import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/WakeLockRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/WakeLockRepository.kt similarity index 68% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/repository/WakeLockRepository.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/repository/WakeLockRepository.kt index 70a4838ef..b48a68e45 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/repository/WakeLockRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/WakeLockRepository.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.repository +package dev.minios.pdaiv1.domain.repository import android.os.PowerManager diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/ClearAppCacheUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/caching/ClearAppCacheUseCase.kt similarity index 69% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/ClearAppCacheUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/caching/ClearAppCacheUseCase.kt index bce57522a..970434a20 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/ClearAppCacheUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/caching/ClearAppCacheUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.caching +package dev.minios.pdaiv1.domain.usecase.caching import io.reactivex.rxjava3.core.Completable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/ClearAppCacheUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/caching/ClearAppCacheUseCaseImpl.kt similarity index 61% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/ClearAppCacheUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/caching/ClearAppCacheUseCaseImpl.kt index 9ba9b6e30..085d7ec34 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/ClearAppCacheUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/caching/ClearAppCacheUseCaseImpl.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.usecase.caching +package dev.minios.pdaiv1.domain.usecase.caching -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.core.common.log.FileLoggingTree -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.core.common.log.FileLoggingTree +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository import io.reactivex.rxjava3.core.Completable internal class ClearAppCacheUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/DataPreLoaderUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/caching/DataPreLoaderUseCase.kt similarity index 69% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/DataPreLoaderUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/caching/DataPreLoaderUseCase.kt index f4227a527..6d64f97fd 100755 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/DataPreLoaderUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/caching/DataPreLoaderUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.caching +package dev.minios.pdaiv1.domain.usecase.caching import io.reactivex.rxjava3.core.Completable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/DataPreLoaderUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/caching/DataPreLoaderUseCaseImpl.kt similarity index 71% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/DataPreLoaderUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/caching/DataPreLoaderUseCaseImpl.kt index da514dc99..feb32ee64 100755 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/DataPreLoaderUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/caching/DataPreLoaderUseCaseImpl.kt @@ -1,16 +1,16 @@ -package com.shifthackz.aisdv1.domain.usecase.caching +package dev.minios.pdaiv1.domain.usecase.caching -import com.shifthackz.aisdv1.core.common.log.debugLog -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.domain.entity.FeatureTag -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.EmbeddingsRepository -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository -import com.shifthackz.aisdv1.domain.repository.LorasRepository -import com.shifthackz.aisdv1.domain.repository.ServerConfigurationRepository -import com.shifthackz.aisdv1.domain.repository.StableDiffusionHyperNetworksRepository -import com.shifthackz.aisdv1.domain.repository.StableDiffusionModelsRepository -import com.shifthackz.aisdv1.domain.repository.StableDiffusionSamplersRepository +import dev.minios.pdaiv1.core.common.log.debugLog +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.domain.entity.FeatureTag +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.EmbeddingsRepository +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.domain.repository.LorasRepository +import dev.minios.pdaiv1.domain.repository.ServerConfigurationRepository +import dev.minios.pdaiv1.domain.repository.StableDiffusionHyperNetworksRepository +import dev.minios.pdaiv1.domain.repository.StableDiffusionModelsRepository +import dev.minios.pdaiv1.domain.repository.StableDiffusionSamplersRepository import io.reactivex.rxjava3.core.Completable internal class DataPreLoaderUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/GetLastResultFromCacheUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/caching/GetLastResultFromCacheUseCase.kt similarity index 54% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/GetLastResultFromCacheUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/caching/GetLastResultFromCacheUseCase.kt index bc3322b3e..576af1ea5 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/GetLastResultFromCacheUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/caching/GetLastResultFromCacheUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.caching +package dev.minios.pdaiv1.domain.usecase.caching -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.AiGenerationResult import io.reactivex.rxjava3.core.Single interface GetLastResultFromCacheUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/GetLastResultFromCacheUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/caching/GetLastResultFromCacheUseCaseImpl.kt similarity index 64% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/GetLastResultFromCacheUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/caching/GetLastResultFromCacheUseCaseImpl.kt index 58804bf85..25131d632 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/GetLastResultFromCacheUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/caching/GetLastResultFromCacheUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.caching +package dev.minios.pdaiv1.domain.usecase.caching -import com.shifthackz.aisdv1.domain.repository.TemporaryGenerationResultRepository +import dev.minios.pdaiv1.domain.repository.TemporaryGenerationResultRepository internal class GetLastResultFromCacheUseCaseImpl( private val temporaryGenerationResultRepository: TemporaryGenerationResultRepository, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/SaveLastResultToCacheUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/caching/SaveLastResultToCacheUseCase.kt similarity index 58% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/SaveLastResultToCacheUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/caching/SaveLastResultToCacheUseCase.kt index de14fb77d..e368f378a 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/SaveLastResultToCacheUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/caching/SaveLastResultToCacheUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.caching +package dev.minios.pdaiv1.domain.usecase.caching -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.AiGenerationResult import io.reactivex.rxjava3.core.Single interface SaveLastResultToCacheUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/SaveLastResultToCacheUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/caching/SaveLastResultToCacheUseCaseImpl.kt similarity index 67% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/SaveLastResultToCacheUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/caching/SaveLastResultToCacheUseCaseImpl.kt index 8819b2f9e..1562ea1a9 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/caching/SaveLastResultToCacheUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/caching/SaveLastResultToCacheUseCaseImpl.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.usecase.caching +package dev.minios.pdaiv1.domain.usecase.caching -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.TemporaryGenerationResultRepository +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.TemporaryGenerationResultRepository import io.reactivex.rxjava3.core.Single internal class SaveLastResultToCacheUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/ObserveSeverConnectivityUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/ObserveSeverConnectivityUseCase.kt similarity index 69% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/ObserveSeverConnectivityUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/ObserveSeverConnectivityUseCase.kt index 264cd6328..a7022bb65 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/ObserveSeverConnectivityUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/ObserveSeverConnectivityUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.connectivity +package dev.minios.pdaiv1.domain.usecase.connectivity import io.reactivex.rxjava3.core.Flowable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/ObserveSeverConnectivityUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/ObserveSeverConnectivityUseCaseImpl.kt similarity index 67% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/ObserveSeverConnectivityUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/ObserveSeverConnectivityUseCaseImpl.kt index f01e4c26b..79e8bba65 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/ObserveSeverConnectivityUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/ObserveSeverConnectivityUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.connectivity +package dev.minios.pdaiv1.domain.usecase.connectivity -import com.shifthackz.aisdv1.domain.gateway.ServerConnectivityGateway +import dev.minios.pdaiv1.domain.gateway.ServerConnectivityGateway internal class ObserveSeverConnectivityUseCaseImpl( private val serverConnectivityGateway: ServerConnectivityGateway, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/PingStableDiffusionServiceUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/PingStableDiffusionServiceUseCase.kt similarity index 69% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/PingStableDiffusionServiceUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/PingStableDiffusionServiceUseCase.kt index 7b406df61..0da06e46a 100755 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/PingStableDiffusionServiceUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/PingStableDiffusionServiceUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.connectivity +package dev.minios.pdaiv1.domain.usecase.connectivity import io.reactivex.rxjava3.core.Completable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/PingStableDiffusionServiceUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/PingStableDiffusionServiceUseCaseImpl.kt similarity index 67% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/PingStableDiffusionServiceUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/PingStableDiffusionServiceUseCaseImpl.kt index 7b39af0f8..5479e81e2 100755 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/PingStableDiffusionServiceUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/PingStableDiffusionServiceUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.connectivity +package dev.minios.pdaiv1.domain.usecase.connectivity -import com.shifthackz.aisdv1.domain.repository.StableDiffusionGenerationRepository +import dev.minios.pdaiv1.domain.repository.StableDiffusionGenerationRepository import io.reactivex.rxjava3.core.Completable internal class PingStableDiffusionServiceUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestConnectivityUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestConnectivityUseCase.kt similarity index 69% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestConnectivityUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestConnectivityUseCase.kt index c5e50b2de..2a15661ca 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestConnectivityUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestConnectivityUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.connectivity +package dev.minios.pdaiv1.domain.usecase.connectivity import io.reactivex.rxjava3.core.Completable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestConnectivityUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestConnectivityUseCaseImpl.kt similarity index 60% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestConnectivityUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestConnectivityUseCaseImpl.kt index b8cf51bba..dcfacd2ac 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestConnectivityUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestConnectivityUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.connectivity +package dev.minios.pdaiv1.domain.usecase.connectivity -import com.shifthackz.aisdv1.domain.repository.StableDiffusionGenerationRepository +import dev.minios.pdaiv1.domain.repository.StableDiffusionGenerationRepository internal class TestConnectivityUseCaseImpl( private val repository: StableDiffusionGenerationRepository, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestFalAiApiKeyUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestFalAiApiKeyUseCase.kt similarity index 67% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestFalAiApiKeyUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestFalAiApiKeyUseCase.kt index 094a9046d..67a737f2f 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestFalAiApiKeyUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestFalAiApiKeyUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.connectivity +package dev.minios.pdaiv1.domain.usecase.connectivity import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestFalAiApiKeyUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestFalAiApiKeyUseCaseImpl.kt similarity index 62% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestFalAiApiKeyUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestFalAiApiKeyUseCaseImpl.kt index d6bcb5665..446e06d77 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestFalAiApiKeyUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestFalAiApiKeyUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.connectivity +package dev.minios.pdaiv1.domain.usecase.connectivity -import com.shifthackz.aisdv1.domain.repository.FalAiGenerationRepository +import dev.minios.pdaiv1.domain.repository.FalAiGenerationRepository internal class TestFalAiApiKeyUseCaseImpl( private val falAiGenerationRepository: FalAiGenerationRepository, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestHordeApiKeyUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestHordeApiKeyUseCase.kt similarity index 67% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestHordeApiKeyUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestHordeApiKeyUseCase.kt index c2c641fce..3b78ea25f 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestHordeApiKeyUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestHordeApiKeyUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.connectivity +package dev.minios.pdaiv1.domain.usecase.connectivity import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestHordeApiKeyUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestHordeApiKeyUseCaseImpl.kt similarity index 62% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestHordeApiKeyUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestHordeApiKeyUseCaseImpl.kt index 611c2f56b..f21dece91 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestHordeApiKeyUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestHordeApiKeyUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.connectivity +package dev.minios.pdaiv1.domain.usecase.connectivity -import com.shifthackz.aisdv1.domain.repository.HordeGenerationRepository +import dev.minios.pdaiv1.domain.repository.HordeGenerationRepository internal class TestHordeApiKeyUseCaseImpl( private val hordeGenerationRepository: HordeGenerationRepository, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestHuggingFaceApiKeyUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestHuggingFaceApiKeyUseCase.kt similarity index 68% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestHuggingFaceApiKeyUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestHuggingFaceApiKeyUseCase.kt index 2bc90e814..737c2fa35 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestHuggingFaceApiKeyUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestHuggingFaceApiKeyUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.connectivity +package dev.minios.pdaiv1.domain.usecase.connectivity import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestHuggingFaceApiKeyUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestHuggingFaceApiKeyUseCaseImpl.kt similarity index 64% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestHuggingFaceApiKeyUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestHuggingFaceApiKeyUseCaseImpl.kt index 683d59c3b..d89e8a71e 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestHuggingFaceApiKeyUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestHuggingFaceApiKeyUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.connectivity +package dev.minios.pdaiv1.domain.usecase.connectivity -import com.shifthackz.aisdv1.domain.repository.HuggingFaceGenerationRepository +import dev.minios.pdaiv1.domain.repository.HuggingFaceGenerationRepository internal class TestHuggingFaceApiKeyUseCaseImpl( private val huggingFaceGenerationRepository: HuggingFaceGenerationRepository, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestOpenAiApiKeyUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestOpenAiApiKeyUseCase.kt similarity index 67% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestOpenAiApiKeyUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestOpenAiApiKeyUseCase.kt index f097e206f..6f978948f 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestOpenAiApiKeyUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestOpenAiApiKeyUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.connectivity +package dev.minios.pdaiv1.domain.usecase.connectivity import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestOpenAiApiKeyUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestOpenAiApiKeyUseCaseImpl.kt similarity index 62% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestOpenAiApiKeyUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestOpenAiApiKeyUseCaseImpl.kt index 5ef393816..be22cea31 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestOpenAiApiKeyUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestOpenAiApiKeyUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.connectivity +package dev.minios.pdaiv1.domain.usecase.connectivity -import com.shifthackz.aisdv1.domain.repository.OpenAiGenerationRepository +import dev.minios.pdaiv1.domain.repository.OpenAiGenerationRepository internal class TestOpenAiApiKeyUseCaseImpl( private val openAiGenerationRepository: OpenAiGenerationRepository, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestStabilityAiApiKeyUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestStabilityAiApiKeyUseCase.kt similarity index 68% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestStabilityAiApiKeyUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestStabilityAiApiKeyUseCase.kt index 4b2e2cced..f862c3c0d 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestStabilityAiApiKeyUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestStabilityAiApiKeyUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.connectivity +package dev.minios.pdaiv1.domain.usecase.connectivity import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestStabilityAiApiKeyUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestStabilityAiApiKeyUseCaseImpl.kt similarity index 64% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestStabilityAiApiKeyUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestStabilityAiApiKeyUseCaseImpl.kt index 00dc2af24..fa0cb8bce 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestStabilityAiApiKeyUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestStabilityAiApiKeyUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.connectivity +package dev.minios.pdaiv1.domain.usecase.connectivity -import com.shifthackz.aisdv1.domain.repository.StabilityAiGenerationRepository +import dev.minios.pdaiv1.domain.repository.StabilityAiGenerationRepository internal class TestStabilityAiApiKeyUseCaseImpl( private val stabilityAiGenerationRepository: StabilityAiGenerationRepository, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestSwarmUiConnectivityUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestSwarmUiConnectivityUseCase.kt similarity index 71% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestSwarmUiConnectivityUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestSwarmUiConnectivityUseCase.kt index 6a29bc0d1..4aa723abe 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestSwarmUiConnectivityUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestSwarmUiConnectivityUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.connectivity +package dev.minios.pdaiv1.domain.usecase.connectivity import io.reactivex.rxjava3.core.Completable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestSwarmUiConnectivityUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestSwarmUiConnectivityUseCaseImpl.kt similarity index 62% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestSwarmUiConnectivityUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestSwarmUiConnectivityUseCaseImpl.kt index e79cc0e5a..42b4d1c25 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestSwarmUiConnectivityUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestSwarmUiConnectivityUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.connectivity +package dev.minios.pdaiv1.domain.usecase.connectivity -import com.shifthackz.aisdv1.domain.repository.SwarmUiGenerationRepository +import dev.minios.pdaiv1.domain.repository.SwarmUiGenerationRepository class TestSwarmUiConnectivityUseCaseImpl( private val repository: SwarmUiGenerationRepository, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/debug/DebugInsertBadBase64UseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/debug/DebugInsertBadBase64UseCase.kt similarity index 71% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/debug/DebugInsertBadBase64UseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/debug/DebugInsertBadBase64UseCase.kt index 8dfba92b2..6186e6235 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/debug/DebugInsertBadBase64UseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/debug/DebugInsertBadBase64UseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.debug +package dev.minios.pdaiv1.domain.usecase.debug import io.reactivex.rxjava3.core.Completable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/debug/DebugInsertBadBase64UseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/debug/DebugInsertBadBase64UseCaseImpl.kt similarity index 84% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/debug/DebugInsertBadBase64UseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/debug/DebugInsertBadBase64UseCaseImpl.kt index edfbaa0d1..0a6cb9e91 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/debug/DebugInsertBadBase64UseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/debug/DebugInsertBadBase64UseCaseImpl.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.usecase.debug +package dev.minios.pdaiv1.domain.usecase.debug -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository import io.reactivex.rxjava3.core.Completable import java.util.Date diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/donate/FetchAndGetSupportersUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/donate/FetchAndGetSupportersUseCase.kt similarity index 56% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/donate/FetchAndGetSupportersUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/donate/FetchAndGetSupportersUseCase.kt index c724d96d5..5b03f7b9a 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/donate/FetchAndGetSupportersUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/donate/FetchAndGetSupportersUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.donate +package dev.minios.pdaiv1.domain.usecase.donate -import com.shifthackz.aisdv1.domain.entity.Supporter +import dev.minios.pdaiv1.domain.entity.Supporter import io.reactivex.rxjava3.core.Single interface FetchAndGetSupportersUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/donate/FetchAndGetSupportersUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/donate/FetchAndGetSupportersUseCaseImpl.kt similarity index 61% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/donate/FetchAndGetSupportersUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/donate/FetchAndGetSupportersUseCaseImpl.kt index 28a81f7ea..794bcca03 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/donate/FetchAndGetSupportersUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/donate/FetchAndGetSupportersUseCaseImpl.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.usecase.donate +package dev.minios.pdaiv1.domain.usecase.donate -import com.shifthackz.aisdv1.domain.entity.Supporter -import com.shifthackz.aisdv1.domain.repository.SupportersRepository +import dev.minios.pdaiv1.domain.entity.Supporter +import dev.minios.pdaiv1.domain.repository.SupportersRepository import io.reactivex.rxjava3.core.Single class FetchAndGetSupportersUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/DeleteModelUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/DeleteModelUseCase.kt similarity index 68% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/DeleteModelUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/DeleteModelUseCase.kt index 9fc4e7c6e..5233e6899 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/DeleteModelUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/DeleteModelUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.downloadable +package dev.minios.pdaiv1.domain.usecase.downloadable import io.reactivex.rxjava3.core.Completable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/DeleteModelUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/DeleteModelUseCaseImpl.kt similarity index 62% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/DeleteModelUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/DeleteModelUseCaseImpl.kt index b35a0043b..3104136be 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/DeleteModelUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/DeleteModelUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.downloadable +package dev.minios.pdaiv1.domain.usecase.downloadable -import com.shifthackz.aisdv1.domain.repository.DownloadableModelRepository +import dev.minios.pdaiv1.domain.repository.DownloadableModelRepository internal class DeleteModelUseCaseImpl( private val downloadableModelRepository: DownloadableModelRepository, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/DownloadModelUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/DownloadModelUseCase.kt similarity index 57% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/DownloadModelUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/DownloadModelUseCase.kt index a956f3c6c..2faacf162 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/DownloadModelUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/DownloadModelUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.downloadable +package dev.minios.pdaiv1.domain.usecase.downloadable -import com.shifthackz.aisdv1.domain.entity.DownloadState +import dev.minios.pdaiv1.domain.entity.DownloadState import io.reactivex.rxjava3.core.Observable interface DownloadModelUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/DownloadModelUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/DownloadModelUseCaseImpl.kt similarity index 64% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/DownloadModelUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/DownloadModelUseCaseImpl.kt index d9d326332..4164c09fa 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/DownloadModelUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/DownloadModelUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.downloadable +package dev.minios.pdaiv1.domain.usecase.downloadable -import com.shifthackz.aisdv1.domain.repository.DownloadableModelRepository +import dev.minios.pdaiv1.domain.repository.DownloadableModelRepository internal class DownloadModelUseCaseImpl( private val downloadableModelRepository: DownloadableModelRepository, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalMediaPipeModelsUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalMediaPipeModelsUseCase.kt similarity index 55% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalMediaPipeModelsUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalMediaPipeModelsUseCase.kt index cd93801fd..72683f688 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalMediaPipeModelsUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalMediaPipeModelsUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.downloadable +package dev.minios.pdaiv1.domain.usecase.downloadable -import com.shifthackz.aisdv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.domain.entity.LocalAiModel import io.reactivex.rxjava3.core.Single interface GetLocalMediaPipeModelsUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalMediaPipeModelsUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalMediaPipeModelsUseCaseImpl.kt similarity index 64% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalMediaPipeModelsUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalMediaPipeModelsUseCaseImpl.kt index 4da8eeba6..7b134ed5b 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalMediaPipeModelsUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalMediaPipeModelsUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.downloadable +package dev.minios.pdaiv1.domain.usecase.downloadable -import com.shifthackz.aisdv1.domain.repository.DownloadableModelRepository +import dev.minios.pdaiv1.domain.repository.DownloadableModelRepository internal class GetLocalMediaPipeModelsUseCaseImpl( private val downloadableModelRepository: DownloadableModelRepository, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalModelUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalModelUseCase.kt similarity index 54% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalModelUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalModelUseCase.kt index 4bf4b43d3..d8305f49c 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalModelUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalModelUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.downloadable +package dev.minios.pdaiv1.domain.usecase.downloadable -import com.shifthackz.aisdv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.domain.entity.LocalAiModel import io.reactivex.rxjava3.core.Single interface GetLocalModelUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalModelUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalModelUseCaseImpl.kt similarity index 58% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalModelUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalModelUseCaseImpl.kt index 3b6c6188f..e82f6f61a 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalModelUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalModelUseCaseImpl.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.usecase.downloadable +package dev.minios.pdaiv1.domain.usecase.downloadable -import com.shifthackz.aisdv1.domain.datasource.DownloadableModelDataSource -import com.shifthackz.aisdv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.domain.datasource.DownloadableModelDataSource +import dev.minios.pdaiv1.domain.entity.LocalAiModel import io.reactivex.rxjava3.core.Single internal class GetLocalModelUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalOnnxModelsUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalOnnxModelsUseCase.kt similarity index 54% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalOnnxModelsUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalOnnxModelsUseCase.kt index f2cce297e..861d3e840 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalOnnxModelsUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalOnnxModelsUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.downloadable +package dev.minios.pdaiv1.domain.usecase.downloadable -import com.shifthackz.aisdv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.domain.entity.LocalAiModel import io.reactivex.rxjava3.core.Single interface GetLocalOnnxModelsUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalOnnxModelsUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalOnnxModelsUseCaseImpl.kt similarity index 62% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalOnnxModelsUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalOnnxModelsUseCaseImpl.kt index 444eccca0..ca3ba25c2 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalOnnxModelsUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalOnnxModelsUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.downloadable +package dev.minios.pdaiv1.domain.usecase.downloadable -import com.shifthackz.aisdv1.domain.repository.DownloadableModelRepository +import dev.minios.pdaiv1.domain.repository.DownloadableModelRepository internal class GetLocalOnnxModelsUseCaseImpl( private val downloadableModelRepository: DownloadableModelRepository, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalQnnModelsUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalQnnModelsUseCase.kt similarity index 54% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalQnnModelsUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalQnnModelsUseCase.kt index 942e0e9b7..f729987d4 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalQnnModelsUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalQnnModelsUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.downloadable +package dev.minios.pdaiv1.domain.usecase.downloadable -import com.shifthackz.aisdv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.domain.entity.LocalAiModel import io.reactivex.rxjava3.core.Single interface GetLocalQnnModelsUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalQnnModelsUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalQnnModelsUseCaseImpl.kt similarity index 62% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalQnnModelsUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalQnnModelsUseCaseImpl.kt index b51b37eb8..01b4cc013 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalQnnModelsUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalQnnModelsUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.downloadable +package dev.minios.pdaiv1.domain.usecase.downloadable -import com.shifthackz.aisdv1.domain.repository.DownloadableModelRepository +import dev.minios.pdaiv1.domain.repository.DownloadableModelRepository internal class GetLocalQnnModelsUseCaseImpl( private val downloadableModelRepository: DownloadableModelRepository, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/ObserveLocalOnnxModelsUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/ObserveLocalOnnxModelsUseCase.kt similarity index 55% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/ObserveLocalOnnxModelsUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/ObserveLocalOnnxModelsUseCase.kt index 021ebd1e2..782541f86 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/ObserveLocalOnnxModelsUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/ObserveLocalOnnxModelsUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.downloadable +package dev.minios.pdaiv1.domain.usecase.downloadable -import com.shifthackz.aisdv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.domain.entity.LocalAiModel import io.reactivex.rxjava3.core.Flowable interface ObserveLocalOnnxModelsUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/ObserveLocalOnnxModelsUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/ObserveLocalOnnxModelsUseCaseImpl.kt similarity index 64% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/ObserveLocalOnnxModelsUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/ObserveLocalOnnxModelsUseCaseImpl.kt index e5e290f81..f43c9854c 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/ObserveLocalOnnxModelsUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/ObserveLocalOnnxModelsUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.downloadable +package dev.minios.pdaiv1.domain.usecase.downloadable -import com.shifthackz.aisdv1.domain.repository.DownloadableModelRepository +import dev.minios.pdaiv1.domain.repository.DownloadableModelRepository internal class ObserveLocalOnnxModelsUseCaseImpl( private val repository: DownloadableModelRepository, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/ScanCustomModelsUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/ScanCustomModelsUseCase.kt similarity index 57% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/ScanCustomModelsUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/ScanCustomModelsUseCase.kt index f3a2dd512..6bd686769 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/ScanCustomModelsUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/ScanCustomModelsUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.downloadable +package dev.minios.pdaiv1.domain.usecase.downloadable -import com.shifthackz.aisdv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.domain.entity.LocalAiModel import io.reactivex.rxjava3.core.Single interface ScanCustomModelsUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/ScanCustomModelsUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/ScanCustomModelsUseCaseImpl.kt similarity index 95% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/ScanCustomModelsUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/ScanCustomModelsUseCaseImpl.kt index c01a07c75..13e43cb6c 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/downloadable/ScanCustomModelsUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/downloadable/ScanCustomModelsUseCaseImpl.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.usecase.downloadable +package dev.minios.pdaiv1.domain.usecase.downloadable -import com.shifthackz.aisdv1.domain.entity.LocalAiModel -import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.domain.preference.PreferenceManager import io.reactivex.rxjava3.core.Single import java.io.File diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/forgemodule/GetForgeModulesUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/forgemodule/GetForgeModulesUseCase.kt similarity index 54% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/forgemodule/GetForgeModulesUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/forgemodule/GetForgeModulesUseCase.kt index 299e31c9c..ccccf9d1a 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/forgemodule/GetForgeModulesUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/forgemodule/GetForgeModulesUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.forgemodule +package dev.minios.pdaiv1.domain.usecase.forgemodule -import com.shifthackz.aisdv1.domain.entity.ForgeModule +import dev.minios.pdaiv1.domain.entity.ForgeModule import io.reactivex.rxjava3.core.Single interface GetForgeModulesUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/forgemodule/GetForgeModulesUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/forgemodule/GetForgeModulesUseCaseImpl.kt similarity index 58% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/forgemodule/GetForgeModulesUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/forgemodule/GetForgeModulesUseCaseImpl.kt index 9dddde26d..fc971a709 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/forgemodule/GetForgeModulesUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/forgemodule/GetForgeModulesUseCaseImpl.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.usecase.forgemodule +package dev.minios.pdaiv1.domain.usecase.forgemodule -import com.shifthackz.aisdv1.domain.entity.ForgeModule -import com.shifthackz.aisdv1.domain.repository.ForgeModulesRepository +import dev.minios.pdaiv1.domain.entity.ForgeModule +import dev.minios.pdaiv1.domain.repository.ForgeModulesRepository import io.reactivex.rxjava3.core.Single internal class GetForgeModulesUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteAllGalleryUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteAllGalleryUseCase.kt similarity index 70% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteAllGalleryUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteAllGalleryUseCase.kt index 7b50772ee..99239e6ed 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteAllGalleryUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteAllGalleryUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.gallery +package dev.minios.pdaiv1.domain.usecase.gallery import io.reactivex.rxjava3.core.Completable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteAllGalleryUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteAllGalleryUseCaseImpl.kt similarity index 68% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteAllGalleryUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteAllGalleryUseCaseImpl.kt index b0046b803..82e680f28 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteAllGalleryUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteAllGalleryUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.gallery +package dev.minios.pdaiv1.domain.usecase.gallery -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository import io.reactivex.rxjava3.core.Completable internal class DeleteAllGalleryUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteGalleryItemUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteGalleryItemUseCase.kt similarity index 71% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteGalleryItemUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteGalleryItemUseCase.kt index 7d003bce3..c814f1a18 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteGalleryItemUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteGalleryItemUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.gallery +package dev.minios.pdaiv1.domain.usecase.gallery import io.reactivex.rxjava3.core.Completable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteGalleryItemUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteGalleryItemUseCaseImpl.kt similarity index 66% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteGalleryItemUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteGalleryItemUseCaseImpl.kt index a57c60900..8ccb1ed2e 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteGalleryItemUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteGalleryItemUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.gallery +package dev.minios.pdaiv1.domain.usecase.gallery -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository import io.reactivex.rxjava3.core.Completable internal class DeleteGalleryItemUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteGalleryItemsUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteGalleryItemsUseCase.kt similarity index 72% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteGalleryItemsUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteGalleryItemsUseCase.kt index 98e77acac..bdb07bd4a 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteGalleryItemsUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteGalleryItemsUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.gallery +package dev.minios.pdaiv1.domain.usecase.gallery import io.reactivex.rxjava3.core.Completable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteGalleryItemsUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteGalleryItemsUseCaseImpl.kt similarity index 70% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteGalleryItemsUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteGalleryItemsUseCaseImpl.kt index 4652b637b..eed22ba30 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteGalleryItemsUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteGalleryItemsUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.gallery +package dev.minios.pdaiv1.domain.usecase.gallery -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository import io.reactivex.rxjava3.core.Completable internal class DeleteGalleryItemsUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetAllGalleryUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/GetAllGalleryUseCase.kt similarity index 54% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetAllGalleryUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/GetAllGalleryUseCase.kt index e09d6a0c6..0bd9cc2ca 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetAllGalleryUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/GetAllGalleryUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.gallery +package dev.minios.pdaiv1.domain.usecase.gallery -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.AiGenerationResult import io.reactivex.rxjava3.core.Single interface GetAllGalleryUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetAllGalleryUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/GetAllGalleryUseCaseImpl.kt similarity index 59% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetAllGalleryUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/GetAllGalleryUseCaseImpl.kt index 1174866d3..812f342a3 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetAllGalleryUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/GetAllGalleryUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.gallery +package dev.minios.pdaiv1.domain.usecase.gallery -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository internal class GetAllGalleryUseCaseImpl( private val repository: GenerationResultRepository, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryItemsUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/GetGalleryItemsUseCase.kt similarity index 57% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryItemsUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/GetGalleryItemsUseCase.kt index 7dde0a363..34376fa04 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryItemsUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/GetGalleryItemsUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.gallery +package dev.minios.pdaiv1.domain.usecase.gallery -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.AiGenerationResult import io.reactivex.rxjava3.core.Single interface GetGalleryItemsUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryItemsUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/GetGalleryItemsUseCaseImpl.kt similarity index 64% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryItemsUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/GetGalleryItemsUseCaseImpl.kt index c441b9b43..14c47cbf7 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryItemsUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/GetGalleryItemsUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.gallery +package dev.minios.pdaiv1.domain.usecase.gallery -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository internal class GetGalleryItemsUseCaseImpl( private val generationResultRepository: GenerationResultRepository, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryPagedIdsUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/GetGalleryPagedIdsUseCase.kt similarity index 84% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryPagedIdsUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/GetGalleryPagedIdsUseCase.kt index a70baf40d..40443b916 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryPagedIdsUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/GetGalleryPagedIdsUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.gallery +package dev.minios.pdaiv1.domain.usecase.gallery import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryPagedIdsUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/GetGalleryPagedIdsUseCaseImpl.kt similarity index 65% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryPagedIdsUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/GetGalleryPagedIdsUseCaseImpl.kt index e0ba464bf..b2ae100e9 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryPagedIdsUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/GetGalleryPagedIdsUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.gallery +package dev.minios.pdaiv1.domain.usecase.gallery -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository import io.reactivex.rxjava3.core.Single class GetGalleryPagedIdsUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetMediaStoreInfoUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/GetMediaStoreInfoUseCase.kt similarity index 54% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetMediaStoreInfoUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/GetMediaStoreInfoUseCase.kt index af831df9f..cf83da322 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetMediaStoreInfoUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/GetMediaStoreInfoUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.gallery +package dev.minios.pdaiv1.domain.usecase.gallery -import com.shifthackz.aisdv1.domain.entity.MediaStoreInfo +import dev.minios.pdaiv1.domain.entity.MediaStoreInfo import io.reactivex.rxjava3.core.Single interface GetMediaStoreInfoUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetMediaStoreInfoUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/GetMediaStoreInfoUseCaseImpl.kt similarity index 59% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetMediaStoreInfoUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/GetMediaStoreInfoUseCaseImpl.kt index 498366bb3..5a33ff547 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetMediaStoreInfoUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/GetMediaStoreInfoUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.gallery +package dev.minios.pdaiv1.domain.usecase.gallery -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository class GetMediaStoreInfoUseCaseImpl( private val repository: GenerationResultRepository, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/ToggleImageVisibilityUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/ToggleImageVisibilityUseCase.kt similarity index 71% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/ToggleImageVisibilityUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/ToggleImageVisibilityUseCase.kt index fe8f5410d..72610d832 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/ToggleImageVisibilityUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/ToggleImageVisibilityUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.gallery +package dev.minios.pdaiv1.domain.usecase.gallery import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/ToggleImageVisibilityUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/ToggleImageVisibilityUseCaseImpl.kt similarity index 62% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/ToggleImageVisibilityUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/ToggleImageVisibilityUseCaseImpl.kt index f7310f9fd..d81f74568 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/gallery/ToggleImageVisibilityUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/ToggleImageVisibilityUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.gallery +package dev.minios.pdaiv1.domain.usecase.gallery -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository internal class ToggleImageVisibilityUseCaseImpl( private val repository: GenerationResultRepository, diff --git a/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/FalAiGenerationUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/FalAiGenerationUseCase.kt new file mode 100644 index 000000000..632d05c0a --- /dev/null +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/FalAiGenerationUseCase.kt @@ -0,0 +1,9 @@ +package dev.minios.pdaiv1.domain.usecase.generation + +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.FalAiPayload +import io.reactivex.rxjava3.core.Single + +interface FalAiGenerationUseCase { + operator fun invoke(payload: FalAiPayload): Single> +} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/FalAiGenerationUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/FalAiGenerationUseCaseImpl.kt similarity index 78% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/FalAiGenerationUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/FalAiGenerationUseCaseImpl.kt index 44618ff64..aa181f139 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/FalAiGenerationUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/FalAiGenerationUseCaseImpl.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.FalAiPayload -import com.shifthackz.aisdv1.domain.repository.FalAiEndpointRepository -import com.shifthackz.aisdv1.domain.repository.FalAiGenerationRepository +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.FalAiPayload +import dev.minios.pdaiv1.domain.repository.FalAiEndpointRepository +import dev.minios.pdaiv1.domain.repository.FalAiGenerationRepository import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/GetGenerationResultPagedUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/GetGenerationResultPagedUseCase.kt similarity index 59% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/GetGenerationResultPagedUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/GetGenerationResultPagedUseCase.kt index a77873357..7b15fa87e 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/GetGenerationResultPagedUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/GetGenerationResultPagedUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.AiGenerationResult import io.reactivex.rxjava3.core.Single interface GetGenerationResultPagedUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/GetGenerationResultPagedUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/GetGenerationResultPagedUseCaseImpl.kt similarity index 65% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/GetGenerationResultPagedUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/GetGenerationResultPagedUseCaseImpl.kt index 4ca7b5c50..09d61c496 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/GetGenerationResultPagedUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/GetGenerationResultPagedUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository internal class GetGenerationResultPagedUseCaseImpl( private val repository: GenerationResultRepository, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/GetGenerationResultUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/GetGenerationResultUseCase.kt similarity index 55% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/GetGenerationResultUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/GetGenerationResultUseCase.kt index bc705d18f..a271b0c9b 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/GetGenerationResultUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/GetGenerationResultUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.AiGenerationResult import io.reactivex.rxjava3.core.Single interface GetGenerationResultUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/GetGenerationResultUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/GetGenerationResultUseCaseImpl.kt similarity index 61% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/GetGenerationResultUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/GetGenerationResultUseCaseImpl.kt index 36965cbfb..fd1fe27d9 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/GetGenerationResultUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/GetGenerationResultUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository internal class GetGenerationResultUseCaseImpl( private val repository: GenerationResultRepository, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/GetRandomImageUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/GetRandomImageUseCase.kt similarity index 72% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/GetRandomImageUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/GetRandomImageUseCase.kt index 5f4b58eb9..4d1f2e31c 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/GetRandomImageUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/GetRandomImageUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation import android.graphics.Bitmap import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/GetRandomImageUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/GetRandomImageUseCaseImpl.kt similarity index 60% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/GetRandomImageUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/GetRandomImageUseCaseImpl.kt index 439834c25..e29837f3f 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/GetRandomImageUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/GetRandomImageUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation -import com.shifthackz.aisdv1.domain.repository.RandomImageRepository +import dev.minios.pdaiv1.domain.repository.RandomImageRepository class GetRandomImageUseCaseImpl( private val randomImageRepository: RandomImageRepository, diff --git a/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/ImageToImageUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/ImageToImageUseCase.kt new file mode 100644 index 000000000..40da5c0bd --- /dev/null +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/ImageToImageUseCase.kt @@ -0,0 +1,9 @@ +package dev.minios.pdaiv1.domain.usecase.generation + +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import io.reactivex.rxjava3.core.Single + +interface ImageToImageUseCase { + operator fun invoke(payload: ImageToImagePayload): Single> +} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/ImageToImageUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/ImageToImageUseCaseImpl.kt similarity index 71% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/ImageToImageUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/ImageToImageUseCaseImpl.kt index 5375b4e39..47f000a25 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/ImageToImageUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/ImageToImageUseCaseImpl.kt @@ -1,14 +1,14 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.HordeGenerationRepository -import com.shifthackz.aisdv1.domain.repository.HuggingFaceGenerationRepository -import com.shifthackz.aisdv1.domain.repository.QnnGenerationRepository -import com.shifthackz.aisdv1.domain.repository.StabilityAiGenerationRepository -import com.shifthackz.aisdv1.domain.repository.StableDiffusionGenerationRepository -import com.shifthackz.aisdv1.domain.repository.SwarmUiGenerationRepository +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.HordeGenerationRepository +import dev.minios.pdaiv1.domain.repository.HuggingFaceGenerationRepository +import dev.minios.pdaiv1.domain.repository.QnnGenerationRepository +import dev.minios.pdaiv1.domain.repository.StabilityAiGenerationRepository +import dev.minios.pdaiv1.domain.repository.StableDiffusionGenerationRepository +import dev.minios.pdaiv1.domain.repository.SwarmUiGenerationRepository import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/InterruptGenerationUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/InterruptGenerationUseCase.kt similarity index 69% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/InterruptGenerationUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/InterruptGenerationUseCase.kt index 267dd45c8..feaf274f4 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/InterruptGenerationUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/InterruptGenerationUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation import io.reactivex.rxjava3.core.Completable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/InterruptGenerationUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/InterruptGenerationUseCaseImpl.kt similarity index 66% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/InterruptGenerationUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/InterruptGenerationUseCaseImpl.kt index c473d3aff..4e916baac 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/InterruptGenerationUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/InterruptGenerationUseCaseImpl.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.HordeGenerationRepository -import com.shifthackz.aisdv1.domain.repository.LocalDiffusionGenerationRepository -import com.shifthackz.aisdv1.domain.repository.QnnGenerationRepository -import com.shifthackz.aisdv1.domain.repository.StableDiffusionGenerationRepository +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.HordeGenerationRepository +import dev.minios.pdaiv1.domain.repository.LocalDiffusionGenerationRepository +import dev.minios.pdaiv1.domain.repository.QnnGenerationRepository +import dev.minios.pdaiv1.domain.repository.StableDiffusionGenerationRepository import io.reactivex.rxjava3.core.Completable internal class InterruptGenerationUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/ObserveHordeProcessStatusUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/ObserveHordeProcessStatusUseCase.kt similarity index 55% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/ObserveHordeProcessStatusUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/ObserveHordeProcessStatusUseCase.kt index e43324368..188582232 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/ObserveHordeProcessStatusUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/ObserveHordeProcessStatusUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation -import com.shifthackz.aisdv1.domain.entity.HordeProcessStatus +import dev.minios.pdaiv1.domain.entity.HordeProcessStatus import io.reactivex.rxjava3.core.Flowable interface ObserveHordeProcessStatusUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/ObserveHordeProcessStatusUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/ObserveHordeProcessStatusUseCaseImpl.kt similarity index 68% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/ObserveHordeProcessStatusUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/ObserveHordeProcessStatusUseCaseImpl.kt index c7154bedc..322fd5a26 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/ObserveHordeProcessStatusUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/ObserveHordeProcessStatusUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation -import com.shifthackz.aisdv1.domain.repository.HordeGenerationRepository +import dev.minios.pdaiv1.domain.repository.HordeGenerationRepository internal class ObserveHordeProcessStatusUseCaseImpl( private val hordeGenerationRepository: HordeGenerationRepository, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/ObserveLocalDiffusionProcessStatusUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/ObserveLocalDiffusionProcessStatusUseCase.kt similarity index 57% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/ObserveLocalDiffusionProcessStatusUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/ObserveLocalDiffusionProcessStatusUseCase.kt index 9530b6b09..7459f6c52 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/ObserveLocalDiffusionProcessStatusUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/ObserveLocalDiffusionProcessStatusUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation -import com.shifthackz.aisdv1.domain.entity.LocalDiffusionStatus +import dev.minios.pdaiv1.domain.entity.LocalDiffusionStatus import io.reactivex.rxjava3.core.Observable interface ObserveLocalDiffusionProcessStatusUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/ObserveLocalDiffusionProcessStatusUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/ObserveLocalDiffusionProcessStatusUseCaseImpl.kt similarity index 70% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/ObserveLocalDiffusionProcessStatusUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/ObserveLocalDiffusionProcessStatusUseCaseImpl.kt index 789296cfa..3be8906b4 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/ObserveLocalDiffusionProcessStatusUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/ObserveLocalDiffusionProcessStatusUseCaseImpl.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation -import com.shifthackz.aisdv1.domain.repository.LocalDiffusionGenerationRepository -import com.shifthackz.aisdv1.domain.repository.QnnGenerationRepository +import dev.minios.pdaiv1.domain.repository.LocalDiffusionGenerationRepository +import dev.minios.pdaiv1.domain.repository.QnnGenerationRepository import io.reactivex.rxjava3.core.Observable internal class ObserveLocalDiffusionProcessStatusUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/SaveGenerationResultUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/SaveGenerationResultUseCase.kt similarity index 56% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/SaveGenerationResultUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/SaveGenerationResultUseCase.kt index 588d5547e..c006ae0c3 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/SaveGenerationResultUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/SaveGenerationResultUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.AiGenerationResult import io.reactivex.rxjava3.core.Completable interface SaveGenerationResultUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/SaveGenerationResultUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/SaveGenerationResultUseCaseImpl.kt similarity index 57% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/SaveGenerationResultUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/SaveGenerationResultUseCaseImpl.kt index 9af8e269e..5de896361 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/SaveGenerationResultUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/SaveGenerationResultUseCaseImpl.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository internal class SaveGenerationResultUseCaseImpl( private val repository: GenerationResultRepository, diff --git a/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/TextToImageUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/TextToImageUseCase.kt new file mode 100755 index 000000000..aff06bf0f --- /dev/null +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/TextToImageUseCase.kt @@ -0,0 +1,9 @@ +package dev.minios.pdaiv1.domain.usecase.generation + +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import io.reactivex.rxjava3.core.Single + +interface TextToImageUseCase { + operator fun invoke(payload: TextToImagePayload): Single> +} diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/TextToImageUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/TextToImageUseCaseImpl.kt similarity index 68% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/TextToImageUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/TextToImageUseCaseImpl.kt index 5b119ef49..d0a46dc42 100755 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/generation/TextToImageUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/generation/TextToImageUseCaseImpl.kt @@ -1,19 +1,19 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.FalAiGenerationRepository -import com.shifthackz.aisdv1.domain.repository.HordeGenerationRepository -import com.shifthackz.aisdv1.domain.repository.HuggingFaceGenerationRepository -import com.shifthackz.aisdv1.domain.repository.LocalDiffusionGenerationRepository -import com.shifthackz.aisdv1.domain.repository.MediaPipeGenerationRepository -import com.shifthackz.aisdv1.domain.repository.OpenAiGenerationRepository -import com.shifthackz.aisdv1.domain.repository.QnnGenerationRepository -import com.shifthackz.aisdv1.domain.repository.StabilityAiGenerationRepository -import com.shifthackz.aisdv1.domain.repository.StableDiffusionGenerationRepository -import com.shifthackz.aisdv1.domain.repository.SwarmUiGenerationRepository +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.FalAiGenerationRepository +import dev.minios.pdaiv1.domain.repository.HordeGenerationRepository +import dev.minios.pdaiv1.domain.repository.HuggingFaceGenerationRepository +import dev.minios.pdaiv1.domain.repository.LocalDiffusionGenerationRepository +import dev.minios.pdaiv1.domain.repository.MediaPipeGenerationRepository +import dev.minios.pdaiv1.domain.repository.OpenAiGenerationRepository +import dev.minios.pdaiv1.domain.repository.QnnGenerationRepository +import dev.minios.pdaiv1.domain.repository.StabilityAiGenerationRepository +import dev.minios.pdaiv1.domain.repository.StableDiffusionGenerationRepository +import dev.minios.pdaiv1.domain.repository.SwarmUiGenerationRepository import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/huggingface/FetchAndGetHuggingFaceModelsUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/huggingface/FetchAndGetHuggingFaceModelsUseCase.kt similarity index 56% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/huggingface/FetchAndGetHuggingFaceModelsUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/huggingface/FetchAndGetHuggingFaceModelsUseCase.kt index adb71b999..b3bdf5433 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/huggingface/FetchAndGetHuggingFaceModelsUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/huggingface/FetchAndGetHuggingFaceModelsUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.huggingface +package dev.minios.pdaiv1.domain.usecase.huggingface -import com.shifthackz.aisdv1.domain.entity.HuggingFaceModel +import dev.minios.pdaiv1.domain.entity.HuggingFaceModel import io.reactivex.rxjava3.core.Single interface FetchAndGetHuggingFaceModelsUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/huggingface/FetchAndGetHuggingFaceModelsUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/huggingface/FetchAndGetHuggingFaceModelsUseCaseImpl.kt similarity index 63% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/huggingface/FetchAndGetHuggingFaceModelsUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/huggingface/FetchAndGetHuggingFaceModelsUseCaseImpl.kt index f071ddccf..8358f9df2 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/huggingface/FetchAndGetHuggingFaceModelsUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/huggingface/FetchAndGetHuggingFaceModelsUseCaseImpl.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.huggingface +package dev.minios.pdaiv1.domain.usecase.huggingface -import com.shifthackz.aisdv1.domain.entity.HuggingFaceModel -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.HuggingFaceModelsRepository +import dev.minios.pdaiv1.domain.entity.HuggingFaceModel +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.HuggingFaceModelsRepository import io.reactivex.rxjava3.core.Single internal class FetchAndGetHuggingFaceModelsUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/report/SendReportUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/report/SendReportUseCase.kt similarity index 60% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/report/SendReportUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/report/SendReportUseCase.kt index 1e4cae100..48037fed4 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/report/SendReportUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/report/SendReportUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.report +package dev.minios.pdaiv1.domain.usecase.report -import com.shifthackz.aisdv1.domain.entity.ReportReason +import dev.minios.pdaiv1.domain.entity.ReportReason import io.reactivex.rxjava3.core.Completable interface SendReportUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/report/SendReportUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/report/SendReportUseCaseImpl.kt similarity index 56% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/report/SendReportUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/report/SendReportUseCaseImpl.kt index 301e905b6..2ed517a38 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/report/SendReportUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/report/SendReportUseCaseImpl.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.usecase.report +package dev.minios.pdaiv1.domain.usecase.report -import com.shifthackz.aisdv1.domain.entity.ReportReason -import com.shifthackz.aisdv1.domain.repository.ReportRepository +import dev.minios.pdaiv1.domain.entity.ReportReason +import dev.minios.pdaiv1.domain.repository.ReportRepository class SendReportUseCaseImpl( private val repository: ReportRepository, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdembedding/FetchAndGetEmbeddingsUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdembedding/FetchAndGetEmbeddingsUseCase.kt similarity index 55% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdembedding/FetchAndGetEmbeddingsUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdembedding/FetchAndGetEmbeddingsUseCase.kt index ca7319286..7df96f6e9 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdembedding/FetchAndGetEmbeddingsUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdembedding/FetchAndGetEmbeddingsUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.sdembedding +package dev.minios.pdaiv1.domain.usecase.sdembedding -import com.shifthackz.aisdv1.domain.entity.Embedding +import dev.minios.pdaiv1.domain.entity.Embedding import io.reactivex.rxjava3.core.Single interface FetchAndGetEmbeddingsUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdembedding/FetchAndGetEmbeddingsUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdembedding/FetchAndGetEmbeddingsUseCaseImpl.kt similarity index 60% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdembedding/FetchAndGetEmbeddingsUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdembedding/FetchAndGetEmbeddingsUseCaseImpl.kt index 257e37e08..74d4a1a67 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdembedding/FetchAndGetEmbeddingsUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdembedding/FetchAndGetEmbeddingsUseCaseImpl.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.usecase.sdembedding +package dev.minios.pdaiv1.domain.usecase.sdembedding -import com.shifthackz.aisdv1.domain.entity.Embedding -import com.shifthackz.aisdv1.domain.repository.EmbeddingsRepository +import dev.minios.pdaiv1.domain.entity.Embedding +import dev.minios.pdaiv1.domain.repository.EmbeddingsRepository import io.reactivex.rxjava3.core.Single internal class FetchAndGetEmbeddingsUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdhypernet/FetchAndGetHyperNetworksUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdhypernet/FetchAndGetHyperNetworksUseCase.kt similarity index 55% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdhypernet/FetchAndGetHyperNetworksUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdhypernet/FetchAndGetHyperNetworksUseCase.kt index 1215b97ef..a13e60800 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdhypernet/FetchAndGetHyperNetworksUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdhypernet/FetchAndGetHyperNetworksUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.sdhypernet +package dev.minios.pdaiv1.domain.usecase.sdhypernet -import com.shifthackz.aisdv1.domain.entity.StableDiffusionHyperNetwork +import dev.minios.pdaiv1.domain.entity.StableDiffusionHyperNetwork import io.reactivex.rxjava3.core.Single interface FetchAndGetHyperNetworksUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdhypernet/FetchAndGetHyperNetworksUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdhypernet/FetchAndGetHyperNetworksUseCaseImpl.kt similarity index 66% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdhypernet/FetchAndGetHyperNetworksUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdhypernet/FetchAndGetHyperNetworksUseCaseImpl.kt index daa65aa92..ff390bfb1 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdhypernet/FetchAndGetHyperNetworksUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdhypernet/FetchAndGetHyperNetworksUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.sdhypernet +package dev.minios.pdaiv1.domain.usecase.sdhypernet -import com.shifthackz.aisdv1.domain.repository.StableDiffusionHyperNetworksRepository +import dev.minios.pdaiv1.domain.repository.StableDiffusionHyperNetworksRepository internal class FetchAndGetHyperNetworksUseCaseImpl( private val stableDiffusionHyperNetworksRepository: StableDiffusionHyperNetworksRepository, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdlora/FetchAndGetLorasUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdlora/FetchAndGetLorasUseCase.kt similarity index 55% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdlora/FetchAndGetLorasUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdlora/FetchAndGetLorasUseCase.kt index 65936385e..5d5d8dcca 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdlora/FetchAndGetLorasUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdlora/FetchAndGetLorasUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.sdlora +package dev.minios.pdaiv1.domain.usecase.sdlora -import com.shifthackz.aisdv1.domain.entity.LoRA +import dev.minios.pdaiv1.domain.entity.LoRA import io.reactivex.rxjava3.core.Single interface FetchAndGetLorasUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdlora/FetchAndGetLorasUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdlora/FetchAndGetLorasUseCaseImpl.kt similarity index 62% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdlora/FetchAndGetLorasUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdlora/FetchAndGetLorasUseCaseImpl.kt index fd9bc42f0..8731d9682 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdlora/FetchAndGetLorasUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdlora/FetchAndGetLorasUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.sdlora +package dev.minios.pdaiv1.domain.usecase.sdlora -import com.shifthackz.aisdv1.domain.repository.LorasRepository +import dev.minios.pdaiv1.domain.repository.LorasRepository internal class FetchAndGetLorasUseCaseImpl( private val lorasRepository: LorasRepository, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdmodel/GetStableDiffusionModelsUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdmodel/GetStableDiffusionModelsUseCase.kt similarity index 58% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdmodel/GetStableDiffusionModelsUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdmodel/GetStableDiffusionModelsUseCase.kt index a03c0b298..e07dd559f 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdmodel/GetStableDiffusionModelsUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdmodel/GetStableDiffusionModelsUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.sdmodel +package dev.minios.pdaiv1.domain.usecase.sdmodel -import com.shifthackz.aisdv1.domain.entity.StableDiffusionModel +import dev.minios.pdaiv1.domain.entity.StableDiffusionModel import io.reactivex.rxjava3.core.Single interface GetStableDiffusionModelsUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdmodel/GetStableDiffusionModelsUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdmodel/GetStableDiffusionModelsUseCaseImpl.kt similarity index 73% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdmodel/GetStableDiffusionModelsUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdmodel/GetStableDiffusionModelsUseCaseImpl.kt index 6e47bebc4..65e733e80 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdmodel/GetStableDiffusionModelsUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdmodel/GetStableDiffusionModelsUseCaseImpl.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.domain.usecase.sdmodel +package dev.minios.pdaiv1.domain.usecase.sdmodel -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.entity.StableDiffusionModel -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.ServerConfigurationRepository -import com.shifthackz.aisdv1.domain.repository.StableDiffusionModelsRepository +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.entity.StableDiffusionModel +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.ServerConfigurationRepository +import dev.minios.pdaiv1.domain.repository.StableDiffusionModelsRepository import io.reactivex.rxjava3.core.Single internal class GetStableDiffusionModelsUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdmodel/SelectStableDiffusionModelUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdmodel/SelectStableDiffusionModelUseCase.kt similarity index 74% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdmodel/SelectStableDiffusionModelUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdmodel/SelectStableDiffusionModelUseCase.kt index cdf9ccb81..4f9ddcbe4 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdmodel/SelectStableDiffusionModelUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdmodel/SelectStableDiffusionModelUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.sdmodel +package dev.minios.pdaiv1.domain.usecase.sdmodel import io.reactivex.rxjava3.core.Completable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdmodel/SelectStableDiffusionModelUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdmodel/SelectStableDiffusionModelUseCaseImpl.kt similarity index 77% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdmodel/SelectStableDiffusionModelUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdmodel/SelectStableDiffusionModelUseCaseImpl.kt index fa918a4b0..0ebff917f 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdmodel/SelectStableDiffusionModelUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdmodel/SelectStableDiffusionModelUseCaseImpl.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.usecase.sdmodel +package dev.minios.pdaiv1.domain.usecase.sdmodel -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.ServerConfigurationRepository +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.ServerConfigurationRepository import io.reactivex.rxjava3.core.Completable internal class SelectStableDiffusionModelUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdsampler/GetStableDiffusionSamplersUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdsampler/GetStableDiffusionSamplersUseCase.kt similarity index 56% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdsampler/GetStableDiffusionSamplersUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdsampler/GetStableDiffusionSamplersUseCase.kt index 2a4d68c2b..983fad19f 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdsampler/GetStableDiffusionSamplersUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdsampler/GetStableDiffusionSamplersUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.sdsampler +package dev.minios.pdaiv1.domain.usecase.sdsampler -import com.shifthackz.aisdv1.domain.entity.StableDiffusionSampler +import dev.minios.pdaiv1.domain.entity.StableDiffusionSampler import io.reactivex.rxjava3.core.Single interface GetStableDiffusionSamplersUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdsampler/GetStableDiffusionSamplersUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdsampler/GetStableDiffusionSamplersUseCaseImpl.kt similarity index 60% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdsampler/GetStableDiffusionSamplersUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdsampler/GetStableDiffusionSamplersUseCaseImpl.kt index 6a0ff21f2..38264d058 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/sdsampler/GetStableDiffusionSamplersUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/sdsampler/GetStableDiffusionSamplersUseCaseImpl.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.usecase.sdsampler +package dev.minios.pdaiv1.domain.usecase.sdsampler -import com.shifthackz.aisdv1.domain.entity.StableDiffusionSampler -import com.shifthackz.aisdv1.domain.repository.StableDiffusionSamplersRepository +import dev.minios.pdaiv1.domain.entity.StableDiffusionSampler +import dev.minios.pdaiv1.domain.repository.StableDiffusionSamplersRepository import io.reactivex.rxjava3.core.Single internal class GetStableDiffusionSamplersUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToA1111UseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToA1111UseCase.kt similarity index 63% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToA1111UseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToA1111UseCase.kt index 28bcb057b..a4bc4ee81 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToA1111UseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToA1111UseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings -import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationCredentials +import dev.minios.pdaiv1.domain.feature.auth.AuthorizationCredentials import io.reactivex.rxjava3.core.Single interface ConnectToA1111UseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToA1111UseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToA1111UseCaseImpl.kt similarity index 80% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToA1111UseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToA1111UseCaseImpl.kt index 89e73ef59..4b86f01dc 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToA1111UseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToA1111UseCaseImpl.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings -import com.shifthackz.aisdv1.core.common.reactive.retryWithDelay -import com.shifthackz.aisdv1.domain.entity.Configuration -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationCredentials -import com.shifthackz.aisdv1.domain.usecase.caching.DataPreLoaderUseCase -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestConnectivityUseCase +import dev.minios.pdaiv1.core.common.reactive.retryWithDelay +import dev.minios.pdaiv1.domain.entity.Configuration +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.feature.auth.AuthorizationCredentials +import dev.minios.pdaiv1.domain.usecase.caching.DataPreLoaderUseCase +import dev.minios.pdaiv1.domain.usecase.connectivity.TestConnectivityUseCase import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToFalAiUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToFalAiUseCase.kt similarity index 74% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToFalAiUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToFalAiUseCase.kt index cdb7ab495..09097a19e 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToFalAiUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToFalAiUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToFalAiUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToFalAiUseCaseImpl.kt similarity index 81% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToFalAiUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToFalAiUseCaseImpl.kt index e94bd1728..8c260820a 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToFalAiUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToFalAiUseCaseImpl.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings -import com.shifthackz.aisdv1.domain.entity.Configuration -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationCredentials -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestFalAiApiKeyUseCase +import dev.minios.pdaiv1.domain.entity.Configuration +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.feature.auth.AuthorizationCredentials +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.connectivity.TestFalAiApiKeyUseCase import io.reactivex.rxjava3.core.Single import java.util.concurrent.TimeUnit diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToHordeUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToHordeUseCase.kt similarity index 72% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToHordeUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToHordeUseCase.kt index ebe7a15da..3008a2b3b 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToHordeUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToHordeUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToHordeUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToHordeUseCaseImpl.kt similarity index 82% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToHordeUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToHordeUseCaseImpl.kt index 07458212f..15bf379da 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToHordeUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToHordeUseCaseImpl.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings -import com.shifthackz.aisdv1.domain.entity.Configuration -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationCredentials -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestHordeApiKeyUseCase +import dev.minios.pdaiv1.domain.entity.Configuration +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.feature.auth.AuthorizationCredentials +import dev.minios.pdaiv1.domain.usecase.connectivity.TestHordeApiKeyUseCase import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single import java.util.concurrent.TimeUnit diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToHuggingFaceUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToHuggingFaceUseCase.kt similarity index 74% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToHuggingFaceUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToHuggingFaceUseCase.kt index f15a207e1..f1d9479fa 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToHuggingFaceUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToHuggingFaceUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToHuggingFaceUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToHuggingFaceUseCaseImpl.kt similarity index 82% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToHuggingFaceUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToHuggingFaceUseCaseImpl.kt index 9a4cb8736..3beb3d1d5 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToHuggingFaceUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToHuggingFaceUseCaseImpl.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings -import com.shifthackz.aisdv1.domain.entity.Configuration -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationCredentials -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestHuggingFaceApiKeyUseCase +import dev.minios.pdaiv1.domain.entity.Configuration +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.feature.auth.AuthorizationCredentials +import dev.minios.pdaiv1.domain.usecase.connectivity.TestHuggingFaceApiKeyUseCase import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single import java.util.concurrent.TimeUnit diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToLocalDiffusionUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToLocalDiffusionUseCase.kt similarity index 73% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToLocalDiffusionUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToLocalDiffusionUseCase.kt index 31c7d1faa..7e0650997 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToLocalDiffusionUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToLocalDiffusionUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToLocalDiffusionUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToLocalDiffusionUseCaseImpl.kt similarity index 87% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToLocalDiffusionUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToLocalDiffusionUseCaseImpl.kt index d2519425b..73a634cfb 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToLocalDiffusionUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToLocalDiffusionUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings -import com.shifthackz.aisdv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.entity.ServerSource import io.reactivex.rxjava3.core.Single internal class ConnectToLocalDiffusionUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToMediaPipeUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToMediaPipeUseCase.kt similarity index 72% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToMediaPipeUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToMediaPipeUseCase.kt index 5c1027e67..ac0349ec7 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToMediaPipeUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToMediaPipeUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToMediaPipeUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToMediaPipeUseCaseImpl.kt similarity index 87% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToMediaPipeUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToMediaPipeUseCaseImpl.kt index a60bdc68f..916c5f0c2 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToMediaPipeUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToMediaPipeUseCaseImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings -import com.shifthackz.aisdv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.entity.ServerSource import io.reactivex.rxjava3.core.Single internal class ConnectToMediaPipeUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToOpenAiUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToOpenAiUseCase.kt similarity index 72% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToOpenAiUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToOpenAiUseCase.kt index 7a2c645a6..4b5211824 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToOpenAiUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToOpenAiUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToOpenAiUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToOpenAiUseCaseImpl.kt similarity index 82% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToOpenAiUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToOpenAiUseCaseImpl.kt index 85e8881ad..fab26cce2 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToOpenAiUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToOpenAiUseCaseImpl.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings -import com.shifthackz.aisdv1.domain.entity.Configuration -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationCredentials -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestOpenAiApiKeyUseCase +import dev.minios.pdaiv1.domain.entity.Configuration +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.feature.auth.AuthorizationCredentials +import dev.minios.pdaiv1.domain.usecase.connectivity.TestOpenAiApiKeyUseCase import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single import java.util.concurrent.TimeUnit diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToQnnUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToQnnUseCase.kt similarity index 75% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToQnnUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToQnnUseCase.kt index b98f7225b..66afe8978 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToQnnUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToQnnUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToQnnUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToQnnUseCaseImpl.kt similarity index 83% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToQnnUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToQnnUseCaseImpl.kt index adbc00c75..b16b6b41b 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToQnnUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToQnnUseCaseImpl.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.preference.PreferenceManager import io.reactivex.rxjava3.core.Single internal class ConnectToQnnUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToStabilityAiUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToStabilityAiUseCase.kt similarity index 73% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToStabilityAiUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToStabilityAiUseCase.kt index ff9565f01..70b674408 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToStabilityAiUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToStabilityAiUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToStabilityAiUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToStabilityAiUseCaseImpl.kt similarity index 82% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToStabilityAiUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToStabilityAiUseCaseImpl.kt index 400767c09..31e7e3a82 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToStabilityAiUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToStabilityAiUseCaseImpl.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings -import com.shifthackz.aisdv1.domain.entity.Configuration -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationCredentials -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestStabilityAiApiKeyUseCase +import dev.minios.pdaiv1.domain.entity.Configuration +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.feature.auth.AuthorizationCredentials +import dev.minios.pdaiv1.domain.usecase.connectivity.TestStabilityAiApiKeyUseCase import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single import java.util.concurrent.TimeUnit diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToSwarmUiUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToSwarmUiUseCase.kt similarity index 58% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToSwarmUiUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToSwarmUiUseCase.kt index 7d77f2a65..9fca50121 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToSwarmUiUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToSwarmUiUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings -import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationCredentials +import dev.minios.pdaiv1.domain.feature.auth.AuthorizationCredentials import io.reactivex.rxjava3.core.Single interface ConnectToSwarmUiUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToSwarmUiUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToSwarmUiUseCaseImpl.kt similarity index 81% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToSwarmUiUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToSwarmUiUseCaseImpl.kt index 78d771c91..a59796121 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToSwarmUiUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToSwarmUiUseCaseImpl.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings -import com.shifthackz.aisdv1.domain.entity.Configuration -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationCredentials -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestSwarmUiConnectivityUseCase +import dev.minios.pdaiv1.domain.entity.Configuration +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.feature.auth.AuthorizationCredentials +import dev.minios.pdaiv1.domain.usecase.connectivity.TestSwarmUiConnectivityUseCase import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single import java.util.concurrent.TimeUnit diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/GetConfigurationUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/GetConfigurationUseCase.kt similarity index 53% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/GetConfigurationUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/GetConfigurationUseCase.kt index b7540c0e2..d3383063d 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/GetConfigurationUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/GetConfigurationUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings -import com.shifthackz.aisdv1.domain.entity.Configuration +import dev.minios.pdaiv1.domain.entity.Configuration import io.reactivex.rxjava3.core.Single interface GetConfigurationUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/GetConfigurationUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/GetConfigurationUseCaseImpl.kt similarity index 86% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/GetConfigurationUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/GetConfigurationUseCaseImpl.kt index ecedaa1a1..3df91c433 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/GetConfigurationUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/GetConfigurationUseCaseImpl.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings -import com.shifthackz.aisdv1.domain.entity.Configuration -import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationStore -import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.entity.Configuration +import dev.minios.pdaiv1.domain.feature.auth.AuthorizationStore +import dev.minios.pdaiv1.domain.preference.PreferenceManager import io.reactivex.rxjava3.core.Single internal class GetConfigurationUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/SetServerConfigurationUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/SetServerConfigurationUseCase.kt similarity index 58% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/SetServerConfigurationUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/SetServerConfigurationUseCase.kt index 1e9ce6f57..3d1c315ca 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/SetServerConfigurationUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/SetServerConfigurationUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings -import com.shifthackz.aisdv1.domain.entity.Configuration +import dev.minios.pdaiv1.domain.entity.Configuration import io.reactivex.rxjava3.core.Completable interface SetServerConfigurationUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/SetServerConfigurationUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/SetServerConfigurationUseCaseImpl.kt similarity index 88% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/SetServerConfigurationUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/SetServerConfigurationUseCaseImpl.kt index 72e497a51..f3aff41fa 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/settings/SetServerConfigurationUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/settings/SetServerConfigurationUseCaseImpl.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings -import com.shifthackz.aisdv1.domain.entity.Configuration -import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationStore -import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.entity.Configuration +import dev.minios.pdaiv1.domain.feature.auth.AuthorizationStore +import dev.minios.pdaiv1.domain.preference.PreferenceManager import io.reactivex.rxjava3.core.Completable internal class SetServerConfigurationUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/splash/SplashNavigationUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/splash/SplashNavigationUseCase.kt similarity index 81% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/splash/SplashNavigationUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/splash/SplashNavigationUseCase.kt index 441a1f936..4c431f1cf 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/splash/SplashNavigationUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/splash/SplashNavigationUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.splash +package dev.minios.pdaiv1.domain.usecase.splash import io.reactivex.rxjava3.core.Single diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/splash/SplashNavigationUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/splash/SplashNavigationUseCaseImpl.kt similarity index 75% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/splash/SplashNavigationUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/splash/SplashNavigationUseCaseImpl.kt index 338f7a972..b3054bc1b 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/splash/SplashNavigationUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/splash/SplashNavigationUseCaseImpl.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.usecase.splash +package dev.minios.pdaiv1.domain.usecase.splash -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.splash.SplashNavigationUseCase.Action +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.splash.SplashNavigationUseCase.Action import io.reactivex.rxjava3.core.Single internal class SplashNavigationUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/stabilityai/FetchAndGetStabilityAiEnginesUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/stabilityai/FetchAndGetStabilityAiEnginesUseCase.kt similarity index 56% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/stabilityai/FetchAndGetStabilityAiEnginesUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/stabilityai/FetchAndGetStabilityAiEnginesUseCase.kt index 254da1d85..197e63553 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/stabilityai/FetchAndGetStabilityAiEnginesUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/stabilityai/FetchAndGetStabilityAiEnginesUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.stabilityai +package dev.minios.pdaiv1.domain.usecase.stabilityai -import com.shifthackz.aisdv1.domain.entity.StabilityAiEngine +import dev.minios.pdaiv1.domain.entity.StabilityAiEngine import io.reactivex.rxjava3.core.Single interface FetchAndGetStabilityAiEnginesUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/stabilityai/FetchAndGetStabilityAiEnginesUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/stabilityai/FetchAndGetStabilityAiEnginesUseCaseImpl.kt similarity index 71% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/stabilityai/FetchAndGetStabilityAiEnginesUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/stabilityai/FetchAndGetStabilityAiEnginesUseCaseImpl.kt index d0e792697..028eb48fc 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/stabilityai/FetchAndGetStabilityAiEnginesUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/stabilityai/FetchAndGetStabilityAiEnginesUseCaseImpl.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.stabilityai +package dev.minios.pdaiv1.domain.usecase.stabilityai -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.entity.StabilityAiEngine -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.StabilityAiEnginesRepository +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.entity.StabilityAiEngine +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.StabilityAiEnginesRepository import io.reactivex.rxjava3.core.Single internal class FetchAndGetStabilityAiEnginesUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/stabilityai/ObserveStabilityAiCreditsUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/stabilityai/ObserveStabilityAiCreditsUseCase.kt similarity index 70% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/stabilityai/ObserveStabilityAiCreditsUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/stabilityai/ObserveStabilityAiCreditsUseCase.kt index 6b09390e4..87fc99dad 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/stabilityai/ObserveStabilityAiCreditsUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/stabilityai/ObserveStabilityAiCreditsUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.stabilityai +package dev.minios.pdaiv1.domain.usecase.stabilityai import io.reactivex.rxjava3.core.Flowable diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/stabilityai/ObserveStabilityAiCreditsUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/stabilityai/ObserveStabilityAiCreditsUseCaseImpl.kt similarity index 63% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/stabilityai/ObserveStabilityAiCreditsUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/stabilityai/ObserveStabilityAiCreditsUseCaseImpl.kt index a2764880a..7c59ca7eb 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/stabilityai/ObserveStabilityAiCreditsUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/stabilityai/ObserveStabilityAiCreditsUseCaseImpl.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.stabilityai +package dev.minios.pdaiv1.domain.usecase.stabilityai -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.entity.Settings -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.StabilityAiCreditsRepository +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.entity.Settings +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.StabilityAiCreditsRepository import io.reactivex.rxjava3.core.Flowable internal class ObserveStabilityAiCreditsUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/swarmmodel/FetchAndGetSwarmUiModelsUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/swarmmodel/FetchAndGetSwarmUiModelsUseCase.kt similarity index 55% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/swarmmodel/FetchAndGetSwarmUiModelsUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/swarmmodel/FetchAndGetSwarmUiModelsUseCase.kt index 35b555fbd..81f18db51 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/swarmmodel/FetchAndGetSwarmUiModelsUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/swarmmodel/FetchAndGetSwarmUiModelsUseCase.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.swarmmodel +package dev.minios.pdaiv1.domain.usecase.swarmmodel -import com.shifthackz.aisdv1.domain.entity.SwarmUiModel +import dev.minios.pdaiv1.domain.entity.SwarmUiModel import io.reactivex.rxjava3.core.Single interface FetchAndGetSwarmUiModelsUseCase { diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/swarmmodel/FetchAndGetSwarmUiModelsUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/swarmmodel/FetchAndGetSwarmUiModelsUseCaseImpl.kt similarity index 71% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/swarmmodel/FetchAndGetSwarmUiModelsUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/swarmmodel/FetchAndGetSwarmUiModelsUseCaseImpl.kt index 70c545477..3f3173005 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/swarmmodel/FetchAndGetSwarmUiModelsUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/swarmmodel/FetchAndGetSwarmUiModelsUseCaseImpl.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.swarmmodel +package dev.minios.pdaiv1.domain.usecase.swarmmodel -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.entity.SwarmUiModel -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.SwarmUiModelsRepository +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.entity.SwarmUiModel +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.SwarmUiModelsRepository import io.reactivex.rxjava3.core.Single internal class FetchAndGetSwarmUiModelsUseCaseImpl( diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/wakelock/AcquireWakelockUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/wakelock/AcquireWakelockUseCase.kt similarity index 79% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/wakelock/AcquireWakelockUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/wakelock/AcquireWakelockUseCase.kt index 5ad1c5a61..98c3f47b9 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/wakelock/AcquireWakelockUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/wakelock/AcquireWakelockUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.wakelock +package dev.minios.pdaiv1.domain.usecase.wakelock interface AcquireWakelockUseCase { operator fun invoke(timeout: Long = DEFAULT_TIMEOUT): Result diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/wakelock/AcquireWakelockUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/wakelock/AcquireWakelockUseCaseImpl.kt similarity index 62% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/wakelock/AcquireWakelockUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/wakelock/AcquireWakelockUseCaseImpl.kt index 57f91a548..6aa7c1629 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/wakelock/AcquireWakelockUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/wakelock/AcquireWakelockUseCaseImpl.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.usecase.wakelock +package dev.minios.pdaiv1.domain.usecase.wakelock -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.domain.repository.WakeLockRepository +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.domain.repository.WakeLockRepository internal class AcquireWakelockUseCaseImpl( private val wakeLockRepository: WakeLockRepository, diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/wakelock/ReleaseWakeLockUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/wakelock/ReleaseWakeLockUseCase.kt similarity index 59% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/wakelock/ReleaseWakeLockUseCase.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/wakelock/ReleaseWakeLockUseCase.kt index 42281feca..9cc14eb02 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/wakelock/ReleaseWakeLockUseCase.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/wakelock/ReleaseWakeLockUseCase.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.wakelock +package dev.minios.pdaiv1.domain.usecase.wakelock interface ReleaseWakeLockUseCase { operator fun invoke(): Result diff --git a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/wakelock/ReleaseWakeLockUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/wakelock/ReleaseWakeLockUseCaseImpl.kt similarity index 60% rename from domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/wakelock/ReleaseWakeLockUseCaseImpl.kt rename to domain/src/main/java/dev/minios/pdaiv1/domain/usecase/wakelock/ReleaseWakeLockUseCaseImpl.kt index adb7473f3..5c44d9258 100644 --- a/domain/src/main/java/com/shifthackz/aisdv1/domain/usecase/wakelock/ReleaseWakeLockUseCaseImpl.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/wakelock/ReleaseWakeLockUseCaseImpl.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.usecase.wakelock +package dev.minios.pdaiv1.domain.usecase.wakelock -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.domain.repository.WakeLockRepository +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.domain.repository.WakeLockRepository internal class ReleaseWakeLockUseCaseImpl( private val wakeLockRepository: WakeLockRepository, diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/ServerConfigurationMocks.kt b/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/ServerConfigurationMocks.kt deleted file mode 100644 index 9008a5bf6..000000000 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/ServerConfigurationMocks.kt +++ /dev/null @@ -1,5 +0,0 @@ -package com.shifthackz.aisdv1.domain.mocks - -import com.shifthackz.aisdv1.domain.entity.ServerConfiguration - -val mockServerConfiguration = ServerConfiguration("checkpoint") diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/AiGenerationResultMocks.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/AiGenerationResultMocks.kt similarity index 81% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/AiGenerationResultMocks.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/mocks/AiGenerationResultMocks.kt index b2d049be4..ae32d28df 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/AiGenerationResultMocks.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/AiGenerationResultMocks.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.mocks +package dev.minios.pdaiv1.domain.mocks -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.MediaType +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.MediaType import java.util.Date val mockAiGenerationResult = AiGenerationResult( diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/ConfigurationMocks.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/ConfigurationMocks.kt similarity index 86% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/ConfigurationMocks.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/mocks/ConfigurationMocks.kt index 78f2c6da3..4704bb6cc 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/ConfigurationMocks.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/ConfigurationMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.mocks +package dev.minios.pdaiv1.domain.mocks -import com.shifthackz.aisdv1.domain.entity.Configuration +import dev.minios.pdaiv1.domain.entity.Configuration val mockConfiguration = Configuration( serverUrl = "http://5598.is.my.favorite.com", diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/FalAiMocks.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/FalAiMocks.kt similarity index 77% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/FalAiMocks.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/mocks/FalAiMocks.kt index 2165e0357..2147f80de 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/FalAiMocks.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/FalAiMocks.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.domain.mocks +package dev.minios.pdaiv1.domain.mocks -import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint -import com.shifthackz.aisdv1.domain.entity.FalAiEndpointCategory -import com.shifthackz.aisdv1.domain.entity.FalAiEndpointSchema -import com.shifthackz.aisdv1.domain.entity.FalAiInputProperty -import com.shifthackz.aisdv1.domain.entity.FalAiPayload -import com.shifthackz.aisdv1.domain.entity.FalAiPropertyType +import dev.minios.pdaiv1.domain.entity.FalAiEndpoint +import dev.minios.pdaiv1.domain.entity.FalAiEndpointCategory +import dev.minios.pdaiv1.domain.entity.FalAiEndpointSchema +import dev.minios.pdaiv1.domain.entity.FalAiInputProperty +import dev.minios.pdaiv1.domain.entity.FalAiPayload +import dev.minios.pdaiv1.domain.entity.FalAiPropertyType val mockFalAiInputProperty = FalAiInputProperty( name = "prompt", diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/ForgeModuleMocks.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/ForgeModuleMocks.kt similarity index 72% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/ForgeModuleMocks.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/mocks/ForgeModuleMocks.kt index 2f2f591af..62b01086d 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/ForgeModuleMocks.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/ForgeModuleMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.mocks +package dev.minios.pdaiv1.domain.mocks -import com.shifthackz.aisdv1.domain.entity.ForgeModule +import dev.minios.pdaiv1.domain.entity.ForgeModule val mockForgeModule = ForgeModule( name = "ADetailer", diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/HuggingFaceModelMocks.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/HuggingFaceModelMocks.kt similarity index 72% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/HuggingFaceModelMocks.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/mocks/HuggingFaceModelMocks.kt index d9e8e956f..96f8e6dfb 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/HuggingFaceModelMocks.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/HuggingFaceModelMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.mocks +package dev.minios.pdaiv1.domain.mocks -import com.shifthackz.aisdv1.domain.entity.HuggingFaceModel +import dev.minios.pdaiv1.domain.entity.HuggingFaceModel val mockHuggingFaceModels = listOf( HuggingFaceModel.default, diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/ImageToImagePayloadMocks.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/ImageToImagePayloadMocks.kt similarity index 85% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/ImageToImagePayloadMocks.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/mocks/ImageToImagePayloadMocks.kt index d72aa0ff4..18e735957 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/ImageToImagePayloadMocks.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/ImageToImagePayloadMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.mocks +package dev.minios.pdaiv1.domain.mocks -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload val mockImageToImagePayload = ImageToImagePayload( base64Image = "", diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/LocalAiModelMocks.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/LocalAiModelMocks.kt similarity index 75% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/LocalAiModelMocks.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/mocks/LocalAiModelMocks.kt index 5ce3fa3b9..59dd55762 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/LocalAiModelMocks.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/LocalAiModelMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.mocks +package dev.minios.pdaiv1.domain.mocks -import com.shifthackz.aisdv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.domain.entity.LocalAiModel val mockLocalAiModels = listOf( LocalAiModel.CustomOnnx, diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/LoraMocks.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/LoraMocks.kt similarity index 70% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/LoraMocks.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/mocks/LoraMocks.kt index 7e457a43b..e0ea2fd68 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/LoraMocks.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/LoraMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.mocks +package dev.minios.pdaiv1.domain.mocks -import com.shifthackz.aisdv1.domain.entity.LoRA +import dev.minios.pdaiv1.domain.entity.LoRA val mockLoRAs = listOf( LoRA( diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/MediaStoreInfoMocks.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/MediaStoreInfoMocks.kt similarity index 52% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/MediaStoreInfoMocks.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/mocks/MediaStoreInfoMocks.kt index e3049220e..55317a0c1 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/MediaStoreInfoMocks.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/MediaStoreInfoMocks.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.mocks +package dev.minios.pdaiv1.domain.mocks import android.net.Uri -import com.shifthackz.aisdv1.domain.entity.MediaStoreInfo +import dev.minios.pdaiv1.domain.entity.MediaStoreInfo val mockMediaStoreInfo = MediaStoreInfo( count = 5598, diff --git a/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/ServerConfigurationMocks.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/ServerConfigurationMocks.kt new file mode 100644 index 000000000..9aed829fa --- /dev/null +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/ServerConfigurationMocks.kt @@ -0,0 +1,5 @@ +package dev.minios.pdaiv1.domain.mocks + +import dev.minios.pdaiv1.domain.entity.ServerConfiguration + +val mockServerConfiguration = ServerConfiguration("checkpoint") diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/SettingsMocks.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/SettingsMocks.kt similarity index 77% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/SettingsMocks.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/mocks/SettingsMocks.kt index 4dfca8632..09decdaa3 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/SettingsMocks.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/SettingsMocks.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.mocks +package dev.minios.pdaiv1.domain.mocks -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.entity.Settings +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.entity.Settings val mockSettings = Settings( serverUrl = "", diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/StabilityAiEngineMocks.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/StabilityAiEngineMocks.kt similarity index 66% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/StabilityAiEngineMocks.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/mocks/StabilityAiEngineMocks.kt index 330dad138..f9be485a8 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/StabilityAiEngineMocks.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/StabilityAiEngineMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.mocks +package dev.minios.pdaiv1.domain.mocks -import com.shifthackz.aisdv1.domain.entity.StabilityAiEngine +import dev.minios.pdaiv1.domain.entity.StabilityAiEngine val mockStabilityAiEngines = listOf( StabilityAiEngine( diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/StableDiffusionEmbeddingMocks.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/StableDiffusionEmbeddingMocks.kt similarity index 56% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/StableDiffusionEmbeddingMocks.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/mocks/StableDiffusionEmbeddingMocks.kt index 3a44c6329..bc1d3edcf 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/StableDiffusionEmbeddingMocks.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/StableDiffusionEmbeddingMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.mocks +package dev.minios.pdaiv1.domain.mocks -import com.shifthackz.aisdv1.domain.entity.Embedding +import dev.minios.pdaiv1.domain.entity.Embedding val mockEmbeddings = listOf( Embedding("embedding_1"), diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/StableDiffusionHyperNetworkMocks.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/StableDiffusionHyperNetworkMocks.kt similarity index 66% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/StableDiffusionHyperNetworkMocks.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/mocks/StableDiffusionHyperNetworkMocks.kt index e7e697eba..1ac500a4b 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/StableDiffusionHyperNetworkMocks.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/StableDiffusionHyperNetworkMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.mocks +package dev.minios.pdaiv1.domain.mocks -import com.shifthackz.aisdv1.domain.entity.StableDiffusionHyperNetwork +import dev.minios.pdaiv1.domain.entity.StableDiffusionHyperNetwork val mockStableDiffusionHyperNetworks = listOf( StableDiffusionHyperNetwork( diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/StableDiffusionModelMocks.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/StableDiffusionModelMocks.kt similarity index 80% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/StableDiffusionModelMocks.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/mocks/StableDiffusionModelMocks.kt index f55d4e38f..4bce906ae 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/StableDiffusionModelMocks.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/StableDiffusionModelMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.mocks +package dev.minios.pdaiv1.domain.mocks -import com.shifthackz.aisdv1.domain.entity.StableDiffusionModel +import dev.minios.pdaiv1.domain.entity.StableDiffusionModel val mockStableDiffusionModels = listOf( StableDiffusionModel( diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/StableDiffusionSamplerMocks.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/StableDiffusionSamplerMocks.kt similarity index 75% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/StableDiffusionSamplerMocks.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/mocks/StableDiffusionSamplerMocks.kt index 2cece698b..bcb3c551c 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/StableDiffusionSamplerMocks.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/StableDiffusionSamplerMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.mocks +package dev.minios.pdaiv1.domain.mocks -import com.shifthackz.aisdv1.domain.entity.StableDiffusionSampler +import dev.minios.pdaiv1.domain.entity.StableDiffusionSampler val mockStableDiffusionSamplers = listOf( StableDiffusionSampler( diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/SupporterMocks.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/SupporterMocks.kt similarity index 67% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/SupporterMocks.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/mocks/SupporterMocks.kt index 8d67f341e..34c5517db 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/SupporterMocks.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/SupporterMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.mocks +package dev.minios.pdaiv1.domain.mocks -import com.shifthackz.aisdv1.domain.entity.Supporter +import dev.minios.pdaiv1.domain.entity.Supporter import java.util.Date val mockSupporters = listOf( diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/TextToImagePayloadMocks.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/TextToImagePayloadMocks.kt similarity index 82% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/TextToImagePayloadMocks.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/mocks/TextToImagePayloadMocks.kt index 1817e0e5b..16765a025 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/mocks/TextToImagePayloadMocks.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/mocks/TextToImagePayloadMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.mocks +package dev.minios.pdaiv1.domain.mocks -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload val mockTextToImagePayload = TextToImagePayload( prompt = "prompt", diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/caching/ClearAppCacheUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/caching/ClearAppCacheUseCaseImplTest.kt similarity index 91% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/caching/ClearAppCacheUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/caching/ClearAppCacheUseCaseImplTest.kt index 5a6dc4bff..89516e072 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/caching/ClearAppCacheUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/caching/ClearAppCacheUseCaseImplTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.usecase.caching +package dev.minios.pdaiv1.domain.usecase.caching -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.core.common.log.FileLoggingTree -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.core.common.log.FileLoggingTree +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository import io.mockk.every import io.mockk.mockk import io.mockk.mockkObject diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/caching/DataPreLoaderUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/caching/DataPreLoaderUseCaseImplTest.kt similarity index 93% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/caching/DataPreLoaderUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/caching/DataPreLoaderUseCaseImplTest.kt index 80059ad61..8da4508b2 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/caching/DataPreLoaderUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/caching/DataPreLoaderUseCaseImplTest.kt @@ -1,16 +1,16 @@ -package com.shifthackz.aisdv1.domain.usecase.caching +package dev.minios.pdaiv1.domain.usecase.caching import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.EmbeddingsRepository -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository -import com.shifthackz.aisdv1.domain.repository.LorasRepository -import com.shifthackz.aisdv1.domain.repository.ServerConfigurationRepository -import com.shifthackz.aisdv1.domain.repository.StableDiffusionHyperNetworksRepository -import com.shifthackz.aisdv1.domain.repository.StableDiffusionModelsRepository -import com.shifthackz.aisdv1.domain.repository.StableDiffusionSamplersRepository +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.EmbeddingsRepository +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.domain.repository.LorasRepository +import dev.minios.pdaiv1.domain.repository.ServerConfigurationRepository +import dev.minios.pdaiv1.domain.repository.StableDiffusionHyperNetworksRepository +import dev.minios.pdaiv1.domain.repository.StableDiffusionModelsRepository +import dev.minios.pdaiv1.domain.repository.StableDiffusionSamplersRepository import io.reactivex.rxjava3.core.Completable import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/caching/GetLastResultFromCacheUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/caching/GetLastResultFromCacheUseCaseImplTest.kt similarity index 84% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/caching/GetLastResultFromCacheUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/caching/GetLastResultFromCacheUseCaseImplTest.kt index 3d275385e..e1d3aaeb7 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/caching/GetLastResultFromCacheUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/caching/GetLastResultFromCacheUseCaseImplTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.caching +package dev.minios.pdaiv1.domain.usecase.caching import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.mocks.mockAiGenerationResult -import com.shifthackz.aisdv1.domain.repository.TemporaryGenerationResultRepository +import dev.minios.pdaiv1.domain.mocks.mockAiGenerationResult +import dev.minios.pdaiv1.domain.repository.TemporaryGenerationResultRepository import io.reactivex.rxjava3.core.Single import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/caching/SaveLastResultToCacheUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/caching/SaveLastResultToCacheUseCaseImplTest.kt similarity index 88% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/caching/SaveLastResultToCacheUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/caching/SaveLastResultToCacheUseCaseImplTest.kt index 7507d5f1e..12feced7e 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/caching/SaveLastResultToCacheUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/caching/SaveLastResultToCacheUseCaseImplTest.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.domain.usecase.caching +package dev.minios.pdaiv1.domain.usecase.caching import com.nhaarman.mockitokotlin2.any import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.mocks.mockAiGenerationResult -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.TemporaryGenerationResultRepository +import dev.minios.pdaiv1.domain.mocks.mockAiGenerationResult +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.TemporaryGenerationResultRepository import io.reactivex.rxjava3.core.Completable import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/ObserveSeverConnectivityUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/connectivity/ObserveSeverConnectivityUseCaseImplTest.kt similarity index 94% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/ObserveSeverConnectivityUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/connectivity/ObserveSeverConnectivityUseCaseImplTest.kt index 777ade05b..35a063bea 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/ObserveSeverConnectivityUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/connectivity/ObserveSeverConnectivityUseCaseImplTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.usecase.connectivity +package dev.minios.pdaiv1.domain.usecase.connectivity import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.gateway.ServerConnectivityGateway +import dev.minios.pdaiv1.domain.gateway.ServerConnectivityGateway import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.subjects.BehaviorSubject diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/PingStableDiffusionServiceUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/connectivity/PingStableDiffusionServiceUseCaseImplTest.kt similarity index 88% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/PingStableDiffusionServiceUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/connectivity/PingStableDiffusionServiceUseCaseImplTest.kt index 741e5e341..e59f85428 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/PingStableDiffusionServiceUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/connectivity/PingStableDiffusionServiceUseCaseImplTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.usecase.connectivity +package dev.minios.pdaiv1.domain.usecase.connectivity import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.repository.StableDiffusionGenerationRepository +import dev.minios.pdaiv1.domain.repository.StableDiffusionGenerationRepository import io.reactivex.rxjava3.core.Completable import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestConnectivityUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestConnectivityUseCaseImplTest.kt similarity index 90% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestConnectivityUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestConnectivityUseCaseImplTest.kt index 6d5ffcc1b..a43a718fe 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestConnectivityUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestConnectivityUseCaseImplTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.connectivity +package dev.minios.pdaiv1.domain.usecase.connectivity import com.nhaarman.mockitokotlin2.any import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.repository.StableDiffusionGenerationRepository +import dev.minios.pdaiv1.domain.repository.StableDiffusionGenerationRepository import io.reactivex.rxjava3.core.Completable import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestFalAiApiKeyUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestFalAiApiKeyUseCaseImplTest.kt similarity index 92% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestFalAiApiKeyUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestFalAiApiKeyUseCaseImplTest.kt index 38307be9a..637d541e6 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestFalAiApiKeyUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestFalAiApiKeyUseCaseImplTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.usecase.connectivity +package dev.minios.pdaiv1.domain.usecase.connectivity import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.repository.FalAiGenerationRepository +import dev.minios.pdaiv1.domain.repository.FalAiGenerationRepository import io.reactivex.rxjava3.core.Single import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestHordeApiKeyUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestHordeApiKeyUseCaseImplTest.kt similarity index 91% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestHordeApiKeyUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestHordeApiKeyUseCaseImplTest.kt index 769d5f36a..7162a9843 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestHordeApiKeyUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestHordeApiKeyUseCaseImplTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.usecase.connectivity +package dev.minios.pdaiv1.domain.usecase.connectivity import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.repository.HordeGenerationRepository +import dev.minios.pdaiv1.domain.repository.HordeGenerationRepository import io.reactivex.rxjava3.core.Single import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestHuggingFaceApiKeyUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestHuggingFaceApiKeyUseCaseImplTest.kt similarity index 91% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestHuggingFaceApiKeyUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestHuggingFaceApiKeyUseCaseImplTest.kt index 10d4a46cc..3c815b607 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestHuggingFaceApiKeyUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestHuggingFaceApiKeyUseCaseImplTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.usecase.connectivity +package dev.minios.pdaiv1.domain.usecase.connectivity import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.repository.HuggingFaceGenerationRepository +import dev.minios.pdaiv1.domain.repository.HuggingFaceGenerationRepository import io.reactivex.rxjava3.core.Single import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestOpenAiApiKeyUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestOpenAiApiKeyUseCaseImplTest.kt similarity index 91% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestOpenAiApiKeyUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestOpenAiApiKeyUseCaseImplTest.kt index 40877cc82..8455a7efa 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestOpenAiApiKeyUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestOpenAiApiKeyUseCaseImplTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.usecase.connectivity +package dev.minios.pdaiv1.domain.usecase.connectivity import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.repository.OpenAiGenerationRepository +import dev.minios.pdaiv1.domain.repository.OpenAiGenerationRepository import io.reactivex.rxjava3.core.Single import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestStabilityAiApiKeyUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestStabilityAiApiKeyUseCaseImplTest.kt similarity index 91% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestStabilityAiApiKeyUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestStabilityAiApiKeyUseCaseImplTest.kt index 23a1d673e..b59f08925 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/connectivity/TestStabilityAiApiKeyUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/connectivity/TestStabilityAiApiKeyUseCaseImplTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.usecase.connectivity +package dev.minios.pdaiv1.domain.usecase.connectivity import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.repository.StabilityAiGenerationRepository +import dev.minios.pdaiv1.domain.repository.StabilityAiGenerationRepository import io.reactivex.rxjava3.core.Single import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/debug/DebugInsertBadBase64UseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/debug/DebugInsertBadBase64UseCaseImplTest.kt similarity index 89% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/debug/DebugInsertBadBase64UseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/debug/DebugInsertBadBase64UseCaseImplTest.kt index 1d56c81b4..c24a05642 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/debug/DebugInsertBadBase64UseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/debug/DebugInsertBadBase64UseCaseImplTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.debug +package dev.minios.pdaiv1.domain.usecase.debug import com.nhaarman.mockitokotlin2.any import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository import io.reactivex.rxjava3.core.Single import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/donate/FetchAndGetSupportersUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/donate/FetchAndGetSupportersUseCaseImplTest.kt similarity index 89% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/donate/FetchAndGetSupportersUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/donate/FetchAndGetSupportersUseCaseImplTest.kt index a838d0c3c..4f8e0deff 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/donate/FetchAndGetSupportersUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/donate/FetchAndGetSupportersUseCaseImplTest.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.usecase.donate +package dev.minios.pdaiv1.domain.usecase.donate -import com.shifthackz.aisdv1.domain.mocks.mockSupporters -import com.shifthackz.aisdv1.domain.repository.SupportersRepository +import dev.minios.pdaiv1.domain.mocks.mockSupporters +import dev.minios.pdaiv1.domain.repository.SupportersRepository import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Single diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/downloadable/DeleteModelUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/downloadable/DeleteModelUseCaseImplTest.kt similarity index 88% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/downloadable/DeleteModelUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/downloadable/DeleteModelUseCaseImplTest.kt index f3504939a..291d9fc96 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/downloadable/DeleteModelUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/downloadable/DeleteModelUseCaseImplTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.downloadable +package dev.minios.pdaiv1.domain.usecase.downloadable import com.nhaarman.mockitokotlin2.any import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.repository.DownloadableModelRepository +import dev.minios.pdaiv1.domain.repository.DownloadableModelRepository import io.reactivex.rxjava3.core.Completable import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/downloadable/DownloadModelUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/downloadable/DownloadModelUseCaseImplTest.kt similarity index 90% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/downloadable/DownloadModelUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/downloadable/DownloadModelUseCaseImplTest.kt index f5c463a75..885d564b9 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/downloadable/DownloadModelUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/downloadable/DownloadModelUseCaseImplTest.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.domain.usecase.downloadable +package dev.minios.pdaiv1.domain.usecase.downloadable import com.nhaarman.mockitokotlin2.any import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.entity.DownloadState -import com.shifthackz.aisdv1.domain.repository.DownloadableModelRepository +import dev.minios.pdaiv1.domain.entity.DownloadState +import dev.minios.pdaiv1.domain.repository.DownloadableModelRepository import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.subjects.PublishSubject import org.junit.Before @@ -29,7 +29,7 @@ class DownloadModelUseCaseImplTest { @Test fun `given download running, then finishes successfully, expected final state is Complete`() { - val stubObserver = useCase("5598", "https://moroz.cc/stub.zip").test() + val stubObserver = useCase("5598", "https://example.com/stub.zip").test() stubDownloadStatus.onNext(DownloadState.Unknown) @@ -58,7 +58,7 @@ class DownloadModelUseCaseImplTest { @Test fun `given download running, then fails, expected final state is Error`() { - val stubObserver = useCase("5598", "https://moroz.cc/stub.zip").test() + val stubObserver = useCase("5598", "https://example.com/stub.zip").test() stubDownloadStatus.onNext(DownloadState.Unknown) @@ -87,7 +87,7 @@ class DownloadModelUseCaseImplTest { @Test fun `given download running, then fails, then user restarts download, then completes, expected state Error on 1st try, final state is Complete`() { - val stubObserver = useCase("5598", "https://moroz.cc/stub.zip").test() + val stubObserver = useCase("5598", "https://example.com/stub.zip").test() stubDownloadStatus.onNext(DownloadState.Unknown) @@ -143,7 +143,7 @@ class DownloadModelUseCaseImplTest { whenever(stubRepository.download(any(), any())) .thenReturn(Observable.error(stubTerminateException)) - useCase("5598", "https://moroz.cc/stub.zip") + useCase("5598", "https://example.com/stub.zip") .test() .assertError(stubTerminateException) .await() diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalOnnxModelsUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalOnnxModelsUseCaseImplTest.kt similarity index 88% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalOnnxModelsUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalOnnxModelsUseCaseImplTest.kt index d154c1633..7a236281f 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/downloadable/GetLocalOnnxModelsUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/downloadable/GetLocalOnnxModelsUseCaseImplTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.downloadable +package dev.minios.pdaiv1.domain.usecase.downloadable import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.mocks.mockLocalAiModels -import com.shifthackz.aisdv1.domain.repository.DownloadableModelRepository +import dev.minios.pdaiv1.domain.mocks.mockLocalAiModels +import dev.minios.pdaiv1.domain.repository.DownloadableModelRepository import io.reactivex.rxjava3.core.Single import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/downloadable/ObserveLocalOnnxModelsUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/downloadable/ObserveLocalOnnxModelsUseCaseImplTest.kt similarity index 92% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/downloadable/ObserveLocalOnnxModelsUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/downloadable/ObserveLocalOnnxModelsUseCaseImplTest.kt index a61684b1a..80e1b7d09 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/downloadable/ObserveLocalOnnxModelsUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/downloadable/ObserveLocalOnnxModelsUseCaseImplTest.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.domain.usecase.downloadable +package dev.minios.pdaiv1.domain.usecase.downloadable import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.entity.LocalAiModel -import com.shifthackz.aisdv1.domain.mocks.mockLocalAiModels -import com.shifthackz.aisdv1.domain.repository.DownloadableModelRepository +import dev.minios.pdaiv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.domain.mocks.mockLocalAiModels +import dev.minios.pdaiv1.domain.repository.DownloadableModelRepository import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.subjects.BehaviorSubject diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/forgemodule/GetForgeModulesUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/forgemodule/GetForgeModulesUseCaseImplTest.kt similarity index 89% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/forgemodule/GetForgeModulesUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/forgemodule/GetForgeModulesUseCaseImplTest.kt index cf3d4884b..62824362f 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/forgemodule/GetForgeModulesUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/forgemodule/GetForgeModulesUseCaseImplTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.forgemodule +package dev.minios.pdaiv1.domain.usecase.forgemodule import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.mocks.mockForgeModules -import com.shifthackz.aisdv1.domain.repository.ForgeModulesRepository +import dev.minios.pdaiv1.domain.mocks.mockForgeModules +import dev.minios.pdaiv1.domain.repository.ForgeModulesRepository import io.reactivex.rxjava3.core.Single import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteAllGalleryUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteAllGalleryUseCaseImplTest.kt similarity index 89% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteAllGalleryUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteAllGalleryUseCaseImplTest.kt index 4f07564e6..cdb35bef8 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteAllGalleryUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteAllGalleryUseCaseImplTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.usecase.gallery +package dev.minios.pdaiv1.domain.usecase.gallery import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository import io.reactivex.rxjava3.core.Completable import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteGalleryItemUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteGalleryItemUseCaseImplTest.kt similarity index 89% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteGalleryItemUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteGalleryItemUseCaseImplTest.kt index f6c678f27..8e11d3dc0 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteGalleryItemUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteGalleryItemUseCaseImplTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.gallery +package dev.minios.pdaiv1.domain.usecase.gallery import com.nhaarman.mockitokotlin2.any import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository import io.reactivex.rxjava3.core.Completable import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteGalleryItemsUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteGalleryItemsUseCaseImplTest.kt similarity index 90% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteGalleryItemsUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteGalleryItemsUseCaseImplTest.kt index 9778f650f..26a243ab2 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/gallery/DeleteGalleryItemsUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/DeleteGalleryItemsUseCaseImplTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.gallery +package dev.minios.pdaiv1.domain.usecase.gallery import com.nhaarman.mockitokotlin2.any import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository import io.reactivex.rxjava3.core.Completable import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetAllGalleryUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/GetAllGalleryUseCaseImplTest.kt similarity index 88% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetAllGalleryUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/GetAllGalleryUseCaseImplTest.kt index 4ba7d2c42..a518f60b1 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetAllGalleryUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/GetAllGalleryUseCaseImplTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.gallery +package dev.minios.pdaiv1.domain.usecase.gallery import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.mocks.mockAiGenerationResults -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.domain.mocks.mockAiGenerationResults +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository import io.reactivex.rxjava3.core.Single import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryPagedIdsUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/GetGalleryPagedIdsUseCaseImplTest.kt similarity index 92% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryPagedIdsUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/GetGalleryPagedIdsUseCaseImplTest.kt index eb037a5ba..f55a0a61b 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetGalleryPagedIdsUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/GetGalleryPagedIdsUseCaseImplTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.usecase.gallery +package dev.minios.pdaiv1.domain.usecase.gallery import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository import io.reactivex.rxjava3.core.Single import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetMediaStoreInfoUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/GetMediaStoreInfoUseCaseImplTest.kt similarity index 85% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetMediaStoreInfoUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/GetMediaStoreInfoUseCaseImplTest.kt index 18a11c0e9..67141728f 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/gallery/GetMediaStoreInfoUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/GetMediaStoreInfoUseCaseImplTest.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.domain.usecase.gallery +package dev.minios.pdaiv1.domain.usecase.gallery import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.entity.MediaStoreInfo -import com.shifthackz.aisdv1.domain.mocks.mockMediaStoreInfo -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.domain.entity.MediaStoreInfo +import dev.minios.pdaiv1.domain.mocks.mockMediaStoreInfo +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository import io.reactivex.rxjava3.core.Single import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/gallery/ToggleImageVisibilityUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/ToggleImageVisibilityUseCaseImplTest.kt similarity index 89% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/gallery/ToggleImageVisibilityUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/ToggleImageVisibilityUseCaseImplTest.kt index 33880cd49..ac87cca0f 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/gallery/ToggleImageVisibilityUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/ToggleImageVisibilityUseCaseImplTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.gallery +package dev.minios.pdaiv1.domain.usecase.gallery import com.nhaarman.mockitokotlin2.any import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository import io.reactivex.rxjava3.core.Single import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/FalAiGenerationUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/FalAiGenerationUseCaseImplTest.kt similarity index 90% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/FalAiGenerationUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/FalAiGenerationUseCaseImplTest.kt index 4a4a351c2..454909699 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/FalAiGenerationUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/FalAiGenerationUseCaseImplTest.kt @@ -1,13 +1,13 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation import com.nhaarman.mockitokotlin2.any import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.mocks.mockAiGenerationResult -import com.shifthackz.aisdv1.domain.mocks.mockFalAiEndpoint -import com.shifthackz.aisdv1.domain.mocks.mockFalAiPayload -import com.shifthackz.aisdv1.domain.repository.FalAiEndpointRepository -import com.shifthackz.aisdv1.domain.repository.FalAiGenerationRepository +import dev.minios.pdaiv1.domain.mocks.mockAiGenerationResult +import dev.minios.pdaiv1.domain.mocks.mockFalAiEndpoint +import dev.minios.pdaiv1.domain.mocks.mockFalAiPayload +import dev.minios.pdaiv1.domain.repository.FalAiEndpointRepository +import dev.minios.pdaiv1.domain.repository.FalAiGenerationRepository import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/GetGenerationResultPagedUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/GetGenerationResultPagedUseCaseImplTest.kt similarity index 88% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/GetGenerationResultPagedUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/GetGenerationResultPagedUseCaseImplTest.kt index 5ca053dad..d7af0b621 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/GetGenerationResultPagedUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/GetGenerationResultPagedUseCaseImplTest.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation import com.nhaarman.mockitokotlin2.any import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.mocks.mockAiGenerationResults -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.domain.mocks.mockAiGenerationResults +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository import io.reactivex.rxjava3.core.Single import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/GetGenerationResultUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/GetGenerationResultUseCaseImplTest.kt similarity index 86% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/GetGenerationResultUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/GetGenerationResultUseCaseImplTest.kt index 07a2f519e..4ae2a790d 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/GetGenerationResultUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/GetGenerationResultUseCaseImplTest.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation import com.nhaarman.mockitokotlin2.any import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.mocks.mockAiGenerationResult -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.domain.mocks.mockAiGenerationResult +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository import io.reactivex.rxjava3.core.Single import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/GetRandomImageUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/GetRandomImageUseCaseImplTest.kt similarity index 90% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/GetRandomImageUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/GetRandomImageUseCaseImplTest.kt index 8cbe8a820..760b677ac 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/GetRandomImageUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/GetRandomImageUseCaseImplTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation import android.graphics.Bitmap import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.repository.RandomImageRepository +import dev.minios.pdaiv1.domain.repository.RandomImageRepository import io.reactivex.rxjava3.core.Single import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/ImageToImageUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/ImageToImageUseCaseImplTest.kt similarity index 93% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/ImageToImageUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/ImageToImageUseCaseImplTest.kt index 68a64aba7..0bda15ac0 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/ImageToImageUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/ImageToImageUseCaseImplTest.kt @@ -1,18 +1,18 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation import com.nhaarman.mockitokotlin2.any import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.mocks.mockAiGenerationResult -import com.shifthackz.aisdv1.domain.mocks.mockImageToImagePayload -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.HordeGenerationRepository -import com.shifthackz.aisdv1.domain.repository.HuggingFaceGenerationRepository -import com.shifthackz.aisdv1.domain.repository.StabilityAiGenerationRepository -import com.shifthackz.aisdv1.domain.repository.QnnGenerationRepository -import com.shifthackz.aisdv1.domain.repository.StableDiffusionGenerationRepository -import com.shifthackz.aisdv1.domain.repository.SwarmUiGenerationRepository +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.mocks.mockAiGenerationResult +import dev.minios.pdaiv1.domain.mocks.mockImageToImagePayload +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.HordeGenerationRepository +import dev.minios.pdaiv1.domain.repository.HuggingFaceGenerationRepository +import dev.minios.pdaiv1.domain.repository.StabilityAiGenerationRepository +import dev.minios.pdaiv1.domain.repository.QnnGenerationRepository +import dev.minios.pdaiv1.domain.repository.StableDiffusionGenerationRepository +import dev.minios.pdaiv1.domain.repository.SwarmUiGenerationRepository import io.reactivex.rxjava3.core.Single import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/InterruptGenerationUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/InterruptGenerationUseCaseImplTest.kt similarity index 90% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/InterruptGenerationUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/InterruptGenerationUseCaseImplTest.kt index 4b81c09e8..ea3439648 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/InterruptGenerationUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/InterruptGenerationUseCaseImplTest.kt @@ -1,13 +1,13 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.HordeGenerationRepository -import com.shifthackz.aisdv1.domain.repository.LocalDiffusionGenerationRepository -import com.shifthackz.aisdv1.domain.repository.QnnGenerationRepository -import com.shifthackz.aisdv1.domain.repository.StableDiffusionGenerationRepository +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.HordeGenerationRepository +import dev.minios.pdaiv1.domain.repository.LocalDiffusionGenerationRepository +import dev.minios.pdaiv1.domain.repository.QnnGenerationRepository +import dev.minios.pdaiv1.domain.repository.StableDiffusionGenerationRepository import io.reactivex.rxjava3.core.Completable import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/ObserveHordeProcessStatusUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/ObserveHordeProcessStatusUseCaseImplTest.kt similarity index 91% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/ObserveHordeProcessStatusUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/ObserveHordeProcessStatusUseCaseImplTest.kt index 094b08793..985f61026 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/ObserveHordeProcessStatusUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/ObserveHordeProcessStatusUseCaseImplTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.entity.HordeProcessStatus -import com.shifthackz.aisdv1.domain.repository.HordeGenerationRepository +import dev.minios.pdaiv1.domain.entity.HordeProcessStatus +import dev.minios.pdaiv1.domain.repository.HordeGenerationRepository import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.subjects.BehaviorSubject diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/ObserveLocalDiffusionProcessStatusUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/ObserveLocalDiffusionProcessStatusUseCaseImplTest.kt similarity index 91% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/ObserveLocalDiffusionProcessStatusUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/ObserveLocalDiffusionProcessStatusUseCaseImplTest.kt index 5b6cbf224..dca5cdfbb 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/ObserveLocalDiffusionProcessStatusUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/ObserveLocalDiffusionProcessStatusUseCaseImplTest.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.entity.LocalDiffusionStatus -import com.shifthackz.aisdv1.domain.repository.LocalDiffusionGenerationRepository -import com.shifthackz.aisdv1.domain.repository.QnnGenerationRepository +import dev.minios.pdaiv1.domain.entity.LocalDiffusionStatus +import dev.minios.pdaiv1.domain.repository.LocalDiffusionGenerationRepository +import dev.minios.pdaiv1.domain.repository.QnnGenerationRepository import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.subjects.BehaviorSubject import org.junit.Before diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/SaveGenerationResultUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/SaveGenerationResultUseCaseImplTest.kt similarity index 85% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/SaveGenerationResultUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/SaveGenerationResultUseCaseImplTest.kt index 750dc81b4..7b88ac24b 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/SaveGenerationResultUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/SaveGenerationResultUseCaseImplTest.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation import com.nhaarman.mockitokotlin2.any import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.mocks.mockAiGenerationResult -import com.shifthackz.aisdv1.domain.repository.GenerationResultRepository +import dev.minios.pdaiv1.domain.mocks.mockAiGenerationResult +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository import io.reactivex.rxjava3.core.Single import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/TextToImageUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/TextToImageUseCaseImplTest.kt similarity index 94% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/TextToImageUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/TextToImageUseCaseImplTest.kt index 6620a40c2..88ce2cb36 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/generation/TextToImageUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/generation/TextToImageUseCaseImplTest.kt @@ -1,22 +1,22 @@ -package com.shifthackz.aisdv1.domain.usecase.generation +package dev.minios.pdaiv1.domain.usecase.generation import com.nhaarman.mockitokotlin2.any import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.mocks.mockAiGenerationResult -import com.shifthackz.aisdv1.domain.mocks.mockTextToImagePayload -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.FalAiGenerationRepository -import com.shifthackz.aisdv1.domain.repository.HordeGenerationRepository -import com.shifthackz.aisdv1.domain.repository.HuggingFaceGenerationRepository -import com.shifthackz.aisdv1.domain.repository.LocalDiffusionGenerationRepository -import com.shifthackz.aisdv1.domain.repository.MediaPipeGenerationRepository -import com.shifthackz.aisdv1.domain.repository.OpenAiGenerationRepository -import com.shifthackz.aisdv1.domain.repository.StabilityAiGenerationRepository -import com.shifthackz.aisdv1.domain.repository.QnnGenerationRepository -import com.shifthackz.aisdv1.domain.repository.StableDiffusionGenerationRepository -import com.shifthackz.aisdv1.domain.repository.SwarmUiGenerationRepository +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.mocks.mockAiGenerationResult +import dev.minios.pdaiv1.domain.mocks.mockTextToImagePayload +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.FalAiGenerationRepository +import dev.minios.pdaiv1.domain.repository.HordeGenerationRepository +import dev.minios.pdaiv1.domain.repository.HuggingFaceGenerationRepository +import dev.minios.pdaiv1.domain.repository.LocalDiffusionGenerationRepository +import dev.minios.pdaiv1.domain.repository.MediaPipeGenerationRepository +import dev.minios.pdaiv1.domain.repository.OpenAiGenerationRepository +import dev.minios.pdaiv1.domain.repository.StabilityAiGenerationRepository +import dev.minios.pdaiv1.domain.repository.QnnGenerationRepository +import dev.minios.pdaiv1.domain.repository.StableDiffusionGenerationRepository +import dev.minios.pdaiv1.domain.repository.SwarmUiGenerationRepository import io.reactivex.rxjava3.core.Single import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/huggingface/FetchAndGetHuggingFaceModelsUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/huggingface/FetchAndGetHuggingFaceModelsUseCaseImplTest.kt similarity index 85% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/huggingface/FetchAndGetHuggingFaceModelsUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/huggingface/FetchAndGetHuggingFaceModelsUseCaseImplTest.kt index c0094e283..d5ecb7323 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/huggingface/FetchAndGetHuggingFaceModelsUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/huggingface/FetchAndGetHuggingFaceModelsUseCaseImplTest.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.domain.usecase.huggingface +package dev.minios.pdaiv1.domain.usecase.huggingface import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.mocks.mockHuggingFaceModels -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.HuggingFaceModelsRepository +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.mocks.mockHuggingFaceModels +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.HuggingFaceModelsRepository import io.reactivex.rxjava3.core.Single import org.junit.Before import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/sdembedding/FetchAndGetEmbeddingsUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/sdembedding/FetchAndGetEmbeddingsUseCaseImplTest.kt similarity index 89% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/sdembedding/FetchAndGetEmbeddingsUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/sdembedding/FetchAndGetEmbeddingsUseCaseImplTest.kt index bc806e019..170720456 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/sdembedding/FetchAndGetEmbeddingsUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/sdembedding/FetchAndGetEmbeddingsUseCaseImplTest.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.domain.usecase.sdembedding +package dev.minios.pdaiv1.domain.usecase.sdembedding import com.nhaarman.mockitokotlin2.doReturn import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.mocks.mockEmbeddings -import com.shifthackz.aisdv1.domain.repository.EmbeddingsRepository +import dev.minios.pdaiv1.domain.mocks.mockEmbeddings +import dev.minios.pdaiv1.domain.repository.EmbeddingsRepository import io.reactivex.rxjava3.core.Single import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/sdhypernet/FetchAndGetHyperNetworksUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/sdhypernet/FetchAndGetHyperNetworksUseCaseImplTest.kt similarity index 87% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/sdhypernet/FetchAndGetHyperNetworksUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/sdhypernet/FetchAndGetHyperNetworksUseCaseImplTest.kt index a8122d413..9e410c0f8 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/sdhypernet/FetchAndGetHyperNetworksUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/sdhypernet/FetchAndGetHyperNetworksUseCaseImplTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.sdhypernet +package dev.minios.pdaiv1.domain.usecase.sdhypernet import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.mocks.mockStableDiffusionHyperNetworks -import com.shifthackz.aisdv1.domain.repository.StableDiffusionHyperNetworksRepository +import dev.minios.pdaiv1.domain.mocks.mockStableDiffusionHyperNetworks +import dev.minios.pdaiv1.domain.repository.StableDiffusionHyperNetworksRepository import io.reactivex.rxjava3.core.Single import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/sdlora/FetchAndGetLorasUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/sdlora/FetchAndGetLorasUseCaseImplTest.kt similarity index 89% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/sdlora/FetchAndGetLorasUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/sdlora/FetchAndGetLorasUseCaseImplTest.kt index 643bf9f20..dfa6dcd45 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/sdlora/FetchAndGetLorasUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/sdlora/FetchAndGetLorasUseCaseImplTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.sdlora +package dev.minios.pdaiv1.domain.usecase.sdlora import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.mocks.mockLoRAs -import com.shifthackz.aisdv1.domain.repository.LorasRepository +import dev.minios.pdaiv1.domain.mocks.mockLoRAs +import dev.minios.pdaiv1.domain.repository.LorasRepository import io.reactivex.rxjava3.core.Single import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/sdmodel/GetStableDiffusionModelsUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/sdmodel/GetStableDiffusionModelsUseCaseImplTest.kt similarity index 88% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/sdmodel/GetStableDiffusionModelsUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/sdmodel/GetStableDiffusionModelsUseCaseImplTest.kt index b520697c0..83db3406e 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/sdmodel/GetStableDiffusionModelsUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/sdmodel/GetStableDiffusionModelsUseCaseImplTest.kt @@ -1,14 +1,14 @@ -package com.shifthackz.aisdv1.domain.usecase.sdmodel +package dev.minios.pdaiv1.domain.usecase.sdmodel import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.entity.ServerConfiguration -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.mocks.mockServerConfiguration -import com.shifthackz.aisdv1.domain.mocks.mockStableDiffusionModels -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.ServerConfigurationRepository -import com.shifthackz.aisdv1.domain.repository.StableDiffusionModelsRepository +import dev.minios.pdaiv1.domain.entity.ServerConfiguration +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.mocks.mockServerConfiguration +import dev.minios.pdaiv1.domain.mocks.mockStableDiffusionModels +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.ServerConfigurationRepository +import dev.minios.pdaiv1.domain.repository.StableDiffusionModelsRepository import io.reactivex.rxjava3.core.Single import org.junit.Assert import org.junit.Before diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/sdmodel/SelectStableDiffusionModelUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/sdmodel/SelectStableDiffusionModelUseCaseImplTest.kt similarity index 92% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/sdmodel/SelectStableDiffusionModelUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/sdmodel/SelectStableDiffusionModelUseCaseImplTest.kt index 8ac4b20b1..690eaa74a 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/sdmodel/SelectStableDiffusionModelUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/sdmodel/SelectStableDiffusionModelUseCaseImplTest.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.domain.usecase.sdmodel +package dev.minios.pdaiv1.domain.usecase.sdmodel import com.nhaarman.mockitokotlin2.any import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.mocks.mockServerConfiguration -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.ServerConfigurationRepository +import dev.minios.pdaiv1.domain.mocks.mockServerConfiguration +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.ServerConfigurationRepository import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/sdsampler/GetStableDiffusionSamplersUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/sdsampler/GetStableDiffusionSamplersUseCaseImplTest.kt similarity index 88% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/sdsampler/GetStableDiffusionSamplersUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/sdsampler/GetStableDiffusionSamplersUseCaseImplTest.kt index 5da15b29e..951d7f2f7 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/sdsampler/GetStableDiffusionSamplersUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/sdsampler/GetStableDiffusionSamplersUseCaseImplTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.sdsampler +package dev.minios.pdaiv1.domain.usecase.sdsampler import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.mocks.mockStableDiffusionSamplers -import com.shifthackz.aisdv1.domain.repository.StableDiffusionSamplersRepository +import dev.minios.pdaiv1.domain.mocks.mockStableDiffusionSamplers +import dev.minios.pdaiv1.domain.repository.StableDiffusionSamplersRepository import io.reactivex.rxjava3.core.Single import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToA1111UseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToA1111UseCaseImplTest.kt similarity index 87% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToA1111UseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToA1111UseCaseImplTest.kt index f0ee77995..eec7c4cb9 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToA1111UseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToA1111UseCaseImplTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings -import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationCredentials -import com.shifthackz.aisdv1.domain.mocks.mockConfiguration -import com.shifthackz.aisdv1.domain.usecase.caching.DataPreLoaderUseCase -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestConnectivityUseCase +import dev.minios.pdaiv1.domain.feature.auth.AuthorizationCredentials +import dev.minios.pdaiv1.domain.mocks.mockConfiguration +import dev.minios.pdaiv1.domain.usecase.caching.DataPreLoaderUseCase +import dev.minios.pdaiv1.domain.usecase.connectivity.TestConnectivityUseCase import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToFalAiUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToFalAiUseCaseImplTest.kt similarity index 95% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToFalAiUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToFalAiUseCaseImplTest.kt index de7a220ad..af49c8f35 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToFalAiUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToFalAiUseCaseImplTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings -import com.shifthackz.aisdv1.domain.mocks.mockConfiguration -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestFalAiApiKeyUseCase +import dev.minios.pdaiv1.domain.mocks.mockConfiguration +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.connectivity.TestFalAiApiKeyUseCase import io.mockk.every import io.mockk.mockk import io.mockk.verify diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToHordeUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToHordeUseCaseImplTest.kt similarity index 93% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToHordeUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToHordeUseCaseImplTest.kt index aa12885ad..4020117ea 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToHordeUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToHordeUseCaseImplTest.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings -import com.shifthackz.aisdv1.domain.mocks.mockConfiguration -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestHordeApiKeyUseCase +import dev.minios.pdaiv1.domain.mocks.mockConfiguration +import dev.minios.pdaiv1.domain.usecase.connectivity.TestHordeApiKeyUseCase import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToHuggingFaceUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToHuggingFaceUseCaseImplTest.kt similarity index 93% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToHuggingFaceUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToHuggingFaceUseCaseImplTest.kt index c66c336da..2020c6b5e 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToHuggingFaceUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToHuggingFaceUseCaseImplTest.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings -import com.shifthackz.aisdv1.domain.mocks.mockConfiguration -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestHuggingFaceApiKeyUseCase +import dev.minios.pdaiv1.domain.mocks.mockConfiguration +import dev.minios.pdaiv1.domain.usecase.connectivity.TestHuggingFaceApiKeyUseCase import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToLocalDiffusionUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToLocalDiffusionUseCaseImplTest.kt similarity index 93% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToLocalDiffusionUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToLocalDiffusionUseCaseImplTest.kt index 33a09c57d..a0ee9692b 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToLocalDiffusionUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToLocalDiffusionUseCaseImplTest.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings -import com.shifthackz.aisdv1.domain.mocks.mockConfiguration +import dev.minios.pdaiv1.domain.mocks.mockConfiguration import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToOpenAiUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToOpenAiUseCaseImplTest.kt similarity index 93% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToOpenAiUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToOpenAiUseCaseImplTest.kt index 470b26571..8cb6ae679 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToOpenAiUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToOpenAiUseCaseImplTest.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings -import com.shifthackz.aisdv1.domain.mocks.mockConfiguration -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestOpenAiApiKeyUseCase +import dev.minios.pdaiv1.domain.mocks.mockConfiguration +import dev.minios.pdaiv1.domain.usecase.connectivity.TestOpenAiApiKeyUseCase import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToStabilityAiUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToStabilityAiUseCaseImplTest.kt similarity index 93% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToStabilityAiUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToStabilityAiUseCaseImplTest.kt index a3d2a4e73..90c2d4171 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/ConnectToStabilityAiUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/ConnectToStabilityAiUseCaseImplTest.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings -import com.shifthackz.aisdv1.domain.mocks.mockConfiguration -import com.shifthackz.aisdv1.domain.usecase.connectivity.TestStabilityAiApiKeyUseCase +import dev.minios.pdaiv1.domain.mocks.mockConfiguration +import dev.minios.pdaiv1.domain.usecase.connectivity.TestStabilityAiApiKeyUseCase import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/GetConfigurationUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/GetConfigurationUseCaseImplTest.kt similarity index 90% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/GetConfigurationUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/GetConfigurationUseCaseImplTest.kt index 245edafee..8082dee7f 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/GetConfigurationUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/GetConfigurationUseCaseImplTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings -import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationCredentials -import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationStore -import com.shifthackz.aisdv1.domain.mocks.mockConfiguration -import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.feature.auth.AuthorizationCredentials +import dev.minios.pdaiv1.domain.feature.auth.AuthorizationStore +import dev.minios.pdaiv1.domain.mocks.mockConfiguration +import dev.minios.pdaiv1.domain.preference.PreferenceManager import io.mockk.every import io.mockk.mockk import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/SetServerConfigurationUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/SetServerConfigurationUseCaseImplTest.kt similarity index 91% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/SetServerConfigurationUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/SetServerConfigurationUseCaseImplTest.kt index 3c3032e78..28dc5e96b 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/settings/SetServerConfigurationUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/settings/SetServerConfigurationUseCaseImplTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.domain.usecase.settings +package dev.minios.pdaiv1.domain.usecase.settings -import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationStore -import com.shifthackz.aisdv1.domain.mocks.mockConfiguration -import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.feature.auth.AuthorizationStore +import dev.minios.pdaiv1.domain.mocks.mockConfiguration +import dev.minios.pdaiv1.domain.preference.PreferenceManager import io.mockk.every import io.mockk.mockk import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/splash/SplashNavigationUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/splash/SplashNavigationUseCaseImplTest.kt similarity index 95% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/splash/SplashNavigationUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/splash/SplashNavigationUseCaseImplTest.kt index 092b4c19b..064538ed7 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/splash/SplashNavigationUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/splash/SplashNavigationUseCaseImplTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.domain.usecase.splash +package dev.minios.pdaiv1.domain.usecase.splash import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.preference.PreferenceManager import org.junit.Test class SplashNavigationUseCaseImplTest { diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/stabilityai/FetchAndGetStabilityAiEnginesUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/stabilityai/FetchAndGetStabilityAiEnginesUseCaseImplTest.kt similarity index 82% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/stabilityai/FetchAndGetStabilityAiEnginesUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/stabilityai/FetchAndGetStabilityAiEnginesUseCaseImplTest.kt index 893d14a05..5d6c49474 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/stabilityai/FetchAndGetStabilityAiEnginesUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/stabilityai/FetchAndGetStabilityAiEnginesUseCaseImplTest.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.domain.usecase.stabilityai +package dev.minios.pdaiv1.domain.usecase.stabilityai import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.mocks.mockStabilityAiEngines -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.StabilityAiEnginesRepository +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.mocks.mockStabilityAiEngines +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.StabilityAiEnginesRepository import io.reactivex.rxjava3.core.Single import org.junit.Before import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/stabilityai/ObserveStabilityAiCreditsUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/stabilityai/ObserveStabilityAiCreditsUseCaseImplTest.kt similarity index 91% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/stabilityai/ObserveStabilityAiCreditsUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/stabilityai/ObserveStabilityAiCreditsUseCaseImplTest.kt index a1b189bcc..2c5226556 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/stabilityai/ObserveStabilityAiCreditsUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/stabilityai/ObserveStabilityAiCreditsUseCaseImplTest.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.domain.usecase.stabilityai +package dev.minios.pdaiv1.domain.usecase.stabilityai import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.entity.Settings -import com.shifthackz.aisdv1.domain.mocks.mockSettings -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.StabilityAiCreditsRepository +import dev.minios.pdaiv1.domain.entity.Settings +import dev.minios.pdaiv1.domain.mocks.mockSettings +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.StabilityAiCreditsRepository import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.subjects.BehaviorSubject diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/wakelock/AcquireWakelockUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/wakelock/AcquireWakelockUseCaseImplTest.kt similarity index 91% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/wakelock/AcquireWakelockUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/wakelock/AcquireWakelockUseCaseImplTest.kt index 997c02636..26a405d6c 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/wakelock/AcquireWakelockUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/wakelock/AcquireWakelockUseCaseImplTest.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.domain.usecase.wakelock +package dev.minios.pdaiv1.domain.usecase.wakelock import android.os.PowerManager import com.nhaarman.mockitokotlin2.any @@ -6,7 +6,7 @@ import com.nhaarman.mockitokotlin2.doNothing import com.nhaarman.mockitokotlin2.given import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.repository.WakeLockRepository +import dev.minios.pdaiv1.domain.repository.WakeLockRepository import org.junit.Assert import org.junit.Before import org.junit.Test diff --git a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/wakelock/ReleaseWakeLockUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/wakelock/ReleaseWakeLockUseCaseImplTest.kt similarity index 91% rename from domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/wakelock/ReleaseWakeLockUseCaseImplTest.kt rename to domain/src/test/java/dev/minios/pdaiv1/domain/usecase/wakelock/ReleaseWakeLockUseCaseImplTest.kt index 1aae07959..bb5968fd4 100644 --- a/domain/src/test/java/com/shifthackz/aisdv1/domain/usecase/wakelock/ReleaseWakeLockUseCaseImplTest.kt +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/wakelock/ReleaseWakeLockUseCaseImplTest.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.domain.usecase.wakelock +package dev.minios.pdaiv1.domain.usecase.wakelock import android.os.PowerManager import com.nhaarman.mockitokotlin2.doNothing import com.nhaarman.mockitokotlin2.given import com.nhaarman.mockitokotlin2.mock import com.nhaarman.mockitokotlin2.whenever -import com.shifthackz.aisdv1.domain.repository.WakeLockRepository +import dev.minios.pdaiv1.domain.repository.WakeLockRepository import org.junit.Assert import org.junit.Before import org.junit.Test diff --git a/fastlane/metadata/android/en-US/full_description.txt b/fastlane/metadata/android/en-US/full_description.txt index ed805764a..3aabfda05 100644 --- a/fastlane/metadata/android/en-US/full_description.txt +++ b/fastlane/metadata/android/en-US/full_description.txt @@ -1,21 +1,21 @@ -Unleash Your Creativity with SDAI - The Ultimate AI Art Generator for Android +Unleash Your Creativity with PDAI - The Ultimate AI Art Generator for Android -Discover the power of AI-driven art creation with SDAI (Stable Diffusion Android), the open-source app that puts the magic of artificial intelligence at your fingertips. Whether you're a digital artist, a hobbyist, or simply curious about the possibilities of AI, SDAI offers a unique and flexible platform to create stunning, high-quality images with ease. +Discover the power of AI-driven art creation with PDAI (Pocket Diffusion Android), the open-source app that puts the magic of artificial intelligence at your fingertips. Whether you're a digital artist, a hobbyist, or simply curious about the possibilities of AI, PDAI offers a unique and flexible platform to create stunning, high-quality images with ease. -Why Choose SDAI? +Why Choose PDAI? -SDAI isn't just another AI art app—it's a tool that empowers you to create without limits. With the freedom to choose your generation provider and the ability to work offline, you can bring your most ambitious ideas to life, anytime, anywhere. Plus, as an open-source project, you're not just a user—you can be a part of the evolution of SDAI. +PDAI isn't just another AI art app—it's a tool that empowers you to create without limits. With the freedom to choose your generation provider and the ability to work offline, you can bring your most ambitious ideas to life, anytime, anywhere. Plus, as an open-source project, you're not just a user—you can be a part of the evolution of PDAI. Key Features: -- Choose Your AI Generation Provider: SDAI lets you pick the AI model that best suits your needs, giving you complete control over your creative process. Whether you prefer cloud-based solutions or local setups, SDAI has you covered. +- Choose Your AI Generation Provider: PDAI lets you pick the AI model that best suits your needs, giving you complete control over your creative process. Whether you prefer cloud-based solutions or local setups, PDAI has you covered. -- Offline Image Creation with Local Diffusion: No internet? No problem! SDAI enables offline image generation using Local Diffusion, ensuring that your creativity is never interrupted. +- Offline Image Creation with Local Diffusion: No internet? No problem! PDAI enables offline image generation using Local Diffusion, ensuring that your creativity is never interrupted. -- Open Source & Community-Driven: Built with transparency and collaboration in mind, SDAI is fully open source. Join our community of developers and artists, contribute to the project, or simply explore the code to see how it all works. +- Open Source & Community-Driven: Built with transparency and collaboration in mind, PDAI is fully open source. Join our community of developers and artists, contribute to the project, or simply explore the code to see how it all works. -- User-Friendly Interface: Designed with both beginners and experts in mind, SDAI's intuitive interface makes it easy to dive into the world of AI art without any steep learning curve. +- User-Friendly Interface: Designed with both beginners and experts in mind, PDAI's intuitive interface makes it easy to dive into the world of AI art without any steep learning curve. Get Started Today! -Download SDAI now and start exploring the endless possibilities of AI-generated art. Whether you're looking to create intricate digital masterpieces or simply have fun with AI, SDAI is your gateway to a new world of creativity. +Download PDAI now and start exploring the endless possibilities of AI-generated art. Whether you're looking to create intricate digital masterpieces or simply have fun with AI, PDAI is your gateway to a new world of creativity. diff --git a/feature/auth/build.gradle.kts b/feature/auth/build.gradle.kts index 17cfb2b96..3ae7abbb1 100644 --- a/feature/auth/build.gradle.kts +++ b/feature/auth/build.gradle.kts @@ -3,7 +3,7 @@ plugins { } android { - namespace = "com.shifthackz.aisdv1.feature.auth" + namespace = "dev.minios.pdaiv1.feature.auth" } dependencies { diff --git a/feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/AuthorizationMappers.kt b/feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/AuthorizationMappers.kt similarity index 70% rename from feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/AuthorizationMappers.kt rename to feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/AuthorizationMappers.kt index 43ede32fe..aa239cc53 100644 --- a/feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/AuthorizationMappers.kt +++ b/feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/AuthorizationMappers.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.feature.auth +package dev.minios.pdaiv1.feature.auth -import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationCredentials -import com.shifthackz.aisdv1.feature.auth.credentials.Credentials -import com.shifthackz.aisdv1.feature.auth.credentials.EmptyCredentials -import com.shifthackz.aisdv1.feature.auth.credentials.HttpBasicCredentials +import dev.minios.pdaiv1.domain.feature.auth.AuthorizationCredentials +import dev.minios.pdaiv1.feature.auth.credentials.Credentials +import dev.minios.pdaiv1.feature.auth.credentials.EmptyCredentials +import dev.minios.pdaiv1.feature.auth.credentials.HttpBasicCredentials internal fun AuthorizationCredentials.toRaw(): Credentials = when (this) { is AuthorizationCredentials.HttpBasic -> HttpBasicCredentials( diff --git a/feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/AuthorizationStoreImpl.kt b/feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/AuthorizationStoreImpl.kt similarity index 88% rename from feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/AuthorizationStoreImpl.kt rename to feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/AuthorizationStoreImpl.kt index b9ef13469..55238b6ae 100644 --- a/feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/AuthorizationStoreImpl.kt +++ b/feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/AuthorizationStoreImpl.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.feature.auth +package dev.minios.pdaiv1.feature.auth import android.content.SharedPreferences -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationCredentials -import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationStore +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.domain.feature.auth.AuthorizationCredentials +import dev.minios.pdaiv1.domain.feature.auth.AuthorizationStore internal class AuthorizationStoreImpl( private val preferences: SharedPreferences, diff --git a/feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/credentials/Credentials.kt b/feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/credentials/Credentials.kt similarity index 52% rename from feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/credentials/Credentials.kt rename to feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/credentials/Credentials.kt index 96129608b..f4e7e71e1 100644 --- a/feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/credentials/Credentials.kt +++ b/feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/credentials/Credentials.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.feature.auth.credentials +package dev.minios.pdaiv1.feature.auth.credentials internal interface Credentials { fun toJson(): String diff --git a/feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/credentials/EmptyCredentials.kt b/feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/credentials/EmptyCredentials.kt similarity index 62% rename from feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/credentials/EmptyCredentials.kt rename to feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/credentials/EmptyCredentials.kt index 935a931e3..196b06b50 100644 --- a/feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/credentials/EmptyCredentials.kt +++ b/feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/credentials/EmptyCredentials.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.feature.auth.credentials +package dev.minios.pdaiv1.feature.auth.credentials internal class EmptyCredentials : Credentials { override fun toJson(): String = "" diff --git a/feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/credentials/HttpBasicCredentials.kt b/feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/credentials/HttpBasicCredentials.kt similarity index 90% rename from feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/credentials/HttpBasicCredentials.kt rename to feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/credentials/HttpBasicCredentials.kt index 882748a8e..ce33d3838 100644 --- a/feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/credentials/HttpBasicCredentials.kt +++ b/feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/credentials/HttpBasicCredentials.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.feature.auth.credentials +package dev.minios.pdaiv1.feature.auth.credentials import com.google.gson.Gson import com.google.gson.annotations.SerializedName diff --git a/feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/crypto/CryptoProvider.kt b/feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/crypto/CryptoProvider.kt similarity index 73% rename from feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/crypto/CryptoProvider.kt rename to feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/crypto/CryptoProvider.kt index 7fdbd03a4..486df612c 100644 --- a/feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/crypto/CryptoProvider.kt +++ b/feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/crypto/CryptoProvider.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.feature.auth.crypto +package dev.minios.pdaiv1.feature.auth.crypto import android.content.SharedPreferences diff --git a/feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/crypto/CryptoProviderImpl.kt b/feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/crypto/CryptoProviderImpl.kt similarity index 94% rename from feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/crypto/CryptoProviderImpl.kt rename to feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/crypto/CryptoProviderImpl.kt index 416f42ae3..16ab659bc 100644 --- a/feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/crypto/CryptoProviderImpl.kt +++ b/feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/crypto/CryptoProviderImpl.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.feature.auth.crypto +package dev.minios.pdaiv1.feature.auth.crypto import android.content.Context import android.content.SharedPreferences diff --git a/feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/di/AuthModule.kt b/feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/di/AuthModule.kt similarity index 53% rename from feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/di/AuthModule.kt rename to feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/di/AuthModule.kt index 07a8c5990..f454489a7 100644 --- a/feature/auth/src/main/java/com/shifthackz/aisdv1/feature/auth/di/AuthModule.kt +++ b/feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/di/AuthModule.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.feature.auth.di +package dev.minios.pdaiv1.feature.auth.di -import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationStore -import com.shifthackz.aisdv1.feature.auth.AuthorizationStoreImpl -import com.shifthackz.aisdv1.feature.auth.crypto.CryptoProvider -import com.shifthackz.aisdv1.feature.auth.crypto.CryptoProviderImpl +import dev.minios.pdaiv1.domain.feature.auth.AuthorizationStore +import dev.minios.pdaiv1.feature.auth.AuthorizationStoreImpl +import dev.minios.pdaiv1.feature.auth.crypto.CryptoProvider +import dev.minios.pdaiv1.feature.auth.crypto.CryptoProviderImpl import org.koin.android.ext.koin.androidContext import org.koin.dsl.module diff --git a/feature/diffusion/build.gradle.kts b/feature/diffusion/build.gradle.kts index 03c679e4a..cf965bf4c 100644 --- a/feature/diffusion/build.gradle.kts +++ b/feature/diffusion/build.gradle.kts @@ -3,7 +3,7 @@ plugins { } android { - namespace = "com.shifthackz.aisdv1.feature.diffusion" + namespace = "dev.minios.pdaiv1.feature.diffusion" } dependencies { diff --git a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/di/DiffusionModule.kt b/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/di/DiffusionModule.kt deleted file mode 100644 index 4aa7ef14b..000000000 --- a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/di/DiffusionModule.kt +++ /dev/null @@ -1,19 +0,0 @@ -package com.shifthackz.aisdv1.feature.diffusion.di - -import com.shifthackz.aisdv1.domain.feature.diffusion.LocalDiffusion -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionImpl -import com.shifthackz.aisdv1.feature.diffusion.ai.tokenizer.EnglishTextTokenizer -import com.shifthackz.aisdv1.feature.diffusion.ai.tokenizer.LocalDiffusionTextTokenizer -import com.shifthackz.aisdv1.feature.diffusion.ai.unet.UNet -import com.shifthackz.aisdv1.feature.diffusion.environment.OrtEnvironmentProvider -import com.shifthackz.aisdv1.feature.diffusion.environment.OrtEnvironmentProviderImpl -import org.koin.core.module.dsl.singleOf -import org.koin.dsl.bind -import org.koin.dsl.module - -val diffusionModule = module { - singleOf(::UNet) - singleOf(::EnglishTextTokenizer) bind LocalDiffusionTextTokenizer::class - singleOf(::LocalDiffusionImpl) bind LocalDiffusion::class - singleOf(::OrtEnvironmentProviderImpl) bind OrtEnvironmentProvider::class -} diff --git a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/entity/LocalDiffusionAlias.kt b/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/entity/LocalDiffusionAlias.kt deleted file mode 100644 index debe29cb4..000000000 --- a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/entity/LocalDiffusionAlias.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.shifthackz.aisdv1.feature.diffusion.entity - -typealias Array3D = Array>> diff --git a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/LocalDiffusionContract.kt b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/LocalDiffusionContract.kt similarity index 96% rename from feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/LocalDiffusionContract.kt rename to feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/LocalDiffusionContract.kt index a59a7afce..f1b068ca0 100644 --- a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/LocalDiffusionContract.kt +++ b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/LocalDiffusionContract.kt @@ -1,6 +1,6 @@ @file:Suppress("SpellCheckingInspection") -package com.shifthackz.aisdv1.feature.diffusion +package dev.minios.pdaiv1.feature.diffusion internal object LocalDiffusionContract { //region LOGGING diff --git a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/LocalDiffusionImpl.kt b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/LocalDiffusionImpl.kt similarity index 85% rename from feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/LocalDiffusionImpl.kt rename to feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/LocalDiffusionImpl.kt index 775cad2c2..0ece29d23 100644 --- a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/LocalDiffusionImpl.kt +++ b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/LocalDiffusionImpl.kt @@ -1,16 +1,16 @@ -package com.shifthackz.aisdv1.feature.diffusion +package dev.minios.pdaiv1.feature.diffusion import ai.onnxruntime.OnnxTensor import android.graphics.Bitmap -import com.shifthackz.aisdv1.core.common.log.debugLog -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.domain.entity.LocalDiffusionStatus -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import com.shifthackz.aisdv1.domain.feature.diffusion.LocalDiffusion -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionContract.TAG -import com.shifthackz.aisdv1.feature.diffusion.ai.tokenizer.LocalDiffusionTextTokenizer -import com.shifthackz.aisdv1.feature.diffusion.ai.unet.UNet -import com.shifthackz.aisdv1.feature.diffusion.environment.OrtEnvironmentProvider +import dev.minios.pdaiv1.core.common.log.debugLog +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.domain.entity.LocalDiffusionStatus +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.feature.diffusion.LocalDiffusion +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionContract.TAG +import dev.minios.pdaiv1.feature.diffusion.ai.tokenizer.LocalDiffusionTextTokenizer +import dev.minios.pdaiv1.feature.diffusion.ai.unet.UNet +import dev.minios.pdaiv1.feature.diffusion.environment.OrtEnvironmentProvider import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.subjects.PublishSubject diff --git a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/extensions/ArrayExtensions.kt b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/extensions/ArrayExtensions.kt similarity index 93% rename from feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/extensions/ArrayExtensions.kt rename to feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/extensions/ArrayExtensions.kt index 5f844ee72..d679bc28e 100644 --- a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/extensions/ArrayExtensions.kt +++ b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/extensions/ArrayExtensions.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.feature.diffusion.ai.extensions +package dev.minios.pdaiv1.feature.diffusion.ai.extensions -import com.shifthackz.aisdv1.feature.diffusion.entity.Array3D +import dev.minios.pdaiv1.feature.diffusion.entity.Array3D import kotlin.math.ceil import java.util.function.Function diff --git a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/extensions/StringExtensions.kt b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/extensions/StringExtensions.kt similarity index 92% rename from feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/extensions/StringExtensions.kt rename to feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/extensions/StringExtensions.kt index 89519bc9f..461086475 100644 --- a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/extensions/StringExtensions.kt +++ b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/extensions/StringExtensions.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.feature.diffusion.ai.extensions +package dev.minios.pdaiv1.feature.diffusion.ai.extensions internal fun String.halfCorner(): String { var output = this diff --git a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/extensions/TensorExtensions.kt b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/extensions/TensorExtensions.kt similarity index 89% rename from feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/extensions/TensorExtensions.kt rename to feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/extensions/TensorExtensions.kt index 97ba816ba..b1cff7b52 100644 --- a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/extensions/TensorExtensions.kt +++ b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/extensions/TensorExtensions.kt @@ -1,12 +1,12 @@ @file:Suppress("KotlinConstantConditions") -package com.shifthackz.aisdv1.feature.diffusion.ai.extensions +package dev.minios.pdaiv1.feature.diffusion.ai.extensions import ai.onnxruntime.OnnxTensor import android.util.Pair -import com.shifthackz.aisdv1.feature.diffusion.entity.Array3D -import com.shifthackz.aisdv1.feature.diffusion.entity.LocalDiffusionTensor -import com.shifthackz.aisdv1.feature.diffusion.environment.OrtEnvironmentProvider +import dev.minios.pdaiv1.feature.diffusion.entity.Array3D +import dev.minios.pdaiv1.feature.diffusion.entity.LocalDiffusionTensor +import dev.minios.pdaiv1.feature.diffusion.environment.OrtEnvironmentProvider import org.koin.java.KoinJavaComponent.inject import java.nio.FloatBuffer diff --git a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/scheduler/EulerAncestralDiscreteLocalDiffusionScheduler.kt b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/scheduler/EulerAncestralDiscreteLocalDiffusionScheduler.kt similarity index 90% rename from feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/scheduler/EulerAncestralDiscreteLocalDiffusionScheduler.kt rename to feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/scheduler/EulerAncestralDiscreteLocalDiffusionScheduler.kt index 68722b009..ab28f9984 100644 --- a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/scheduler/EulerAncestralDiscreteLocalDiffusionScheduler.kt +++ b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/scheduler/EulerAncestralDiscreteLocalDiffusionScheduler.kt @@ -1,20 +1,20 @@ @file:Suppress("UNCHECKED_CAST") -package com.shifthackz.aisdv1.feature.diffusion.ai.scheduler +package dev.minios.pdaiv1.feature.diffusion.ai.scheduler import ai.onnxruntime.OnnxTensor -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionContract.BETA_SCHEDULER_LINEAR -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionContract.BETA_SCHEDULER_SCALED_LINEAR -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionContract.BETA_SCHEDULER_SQUARED_v2 -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionContract.PREDICTION_EPSILON -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionContract.PREDICTION_V -import com.shifthackz.aisdv1.feature.diffusion.ai.extensions.arrange -import com.shifthackz.aisdv1.feature.diffusion.ai.extensions.interpolate -import com.shifthackz.aisdv1.feature.diffusion.ai.extensions.lineSpace -import com.shifthackz.aisdv1.feature.diffusion.entity.Array3D -import com.shifthackz.aisdv1.feature.diffusion.entity.LocalDiffusionTensor -import com.shifthackz.aisdv1.feature.diffusion.environment.OrtEnvironmentProvider -import com.shifthackz.aisdv1.feature.diffusion.entity.LocalDiffusionConfig +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionContract.BETA_SCHEDULER_LINEAR +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionContract.BETA_SCHEDULER_SCALED_LINEAR +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionContract.BETA_SCHEDULER_SQUARED_v2 +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionContract.PREDICTION_EPSILON +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionContract.PREDICTION_V +import dev.minios.pdaiv1.feature.diffusion.ai.extensions.arrange +import dev.minios.pdaiv1.feature.diffusion.ai.extensions.interpolate +import dev.minios.pdaiv1.feature.diffusion.ai.extensions.lineSpace +import dev.minios.pdaiv1.feature.diffusion.entity.Array3D +import dev.minios.pdaiv1.feature.diffusion.entity.LocalDiffusionTensor +import dev.minios.pdaiv1.feature.diffusion.environment.OrtEnvironmentProvider +import dev.minios.pdaiv1.feature.diffusion.entity.LocalDiffusionConfig import org.koin.core.component.KoinComponent import org.koin.core.component.inject import java.nio.FloatBuffer diff --git a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/scheduler/LocalDiffusionScheduler.kt b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/scheduler/LocalDiffusionScheduler.kt similarity index 72% rename from feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/scheduler/LocalDiffusionScheduler.kt rename to feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/scheduler/LocalDiffusionScheduler.kt index 3a7f4f3ba..fe805c819 100644 --- a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/scheduler/LocalDiffusionScheduler.kt +++ b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/scheduler/LocalDiffusionScheduler.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.feature.diffusion.ai.scheduler +package dev.minios.pdaiv1.feature.diffusion.ai.scheduler -import com.shifthackz.aisdv1.feature.diffusion.entity.LocalDiffusionTensor +import dev.minios.pdaiv1.feature.diffusion.entity.LocalDiffusionTensor internal interface LocalDiffusionScheduler { val initNoiseSigma: Double diff --git a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/tokenizer/EnglishTextTokenizer.kt b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/tokenizer/EnglishTextTokenizer.kt similarity index 90% rename from feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/tokenizer/EnglishTextTokenizer.kt rename to feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/tokenizer/EnglishTextTokenizer.kt index 0683aeff5..c15e322f4 100644 --- a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/tokenizer/EnglishTextTokenizer.kt +++ b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/tokenizer/EnglishTextTokenizer.kt @@ -1,26 +1,26 @@ @file:Suppress("KotlinConstantConditions") -package com.shifthackz.aisdv1.feature.diffusion.ai.tokenizer +package dev.minios.pdaiv1.feature.diffusion.ai.tokenizer import ai.onnxruntime.OnnxTensor import ai.onnxruntime.OrtSession import android.text.TextUtils import android.util.JsonReader import android.util.Pair -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.core.common.log.debugLog -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionContract -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionContract.KEY_INPUT_IDS -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionContract.ORT -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionContract.ORT_KEY_MODEL_FORMAT -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionContract.TAG -import com.shifthackz.aisdv1.feature.diffusion.ai.extensions.halfCorner -import com.shifthackz.aisdv1.feature.diffusion.ai.extensions.toArrays -import com.shifthackz.aisdv1.feature.diffusion.environment.LocalModelIdProvider -import com.shifthackz.aisdv1.feature.diffusion.environment.OrtEnvironmentProvider -import com.shifthackz.aisdv1.feature.diffusion.extensions.modelPathPrefix +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.core.common.log.debugLog +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionContract +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionContract.KEY_INPUT_IDS +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionContract.ORT +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionContract.ORT_KEY_MODEL_FORMAT +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionContract.TAG +import dev.minios.pdaiv1.feature.diffusion.ai.extensions.halfCorner +import dev.minios.pdaiv1.feature.diffusion.ai.extensions.toArrays +import dev.minios.pdaiv1.feature.diffusion.environment.LocalModelIdProvider +import dev.minios.pdaiv1.feature.diffusion.environment.OrtEnvironmentProvider +import dev.minios.pdaiv1.feature.diffusion.extensions.modelPathPrefix import java.io.BufferedReader import java.io.FileInputStream import java.io.InputStreamReader diff --git a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/tokenizer/LocalDiffusionTextTokenizer.kt b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/tokenizer/LocalDiffusionTextTokenizer.kt similarity index 84% rename from feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/tokenizer/LocalDiffusionTextTokenizer.kt rename to feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/tokenizer/LocalDiffusionTextTokenizer.kt index ee66bfdb8..da7178be2 100644 --- a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/tokenizer/LocalDiffusionTextTokenizer.kt +++ b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/tokenizer/LocalDiffusionTextTokenizer.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.feature.diffusion.ai.tokenizer +package dev.minios.pdaiv1.feature.diffusion.ai.tokenizer import ai.onnxruntime.OnnxTensor diff --git a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/tokenizer/TokenizerByteSet.kt b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/tokenizer/TokenizerByteSet.kt similarity index 99% rename from feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/tokenizer/TokenizerByteSet.kt rename to feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/tokenizer/TokenizerByteSet.kt index 615b55489..ecaf9d28b 100644 --- a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/tokenizer/TokenizerByteSet.kt +++ b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/tokenizer/TokenizerByteSet.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.feature.diffusion.ai.tokenizer +package dev.minios.pdaiv1.feature.diffusion.ai.tokenizer object TokenizerByteSet { val byteEncoder: MutableMap = HashMap() diff --git a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/unet/UNet.kt b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/unet/UNet.kt similarity index 85% rename from feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/unet/UNet.kt rename to feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/unet/UNet.kt index 85cc131fd..bdc6a544b 100644 --- a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/unet/UNet.kt +++ b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/unet/UNet.kt @@ -1,6 +1,6 @@ @file:Suppress("UNCHECKED_CAST", "MemberVisibilityCanBePrivate") -package com.shifthackz.aisdv1.feature.diffusion.ai.unet +package dev.minios.pdaiv1.feature.diffusion.ai.unet import ai.onnxruntime.OnnxTensor import ai.onnxruntime.OrtSession @@ -8,30 +8,30 @@ import ai.onnxruntime.OrtSession.SessionOptions import ai.onnxruntime.providers.NNAPIFlags import android.graphics.Bitmap import android.util.Pair -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.core.common.log.debugLog -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionContract -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionContract.KEY_ENCODER_HIDDEN_STATES -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionContract.KEY_LATENT_SAMPLE -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionContract.KEY_SAMPLE -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionContract.KEY_TIME_STEP -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionContract.ORT -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionContract.ORT_KEY_MODEL_FORMAT -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionContract.TAG -import com.shifthackz.aisdv1.feature.diffusion.ai.extensions.duplicate -import com.shifthackz.aisdv1.feature.diffusion.ai.extensions.getSizes -import com.shifthackz.aisdv1.feature.diffusion.ai.extensions.multipleTensorsByFloat -import com.shifthackz.aisdv1.feature.diffusion.ai.extensions.splitTensor -import com.shifthackz.aisdv1.feature.diffusion.ai.scheduler.EulerAncestralDiscreteLocalDiffusionScheduler -import com.shifthackz.aisdv1.feature.diffusion.ai.vae.VaeDecoder -import com.shifthackz.aisdv1.feature.diffusion.entity.Array3D -import com.shifthackz.aisdv1.feature.diffusion.entity.LocalDiffusionFlag -import com.shifthackz.aisdv1.feature.diffusion.entity.LocalDiffusionTensor -import com.shifthackz.aisdv1.feature.diffusion.environment.DeviceNNAPIFlagProvider -import com.shifthackz.aisdv1.feature.diffusion.environment.LocalModelIdProvider -import com.shifthackz.aisdv1.feature.diffusion.environment.OrtEnvironmentProvider -import com.shifthackz.aisdv1.feature.diffusion.extensions.modelPathPrefix +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.core.common.log.debugLog +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionContract +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionContract.KEY_ENCODER_HIDDEN_STATES +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionContract.KEY_LATENT_SAMPLE +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionContract.KEY_SAMPLE +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionContract.KEY_TIME_STEP +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionContract.ORT +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionContract.ORT_KEY_MODEL_FORMAT +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionContract.TAG +import dev.minios.pdaiv1.feature.diffusion.ai.extensions.duplicate +import dev.minios.pdaiv1.feature.diffusion.ai.extensions.getSizes +import dev.minios.pdaiv1.feature.diffusion.ai.extensions.multipleTensorsByFloat +import dev.minios.pdaiv1.feature.diffusion.ai.extensions.splitTensor +import dev.minios.pdaiv1.feature.diffusion.ai.scheduler.EulerAncestralDiscreteLocalDiffusionScheduler +import dev.minios.pdaiv1.feature.diffusion.ai.vae.VaeDecoder +import dev.minios.pdaiv1.feature.diffusion.entity.Array3D +import dev.minios.pdaiv1.feature.diffusion.entity.LocalDiffusionFlag +import dev.minios.pdaiv1.feature.diffusion.entity.LocalDiffusionTensor +import dev.minios.pdaiv1.feature.diffusion.environment.DeviceNNAPIFlagProvider +import dev.minios.pdaiv1.feature.diffusion.environment.LocalModelIdProvider +import dev.minios.pdaiv1.feature.diffusion.environment.OrtEnvironmentProvider +import dev.minios.pdaiv1.feature.diffusion.extensions.modelPathPrefix import java.nio.IntBuffer import java.util.EnumSet import java.util.Random diff --git a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/vae/VaeDecoder.kt b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/vae/VaeDecoder.kt similarity index 74% rename from feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/vae/VaeDecoder.kt rename to feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/vae/VaeDecoder.kt index 5dea5b554..43bcf8316 100644 --- a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/ai/vae/VaeDecoder.kt +++ b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/ai/vae/VaeDecoder.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.feature.diffusion.ai.vae +package dev.minios.pdaiv1.feature.diffusion.ai.vae import ai.onnxruntime.OnnxTensor import ai.onnxruntime.OrtSession @@ -6,16 +6,16 @@ import ai.onnxruntime.OrtSession.SessionOptions import ai.onnxruntime.providers.NNAPIFlags import android.graphics.Bitmap import android.graphics.Color -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionContract -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionContract.ORT -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionContract.ORT_KEY_MODEL_FORMAT -import com.shifthackz.aisdv1.feature.diffusion.entity.Array3D -import com.shifthackz.aisdv1.feature.diffusion.entity.LocalDiffusionFlag -import com.shifthackz.aisdv1.feature.diffusion.environment.LocalModelIdProvider -import com.shifthackz.aisdv1.feature.diffusion.environment.OrtEnvironmentProvider -import com.shifthackz.aisdv1.feature.diffusion.extensions.modelPathPrefix +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionContract +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionContract.ORT +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionContract.ORT_KEY_MODEL_FORMAT +import dev.minios.pdaiv1.feature.diffusion.entity.Array3D +import dev.minios.pdaiv1.feature.diffusion.entity.LocalDiffusionFlag +import dev.minios.pdaiv1.feature.diffusion.environment.LocalModelIdProvider +import dev.minios.pdaiv1.feature.diffusion.environment.OrtEnvironmentProvider +import dev.minios.pdaiv1.feature.diffusion.extensions.modelPathPrefix import java.util.EnumSet import kotlin.math.roundToInt diff --git a/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/di/DiffusionModule.kt b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/di/DiffusionModule.kt new file mode 100644 index 000000000..2f49c7055 --- /dev/null +++ b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/di/DiffusionModule.kt @@ -0,0 +1,19 @@ +package dev.minios.pdaiv1.feature.diffusion.di + +import dev.minios.pdaiv1.domain.feature.diffusion.LocalDiffusion +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionImpl +import dev.minios.pdaiv1.feature.diffusion.ai.tokenizer.EnglishTextTokenizer +import dev.minios.pdaiv1.feature.diffusion.ai.tokenizer.LocalDiffusionTextTokenizer +import dev.minios.pdaiv1.feature.diffusion.ai.unet.UNet +import dev.minios.pdaiv1.feature.diffusion.environment.OrtEnvironmentProvider +import dev.minios.pdaiv1.feature.diffusion.environment.OrtEnvironmentProviderImpl +import org.koin.core.module.dsl.singleOf +import org.koin.dsl.bind +import org.koin.dsl.module + +val diffusionModule = module { + singleOf(::UNet) + singleOf(::EnglishTextTokenizer) bind LocalDiffusionTextTokenizer::class + singleOf(::LocalDiffusionImpl) bind LocalDiffusion::class + singleOf(::OrtEnvironmentProviderImpl) bind OrtEnvironmentProvider::class +} diff --git a/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/entity/LocalDiffusionAlias.kt b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/entity/LocalDiffusionAlias.kt new file mode 100644 index 000000000..e4e62bdf0 --- /dev/null +++ b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/entity/LocalDiffusionAlias.kt @@ -0,0 +1,3 @@ +package dev.minios.pdaiv1.feature.diffusion.entity + +typealias Array3D = Array>> diff --git a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/entity/LocalDiffusionConfig.kt b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/entity/LocalDiffusionConfig.kt similarity index 61% rename from feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/entity/LocalDiffusionConfig.kt rename to feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/entity/LocalDiffusionConfig.kt index 5d6728083..93960b9a9 100644 --- a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/entity/LocalDiffusionConfig.kt +++ b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/entity/LocalDiffusionConfig.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.feature.diffusion.entity +package dev.minios.pdaiv1.feature.diffusion.entity -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionContract.BETA_SCHEDULER_SCALED_LINEAR -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionContract.DPM_SOLVER_PP -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionContract.PREDICTION_EPSILON -import com.shifthackz.aisdv1.feature.diffusion.LocalDiffusionContract.SOLVER_MIDPOINT +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionContract.BETA_SCHEDULER_SCALED_LINEAR +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionContract.DPM_SOLVER_PP +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionContract.PREDICTION_EPSILON +import dev.minios.pdaiv1.feature.diffusion.LocalDiffusionContract.SOLVER_MIDPOINT internal data class LocalDiffusionConfig( val betaStart: Float = 0.00085f, diff --git a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/entity/LocalDiffusionFlag.kt b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/entity/LocalDiffusionFlag.kt similarity index 65% rename from feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/entity/LocalDiffusionFlag.kt rename to feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/entity/LocalDiffusionFlag.kt index 34479d859..7a71019fe 100644 --- a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/entity/LocalDiffusionFlag.kt +++ b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/entity/LocalDiffusionFlag.kt @@ -1,6 +1,6 @@ @file:Suppress("unused") -package com.shifthackz.aisdv1.feature.diffusion.entity +package dev.minios.pdaiv1.feature.diffusion.entity enum class LocalDiffusionFlag(val value: Int) { CPU(0), diff --git a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/entity/LocalDiffusionTensor.kt b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/entity/LocalDiffusionTensor.kt similarity index 94% rename from feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/entity/LocalDiffusionTensor.kt rename to feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/entity/LocalDiffusionTensor.kt index 3287de5f4..68a509aa8 100644 --- a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/entity/LocalDiffusionTensor.kt +++ b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/entity/LocalDiffusionTensor.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.feature.diffusion.entity +package dev.minios.pdaiv1.feature.diffusion.entity import ai.onnxruntime.OnnxTensor diff --git a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/environment/DeviceNNAPIFlagProvider.kt b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/environment/DeviceNNAPIFlagProvider.kt similarity index 50% rename from feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/environment/DeviceNNAPIFlagProvider.kt rename to feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/environment/DeviceNNAPIFlagProvider.kt index 692b24b2a..10cb6ea60 100644 --- a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/environment/DeviceNNAPIFlagProvider.kt +++ b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/environment/DeviceNNAPIFlagProvider.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.feature.diffusion.environment +package dev.minios.pdaiv1.feature.diffusion.environment fun interface DeviceNNAPIFlagProvider { fun get(): Int diff --git a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/environment/LocalModelIdProvider.kt b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/environment/LocalModelIdProvider.kt similarity index 50% rename from feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/environment/LocalModelIdProvider.kt rename to feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/environment/LocalModelIdProvider.kt index 3c24f58bf..e139a2de1 100644 --- a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/environment/LocalModelIdProvider.kt +++ b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/environment/LocalModelIdProvider.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.feature.diffusion.environment +package dev.minios.pdaiv1.feature.diffusion.environment fun interface LocalModelIdProvider { fun get(): String diff --git a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/environment/OrtEnvironmentProvider.kt b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/environment/OrtEnvironmentProvider.kt similarity index 66% rename from feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/environment/OrtEnvironmentProvider.kt rename to feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/environment/OrtEnvironmentProvider.kt index 2d6666601..32ca618e6 100644 --- a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/environment/OrtEnvironmentProvider.kt +++ b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/environment/OrtEnvironmentProvider.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.feature.diffusion.environment +package dev.minios.pdaiv1.feature.diffusion.environment import ai.onnxruntime.OrtEnvironment diff --git a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/environment/OrtEnvironmentProviderImpl.kt b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/environment/OrtEnvironmentProviderImpl.kt similarity index 81% rename from feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/environment/OrtEnvironmentProviderImpl.kt rename to feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/environment/OrtEnvironmentProviderImpl.kt index cc680035a..c4b66cc74 100644 --- a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/environment/OrtEnvironmentProviderImpl.kt +++ b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/environment/OrtEnvironmentProviderImpl.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.feature.diffusion.environment +package dev.minios.pdaiv1.feature.diffusion.environment import ai.onnxruntime.OrtEnvironment diff --git a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/extensions/LocalDiffusionPaths.kt b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/extensions/LocalDiffusionPaths.kt similarity index 55% rename from feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/extensions/LocalDiffusionPaths.kt rename to feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/extensions/LocalDiffusionPaths.kt index 1b22e6d94..0a0395896 100644 --- a/feature/diffusion/src/main/java/com/shifthackz/aisdv1/feature/diffusion/extensions/LocalDiffusionPaths.kt +++ b/feature/diffusion/src/main/java/dev/minios/pdaiv1/feature/diffusion/extensions/LocalDiffusionPaths.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.feature.diffusion.extensions +package dev.minios.pdaiv1.feature.diffusion.extensions -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.domain.entity.LocalAiModel -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.feature.diffusion.environment.LocalModelIdProvider +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.feature.diffusion.environment.LocalModelIdProvider fun modelPathPrefix( preferenceManager: PreferenceManager, diff --git a/feature/mediapipe/build.gradle.kts b/feature/mediapipe/build.gradle.kts index b58a73581..77f1a2844 100644 --- a/feature/mediapipe/build.gradle.kts +++ b/feature/mediapipe/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } android { - namespace = "com.shifthackz.aisdv1.feature.mediapipe" + namespace = "dev.minios.pdaiv1.feature.mediapipe" } dependencies { diff --git a/feature/mediapipe/src/foss/java/com/shifthackz/aisdv1/feature/mediapipe/MediaPipeImpl.kt b/feature/mediapipe/src/foss/java/dev/minios/pdaiv1/feature/mediapipe/MediaPipeImpl.kt similarity index 63% rename from feature/mediapipe/src/foss/java/com/shifthackz/aisdv1/feature/mediapipe/MediaPipeImpl.kt rename to feature/mediapipe/src/foss/java/dev/minios/pdaiv1/feature/mediapipe/MediaPipeImpl.kt index 3be83e5ea..eaa2121c9 100644 --- a/feature/mediapipe/src/foss/java/com/shifthackz/aisdv1/feature/mediapipe/MediaPipeImpl.kt +++ b/feature/mediapipe/src/foss/java/dev/minios/pdaiv1/feature/mediapipe/MediaPipeImpl.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.feature.mediapipe +package dev.minios.pdaiv1.feature.mediapipe import android.graphics.Bitmap -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import com.shifthackz.aisdv1.domain.feature.mediapipe.MediaPipe +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.feature.mediapipe.MediaPipe import io.reactivex.rxjava3.core.Single internal class MediaPipeImpl : MediaPipe { diff --git a/feature/mediapipe/src/playstore/java/com/shifthackz/aisdv1/feature/mediapipe/MediaPipeImpl.kt b/feature/mediapipe/src/full/java/dev/minios/pdaiv1/feature/mediapipe/MediaPipeImpl.kt similarity index 82% rename from feature/mediapipe/src/playstore/java/com/shifthackz/aisdv1/feature/mediapipe/MediaPipeImpl.kt rename to feature/mediapipe/src/full/java/dev/minios/pdaiv1/feature/mediapipe/MediaPipeImpl.kt index a6e7e98ab..fa4cf5de9 100644 --- a/feature/mediapipe/src/playstore/java/com/shifthackz/aisdv1/feature/mediapipe/MediaPipeImpl.kt +++ b/feature/mediapipe/src/full/java/dev/minios/pdaiv1/feature/mediapipe/MediaPipeImpl.kt @@ -1,16 +1,16 @@ -package com.shifthackz.aisdv1.feature.mediapipe +package dev.minios.pdaiv1.feature.mediapipe import android.content.Context import android.graphics.Bitmap import com.google.mediapipe.framework.image.BitmapExtractor import com.google.mediapipe.tasks.vision.imagegenerator.ImageGenerator import com.google.mediapipe.tasks.vision.imagegenerator.ImageGenerator.ImageGeneratorOptions -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.core.common.log.debugLog -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import com.shifthackz.aisdv1.domain.feature.mediapipe.MediaPipe -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.feature.mediapipe.extensions.modelPath +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.core.common.log.debugLog +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.feature.mediapipe.MediaPipe +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.feature.mediapipe.extensions.modelPath import io.reactivex.rxjava3.core.Single internal class MediaPipeImpl( diff --git a/feature/mediapipe/src/main/java/com/shifthackz/aisdv1/feature/mediapipe/di/MediaPipeModule.kt b/feature/mediapipe/src/main/java/dev/minios/pdaiv1/feature/mediapipe/di/MediaPipeModule.kt similarity index 50% rename from feature/mediapipe/src/main/java/com/shifthackz/aisdv1/feature/mediapipe/di/MediaPipeModule.kt rename to feature/mediapipe/src/main/java/dev/minios/pdaiv1/feature/mediapipe/di/MediaPipeModule.kt index 3327827e3..fbf3ca12d 100644 --- a/feature/mediapipe/src/main/java/com/shifthackz/aisdv1/feature/mediapipe/di/MediaPipeModule.kt +++ b/feature/mediapipe/src/main/java/dev/minios/pdaiv1/feature/mediapipe/di/MediaPipeModule.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.feature.mediapipe.di +package dev.minios.pdaiv1.feature.mediapipe.di -import com.shifthackz.aisdv1.domain.feature.mediapipe.MediaPipe -import com.shifthackz.aisdv1.feature.mediapipe.MediaPipeImpl +import dev.minios.pdaiv1.domain.feature.mediapipe.MediaPipe +import dev.minios.pdaiv1.feature.mediapipe.MediaPipeImpl import org.koin.core.module.dsl.factoryOf import org.koin.dsl.bind import org.koin.dsl.module diff --git a/feature/mediapipe/src/main/java/com/shifthackz/aisdv1/feature/mediapipe/extensions/MediaPipeModelPaths.kt b/feature/mediapipe/src/main/java/dev/minios/pdaiv1/feature/mediapipe/extensions/MediaPipeModelPaths.kt similarity index 60% rename from feature/mediapipe/src/main/java/com/shifthackz/aisdv1/feature/mediapipe/extensions/MediaPipeModelPaths.kt rename to feature/mediapipe/src/main/java/dev/minios/pdaiv1/feature/mediapipe/extensions/MediaPipeModelPaths.kt index 91e494047..35d8cb020 100644 --- a/feature/mediapipe/src/main/java/com/shifthackz/aisdv1/feature/mediapipe/extensions/MediaPipeModelPaths.kt +++ b/feature/mediapipe/src/main/java/dev/minios/pdaiv1/feature/mediapipe/extensions/MediaPipeModelPaths.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.feature.mediapipe.extensions +package dev.minios.pdaiv1.feature.mediapipe.extensions -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.domain.entity.LocalAiModel -import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.domain.preference.PreferenceManager fun modelPath( preferenceManager: PreferenceManager, diff --git a/feature/mediapipe/src/full/java/com/shifthackz/aisdv1/feature/mediapipe/MediaPipeImpl.kt b/feature/mediapipe/src/playstore/java/dev/minios/pdaiv1/feature/mediapipe/MediaPipeImpl.kt similarity index 82% rename from feature/mediapipe/src/full/java/com/shifthackz/aisdv1/feature/mediapipe/MediaPipeImpl.kt rename to feature/mediapipe/src/playstore/java/dev/minios/pdaiv1/feature/mediapipe/MediaPipeImpl.kt index a6e7e98ab..fa4cf5de9 100644 --- a/feature/mediapipe/src/full/java/com/shifthackz/aisdv1/feature/mediapipe/MediaPipeImpl.kt +++ b/feature/mediapipe/src/playstore/java/dev/minios/pdaiv1/feature/mediapipe/MediaPipeImpl.kt @@ -1,16 +1,16 @@ -package com.shifthackz.aisdv1.feature.mediapipe +package dev.minios.pdaiv1.feature.mediapipe import android.content.Context import android.graphics.Bitmap import com.google.mediapipe.framework.image.BitmapExtractor import com.google.mediapipe.tasks.vision.imagegenerator.ImageGenerator import com.google.mediapipe.tasks.vision.imagegenerator.ImageGenerator.ImageGeneratorOptions -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.core.common.log.debugLog -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import com.shifthackz.aisdv1.domain.feature.mediapipe.MediaPipe -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.feature.mediapipe.extensions.modelPath +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.core.common.log.debugLog +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.feature.mediapipe.MediaPipe +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.feature.mediapipe.extensions.modelPath import io.reactivex.rxjava3.core.Single internal class MediaPipeImpl( diff --git a/feature/mediapipe/src/test/java/com/shifthackz/aisdv1/feature/mediapipe/ExampleUnitTest.kt b/feature/mediapipe/src/test/java/dev/minios/pdaiv1/feature/mediapipe/ExampleUnitTest.kt similarity index 86% rename from feature/mediapipe/src/test/java/com/shifthackz/aisdv1/feature/mediapipe/ExampleUnitTest.kt rename to feature/mediapipe/src/test/java/dev/minios/pdaiv1/feature/mediapipe/ExampleUnitTest.kt index 2fc2001c4..036920cba 100644 --- a/feature/mediapipe/src/test/java/com/shifthackz/aisdv1/feature/mediapipe/ExampleUnitTest.kt +++ b/feature/mediapipe/src/test/java/dev/minios/pdaiv1/feature/mediapipe/ExampleUnitTest.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.feature.mediapipe +package dev.minios.pdaiv1.feature.mediapipe import org.junit.Assert.* import org.junit.Test diff --git a/feature/qnn/build.gradle.kts b/feature/qnn/build.gradle.kts index 86be19617..e82fd16d9 100644 --- a/feature/qnn/build.gradle.kts +++ b/feature/qnn/build.gradle.kts @@ -4,7 +4,7 @@ plugins { } android { - namespace = "com.shifthackz.aisdv1.feature.qnn" + namespace = "dev.minios.pdaiv1.feature.qnn" defaultConfig { ndk { diff --git a/feature/qnn/consumer-rules.pro b/feature/qnn/consumer-rules.pro index a994a4e29..ae8981ee3 100644 --- a/feature/qnn/consumer-rules.pro +++ b/feature/qnn/consumer-rules.pro @@ -4,5 +4,5 @@ } # Keep QNN Bridge --keep class com.shifthackz.aisdv1.feature.qnn.jni.QnnBridge { *; } --keep class com.shifthackz.aisdv1.feature.qnn.jni.QnnBridge$* { *; } +-keep class dev.minios.pdaiv1.feature.qnn.jni.QnnBridge { *; } +-keep class dev.minios.pdaiv1.feature.qnn.jni.QnnBridge$* { *; } diff --git a/feature/qnn/src/main/java/com/shifthackz/aisdv1/feature/qnn/LocalQnnImpl.kt b/feature/qnn/src/main/java/dev/minios/pdaiv1/feature/qnn/LocalQnnImpl.kt similarity index 97% rename from feature/qnn/src/main/java/com/shifthackz/aisdv1/feature/qnn/LocalQnnImpl.kt rename to feature/qnn/src/main/java/dev/minios/pdaiv1/feature/qnn/LocalQnnImpl.kt index 3b1fe2861..020b01288 100644 --- a/feature/qnn/src/main/java/com/shifthackz/aisdv1/feature/qnn/LocalQnnImpl.kt +++ b/feature/qnn/src/main/java/dev/minios/pdaiv1/feature/qnn/LocalQnnImpl.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.feature.qnn +package dev.minios.pdaiv1.feature.qnn import android.content.Context import android.graphics.Bitmap @@ -10,18 +10,18 @@ import android.graphics.Rect import android.util.Base64 import android.util.Log import com.google.gson.Gson -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.LocalAiModel -import com.shifthackz.aisdv1.domain.entity.LocalDiffusionStatus -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import com.shifthackz.aisdv1.domain.feature.qnn.LocalQnn -import com.shifthackz.aisdv1.domain.feature.qnn.QnnGenerationResult -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.feature.qnn.api.model.CompleteEvent -import com.shifthackz.aisdv1.feature.qnn.api.model.GenerateRequest -import com.shifthackz.aisdv1.feature.qnn.api.model.ProgressEvent -import com.shifthackz.aisdv1.feature.qnn.service.QnnBackendService +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.domain.entity.LocalDiffusionStatus +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.feature.qnn.LocalQnn +import dev.minios.pdaiv1.domain.feature.qnn.QnnGenerationResult +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.feature.qnn.api.model.CompleteEvent +import dev.minios.pdaiv1.feature.qnn.api.model.GenerateRequest +import dev.minios.pdaiv1.feature.qnn.api.model.ProgressEvent +import dev.minios.pdaiv1.feature.qnn.service.QnnBackendService import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single diff --git a/feature/qnn/src/main/java/com/shifthackz/aisdv1/feature/qnn/api/model/ApiModels.kt b/feature/qnn/src/main/java/dev/minios/pdaiv1/feature/qnn/api/model/ApiModels.kt similarity index 97% rename from feature/qnn/src/main/java/com/shifthackz/aisdv1/feature/qnn/api/model/ApiModels.kt rename to feature/qnn/src/main/java/dev/minios/pdaiv1/feature/qnn/api/model/ApiModels.kt index 4d020f394..923017e97 100644 --- a/feature/qnn/src/main/java/com/shifthackz/aisdv1/feature/qnn/api/model/ApiModels.kt +++ b/feature/qnn/src/main/java/dev/minios/pdaiv1/feature/qnn/api/model/ApiModels.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.feature.qnn.api.model +package dev.minios.pdaiv1.feature.qnn.api.model import com.google.gson.annotations.SerializedName diff --git a/feature/qnn/src/main/java/com/shifthackz/aisdv1/feature/qnn/di/QnnModule.kt b/feature/qnn/src/main/java/dev/minios/pdaiv1/feature/qnn/di/QnnModule.kt similarity index 85% rename from feature/qnn/src/main/java/com/shifthackz/aisdv1/feature/qnn/di/QnnModule.kt rename to feature/qnn/src/main/java/dev/minios/pdaiv1/feature/qnn/di/QnnModule.kt index 4492f21c7..e0064213f 100644 --- a/feature/qnn/src/main/java/com/shifthackz/aisdv1/feature/qnn/di/QnnModule.kt +++ b/feature/qnn/src/main/java/dev/minios/pdaiv1/feature/qnn/di/QnnModule.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.feature.qnn.di +package dev.minios.pdaiv1.feature.qnn.di import com.google.gson.Gson -import com.shifthackz.aisdv1.domain.feature.qnn.LocalQnn -import com.shifthackz.aisdv1.feature.qnn.LocalQnnImpl -import com.shifthackz.aisdv1.feature.qnn.model.QnnModelManager +import dev.minios.pdaiv1.domain.feature.qnn.LocalQnn +import dev.minios.pdaiv1.feature.qnn.LocalQnnImpl +import dev.minios.pdaiv1.feature.qnn.model.QnnModelManager import okhttp3.OkHttpClient import okhttp3.logging.HttpLoggingInterceptor import org.koin.android.ext.koin.androidContext diff --git a/feature/qnn/src/main/java/com/shifthackz/aisdv1/feature/qnn/model/QnnModelManager.kt b/feature/qnn/src/main/java/dev/minios/pdaiv1/feature/qnn/model/QnnModelManager.kt similarity index 99% rename from feature/qnn/src/main/java/com/shifthackz/aisdv1/feature/qnn/model/QnnModelManager.kt rename to feature/qnn/src/main/java/dev/minios/pdaiv1/feature/qnn/model/QnnModelManager.kt index 5c1d97897..5298c95ed 100644 --- a/feature/qnn/src/main/java/com/shifthackz/aisdv1/feature/qnn/model/QnnModelManager.kt +++ b/feature/qnn/src/main/java/dev/minios/pdaiv1/feature/qnn/model/QnnModelManager.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.feature.qnn.model +package dev.minios.pdaiv1.feature.qnn.model import android.content.Context import kotlinx.coroutines.Dispatchers diff --git a/feature/qnn/src/main/java/com/shifthackz/aisdv1/feature/qnn/service/QnnBackendService.kt b/feature/qnn/src/main/java/dev/minios/pdaiv1/feature/qnn/service/QnnBackendService.kt similarity index 99% rename from feature/qnn/src/main/java/com/shifthackz/aisdv1/feature/qnn/service/QnnBackendService.kt rename to feature/qnn/src/main/java/dev/minios/pdaiv1/feature/qnn/service/QnnBackendService.kt index d0a9af2bd..9e627ebfe 100644 --- a/feature/qnn/src/main/java/com/shifthackz/aisdv1/feature/qnn/service/QnnBackendService.kt +++ b/feature/qnn/src/main/java/dev/minios/pdaiv1/feature/qnn/service/QnnBackendService.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.feature.qnn.service +package dev.minios.pdaiv1.feature.qnn.service import android.app.Notification import android.app.NotificationChannel @@ -50,8 +50,8 @@ class QnnBackendService : Service() { private const val RUNTIME_DIR = "qnn_runtime" private const val SERVER_PORT = 8081 - const val ACTION_START = "com.shifthackz.aisdv1.feature.qnn.START" - const val ACTION_STOP = "com.shifthackz.aisdv1.feature.qnn.STOP" + const val ACTION_START = "dev.minios.pdaiv1.feature.qnn.START" + const val ACTION_STOP = "dev.minios.pdaiv1.feature.qnn.STOP" const val EXTRA_MODEL_PATH = "model_path" const val EXTRA_WIDTH = "width" const val EXTRA_HEIGHT = "height" diff --git a/feature/work/build.gradle.kts b/feature/work/build.gradle.kts index 7f45580bc..b24f8a8c6 100644 --- a/feature/work/build.gradle.kts +++ b/feature/work/build.gradle.kts @@ -3,7 +3,7 @@ plugins { } android { - namespace = "com.shifthackz.aisdv1.feature.work" + namespace = "dev.minios.pdaiv1.feature.work" } dependencies { diff --git a/feature/work/src/main/java/com/shifthackz/aisdv1/work/BackgroundTaskManagerImpl.kt b/feature/work/src/main/java/dev/minios/pdaiv1/work/BackgroundTaskManagerImpl.kt similarity index 84% rename from feature/work/src/main/java/com/shifthackz/aisdv1/work/BackgroundTaskManagerImpl.kt rename to feature/work/src/main/java/dev/minios/pdaiv1/work/BackgroundTaskManagerImpl.kt index 75ec4643a..91a32636f 100644 --- a/feature/work/src/main/java/com/shifthackz/aisdv1/work/BackgroundTaskManagerImpl.kt +++ b/feature/work/src/main/java/dev/minios/pdaiv1/work/BackgroundTaskManagerImpl.kt @@ -1,20 +1,20 @@ -package com.shifthackz.aisdv1.work +package dev.minios.pdaiv1.work import androidx.work.ExistingWorkPolicy import androidx.work.ListenableWorker import androidx.work.OneTimeWorkRequestBuilder import androidx.work.OutOfQuotaPolicy -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.domain.entity.FalAiPayload -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import com.shifthackz.aisdv1.domain.feature.work.BackgroundTaskManager -import com.shifthackz.aisdv1.work.di.WorkManagerProvider -import com.shifthackz.aisdv1.work.mappers.toByteArray -import com.shifthackz.aisdv1.work.mappers.toByteArray as toFalAiByteArray -import com.shifthackz.aisdv1.work.task.FalAiTask -import com.shifthackz.aisdv1.work.task.ImageToImageTask -import com.shifthackz.aisdv1.work.task.TextToImageTask +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.domain.entity.FalAiPayload +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.feature.work.BackgroundTaskManager +import dev.minios.pdaiv1.work.di.WorkManagerProvider +import dev.minios.pdaiv1.work.mappers.toByteArray +import dev.minios.pdaiv1.work.mappers.toByteArray as toFalAiByteArray +import dev.minios.pdaiv1.work.task.FalAiTask +import dev.minios.pdaiv1.work.task.ImageToImageTask +import dev.minios.pdaiv1.work.task.TextToImageTask import org.koin.java.KoinJavaComponent.inject import java.io.File diff --git a/feature/work/src/main/java/com/shifthackz/aisdv1/work/BackgroundWorkObserverImpl.kt b/feature/work/src/main/java/dev/minios/pdaiv1/work/BackgroundWorkObserverImpl.kt similarity index 88% rename from feature/work/src/main/java/com/shifthackz/aisdv1/work/BackgroundWorkObserverImpl.kt rename to feature/work/src/main/java/dev/minios/pdaiv1/work/BackgroundWorkObserverImpl.kt index 6a78e5b38..b539c8c5e 100644 --- a/feature/work/src/main/java/com/shifthackz/aisdv1/work/BackgroundWorkObserverImpl.kt +++ b/feature/work/src/main/java/dev/minios/pdaiv1/work/BackgroundWorkObserverImpl.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.work +package dev.minios.pdaiv1.work import androidx.work.WorkInfo -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.BackgroundWorkResult -import com.shifthackz.aisdv1.domain.entity.BackgroundWorkStatus -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.work.di.WorkManagerProvider +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.BackgroundWorkResult +import dev.minios.pdaiv1.domain.entity.BackgroundWorkStatus +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.work.di.WorkManagerProvider import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.subjects.BehaviorSubject diff --git a/feature/work/src/main/java/com/shifthackz/aisdv1/work/Constants.kt b/feature/work/src/main/java/dev/minios/pdaiv1/work/Constants.kt similarity index 94% rename from feature/work/src/main/java/com/shifthackz/aisdv1/work/Constants.kt rename to feature/work/src/main/java/dev/minios/pdaiv1/work/Constants.kt index 0fea29a82..f7e40aea4 100644 --- a/feature/work/src/main/java/com/shifthackz/aisdv1/work/Constants.kt +++ b/feature/work/src/main/java/dev/minios/pdaiv1/work/Constants.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.work +package dev.minios.pdaiv1.work internal object Constants { diff --git a/feature/work/src/main/java/com/shifthackz/aisdv1/work/core/CoreGenerationWorker.kt b/feature/work/src/main/java/dev/minios/pdaiv1/work/core/CoreGenerationWorker.kt similarity index 83% rename from feature/work/src/main/java/com/shifthackz/aisdv1/work/core/CoreGenerationWorker.kt rename to feature/work/src/main/java/dev/minios/pdaiv1/work/core/CoreGenerationWorker.kt index b77330eea..050f59b62 100644 --- a/feature/work/src/main/java/com/shifthackz/aisdv1/work/core/CoreGenerationWorker.kt +++ b/feature/work/src/main/java/dev/minios/pdaiv1/work/core/CoreGenerationWorker.kt @@ -1,24 +1,24 @@ @file:Suppress("MemberVisibilityCanBePrivate") -package com.shifthackz.aisdv1.work.core +package dev.minios.pdaiv1.work.core import android.content.Context import androidx.work.WorkerParameters -import com.shifthackz.aisdv1.core.common.appbuild.ActivityIntentProvider -import com.shifthackz.aisdv1.core.common.contract.RxDisposableContract -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.localization.formatter.DurationFormatter -import com.shifthackz.aisdv1.core.notification.PushNotificationManager -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.generation.InterruptGenerationUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.ObserveHordeProcessStatusUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.ObserveLocalDiffusionProcessStatusUseCase +import dev.minios.pdaiv1.core.common.appbuild.ActivityIntentProvider +import dev.minios.pdaiv1.core.common.contract.RxDisposableContract +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.localization.formatter.DurationFormatter +import dev.minios.pdaiv1.core.notification.PushNotificationManager +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.generation.InterruptGenerationUseCase +import dev.minios.pdaiv1.domain.usecase.generation.ObserveHordeProcessStatusUseCase +import dev.minios.pdaiv1.domain.usecase.generation.ObserveLocalDiffusionProcessStatusUseCase import io.reactivex.rxjava3.disposables.CompositeDisposable import io.reactivex.rxjava3.kotlin.subscribeBy -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR internal abstract class CoreGenerationWorker( context: Context, diff --git a/feature/work/src/main/java/com/shifthackz/aisdv1/work/core/NotificationWorker.kt b/feature/work/src/main/java/dev/minios/pdaiv1/work/core/NotificationWorker.kt similarity index 94% rename from feature/work/src/main/java/com/shifthackz/aisdv1/work/core/NotificationWorker.kt rename to feature/work/src/main/java/dev/minios/pdaiv1/work/core/NotificationWorker.kt index d0684a102..9ad2ea9ae 100644 --- a/feature/work/src/main/java/com/shifthackz/aisdv1/work/core/NotificationWorker.kt +++ b/feature/work/src/main/java/dev/minios/pdaiv1/work/core/NotificationWorker.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.work.core +package dev.minios.pdaiv1.work.core import android.app.PendingIntent import android.content.Context @@ -9,9 +9,9 @@ import androidx.core.app.NotificationCompat import androidx.work.ForegroundInfo import androidx.work.WorkManager import androidx.work.WorkerParameters -import com.shifthackz.aisdv1.core.common.appbuild.ActivityIntentProvider -import com.shifthackz.aisdv1.core.common.extensions.isAppInForeground -import com.shifthackz.aisdv1.core.notification.PushNotificationManager +import dev.minios.pdaiv1.core.common.appbuild.ActivityIntentProvider +import dev.minios.pdaiv1.core.common.extensions.isAppInForeground +import dev.minios.pdaiv1.core.notification.PushNotificationManager import io.reactivex.rxjava3.core.Single internal abstract class NotificationWorker( diff --git a/feature/work/src/main/java/com/shifthackz/aisdv1/work/core/Rx3Worker.kt b/feature/work/src/main/java/dev/minios/pdaiv1/work/core/Rx3Worker.kt similarity index 98% rename from feature/work/src/main/java/com/shifthackz/aisdv1/work/core/Rx3Worker.kt rename to feature/work/src/main/java/dev/minios/pdaiv1/work/core/Rx3Worker.kt index 5e2574746..71b974d6d 100644 --- a/feature/work/src/main/java/com/shifthackz/aisdv1/work/core/Rx3Worker.kt +++ b/feature/work/src/main/java/dev/minios/pdaiv1/work/core/Rx3Worker.kt @@ -1,6 +1,6 @@ @file:Suppress("MemberVisibilityCanBePrivate") -package com.shifthackz.aisdv1.work.core +package dev.minios.pdaiv1.work.core import android.content.Context import androidx.annotation.MainThread diff --git a/feature/work/src/main/java/com/shifthackz/aisdv1/work/di/BackgroundWorkModule.kt b/feature/work/src/main/java/dev/minios/pdaiv1/work/di/BackgroundWorkModule.kt similarity index 68% rename from feature/work/src/main/java/com/shifthackz/aisdv1/work/di/BackgroundWorkModule.kt rename to feature/work/src/main/java/dev/minios/pdaiv1/work/di/BackgroundWorkModule.kt index 713198ea3..adad875f2 100644 --- a/feature/work/src/main/java/com/shifthackz/aisdv1/work/di/BackgroundWorkModule.kt +++ b/feature/work/src/main/java/dev/minios/pdaiv1/work/di/BackgroundWorkModule.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.work.di +package dev.minios.pdaiv1.work.di import androidx.work.WorkManager import androidx.work.WorkerFactory -import com.shifthackz.aisdv1.domain.feature.work.BackgroundTaskManager -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.work.BackgroundTaskManagerImpl -import com.shifthackz.aisdv1.work.BackgroundWorkObserverImpl +import dev.minios.pdaiv1.domain.feature.work.BackgroundTaskManager +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.work.BackgroundTaskManagerImpl +import dev.minios.pdaiv1.work.BackgroundWorkObserverImpl import org.koin.android.ext.koin.androidApplication import org.koin.core.module.dsl.factoryOf import org.koin.core.module.dsl.singleOf diff --git a/feature/work/src/main/java/com/shifthackz/aisdv1/work/di/SdaiWorkerFactory.kt b/feature/work/src/main/java/dev/minios/pdaiv1/work/di/SdaiWorkerFactory.kt similarity index 77% rename from feature/work/src/main/java/com/shifthackz/aisdv1/work/di/SdaiWorkerFactory.kt rename to feature/work/src/main/java/dev/minios/pdaiv1/work/di/SdaiWorkerFactory.kt index e6e358dbc..82d6911a7 100644 --- a/feature/work/src/main/java/com/shifthackz/aisdv1/work/di/SdaiWorkerFactory.kt +++ b/feature/work/src/main/java/dev/minios/pdaiv1/work/di/SdaiWorkerFactory.kt @@ -1,23 +1,23 @@ -package com.shifthackz.aisdv1.work.di +package dev.minios.pdaiv1.work.di import android.content.Context import androidx.work.ListenableWorker import androidx.work.WorkerFactory import androidx.work.WorkerParameters -import com.shifthackz.aisdv1.core.common.appbuild.ActivityIntentProvider -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.core.notification.PushNotificationManager -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.generation.FalAiGenerationUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.ImageToImageUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.InterruptGenerationUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.ObserveHordeProcessStatusUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.ObserveLocalDiffusionProcessStatusUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.TextToImageUseCase -import com.shifthackz.aisdv1.work.task.FalAiTask -import com.shifthackz.aisdv1.work.task.ImageToImageTask -import com.shifthackz.aisdv1.work.task.TextToImageTask +import dev.minios.pdaiv1.core.common.appbuild.ActivityIntentProvider +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.core.notification.PushNotificationManager +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.generation.FalAiGenerationUseCase +import dev.minios.pdaiv1.domain.usecase.generation.ImageToImageUseCase +import dev.minios.pdaiv1.domain.usecase.generation.InterruptGenerationUseCase +import dev.minios.pdaiv1.domain.usecase.generation.ObserveHordeProcessStatusUseCase +import dev.minios.pdaiv1.domain.usecase.generation.ObserveLocalDiffusionProcessStatusUseCase +import dev.minios.pdaiv1.domain.usecase.generation.TextToImageUseCase +import dev.minios.pdaiv1.work.task.FalAiTask +import dev.minios.pdaiv1.work.task.ImageToImageTask +import dev.minios.pdaiv1.work.task.TextToImageTask class SdaiWorkerFactory( private val backgroundWorkObserver: BackgroundWorkObserver, diff --git a/feature/work/src/main/java/com/shifthackz/aisdv1/work/di/WorkManagerProvider.kt b/feature/work/src/main/java/dev/minios/pdaiv1/work/di/WorkManagerProvider.kt similarity index 74% rename from feature/work/src/main/java/com/shifthackz/aisdv1/work/di/WorkManagerProvider.kt rename to feature/work/src/main/java/dev/minios/pdaiv1/work/di/WorkManagerProvider.kt index b4d24fda8..14f6b7139 100644 --- a/feature/work/src/main/java/com/shifthackz/aisdv1/work/di/WorkManagerProvider.kt +++ b/feature/work/src/main/java/dev/minios/pdaiv1/work/di/WorkManagerProvider.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.work.di +package dev.minios.pdaiv1.work.di import androidx.work.WorkManager diff --git a/feature/work/src/main/java/com/shifthackz/aisdv1/work/mappers/FalAiPayloadMappers.kt b/feature/work/src/main/java/dev/minios/pdaiv1/work/mappers/FalAiPayloadMappers.kt similarity index 90% rename from feature/work/src/main/java/com/shifthackz/aisdv1/work/mappers/FalAiPayloadMappers.kt rename to feature/work/src/main/java/dev/minios/pdaiv1/work/mappers/FalAiPayloadMappers.kt index eec91e32b..fb3ca1c52 100644 --- a/feature/work/src/main/java/com/shifthackz/aisdv1/work/mappers/FalAiPayloadMappers.kt +++ b/feature/work/src/main/java/dev/minios/pdaiv1/work/mappers/FalAiPayloadMappers.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.work.mappers +package dev.minios.pdaiv1.work.mappers import com.google.gson.Gson import com.google.gson.reflect.TypeToken -import com.shifthackz.aisdv1.domain.entity.FalAiPayload +import dev.minios.pdaiv1.domain.entity.FalAiPayload private val gson = Gson() diff --git a/feature/work/src/main/java/com/shifthackz/aisdv1/work/mappers/ImageToImagePayloadMappers.kt b/feature/work/src/main/java/dev/minios/pdaiv1/work/mappers/ImageToImagePayloadMappers.kt similarity index 87% rename from feature/work/src/main/java/com/shifthackz/aisdv1/work/mappers/ImageToImagePayloadMappers.kt rename to feature/work/src/main/java/dev/minios/pdaiv1/work/mappers/ImageToImagePayloadMappers.kt index 15c5aa7a3..9cd0995cb 100644 --- a/feature/work/src/main/java/com/shifthackz/aisdv1/work/mappers/ImageToImagePayloadMappers.kt +++ b/feature/work/src/main/java/dev/minios/pdaiv1/work/mappers/ImageToImagePayloadMappers.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.work.mappers +package dev.minios.pdaiv1.work.mappers -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream import java.io.ObjectInputStream diff --git a/feature/work/src/main/java/com/shifthackz/aisdv1/work/mappers/TextToImagePayloadMappers.kt b/feature/work/src/main/java/dev/minios/pdaiv1/work/mappers/TextToImagePayloadMappers.kt similarity index 87% rename from feature/work/src/main/java/com/shifthackz/aisdv1/work/mappers/TextToImagePayloadMappers.kt rename to feature/work/src/main/java/dev/minios/pdaiv1/work/mappers/TextToImagePayloadMappers.kt index fa34514ec..b3fb68e75 100644 --- a/feature/work/src/main/java/com/shifthackz/aisdv1/work/mappers/TextToImagePayloadMappers.kt +++ b/feature/work/src/main/java/dev/minios/pdaiv1/work/mappers/TextToImagePayloadMappers.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.work.mappers +package dev.minios.pdaiv1.work.mappers -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.domain.entity.TextToImagePayload import java.io.ByteArrayInputStream import java.io.ByteArrayOutputStream import java.io.ObjectInputStream diff --git a/feature/work/src/main/java/com/shifthackz/aisdv1/work/task/FalAiTask.kt b/feature/work/src/main/java/dev/minios/pdaiv1/work/task/FalAiTask.kt similarity index 77% rename from feature/work/src/main/java/com/shifthackz/aisdv1/work/task/FalAiTask.kt rename to feature/work/src/main/java/dev/minios/pdaiv1/work/task/FalAiTask.kt index c6a41b79a..ebdf799e7 100644 --- a/feature/work/src/main/java/com/shifthackz/aisdv1/work/task/FalAiTask.kt +++ b/feature/work/src/main/java/dev/minios/pdaiv1/work/task/FalAiTask.kt @@ -1,23 +1,23 @@ -package com.shifthackz.aisdv1.work.task +package dev.minios.pdaiv1.work.task import android.content.Context import androidx.work.WorkerParameters -import com.shifthackz.aisdv1.core.common.appbuild.ActivityIntentProvider -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.core.common.log.debugLog -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.notification.PushNotificationManager -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.generation.FalAiGenerationUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.InterruptGenerationUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.ObserveHordeProcessStatusUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.ObserveLocalDiffusionProcessStatusUseCase -import com.shifthackz.aisdv1.work.Constants -import com.shifthackz.aisdv1.work.Constants.NOTIFICATION_FAL_AI_FOREGROUND -import com.shifthackz.aisdv1.work.Constants.NOTIFICATION_FAL_AI_GENERIC -import com.shifthackz.aisdv1.work.core.CoreGenerationWorker -import com.shifthackz.aisdv1.work.mappers.toFalAiPayload +import dev.minios.pdaiv1.core.common.appbuild.ActivityIntentProvider +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.core.common.log.debugLog +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.notification.PushNotificationManager +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.generation.FalAiGenerationUseCase +import dev.minios.pdaiv1.domain.usecase.generation.InterruptGenerationUseCase +import dev.minios.pdaiv1.domain.usecase.generation.ObserveHordeProcessStatusUseCase +import dev.minios.pdaiv1.domain.usecase.generation.ObserveLocalDiffusionProcessStatusUseCase +import dev.minios.pdaiv1.work.Constants +import dev.minios.pdaiv1.work.Constants.NOTIFICATION_FAL_AI_FOREGROUND +import dev.minios.pdaiv1.work.Constants.NOTIFICATION_FAL_AI_GENERIC +import dev.minios.pdaiv1.work.core.CoreGenerationWorker +import dev.minios.pdaiv1.work.mappers.toFalAiPayload import io.reactivex.rxjava3.core.Single import java.io.File diff --git a/feature/work/src/main/java/com/shifthackz/aisdv1/work/task/ImageToImageTask.kt b/feature/work/src/main/java/dev/minios/pdaiv1/work/task/ImageToImageTask.kt similarity index 73% rename from feature/work/src/main/java/com/shifthackz/aisdv1/work/task/ImageToImageTask.kt rename to feature/work/src/main/java/dev/minios/pdaiv1/work/task/ImageToImageTask.kt index c6b69bf82..5424cba65 100644 --- a/feature/work/src/main/java/com/shifthackz/aisdv1/work/task/ImageToImageTask.kt +++ b/feature/work/src/main/java/dev/minios/pdaiv1/work/task/ImageToImageTask.kt @@ -1,21 +1,21 @@ -package com.shifthackz.aisdv1.work.task +package dev.minios.pdaiv1.work.task import android.content.Context import androidx.work.WorkerParameters -import com.shifthackz.aisdv1.core.common.appbuild.ActivityIntentProvider -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.core.notification.PushNotificationManager -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.generation.ImageToImageUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.InterruptGenerationUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.ObserveHordeProcessStatusUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.ObserveLocalDiffusionProcessStatusUseCase -import com.shifthackz.aisdv1.work.Constants -import com.shifthackz.aisdv1.work.Constants.NOTIFICATION_IMAGE_TO_IMAGE_FOREGROUND -import com.shifthackz.aisdv1.work.Constants.NOTIFICATION_IMAGE_TO_IMAGE_GENERIC -import com.shifthackz.aisdv1.work.core.CoreGenerationWorker -import com.shifthackz.aisdv1.work.mappers.toImageToImagePayload +import dev.minios.pdaiv1.core.common.appbuild.ActivityIntentProvider +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.core.notification.PushNotificationManager +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.generation.ImageToImageUseCase +import dev.minios.pdaiv1.domain.usecase.generation.InterruptGenerationUseCase +import dev.minios.pdaiv1.domain.usecase.generation.ObserveHordeProcessStatusUseCase +import dev.minios.pdaiv1.domain.usecase.generation.ObserveLocalDiffusionProcessStatusUseCase +import dev.minios.pdaiv1.work.Constants +import dev.minios.pdaiv1.work.Constants.NOTIFICATION_IMAGE_TO_IMAGE_FOREGROUND +import dev.minios.pdaiv1.work.Constants.NOTIFICATION_IMAGE_TO_IMAGE_GENERIC +import dev.minios.pdaiv1.work.core.CoreGenerationWorker +import dev.minios.pdaiv1.work.mappers.toImageToImagePayload import io.reactivex.rxjava3.core.Single import java.io.File diff --git a/feature/work/src/main/java/com/shifthackz/aisdv1/work/task/TextToImageTask.kt b/feature/work/src/main/java/dev/minios/pdaiv1/work/task/TextToImageTask.kt similarity index 78% rename from feature/work/src/main/java/com/shifthackz/aisdv1/work/task/TextToImageTask.kt rename to feature/work/src/main/java/dev/minios/pdaiv1/work/task/TextToImageTask.kt index f9e686315..e37f71ebb 100644 --- a/feature/work/src/main/java/com/shifthackz/aisdv1/work/task/TextToImageTask.kt +++ b/feature/work/src/main/java/dev/minios/pdaiv1/work/task/TextToImageTask.kt @@ -1,23 +1,23 @@ -package com.shifthackz.aisdv1.work.task +package dev.minios.pdaiv1.work.task import android.content.Context import androidx.work.WorkerParameters -import com.shifthackz.aisdv1.core.common.appbuild.ActivityIntentProvider -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.core.common.log.debugLog -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.notification.PushNotificationManager -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.generation.InterruptGenerationUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.ObserveHordeProcessStatusUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.ObserveLocalDiffusionProcessStatusUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.TextToImageUseCase -import com.shifthackz.aisdv1.work.Constants -import com.shifthackz.aisdv1.work.Constants.NOTIFICATION_TEXT_TO_IMAGE_FOREGROUND -import com.shifthackz.aisdv1.work.Constants.NOTIFICATION_TEXT_TO_IMAGE_GENERIC -import com.shifthackz.aisdv1.work.core.CoreGenerationWorker -import com.shifthackz.aisdv1.work.mappers.toTextToImagePayload +import dev.minios.pdaiv1.core.common.appbuild.ActivityIntentProvider +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.core.common.log.debugLog +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.notification.PushNotificationManager +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.generation.InterruptGenerationUseCase +import dev.minios.pdaiv1.domain.usecase.generation.ObserveHordeProcessStatusUseCase +import dev.minios.pdaiv1.domain.usecase.generation.ObserveLocalDiffusionProcessStatusUseCase +import dev.minios.pdaiv1.domain.usecase.generation.TextToImageUseCase +import dev.minios.pdaiv1.work.Constants +import dev.minios.pdaiv1.work.Constants.NOTIFICATION_TEXT_TO_IMAGE_FOREGROUND +import dev.minios.pdaiv1.work.Constants.NOTIFICATION_TEXT_TO_IMAGE_GENERIC +import dev.minios.pdaiv1.work.core.CoreGenerationWorker +import dev.minios.pdaiv1.work.mappers.toTextToImagePayload import io.reactivex.rxjava3.core.Single import java.io.File diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 184c54499..b2075fe74 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,6 +1,6 @@ [versions] -versionName = "0.6.8" -versionCode = "190" +versionName = "0.7.0" +versionCode = "191" targetSdk = "34" compileSdk = "35" minSdk = "24" diff --git a/network/build.gradle.kts b/network/build.gradle.kts index 989be25cd..cc733f8e3 100755 --- a/network/build.gradle.kts +++ b/network/build.gradle.kts @@ -3,7 +3,7 @@ plugins { } android { - namespace = "com.shifthackz.aisdv1.network" + namespace = "dev.minios.pdaiv1.network" } dependencies { diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/exception/BadSessionException.kt b/network/src/main/java/com/shifthackz/aisdv1/network/exception/BadSessionException.kt deleted file mode 100644 index c0589290f..000000000 --- a/network/src/main/java/com/shifthackz/aisdv1/network/exception/BadSessionException.kt +++ /dev/null @@ -1,3 +0,0 @@ -package com.shifthackz.aisdv1.network.exception - -class BadSessionException : Throwable() diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/response/DownloadableModelResponse.kt b/network/src/main/java/com/shifthackz/aisdv1/network/response/DownloadableModelResponse.kt deleted file mode 100644 index 5f08ac66a..000000000 --- a/network/src/main/java/com/shifthackz/aisdv1/network/response/DownloadableModelResponse.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.shifthackz.aisdv1.network.response - -import com.google.gson.annotations.SerializedName - -data class DownloadableModelResponse( - @SerializedName("id") - val id: String?, - @SerializedName("name") - val name: String?, - @SerializedName("size") - val size: String?, - @SerializedName("sources") - val sources: List?, -) diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/api/automatic1111/Automatic1111RestApi.kt b/network/src/main/java/dev/minios/pdaiv1/network/api/automatic1111/Automatic1111RestApi.kt similarity index 74% rename from network/src/main/java/com/shifthackz/aisdv1/network/api/automatic1111/Automatic1111RestApi.kt rename to network/src/main/java/dev/minios/pdaiv1/network/api/automatic1111/Automatic1111RestApi.kt index 9f121aa61..1586d787a 100755 --- a/network/src/main/java/com/shifthackz/aisdv1/network/api/automatic1111/Automatic1111RestApi.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/api/automatic1111/Automatic1111RestApi.kt @@ -1,16 +1,16 @@ -package com.shifthackz.aisdv1.network.api.automatic1111 - -import com.shifthackz.aisdv1.network.model.ExtensionRaw -import com.shifthackz.aisdv1.network.model.ForgeModuleRaw -import com.shifthackz.aisdv1.network.model.ServerConfigurationRaw -import com.shifthackz.aisdv1.network.model.StableDiffusionHyperNetworkRaw -import com.shifthackz.aisdv1.network.model.StableDiffusionLoraRaw -import com.shifthackz.aisdv1.network.model.StableDiffusionModelRaw -import com.shifthackz.aisdv1.network.model.StableDiffusionSamplerRaw -import com.shifthackz.aisdv1.network.request.ImageToImageRequest -import com.shifthackz.aisdv1.network.request.TextToImageRequest -import com.shifthackz.aisdv1.network.response.SdEmbeddingsResponse -import com.shifthackz.aisdv1.network.response.SdGenerationResponse +package dev.minios.pdaiv1.network.api.automatic1111 + +import dev.minios.pdaiv1.network.model.ExtensionRaw +import dev.minios.pdaiv1.network.model.ForgeModuleRaw +import dev.minios.pdaiv1.network.model.ServerConfigurationRaw +import dev.minios.pdaiv1.network.model.StableDiffusionHyperNetworkRaw +import dev.minios.pdaiv1.network.model.StableDiffusionLoraRaw +import dev.minios.pdaiv1.network.model.StableDiffusionModelRaw +import dev.minios.pdaiv1.network.model.StableDiffusionSamplerRaw +import dev.minios.pdaiv1.network.request.ImageToImageRequest +import dev.minios.pdaiv1.network.request.TextToImageRequest +import dev.minios.pdaiv1.network.response.SdEmbeddingsResponse +import dev.minios.pdaiv1.network.response.SdGenerationResponse import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single import retrofit2.http.Body diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/api/falai/FalAiApi.kt b/network/src/main/java/dev/minios/pdaiv1/network/api/falai/FalAiApi.kt similarity index 81% rename from network/src/main/java/com/shifthackz/aisdv1/network/api/falai/FalAiApi.kt rename to network/src/main/java/dev/minios/pdaiv1/network/api/falai/FalAiApi.kt index 5715c2510..d73d8ed18 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/api/falai/FalAiApi.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/api/falai/FalAiApi.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.network.api.falai +package dev.minios.pdaiv1.network.api.falai -import com.shifthackz.aisdv1.network.request.FalAiTextToImageRequest -import com.shifthackz.aisdv1.network.response.FalAiQueueResponse -import com.shifthackz.aisdv1.network.response.FalAiQueueStatusResponse -import com.shifthackz.aisdv1.network.response.FalAiGenerationResponse +import dev.minios.pdaiv1.network.request.FalAiTextToImageRequest +import dev.minios.pdaiv1.network.response.FalAiQueueResponse +import dev.minios.pdaiv1.network.response.FalAiQueueStatusResponse +import dev.minios.pdaiv1.network.response.FalAiGenerationResponse import io.reactivex.rxjava3.core.Single import retrofit2.http.Body import retrofit2.http.GET diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/api/horde/HordeRestApi.kt b/network/src/main/java/dev/minios/pdaiv1/network/api/horde/HordeRestApi.kt similarity index 67% rename from network/src/main/java/com/shifthackz/aisdv1/network/api/horde/HordeRestApi.kt rename to network/src/main/java/dev/minios/pdaiv1/network/api/horde/HordeRestApi.kt index 729e1e53d..01e7ebd29 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/api/horde/HordeRestApi.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/api/horde/HordeRestApi.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.network.api.horde +package dev.minios.pdaiv1.network.api.horde -import com.shifthackz.aisdv1.network.request.HordeGenerationAsyncRequest -import com.shifthackz.aisdv1.network.response.HordeGenerationAsyncResponse -import com.shifthackz.aisdv1.network.response.HordeGenerationCheckFullResponse -import com.shifthackz.aisdv1.network.response.HordeGenerationCheckResponse -import com.shifthackz.aisdv1.network.response.HordeUserResponse +import dev.minios.pdaiv1.network.request.HordeGenerationAsyncRequest +import dev.minios.pdaiv1.network.response.HordeGenerationAsyncResponse +import dev.minios.pdaiv1.network.response.HordeGenerationCheckFullResponse +import dev.minios.pdaiv1.network.response.HordeGenerationCheckResponse +import dev.minios.pdaiv1.network.response.HordeUserResponse import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single import retrofit2.http.Body diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/api/huggingface/HuggingFaceApi.kt b/network/src/main/java/dev/minios/pdaiv1/network/api/huggingface/HuggingFaceApi.kt similarity index 76% rename from network/src/main/java/com/shifthackz/aisdv1/network/api/huggingface/HuggingFaceApi.kt rename to network/src/main/java/dev/minios/pdaiv1/network/api/huggingface/HuggingFaceApi.kt index a1821f48c..8a423ad0b 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/api/huggingface/HuggingFaceApi.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/api/huggingface/HuggingFaceApi.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.api.huggingface +package dev.minios.pdaiv1.network.api.huggingface import io.reactivex.rxjava3.core.Completable import retrofit2.http.GET diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/api/huggingface/HuggingFaceInferenceApi.kt b/network/src/main/java/dev/minios/pdaiv1/network/api/huggingface/HuggingFaceInferenceApi.kt similarity index 83% rename from network/src/main/java/com/shifthackz/aisdv1/network/api/huggingface/HuggingFaceInferenceApi.kt rename to network/src/main/java/dev/minios/pdaiv1/network/api/huggingface/HuggingFaceInferenceApi.kt index f18a3bead..7e67a7866 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/api/huggingface/HuggingFaceInferenceApi.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/api/huggingface/HuggingFaceInferenceApi.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.network.api.huggingface +package dev.minios.pdaiv1.network.api.huggingface import android.graphics.Bitmap -import com.shifthackz.aisdv1.network.request.HuggingFaceGenerationRequest +import dev.minios.pdaiv1.network.request.HuggingFaceGenerationRequest import io.reactivex.rxjava3.core.Single import okhttp3.ResponseBody import retrofit2.Response diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/api/huggingface/HuggingFaceInferenceApiImpl.kt b/network/src/main/java/dev/minios/pdaiv1/network/api/huggingface/HuggingFaceInferenceApiImpl.kt similarity index 89% rename from network/src/main/java/com/shifthackz/aisdv1/network/api/huggingface/HuggingFaceInferenceApiImpl.kt rename to network/src/main/java/dev/minios/pdaiv1/network/api/huggingface/HuggingFaceInferenceApiImpl.kt index 27b3d2ca0..66c98a818 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/api/huggingface/HuggingFaceInferenceApiImpl.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/api/huggingface/HuggingFaceInferenceApiImpl.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.network.api.huggingface +package dev.minios.pdaiv1.network.api.huggingface import android.graphics.Bitmap import android.graphics.BitmapFactory -import com.shifthackz.aisdv1.core.common.log.debugLog -import com.shifthackz.aisdv1.network.request.HuggingFaceGenerationRequest +import dev.minios.pdaiv1.core.common.log.debugLog +import dev.minios.pdaiv1.network.request.HuggingFaceGenerationRequest import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single import java.util.concurrent.TimeUnit diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/api/imagecdn/ImageCdnRestApi.kt b/network/src/main/java/dev/minios/pdaiv1/network/api/imagecdn/ImageCdnRestApi.kt similarity index 87% rename from network/src/main/java/com/shifthackz/aisdv1/network/api/imagecdn/ImageCdnRestApi.kt rename to network/src/main/java/dev/minios/pdaiv1/network/api/imagecdn/ImageCdnRestApi.kt index e5c3f61f4..21d0df953 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/api/imagecdn/ImageCdnRestApi.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/api/imagecdn/ImageCdnRestApi.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.api.imagecdn +package dev.minios.pdaiv1.network.api.imagecdn import android.graphics.Bitmap import io.reactivex.rxjava3.core.Single diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/api/imagecdn/ImageCdnRestApiImpl.kt b/network/src/main/java/dev/minios/pdaiv1/network/api/imagecdn/ImageCdnRestApiImpl.kt similarity index 92% rename from network/src/main/java/com/shifthackz/aisdv1/network/api/imagecdn/ImageCdnRestApiImpl.kt rename to network/src/main/java/dev/minios/pdaiv1/network/api/imagecdn/ImageCdnRestApiImpl.kt index ae609d9a1..024d5fdb1 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/api/imagecdn/ImageCdnRestApiImpl.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/api/imagecdn/ImageCdnRestApiImpl.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.api.imagecdn +package dev.minios.pdaiv1.network.api.imagecdn import android.graphics.Bitmap import android.graphics.BitmapFactory diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/api/openai/OpenAiApi.kt b/network/src/main/java/dev/minios/pdaiv1/network/api/openai/OpenAiApi.kt similarity index 82% rename from network/src/main/java/com/shifthackz/aisdv1/network/api/openai/OpenAiApi.kt rename to network/src/main/java/dev/minios/pdaiv1/network/api/openai/OpenAiApi.kt index 2635dd2ed..73bf3be18 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/api/openai/OpenAiApi.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/api/openai/OpenAiApi.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.network.api.openai +package dev.minios.pdaiv1.network.api.openai -import com.shifthackz.aisdv1.network.request.OpenAiRequest -import com.shifthackz.aisdv1.network.response.OpenAiResponse +import dev.minios.pdaiv1.network.request.OpenAiRequest +import dev.minios.pdaiv1.network.response.OpenAiResponse import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single import retrofit2.http.Body diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/api/sdai/DonateApi.kt b/network/src/main/java/dev/minios/pdaiv1/network/api/pdai/DonateApi.kt similarity index 63% rename from network/src/main/java/com/shifthackz/aisdv1/network/api/sdai/DonateApi.kt rename to network/src/main/java/dev/minios/pdaiv1/network/api/pdai/DonateApi.kt index d8a545f11..b7de44495 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/api/sdai/DonateApi.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/api/pdai/DonateApi.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.network.api.sdai +package dev.minios.pdaiv1.network.api.pdai -import com.shifthackz.aisdv1.network.model.SupporterRaw +import dev.minios.pdaiv1.network.model.SupporterRaw import io.reactivex.rxjava3.core.Single import retrofit2.http.GET diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/api/sdai/DownloadableModelsApi.kt b/network/src/main/java/dev/minios/pdaiv1/network/api/pdai/DownloadableModelsApi.kt similarity index 90% rename from network/src/main/java/com/shifthackz/aisdv1/network/api/sdai/DownloadableModelsApi.kt rename to network/src/main/java/dev/minios/pdaiv1/network/api/pdai/DownloadableModelsApi.kt index 1bb08b5b2..15e95f716 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/api/sdai/DownloadableModelsApi.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/api/pdai/DownloadableModelsApi.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.network.api.sdai +package dev.minios.pdaiv1.network.api.pdai -import com.shifthackz.aisdv1.network.response.DownloadableModelResponse +import dev.minios.pdaiv1.network.response.DownloadableModelResponse import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single import okhttp3.ResponseBody diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/api/sdai/DownloadableModelsApiImpl.kt b/network/src/main/java/dev/minios/pdaiv1/network/api/pdai/DownloadableModelsApiImpl.kt similarity index 82% rename from network/src/main/java/com/shifthackz/aisdv1/network/api/sdai/DownloadableModelsApiImpl.kt rename to network/src/main/java/dev/minios/pdaiv1/network/api/pdai/DownloadableModelsApiImpl.kt index 8b4d3f002..a42df7f04 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/api/sdai/DownloadableModelsApiImpl.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/api/pdai/DownloadableModelsApiImpl.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.network.api.sdai +package dev.minios.pdaiv1.network.api.pdai -import com.shifthackz.aisdv1.network.extensions.saveFile -import com.shifthackz.aisdv1.network.response.DownloadableModelResponse +import dev.minios.pdaiv1.network.extensions.saveFile +import dev.minios.pdaiv1.network.response.DownloadableModelResponse import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single import java.io.File diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/api/sdai/HuggingFaceModelsApi.kt b/network/src/main/java/dev/minios/pdaiv1/network/api/pdai/HuggingFaceModelsApi.kt similarity index 64% rename from network/src/main/java/com/shifthackz/aisdv1/network/api/sdai/HuggingFaceModelsApi.kt rename to network/src/main/java/dev/minios/pdaiv1/network/api/pdai/HuggingFaceModelsApi.kt index fd223c027..37853fc84 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/api/sdai/HuggingFaceModelsApi.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/api/pdai/HuggingFaceModelsApi.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.network.api.sdai +package dev.minios.pdaiv1.network.api.pdai -import com.shifthackz.aisdv1.network.model.HuggingFaceModelRaw +import dev.minios.pdaiv1.network.model.HuggingFaceModelRaw import io.reactivex.rxjava3.core.Single import retrofit2.http.GET diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/api/sdai/ReportApi.kt b/network/src/main/java/dev/minios/pdaiv1/network/api/pdai/ReportApi.kt similarity index 66% rename from network/src/main/java/com/shifthackz/aisdv1/network/api/sdai/ReportApi.kt rename to network/src/main/java/dev/minios/pdaiv1/network/api/pdai/ReportApi.kt index 5c4c60157..31005504d 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/api/sdai/ReportApi.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/api/pdai/ReportApi.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.network.api.sdai +package dev.minios.pdaiv1.network.api.pdai -import com.shifthackz.aisdv1.network.request.ReportRequest +import dev.minios.pdaiv1.network.request.ReportRequest import io.reactivex.rxjava3.core.Completable import retrofit2.http.Body import retrofit2.http.POST diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/api/stabilityai/StabilityAiApi.kt b/network/src/main/java/dev/minios/pdaiv1/network/api/stabilityai/StabilityAiApi.kt similarity index 83% rename from network/src/main/java/com/shifthackz/aisdv1/network/api/stabilityai/StabilityAiApi.kt rename to network/src/main/java/dev/minios/pdaiv1/network/api/stabilityai/StabilityAiApi.kt index 31160bd62..771fc70ba 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/api/stabilityai/StabilityAiApi.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/api/stabilityai/StabilityAiApi.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.network.api.stabilityai +package dev.minios.pdaiv1.network.api.stabilityai -import com.shifthackz.aisdv1.network.model.StabilityAiEngineRaw -import com.shifthackz.aisdv1.network.request.StabilityTextToImageRequest -import com.shifthackz.aisdv1.network.response.StabilityCreditsResponse -import com.shifthackz.aisdv1.network.response.StabilityGenerationResponse +import dev.minios.pdaiv1.network.model.StabilityAiEngineRaw +import dev.minios.pdaiv1.network.request.StabilityTextToImageRequest +import dev.minios.pdaiv1.network.response.StabilityCreditsResponse +import dev.minios.pdaiv1.network.response.StabilityGenerationResponse import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single import okhttp3.RequestBody diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/api/swarmui/SwarmUiApi.kt b/network/src/main/java/dev/minios/pdaiv1/network/api/swarmui/SwarmUiApi.kt similarity index 79% rename from network/src/main/java/com/shifthackz/aisdv1/network/api/swarmui/SwarmUiApi.kt rename to network/src/main/java/dev/minios/pdaiv1/network/api/swarmui/SwarmUiApi.kt index 0f261edde..e2999be94 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/api/swarmui/SwarmUiApi.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/api/swarmui/SwarmUiApi.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.network.api.swarmui +package dev.minios.pdaiv1.network.api.swarmui import android.graphics.Bitmap -import com.shifthackz.aisdv1.network.request.SwarmUiGenerationRequest -import com.shifthackz.aisdv1.network.request.SwarmUiModelsRequest -import com.shifthackz.aisdv1.network.response.SwarmUiGenerationResponse -import com.shifthackz.aisdv1.network.response.SwarmUiModelsResponse -import com.shifthackz.aisdv1.network.response.SwarmUiSessionResponse +import dev.minios.pdaiv1.network.request.SwarmUiGenerationRequest +import dev.minios.pdaiv1.network.request.SwarmUiModelsRequest +import dev.minios.pdaiv1.network.response.SwarmUiGenerationResponse +import dev.minios.pdaiv1.network.response.SwarmUiModelsResponse +import dev.minios.pdaiv1.network.response.SwarmUiSessionResponse import io.reactivex.rxjava3.core.Single import okhttp3.ResponseBody import retrofit2.Response diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/api/swarmui/SwarmUiApiImpl.kt b/network/src/main/java/dev/minios/pdaiv1/network/api/swarmui/SwarmUiApiImpl.kt similarity index 75% rename from network/src/main/java/com/shifthackz/aisdv1/network/api/swarmui/SwarmUiApiImpl.kt rename to network/src/main/java/dev/minios/pdaiv1/network/api/swarmui/SwarmUiApiImpl.kt index 84a94a640..b2accad9e 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/api/swarmui/SwarmUiApiImpl.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/api/swarmui/SwarmUiApiImpl.kt @@ -1,13 +1,13 @@ -package com.shifthackz.aisdv1.network.api.swarmui +package dev.minios.pdaiv1.network.api.swarmui import android.graphics.Bitmap import android.graphics.BitmapFactory -import com.shifthackz.aisdv1.network.exception.BadSessionException -import com.shifthackz.aisdv1.network.request.SwarmUiGenerationRequest -import com.shifthackz.aisdv1.network.request.SwarmUiModelsRequest -import com.shifthackz.aisdv1.network.response.SwarmUiGenerationResponse -import com.shifthackz.aisdv1.network.response.SwarmUiModelsResponse -import com.shifthackz.aisdv1.network.response.SwarmUiSessionResponse +import dev.minios.pdaiv1.network.exception.BadSessionException +import dev.minios.pdaiv1.network.request.SwarmUiGenerationRequest +import dev.minios.pdaiv1.network.request.SwarmUiModelsRequest +import dev.minios.pdaiv1.network.response.SwarmUiGenerationResponse +import dev.minios.pdaiv1.network.response.SwarmUiModelsResponse +import dev.minios.pdaiv1.network.response.SwarmUiSessionResponse import io.reactivex.rxjava3.core.Single import retrofit2.HttpException diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/authenticator/RestAuthenticator.kt b/network/src/main/java/dev/minios/pdaiv1/network/authenticator/RestAuthenticator.kt similarity index 84% rename from network/src/main/java/com/shifthackz/aisdv1/network/authenticator/RestAuthenticator.kt rename to network/src/main/java/dev/minios/pdaiv1/network/authenticator/RestAuthenticator.kt index 1406e011a..fb9194c96 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/authenticator/RestAuthenticator.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/authenticator/RestAuthenticator.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.network.authenticator +package dev.minios.pdaiv1.network.authenticator -import com.shifthackz.aisdv1.network.qualifiers.CredentialsProvider -import com.shifthackz.aisdv1.network.qualifiers.NetworkHeaders +import dev.minios.pdaiv1.network.qualifiers.CredentialsProvider +import dev.minios.pdaiv1.network.qualifiers.NetworkHeaders import okhttp3.Authenticator import okhttp3.Credentials import okhttp3.Request diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/connectivity/ConnectivityMonitor.kt b/network/src/main/java/dev/minios/pdaiv1/network/connectivity/ConnectivityMonitor.kt similarity index 92% rename from network/src/main/java/com/shifthackz/aisdv1/network/connectivity/ConnectivityMonitor.kt rename to network/src/main/java/dev/minios/pdaiv1/network/connectivity/ConnectivityMonitor.kt index 2a36967ee..5d0991611 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/connectivity/ConnectivityMonitor.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/connectivity/ConnectivityMonitor.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.network.connectivity +package dev.minios.pdaiv1.network.connectivity -import com.shifthackz.aisdv1.core.common.log.debugLog +import dev.minios.pdaiv1.core.common.log.debugLog import io.reactivex.rxjava3.core.Observable import java.net.HttpURLConnection import java.net.URL diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/di/NetworkModule.kt b/network/src/main/java/dev/minios/pdaiv1/network/di/NetworkModule.kt similarity index 69% rename from network/src/main/java/com/shifthackz/aisdv1/network/di/NetworkModule.kt rename to network/src/main/java/dev/minios/pdaiv1/network/di/NetworkModule.kt index 39397d658..9adc8a8d0 100755 --- a/network/src/main/java/com/shifthackz/aisdv1/network/di/NetworkModule.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/di/NetworkModule.kt @@ -1,38 +1,38 @@ -package com.shifthackz.aisdv1.network.di +package dev.minios.pdaiv1.network.di import com.google.gson.Gson import com.google.gson.GsonBuilder import com.google.gson.Strictness -import com.shifthackz.aisdv1.network.api.automatic1111.Automatic1111RestApi -import com.shifthackz.aisdv1.network.api.falai.FalAiApi -import com.shifthackz.aisdv1.network.api.horde.HordeRestApi -import com.shifthackz.aisdv1.network.api.huggingface.HuggingFaceApi -import com.shifthackz.aisdv1.network.api.huggingface.HuggingFaceInferenceApi -import com.shifthackz.aisdv1.network.api.huggingface.HuggingFaceInferenceApiImpl -import com.shifthackz.aisdv1.network.api.imagecdn.ImageCdnRestApi -import com.shifthackz.aisdv1.network.api.imagecdn.ImageCdnRestApiImpl -import com.shifthackz.aisdv1.network.api.openai.OpenAiApi -import com.shifthackz.aisdv1.network.api.sdai.DonateApi -import com.shifthackz.aisdv1.network.api.sdai.DownloadableModelsApi -import com.shifthackz.aisdv1.network.api.sdai.DownloadableModelsApiImpl -import com.shifthackz.aisdv1.network.api.sdai.HuggingFaceModelsApi -import com.shifthackz.aisdv1.network.api.sdai.ReportApi -import com.shifthackz.aisdv1.network.api.stabilityai.StabilityAiApi -import com.shifthackz.aisdv1.network.api.swarmui.SwarmUiApi -import com.shifthackz.aisdv1.network.api.swarmui.SwarmUiApiImpl -import com.shifthackz.aisdv1.network.authenticator.RestAuthenticator -import com.shifthackz.aisdv1.network.connectivity.ConnectivityMonitor -import com.shifthackz.aisdv1.network.error.StabilityAiErrorMapper -import com.shifthackz.aisdv1.network.extensions.withBaseUrl -import com.shifthackz.aisdv1.network.interceptor.HeaderInterceptor -import com.shifthackz.aisdv1.network.interceptor.LoggingInterceptor -import com.shifthackz.aisdv1.network.qualifiers.ApiUrlProvider -import com.shifthackz.aisdv1.network.qualifiers.HttpInterceptor -import com.shifthackz.aisdv1.network.qualifiers.HttpInterceptors -import com.shifthackz.aisdv1.network.qualifiers.NetworkInterceptor -import com.shifthackz.aisdv1.network.qualifiers.NetworkInterceptors -import com.shifthackz.aisdv1.network.qualifiers.RetrofitCallAdapters -import com.shifthackz.aisdv1.network.qualifiers.RetrofitConverterFactories +import dev.minios.pdaiv1.network.api.automatic1111.Automatic1111RestApi +import dev.minios.pdaiv1.network.api.falai.FalAiApi +import dev.minios.pdaiv1.network.api.horde.HordeRestApi +import dev.minios.pdaiv1.network.api.huggingface.HuggingFaceApi +import dev.minios.pdaiv1.network.api.huggingface.HuggingFaceInferenceApi +import dev.minios.pdaiv1.network.api.huggingface.HuggingFaceInferenceApiImpl +import dev.minios.pdaiv1.network.api.imagecdn.ImageCdnRestApi +import dev.minios.pdaiv1.network.api.imagecdn.ImageCdnRestApiImpl +import dev.minios.pdaiv1.network.api.openai.OpenAiApi +import dev.minios.pdaiv1.network.api.pdai.DonateApi +import dev.minios.pdaiv1.network.api.pdai.DownloadableModelsApi +import dev.minios.pdaiv1.network.api.pdai.DownloadableModelsApiImpl +import dev.minios.pdaiv1.network.api.pdai.HuggingFaceModelsApi +import dev.minios.pdaiv1.network.api.pdai.ReportApi +import dev.minios.pdaiv1.network.api.stabilityai.StabilityAiApi +import dev.minios.pdaiv1.network.api.swarmui.SwarmUiApi +import dev.minios.pdaiv1.network.api.swarmui.SwarmUiApiImpl +import dev.minios.pdaiv1.network.authenticator.RestAuthenticator +import dev.minios.pdaiv1.network.connectivity.ConnectivityMonitor +import dev.minios.pdaiv1.network.error.StabilityAiErrorMapper +import dev.minios.pdaiv1.network.extensions.withBaseUrl +import dev.minios.pdaiv1.network.interceptor.HeaderInterceptor +import dev.minios.pdaiv1.network.interceptor.LoggingInterceptor +import dev.minios.pdaiv1.network.qualifiers.ApiUrlProvider +import dev.minios.pdaiv1.network.qualifiers.HttpInterceptor +import dev.minios.pdaiv1.network.qualifiers.HttpInterceptors +import dev.minios.pdaiv1.network.qualifiers.NetworkInterceptor +import dev.minios.pdaiv1.network.qualifiers.NetworkInterceptors +import dev.minios.pdaiv1.network.qualifiers.RetrofitCallAdapters +import dev.minios.pdaiv1.network.qualifiers.RetrofitConverterFactories import okhttp3.OkHttpClient import org.koin.core.module.dsl.singleOf import org.koin.dsl.bind diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/error/StabilityAiErrorMapper.kt b/network/src/main/java/dev/minios/pdaiv1/network/error/StabilityAiErrorMapper.kt similarity index 83% rename from network/src/main/java/com/shifthackz/aisdv1/network/error/StabilityAiErrorMapper.kt rename to network/src/main/java/dev/minios/pdaiv1/network/error/StabilityAiErrorMapper.kt index f42a334fb..ec57a8ebf 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/error/StabilityAiErrorMapper.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/error/StabilityAiErrorMapper.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.network.error +package dev.minios.pdaiv1.network.error import com.google.gson.Gson import com.google.gson.reflect.TypeToken -import com.shifthackz.aisdv1.network.response.StabilityAiErrorResponse +import dev.minios.pdaiv1.network.response.StabilityAiErrorResponse import io.reactivex.rxjava3.core.Single import retrofit2.HttpException diff --git a/network/src/main/java/dev/minios/pdaiv1/network/exception/BadSessionException.kt b/network/src/main/java/dev/minios/pdaiv1/network/exception/BadSessionException.kt new file mode 100644 index 000000000..f681a89c9 --- /dev/null +++ b/network/src/main/java/dev/minios/pdaiv1/network/exception/BadSessionException.kt @@ -0,0 +1,3 @@ +package dev.minios.pdaiv1.network.exception + +class BadSessionException : Throwable() diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/extensions/ResponseBodyExtensions.kt b/network/src/main/java/dev/minios/pdaiv1/network/extensions/ResponseBodyExtensions.kt similarity index 95% rename from network/src/main/java/com/shifthackz/aisdv1/network/extensions/ResponseBodyExtensions.kt rename to network/src/main/java/dev/minios/pdaiv1/network/extensions/ResponseBodyExtensions.kt index 170221f5a..7009614e4 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/extensions/ResponseBodyExtensions.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/extensions/ResponseBodyExtensions.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.extensions +package dev.minios.pdaiv1.network.extensions import io.reactivex.rxjava3.core.Observable import okhttp3.ResponseBody diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/extensions/RetrofitExtensions.kt b/network/src/main/java/dev/minios/pdaiv1/network/extensions/RetrofitExtensions.kt similarity index 73% rename from network/src/main/java/com/shifthackz/aisdv1/network/extensions/RetrofitExtensions.kt rename to network/src/main/java/dev/minios/pdaiv1/network/extensions/RetrofitExtensions.kt index 07ec9975d..01bd7e650 100755 --- a/network/src/main/java/com/shifthackz/aisdv1/network/extensions/RetrofitExtensions.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/extensions/RetrofitExtensions.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.extensions +package dev.minios.pdaiv1.network.extensions import retrofit2.Retrofit diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/interceptor/HeaderInterceptor.kt b/network/src/main/java/dev/minios/pdaiv1/network/interceptor/HeaderInterceptor.kt similarity index 66% rename from network/src/main/java/com/shifthackz/aisdv1/network/interceptor/HeaderInterceptor.kt rename to network/src/main/java/dev/minios/pdaiv1/network/interceptor/HeaderInterceptor.kt index 422bdca7d..0afb12f29 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/interceptor/HeaderInterceptor.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/interceptor/HeaderInterceptor.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.network.interceptor +package dev.minios.pdaiv1.network.interceptor -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.core.common.extensions.applyIf -import com.shifthackz.aisdv1.network.qualifiers.NetworkHeaders -import com.shifthackz.aisdv1.network.qualifiers.ApiKeyProvider +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.core.common.extensions.applyIf +import dev.minios.pdaiv1.network.qualifiers.NetworkHeaders +import dev.minios.pdaiv1.network.qualifiers.ApiKeyProvider import okhttp3.Interceptor import okhttp3.Response diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/interceptor/LoggingInterceptor.kt b/network/src/main/java/dev/minios/pdaiv1/network/interceptor/LoggingInterceptor.kt similarity index 75% rename from network/src/main/java/com/shifthackz/aisdv1/network/interceptor/LoggingInterceptor.kt rename to network/src/main/java/dev/minios/pdaiv1/network/interceptor/LoggingInterceptor.kt index e138632e7..e377334cf 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/interceptor/LoggingInterceptor.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/interceptor/LoggingInterceptor.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.network.interceptor +package dev.minios.pdaiv1.network.interceptor -import com.shifthackz.aisdv1.core.common.log.debugLog +import dev.minios.pdaiv1.core.common.log.debugLog import okhttp3.logging.HttpLoggingInterceptor internal class LoggingInterceptor { diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/model/ExtensionRaw.kt b/network/src/main/java/dev/minios/pdaiv1/network/model/ExtensionRaw.kt similarity index 80% rename from network/src/main/java/com/shifthackz/aisdv1/network/model/ExtensionRaw.kt rename to network/src/main/java/dev/minios/pdaiv1/network/model/ExtensionRaw.kt index 908660cec..98c779b44 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/model/ExtensionRaw.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/model/ExtensionRaw.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.model +package dev.minios.pdaiv1.network.model import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/model/ForgeModuleRaw.kt b/network/src/main/java/dev/minios/pdaiv1/network/model/ForgeModuleRaw.kt similarity index 82% rename from network/src/main/java/com/shifthackz/aisdv1/network/model/ForgeModuleRaw.kt rename to network/src/main/java/dev/minios/pdaiv1/network/model/ForgeModuleRaw.kt index 487c1c891..e45ff1beb 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/model/ForgeModuleRaw.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/model/ForgeModuleRaw.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.model +package dev.minios.pdaiv1.network.model import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/model/HuggingFaceModelRaw.kt b/network/src/main/java/dev/minios/pdaiv1/network/model/HuggingFaceModelRaw.kt similarity index 86% rename from network/src/main/java/com/shifthackz/aisdv1/network/model/HuggingFaceModelRaw.kt rename to network/src/main/java/dev/minios/pdaiv1/network/model/HuggingFaceModelRaw.kt index 58532f7ec..a31eb1276 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/model/HuggingFaceModelRaw.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/model/HuggingFaceModelRaw.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.model +package dev.minios.pdaiv1.network.model import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/model/OpenAiImageRaw.kt b/network/src/main/java/dev/minios/pdaiv1/network/model/OpenAiImageRaw.kt similarity index 89% rename from network/src/main/java/com/shifthackz/aisdv1/network/model/OpenAiImageRaw.kt rename to network/src/main/java/dev/minios/pdaiv1/network/model/OpenAiImageRaw.kt index 547cf06b1..6448f8613 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/model/OpenAiImageRaw.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/model/OpenAiImageRaw.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.model +package dev.minios.pdaiv1.network.model import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/model/ServerConfigurationRaw.kt b/network/src/main/java/dev/minios/pdaiv1/network/model/ServerConfigurationRaw.kt similarity index 79% rename from network/src/main/java/com/shifthackz/aisdv1/network/model/ServerConfigurationRaw.kt rename to network/src/main/java/dev/minios/pdaiv1/network/model/ServerConfigurationRaw.kt index 108712ae9..89261d24b 100755 --- a/network/src/main/java/com/shifthackz/aisdv1/network/model/ServerConfigurationRaw.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/model/ServerConfigurationRaw.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.model +package dev.minios.pdaiv1.network.model import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/model/StabilityAiEngineRaw.kt b/network/src/main/java/dev/minios/pdaiv1/network/model/StabilityAiEngineRaw.kt similarity index 87% rename from network/src/main/java/com/shifthackz/aisdv1/network/model/StabilityAiEngineRaw.kt rename to network/src/main/java/dev/minios/pdaiv1/network/model/StabilityAiEngineRaw.kt index d3febbee1..f14e65f98 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/model/StabilityAiEngineRaw.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/model/StabilityAiEngineRaw.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.model +package dev.minios.pdaiv1.network.model import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/model/StabilityTextPromptRaw.kt b/network/src/main/java/dev/minios/pdaiv1/network/model/StabilityTextPromptRaw.kt similarity index 81% rename from network/src/main/java/com/shifthackz/aisdv1/network/model/StabilityTextPromptRaw.kt rename to network/src/main/java/dev/minios/pdaiv1/network/model/StabilityTextPromptRaw.kt index ed2cd8499..87cb3b0bb 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/model/StabilityTextPromptRaw.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/model/StabilityTextPromptRaw.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.model +package dev.minios.pdaiv1.network.model import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/model/StableDiffusionHyperNetworkRaw.kt b/network/src/main/java/dev/minios/pdaiv1/network/model/StableDiffusionHyperNetworkRaw.kt similarity index 81% rename from network/src/main/java/com/shifthackz/aisdv1/network/model/StableDiffusionHyperNetworkRaw.kt rename to network/src/main/java/dev/minios/pdaiv1/network/model/StableDiffusionHyperNetworkRaw.kt index 088412c4f..e8de2a46d 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/model/StableDiffusionHyperNetworkRaw.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/model/StableDiffusionHyperNetworkRaw.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.model +package dev.minios.pdaiv1.network.model import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/model/StableDiffusionLoraRaw.kt b/network/src/main/java/dev/minios/pdaiv1/network/model/StableDiffusionLoraRaw.kt similarity index 84% rename from network/src/main/java/com/shifthackz/aisdv1/network/model/StableDiffusionLoraRaw.kt rename to network/src/main/java/dev/minios/pdaiv1/network/model/StableDiffusionLoraRaw.kt index d6da59147..e5d3aaf06 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/model/StableDiffusionLoraRaw.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/model/StableDiffusionLoraRaw.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.model +package dev.minios.pdaiv1.network.model import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/model/StableDiffusionModelRaw.kt b/network/src/main/java/dev/minios/pdaiv1/network/model/StableDiffusionModelRaw.kt similarity index 90% rename from network/src/main/java/com/shifthackz/aisdv1/network/model/StableDiffusionModelRaw.kt rename to network/src/main/java/dev/minios/pdaiv1/network/model/StableDiffusionModelRaw.kt index 445fc36c6..2f8c8c6d8 100755 --- a/network/src/main/java/com/shifthackz/aisdv1/network/model/StableDiffusionModelRaw.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/model/StableDiffusionModelRaw.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.model +package dev.minios.pdaiv1.network.model import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/model/StableDiffusionSamplerRaw.kt b/network/src/main/java/dev/minios/pdaiv1/network/model/StableDiffusionSamplerRaw.kt similarity index 86% rename from network/src/main/java/com/shifthackz/aisdv1/network/model/StableDiffusionSamplerRaw.kt rename to network/src/main/java/dev/minios/pdaiv1/network/model/StableDiffusionSamplerRaw.kt index 0eb4e90e0..ce7a645af 100755 --- a/network/src/main/java/com/shifthackz/aisdv1/network/model/StableDiffusionSamplerRaw.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/model/StableDiffusionSamplerRaw.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.model +package dev.minios.pdaiv1.network.model import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/model/SupporterRaw.kt b/network/src/main/java/dev/minios/pdaiv1/network/model/SupporterRaw.kt similarity index 91% rename from network/src/main/java/com/shifthackz/aisdv1/network/model/SupporterRaw.kt rename to network/src/main/java/dev/minios/pdaiv1/network/model/SupporterRaw.kt index 2ae5fb612..ccf50e36c 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/model/SupporterRaw.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/model/SupporterRaw.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.model +package dev.minios.pdaiv1.network.model import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/model/SwarmUiModelRaw.kt b/network/src/main/java/dev/minios/pdaiv1/network/model/SwarmUiModelRaw.kt similarity index 84% rename from network/src/main/java/com/shifthackz/aisdv1/network/model/SwarmUiModelRaw.kt rename to network/src/main/java/dev/minios/pdaiv1/network/model/SwarmUiModelRaw.kt index 47f5fc531..62b55c658 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/model/SwarmUiModelRaw.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/model/SwarmUiModelRaw.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.model +package dev.minios.pdaiv1.network.model import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/ApiKeyProvider.kt b/network/src/main/java/dev/minios/pdaiv1/network/qualifiers/ApiKeyProvider.kt similarity index 62% rename from network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/ApiKeyProvider.kt rename to network/src/main/java/dev/minios/pdaiv1/network/qualifiers/ApiKeyProvider.kt index c77a23b6a..b8f5c1ec9 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/ApiKeyProvider.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/qualifiers/ApiKeyProvider.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.qualifiers +package dev.minios.pdaiv1.network.qualifiers fun interface ApiKeyProvider { operator fun invoke(): Pair? diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/ApiUrlProvider.kt b/network/src/main/java/dev/minios/pdaiv1/network/qualifiers/ApiUrlProvider.kt similarity index 88% rename from network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/ApiUrlProvider.kt rename to network/src/main/java/dev/minios/pdaiv1/network/qualifiers/ApiUrlProvider.kt index 48819750e..fd0e3e48f 100755 --- a/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/ApiUrlProvider.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/qualifiers/ApiUrlProvider.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.qualifiers +package dev.minios.pdaiv1.network.qualifiers interface ApiUrlProvider { val stableDiffusionAutomaticApiUrl: String diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/CredentialsProvider.kt b/network/src/main/java/dev/minios/pdaiv1/network/qualifiers/CredentialsProvider.kt similarity index 81% rename from network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/CredentialsProvider.kt rename to network/src/main/java/dev/minios/pdaiv1/network/qualifiers/CredentialsProvider.kt index 14179f281..411855d85 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/CredentialsProvider.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/qualifiers/CredentialsProvider.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.qualifiers +package dev.minios.pdaiv1.network.qualifiers interface CredentialsProvider { operator fun invoke(): Data diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/HttpInterceptor.kt b/network/src/main/java/dev/minios/pdaiv1/network/qualifiers/HttpInterceptor.kt similarity index 85% rename from network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/HttpInterceptor.kt rename to network/src/main/java/dev/minios/pdaiv1/network/qualifiers/HttpInterceptor.kt index 1ddb6a4dc..bf900707a 100755 --- a/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/HttpInterceptor.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/qualifiers/HttpInterceptor.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.qualifiers +package dev.minios.pdaiv1.network.qualifiers import okhttp3.Interceptor diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/NetworkHeaders.kt b/network/src/main/java/dev/minios/pdaiv1/network/qualifiers/NetworkHeaders.kt similarity index 75% rename from network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/NetworkHeaders.kt rename to network/src/main/java/dev/minios/pdaiv1/network/qualifiers/NetworkHeaders.kt index 853d90cea..ef38d73e5 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/NetworkHeaders.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/qualifiers/NetworkHeaders.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.qualifiers +package dev.minios.pdaiv1.network.qualifiers object NetworkHeaders { const val APP_VERSION = "X-App-Version" diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/NetworkInterceptor.kt b/network/src/main/java/dev/minios/pdaiv1/network/qualifiers/NetworkInterceptor.kt similarity index 86% rename from network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/NetworkInterceptor.kt rename to network/src/main/java/dev/minios/pdaiv1/network/qualifiers/NetworkInterceptor.kt index bd1a015f8..a1353f258 100755 --- a/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/NetworkInterceptor.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/qualifiers/NetworkInterceptor.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.qualifiers +package dev.minios.pdaiv1.network.qualifiers import okhttp3.Interceptor diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/NetworkPrefixes.kt b/network/src/main/java/dev/minios/pdaiv1/network/qualifiers/NetworkPrefixes.kt similarity index 63% rename from network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/NetworkPrefixes.kt rename to network/src/main/java/dev/minios/pdaiv1/network/qualifiers/NetworkPrefixes.kt index 626f69b7e..d0dcb53f1 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/NetworkPrefixes.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/qualifiers/NetworkPrefixes.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.qualifiers +package dev.minios.pdaiv1.network.qualifiers object NetworkPrefixes { const val BEARER = "Bearer" diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/RetrofitCallAdapters.kt b/network/src/main/java/dev/minios/pdaiv1/network/qualifiers/RetrofitCallAdapters.kt similarity index 68% rename from network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/RetrofitCallAdapters.kt rename to network/src/main/java/dev/minios/pdaiv1/network/qualifiers/RetrofitCallAdapters.kt index 1a89f5fd3..730d3acea 100755 --- a/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/RetrofitCallAdapters.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/qualifiers/RetrofitCallAdapters.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.qualifiers +package dev.minios.pdaiv1.network.qualifiers import retrofit2.CallAdapter diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/RetrofitConverterFactories.kt b/network/src/main/java/dev/minios/pdaiv1/network/qualifiers/RetrofitConverterFactories.kt similarity index 69% rename from network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/RetrofitConverterFactories.kt rename to network/src/main/java/dev/minios/pdaiv1/network/qualifiers/RetrofitConverterFactories.kt index fd9db209f..e6a185940 100755 --- a/network/src/main/java/com/shifthackz/aisdv1/network/qualifiers/RetrofitConverterFactories.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/qualifiers/RetrofitConverterFactories.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.qualifiers +package dev.minios.pdaiv1.network.qualifiers import retrofit2.Converter diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/request/FalAiTextToImageRequest.kt b/network/src/main/java/dev/minios/pdaiv1/network/request/FalAiTextToImageRequest.kt similarity index 95% rename from network/src/main/java/com/shifthackz/aisdv1/network/request/FalAiTextToImageRequest.kt rename to network/src/main/java/dev/minios/pdaiv1/network/request/FalAiTextToImageRequest.kt index 5f8e3bd0a..0ae88f96c 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/request/FalAiTextToImageRequest.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/request/FalAiTextToImageRequest.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.request +package dev.minios.pdaiv1.network.request import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/request/HordeGenerationAsyncRequest.kt b/network/src/main/java/dev/minios/pdaiv1/network/request/HordeGenerationAsyncRequest.kt similarity index 94% rename from network/src/main/java/com/shifthackz/aisdv1/network/request/HordeGenerationAsyncRequest.kt rename to network/src/main/java/dev/minios/pdaiv1/network/request/HordeGenerationAsyncRequest.kt index 1a8d5d73b..a8fca534c 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/request/HordeGenerationAsyncRequest.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/request/HordeGenerationAsyncRequest.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.request +package dev.minios.pdaiv1.network.request import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/request/HuggingFaceGenerationRequest.kt b/network/src/main/java/dev/minios/pdaiv1/network/request/HuggingFaceGenerationRequest.kt similarity index 82% rename from network/src/main/java/com/shifthackz/aisdv1/network/request/HuggingFaceGenerationRequest.kt rename to network/src/main/java/dev/minios/pdaiv1/network/request/HuggingFaceGenerationRequest.kt index 645bf75a1..383a08c1d 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/request/HuggingFaceGenerationRequest.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/request/HuggingFaceGenerationRequest.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.request +package dev.minios.pdaiv1.network.request import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/request/ImageToImageRequest.kt b/network/src/main/java/dev/minios/pdaiv1/network/request/ImageToImageRequest.kt similarity index 97% rename from network/src/main/java/com/shifthackz/aisdv1/network/request/ImageToImageRequest.kt rename to network/src/main/java/dev/minios/pdaiv1/network/request/ImageToImageRequest.kt index b38b4d56c..bc599aa8c 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/request/ImageToImageRequest.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/request/ImageToImageRequest.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.request +package dev.minios.pdaiv1.network.request import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/request/OpenAiRequest.kt b/network/src/main/java/dev/minios/pdaiv1/network/request/OpenAiRequest.kt similarity index 90% rename from network/src/main/java/com/shifthackz/aisdv1/network/request/OpenAiRequest.kt rename to network/src/main/java/dev/minios/pdaiv1/network/request/OpenAiRequest.kt index 470742708..b912cea23 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/request/OpenAiRequest.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/request/OpenAiRequest.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.request +package dev.minios.pdaiv1.network.request import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/request/OverrideSettings.kt b/network/src/main/java/dev/minios/pdaiv1/network/request/OverrideSettings.kt similarity index 80% rename from network/src/main/java/com/shifthackz/aisdv1/network/request/OverrideSettings.kt rename to network/src/main/java/dev/minios/pdaiv1/network/request/OverrideSettings.kt index 1f2b15c6d..3cebafc30 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/request/OverrideSettings.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/request/OverrideSettings.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.request +package dev.minios.pdaiv1.network.request import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/request/ReportRequest.kt b/network/src/main/java/dev/minios/pdaiv1/network/request/ReportRequest.kt similarity index 88% rename from network/src/main/java/com/shifthackz/aisdv1/network/request/ReportRequest.kt rename to network/src/main/java/dev/minios/pdaiv1/network/request/ReportRequest.kt index 0d5fecba8..37ea9987f 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/request/ReportRequest.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/request/ReportRequest.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.request +package dev.minios.pdaiv1.network.request import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/request/StabilityTextToImageRequest.kt b/network/src/main/java/dev/minios/pdaiv1/network/request/StabilityTextToImageRequest.kt similarity index 85% rename from network/src/main/java/com/shifthackz/aisdv1/network/request/StabilityTextToImageRequest.kt rename to network/src/main/java/dev/minios/pdaiv1/network/request/StabilityTextToImageRequest.kt index da77bb24f..f48ebdfca 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/request/StabilityTextToImageRequest.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/request/StabilityTextToImageRequest.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.network.request +package dev.minios.pdaiv1.network.request import com.google.gson.annotations.SerializedName -import com.shifthackz.aisdv1.network.model.StabilityTextPromptRaw +import dev.minios.pdaiv1.network.model.StabilityTextPromptRaw data class StabilityTextToImageRequest( @SerializedName("height") diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/request/SwarmUiGenerationRequest.kt b/network/src/main/java/dev/minios/pdaiv1/network/request/SwarmUiGenerationRequest.kt similarity index 96% rename from network/src/main/java/com/shifthackz/aisdv1/network/request/SwarmUiGenerationRequest.kt rename to network/src/main/java/dev/minios/pdaiv1/network/request/SwarmUiGenerationRequest.kt index 7bd6f84cc..d54b590a4 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/request/SwarmUiGenerationRequest.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/request/SwarmUiGenerationRequest.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.request +package dev.minios.pdaiv1.network.request import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/request/SwarmUiModelsRequest.kt b/network/src/main/java/dev/minios/pdaiv1/network/request/SwarmUiModelsRequest.kt similarity index 86% rename from network/src/main/java/com/shifthackz/aisdv1/network/request/SwarmUiModelsRequest.kt rename to network/src/main/java/dev/minios/pdaiv1/network/request/SwarmUiModelsRequest.kt index 35461f675..b39653372 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/request/SwarmUiModelsRequest.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/request/SwarmUiModelsRequest.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.request +package dev.minios.pdaiv1.network.request import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/request/TextToImageRequest.kt b/network/src/main/java/dev/minios/pdaiv1/network/request/TextToImageRequest.kt similarity index 97% rename from network/src/main/java/com/shifthackz/aisdv1/network/request/TextToImageRequest.kt rename to network/src/main/java/dev/minios/pdaiv1/network/request/TextToImageRequest.kt index 97958679d..8ffba7409 100755 --- a/network/src/main/java/com/shifthackz/aisdv1/network/request/TextToImageRequest.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/request/TextToImageRequest.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.request +package dev.minios.pdaiv1.network.request import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/response/AppVersionResponse.kt b/network/src/main/java/dev/minios/pdaiv1/network/response/AppVersionResponse.kt similarity index 75% rename from network/src/main/java/com/shifthackz/aisdv1/network/response/AppVersionResponse.kt rename to network/src/main/java/dev/minios/pdaiv1/network/response/AppVersionResponse.kt index 04d0a6fa6..5755a1534 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/response/AppVersionResponse.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/response/AppVersionResponse.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.response +package dev.minios.pdaiv1.network.response import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/response/CoinsResponse.kt b/network/src/main/java/dev/minios/pdaiv1/network/response/CoinsResponse.kt similarity index 75% rename from network/src/main/java/com/shifthackz/aisdv1/network/response/CoinsResponse.kt rename to network/src/main/java/dev/minios/pdaiv1/network/response/CoinsResponse.kt index 944aa0dbe..82dba2cd5 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/response/CoinsResponse.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/response/CoinsResponse.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.response +package dev.minios.pdaiv1.network.response import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/dev/minios/pdaiv1/network/response/DownloadableModelResponse.kt b/network/src/main/java/dev/minios/pdaiv1/network/response/DownloadableModelResponse.kt new file mode 100644 index 000000000..d60ae7d48 --- /dev/null +++ b/network/src/main/java/dev/minios/pdaiv1/network/response/DownloadableModelResponse.kt @@ -0,0 +1,25 @@ +package dev.minios.pdaiv1.network.response + +import com.google.gson.annotations.SerializedName + +data class DownloadableModelResponse( + @SerializedName("id") + val id: String?, + @SerializedName("name") + val name: String?, + @SerializedName("size") + val size: String?, + @SerializedName("sources") + val sources: List?, + @SerializedName("metadata") + val metadata: ModelMetadata? = null, +) + +data class ModelMetadata( + @SerializedName("chipset") + val chipset: String? = null, + @SerializedName("type") + val type: String? = null, + @SerializedName("src") + val src: String? = null, +) diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/response/FalAiResponses.kt b/network/src/main/java/dev/minios/pdaiv1/network/response/FalAiResponses.kt similarity index 97% rename from network/src/main/java/com/shifthackz/aisdv1/network/response/FalAiResponses.kt rename to network/src/main/java/dev/minios/pdaiv1/network/response/FalAiResponses.kt index 32190947a..afbc093d5 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/response/FalAiResponses.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/response/FalAiResponses.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.response +package dev.minios.pdaiv1.network.response import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/response/HordeGenerationAsyncResponse.kt b/network/src/main/java/dev/minios/pdaiv1/network/response/HordeGenerationAsyncResponse.kt similarity index 84% rename from network/src/main/java/com/shifthackz/aisdv1/network/response/HordeGenerationAsyncResponse.kt rename to network/src/main/java/dev/minios/pdaiv1/network/response/HordeGenerationAsyncResponse.kt index aec7534de..3eef27def 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/response/HordeGenerationAsyncResponse.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/response/HordeGenerationAsyncResponse.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.response +package dev.minios.pdaiv1.network.response import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/response/HordeGenerationCheckResponse.kt b/network/src/main/java/dev/minios/pdaiv1/network/response/HordeGenerationCheckResponse.kt similarity index 95% rename from network/src/main/java/com/shifthackz/aisdv1/network/response/HordeGenerationCheckResponse.kt rename to network/src/main/java/dev/minios/pdaiv1/network/response/HordeGenerationCheckResponse.kt index 61a4fdd0c..4049fa609 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/response/HordeGenerationCheckResponse.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/response/HordeGenerationCheckResponse.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.response +package dev.minios.pdaiv1.network.response import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/response/HordeUserResponse.kt b/network/src/main/java/dev/minios/pdaiv1/network/response/HordeUserResponse.kt similarity index 73% rename from network/src/main/java/com/shifthackz/aisdv1/network/response/HordeUserResponse.kt rename to network/src/main/java/dev/minios/pdaiv1/network/response/HordeUserResponse.kt index 4da773332..c86ddd66b 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/response/HordeUserResponse.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/response/HordeUserResponse.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.response +package dev.minios.pdaiv1.network.response import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/response/HuggingFaceErrorResponse.kt b/network/src/main/java/dev/minios/pdaiv1/network/response/HuggingFaceErrorResponse.kt similarity index 81% rename from network/src/main/java/com/shifthackz/aisdv1/network/response/HuggingFaceErrorResponse.kt rename to network/src/main/java/dev/minios/pdaiv1/network/response/HuggingFaceErrorResponse.kt index 1974dcd42..801bcce43 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/response/HuggingFaceErrorResponse.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/response/HuggingFaceErrorResponse.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.response +package dev.minios.pdaiv1.network.response import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/response/OpenAiResponse.kt b/network/src/main/java/dev/minios/pdaiv1/network/response/OpenAiResponse.kt similarity index 65% rename from network/src/main/java/com/shifthackz/aisdv1/network/response/OpenAiResponse.kt rename to network/src/main/java/dev/minios/pdaiv1/network/response/OpenAiResponse.kt index 10e29b69b..70d0c02c7 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/response/OpenAiResponse.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/response/OpenAiResponse.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.network.response +package dev.minios.pdaiv1.network.response import com.google.gson.annotations.SerializedName -import com.shifthackz.aisdv1.network.model.OpenAiImageRaw +import dev.minios.pdaiv1.network.model.OpenAiImageRaw data class OpenAiResponse( @SerializedName("created") diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/response/SdEmbeddingsResponse.kt b/network/src/main/java/dev/minios/pdaiv1/network/response/SdEmbeddingsResponse.kt similarity index 76% rename from network/src/main/java/com/shifthackz/aisdv1/network/response/SdEmbeddingsResponse.kt rename to network/src/main/java/dev/minios/pdaiv1/network/response/SdEmbeddingsResponse.kt index 89d617c1c..30834f199 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/response/SdEmbeddingsResponse.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/response/SdEmbeddingsResponse.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.response +package dev.minios.pdaiv1.network.response import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/response/SdGenerationResponse.kt b/network/src/main/java/dev/minios/pdaiv1/network/response/SdGenerationResponse.kt similarity index 90% rename from network/src/main/java/com/shifthackz/aisdv1/network/response/SdGenerationResponse.kt rename to network/src/main/java/dev/minios/pdaiv1/network/response/SdGenerationResponse.kt index 7fdcfa522..2b900755b 100755 --- a/network/src/main/java/com/shifthackz/aisdv1/network/response/SdGenerationResponse.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/response/SdGenerationResponse.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.response +package dev.minios.pdaiv1.network.response import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/response/StabilityAiErrorResponse.kt b/network/src/main/java/dev/minios/pdaiv1/network/response/StabilityAiErrorResponse.kt similarity index 83% rename from network/src/main/java/com/shifthackz/aisdv1/network/response/StabilityAiErrorResponse.kt rename to network/src/main/java/dev/minios/pdaiv1/network/response/StabilityAiErrorResponse.kt index b4457d991..deadb032d 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/response/StabilityAiErrorResponse.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/response/StabilityAiErrorResponse.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.response +package dev.minios.pdaiv1.network.response import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/response/StabilityCreditsResponse.kt b/network/src/main/java/dev/minios/pdaiv1/network/response/StabilityCreditsResponse.kt similarity index 75% rename from network/src/main/java/com/shifthackz/aisdv1/network/response/StabilityCreditsResponse.kt rename to network/src/main/java/dev/minios/pdaiv1/network/response/StabilityCreditsResponse.kt index 107ef1eea..34e31025f 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/response/StabilityCreditsResponse.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/response/StabilityCreditsResponse.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.response +package dev.minios.pdaiv1.network.response import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/response/StabilityGenerationResponse.kt b/network/src/main/java/dev/minios/pdaiv1/network/response/StabilityGenerationResponse.kt similarity index 89% rename from network/src/main/java/com/shifthackz/aisdv1/network/response/StabilityGenerationResponse.kt rename to network/src/main/java/dev/minios/pdaiv1/network/response/StabilityGenerationResponse.kt index 5f1f58b74..6323fb6b6 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/response/StabilityGenerationResponse.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/response/StabilityGenerationResponse.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.response +package dev.minios.pdaiv1.network.response import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/response/SwarmUiGenerationResponse.kt b/network/src/main/java/dev/minios/pdaiv1/network/response/SwarmUiGenerationResponse.kt similarity index 76% rename from network/src/main/java/com/shifthackz/aisdv1/network/response/SwarmUiGenerationResponse.kt rename to network/src/main/java/dev/minios/pdaiv1/network/response/SwarmUiGenerationResponse.kt index ae8cdd12c..5b8a18909 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/response/SwarmUiGenerationResponse.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/response/SwarmUiGenerationResponse.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.response +package dev.minios.pdaiv1.network.response import com.google.gson.annotations.SerializedName diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/response/SwarmUiModelsResponse.kt b/network/src/main/java/dev/minios/pdaiv1/network/response/SwarmUiModelsResponse.kt similarity index 59% rename from network/src/main/java/com/shifthackz/aisdv1/network/response/SwarmUiModelsResponse.kt rename to network/src/main/java/dev/minios/pdaiv1/network/response/SwarmUiModelsResponse.kt index 4913c5b93..fdb69ff24 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/response/SwarmUiModelsResponse.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/response/SwarmUiModelsResponse.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.network.response +package dev.minios.pdaiv1.network.response import com.google.gson.annotations.SerializedName -import com.shifthackz.aisdv1.network.model.SwarmUiModelRaw +import dev.minios.pdaiv1.network.model.SwarmUiModelRaw data class SwarmUiModelsResponse( @SerializedName("files") diff --git a/network/src/main/java/com/shifthackz/aisdv1/network/response/SwarmUiSessionResponse.kt b/network/src/main/java/dev/minios/pdaiv1/network/response/SwarmUiSessionResponse.kt similarity index 76% rename from network/src/main/java/com/shifthackz/aisdv1/network/response/SwarmUiSessionResponse.kt rename to network/src/main/java/dev/minios/pdaiv1/network/response/SwarmUiSessionResponse.kt index 8ec5052b6..5e49aab71 100644 --- a/network/src/main/java/com/shifthackz/aisdv1/network/response/SwarmUiSessionResponse.kt +++ b/network/src/main/java/dev/minios/pdaiv1/network/response/SwarmUiSessionResponse.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.network.response +package dev.minios.pdaiv1.network.response import com.google.gson.annotations.SerializedName diff --git a/network/src/test/java/com/shifthackz/aisdv1/network/authenticator/RestAuthenticatorTest.kt b/network/src/test/java/dev/minios/pdaiv1/network/authenticator/RestAuthenticatorTest.kt similarity index 93% rename from network/src/test/java/com/shifthackz/aisdv1/network/authenticator/RestAuthenticatorTest.kt rename to network/src/test/java/dev/minios/pdaiv1/network/authenticator/RestAuthenticatorTest.kt index cf500c13d..098869c2c 100644 --- a/network/src/test/java/com/shifthackz/aisdv1/network/authenticator/RestAuthenticatorTest.kt +++ b/network/src/test/java/dev/minios/pdaiv1/network/authenticator/RestAuthenticatorTest.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.network.authenticator +package dev.minios.pdaiv1.network.authenticator -import com.shifthackz.aisdv1.network.qualifiers.CredentialsProvider -import com.shifthackz.aisdv1.network.qualifiers.NetworkHeaders +import dev.minios.pdaiv1.network.qualifiers.CredentialsProvider +import dev.minios.pdaiv1.network.qualifiers.NetworkHeaders import io.mockk.every import io.mockk.mockk import okhttp3.Address diff --git a/presentation/build.gradle.kts b/presentation/build.gradle.kts index 4fec26cbe..1bb9c35da 100755 --- a/presentation/build.gradle.kts +++ b/presentation/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } android { - namespace = "com.shifthackz.aisdv1.presentation" + namespace = "dev.minios.pdaiv1.presentation" testOptions.unitTests{ all { test -> test.jvmArgs( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/di/NavigationModule.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/di/NavigationModule.kt deleted file mode 100644 index 21110ee4d..000000000 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/di/NavigationModule.kt +++ /dev/null @@ -1,17 +0,0 @@ -package com.shifthackz.aisdv1.presentation.di - -import com.shifthackz.aisdv1.presentation.navigation.router.drawer.DrawerRouter -import com.shifthackz.aisdv1.presentation.navigation.router.drawer.DrawerRouterImpl -import com.shifthackz.aisdv1.presentation.navigation.router.home.HomeRouter -import com.shifthackz.aisdv1.presentation.navigation.router.home.HomeRouterImpl -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouterImpl -import org.koin.core.module.dsl.singleOf -import org.koin.dsl.bind -import org.koin.dsl.module - -internal val navigationModule = module { - singleOf(::MainRouterImpl) bind MainRouter::class - singleOf(::DrawerRouterImpl) bind DrawerRouter::class - singleOf(::HomeRouterImpl) bind HomeRouter::class -} diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/di/UiUtilsModule.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/di/UiUtilsModule.kt deleted file mode 100644 index 287d94c00..000000000 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/di/UiUtilsModule.kt +++ /dev/null @@ -1,20 +0,0 @@ -package com.shifthackz.aisdv1.presentation.di - -import com.shifthackz.aisdv1.presentation.core.GenerationFormUpdateEvent -import com.shifthackz.aisdv1.presentation.screen.debug.DebugMenuAccessor -import com.shifthackz.aisdv1.presentation.screen.gallery.detail.GalleryDetailBitmapExporter -import com.shifthackz.aisdv1.presentation.screen.gallery.detail.GalleryDetailSharing -import com.shifthackz.aisdv1.presentation.screen.gallery.list.GalleryExporter -import com.shifthackz.aisdv1.presentation.screen.inpaint.InPaintStateProducer -import org.koin.core.module.dsl.factoryOf -import org.koin.core.module.dsl.singleOf -import org.koin.dsl.module - -internal val uiUtilsModule = module { - factoryOf(::GalleryExporter) - factoryOf(::GalleryDetailBitmapExporter) - factoryOf(::GalleryDetailSharing) - singleOf(::GenerationFormUpdateEvent) - singleOf(::DebugMenuAccessor) - singleOf(::InPaintStateProducer) -} diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/extensions/BooleanExtensions.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/extensions/BooleanExtensions.kt deleted file mode 100644 index 6d215d1fe..000000000 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/extensions/BooleanExtensions.kt +++ /dev/null @@ -1,7 +0,0 @@ -package com.shifthackz.aisdv1.presentation.extensions - -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.core.localization.R as LocalizationR - -fun Boolean.mapToUi(): UiText = (if (this) LocalizationR.string.yes else LocalizationR.string.no).asUiText() diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/Router.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/Router.kt deleted file mode 100644 index b5b336637..000000000 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/Router.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.shifthackz.aisdv1.presentation.navigation.router - -import com.shifthackz.aisdv1.presentation.navigation.NavigationEffect -import io.reactivex.rxjava3.core.Observable - -interface Router { - fun observe(): Observable -} diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/drawer/DrawerRouter.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/drawer/DrawerRouter.kt deleted file mode 100644 index 8eab1ef3c..000000000 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/drawer/DrawerRouter.kt +++ /dev/null @@ -1,11 +0,0 @@ -package com.shifthackz.aisdv1.presentation.navigation.router.drawer - -import com.shifthackz.aisdv1.presentation.navigation.NavigationEffect -import com.shifthackz.aisdv1.presentation.navigation.router.Router - -interface DrawerRouter : Router { - - fun openDrawer() - - fun closeDrawer() -} diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/mappers/ModesMapper.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/mappers/ModesMapper.kt deleted file mode 100644 index 1dd0b9c28..000000000 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/mappers/ModesMapper.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.shifthackz.aisdv1.presentation.screen.setup.mappers - -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.domain.entity.ServerSource - -val BuildInfoProvider.allowedModes: List - get() = ServerSource - .entries - .filter { it.allowedInBuilds.contains(type) } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/mappers/ServerSetupValidationFilePathErrorMapper.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/mappers/ServerSetupValidationFilePathErrorMapper.kt deleted file mode 100644 index 08467bf9f..000000000 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/mappers/ServerSetupValidationFilePathErrorMapper.kt +++ /dev/null @@ -1,15 +0,0 @@ -package com.shifthackz.aisdv1.presentation.screen.setup.mappers - -import com.shifthackz.aisdv1.core.localization.R -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.core.validation.ValidationResult -import com.shifthackz.aisdv1.core.validation.path.FilePathValidator - -fun ValidationResult.mapToUi(): UiText? { - if (this.isValid) return null - return when (validationError as FilePathValidator.Error) { - FilePathValidator.Error.Empty -> R.string.error_empty_field - FilePathValidator.Error.Invalid -> R.string.error_invalid - }.asUiText() -} diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/mappers/ServerSetupValidationStringErrorMapper.kt b/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/mappers/ServerSetupValidationStringErrorMapper.kt deleted file mode 100644 index dad53edb6..000000000 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/mappers/ServerSetupValidationStringErrorMapper.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.shifthackz.aisdv1.presentation.screen.setup.mappers - -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.core.validation.ValidationResult -import com.shifthackz.aisdv1.core.validation.common.CommonStringValidator -import com.shifthackz.aisdv1.core.localization.R as LocalizationR - -fun ValidationResult.mapToUi(): UiText? { - if (this.isValid) return null - return when (validationError as CommonStringValidator.Error) { - CommonStringValidator.Error.Empty -> LocalizationR.string.error_empty_field - }.asUiText() -} diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionActivity.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/activity/AiStableDiffusionActivity.kt similarity index 90% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionActivity.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/activity/AiStableDiffusionActivity.kt index 8e2cc4d00..9325349b4 100755 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionActivity.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/activity/AiStableDiffusionActivity.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.activity +package dev.minios.pdaiv1.presentation.activity import android.animation.ObjectAnimator import android.os.Bundle @@ -22,14 +22,14 @@ import androidx.navigation.NavDestination.Companion.hasRoute import androidx.navigation.compose.NavHost import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController -import com.shifthackz.aisdv1.core.common.log.debugLog -import com.shifthackz.aisdv1.presentation.extensions.navigatePopUpToCurrent -import com.shifthackz.aisdv1.presentation.navigation.NavigationEffect -import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute -import com.shifthackz.aisdv1.presentation.navigation.graph.mainNavGraph -import com.shifthackz.aisdv1.presentation.screen.drawer.DrawerScreen -import com.shifthackz.aisdv1.presentation.theme.global.AiSdAppTheme -import com.shifthackz.aisdv1.presentation.utils.PermissionUtil +import dev.minios.pdaiv1.core.common.log.debugLog +import dev.minios.pdaiv1.presentation.extensions.navigatePopUpToCurrent +import dev.minios.pdaiv1.presentation.navigation.NavigationEffect +import dev.minios.pdaiv1.presentation.navigation.NavigationRoute +import dev.minios.pdaiv1.presentation.navigation.graph.mainNavGraph +import dev.minios.pdaiv1.presentation.screen.drawer.DrawerScreen +import dev.minios.pdaiv1.presentation.theme.global.AiSdAppTheme +import dev.minios.pdaiv1.presentation.utils.PermissionUtil import com.shifthackz.android.core.mvi.MviComponent import kotlinx.coroutines.launch import org.koin.androidx.viewmodel.ext.android.viewModel diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/activity/AiStableDiffusionViewModel.kt similarity index 65% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/activity/AiStableDiffusionViewModel.kt index c4b764fd9..fc9f52128 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/activity/AiStableDiffusionViewModel.kt @@ -1,17 +1,17 @@ -package com.shifthackz.aisdv1.presentation.activity +package dev.minios.pdaiv1.presentation.activity -import com.shifthackz.aisdv1.core.common.extensions.EmptyLambda -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread -import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.presentation.navigation.NavigationEffect -import com.shifthackz.aisdv1.presentation.navigation.graph.mainDrawerNavItems -import com.shifthackz.aisdv1.presentation.navigation.router.drawer.DrawerRouter -import com.shifthackz.aisdv1.presentation.navigation.router.home.HomeRouter -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.core.common.extensions.EmptyLambda +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.schedulers.subscribeOnMainThread +import dev.minios.pdaiv1.core.viewmodel.MviRxViewModel +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.presentation.navigation.NavigationEffect +import dev.minios.pdaiv1.presentation.navigation.graph.mainDrawerNavItems +import dev.minios.pdaiv1.presentation.navigation.router.drawer.DrawerRouter +import dev.minios.pdaiv1.presentation.navigation.router.home.HomeRouter +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter import io.reactivex.rxjava3.kotlin.subscribeBy class AiStableDiffusionViewModel( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AppIntent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/activity/AppIntent.kt similarity index 67% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AppIntent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/activity/AppIntent.kt index 75a02fe39..6a3356e2e 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AppIntent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/activity/AppIntent.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.presentation.activity +package dev.minios.pdaiv1.presentation.activity -import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute +import dev.minios.pdaiv1.presentation.navigation.NavigationRoute import com.shifthackz.android.core.mvi.MviIntent sealed interface AppIntent : MviIntent { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AppState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/activity/AppState.kt similarity index 55% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AppState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/activity/AppState.kt index 83cd15cb3..12722e664 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/activity/AppState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/activity/AppState.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.presentation.activity +package dev.minios.pdaiv1.presentation.activity import androidx.compose.runtime.Immutable -import com.shifthackz.aisdv1.presentation.model.NavItem -import com.shifthackz.aisdv1.presentation.navigation.graph.mainDrawerNavItems +import dev.minios.pdaiv1.presentation.model.NavItem +import dev.minios.pdaiv1.presentation.navigation.graph.mainDrawerNavItems import com.shifthackz.android.core.mvi.MviState @Immutable diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationFormUpdateEvent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/core/GenerationFormUpdateEvent.kt similarity index 94% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationFormUpdateEvent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/core/GenerationFormUpdateEvent.kt index 6ae21c0c8..3970d6556 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationFormUpdateEvent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/core/GenerationFormUpdateEvent.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.presentation.core +package dev.minios.pdaiv1.presentation.core -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.AiGenerationResult import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.subjects.BehaviorSubject import io.reactivex.rxjava3.subjects.PublishSubject diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationMviIntent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/core/GenerationMviIntent.kt similarity index 77% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationMviIntent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/core/GenerationMviIntent.kt index 97779864d..4c684f367 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationMviIntent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/core/GenerationMviIntent.kt @@ -1,20 +1,20 @@ -package com.shifthackz.aisdv1.presentation.core +package dev.minios.pdaiv1.presentation.core import android.graphics.Bitmap -import com.shifthackz.aisdv1.domain.entity.ADetailerConfig -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ForgeModule -import com.shifthackz.aisdv1.domain.entity.HiresConfig -import com.shifthackz.aisdv1.domain.entity.ModelType -import com.shifthackz.aisdv1.domain.entity.OpenAiModel -import com.shifthackz.aisdv1.domain.entity.OpenAiQuality -import com.shifthackz.aisdv1.domain.entity.OpenAiSize -import com.shifthackz.aisdv1.domain.entity.OpenAiStyle -import com.shifthackz.aisdv1.domain.entity.StabilityAiClipGuidance -import com.shifthackz.aisdv1.domain.entity.StabilityAiStylePreset -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.model.QnnResolution -import com.shifthackz.aisdv1.presentation.screen.drawer.DrawerIntent +import dev.minios.pdaiv1.domain.entity.ADetailerConfig +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ForgeModule +import dev.minios.pdaiv1.domain.entity.HiresConfig +import dev.minios.pdaiv1.domain.entity.ModelType +import dev.minios.pdaiv1.domain.entity.OpenAiModel +import dev.minios.pdaiv1.domain.entity.OpenAiQuality +import dev.minios.pdaiv1.domain.entity.OpenAiSize +import dev.minios.pdaiv1.domain.entity.OpenAiStyle +import dev.minios.pdaiv1.domain.entity.StabilityAiClipGuidance +import dev.minios.pdaiv1.domain.entity.StabilityAiStylePreset +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.model.QnnResolution +import dev.minios.pdaiv1.presentation.screen.drawer.DrawerIntent import com.shifthackz.android.core.mvi.MviIntent sealed interface GenerationMviIntent : MviIntent { @@ -40,7 +40,7 @@ sealed interface GenerationMviIntent : MviIntent { data object Swap : Size - data class AspectRatio(val ratio: com.shifthackz.aisdv1.presentation.model.AspectRatio) : Size + data class AspectRatio(val ratio: dev.minios.pdaiv1.presentation.model.AspectRatio) : Size } data class SamplingSteps(val value: Int) : Update @@ -65,7 +65,7 @@ sealed interface GenerationMviIntent : MviIntent { data class Batch(val value: Int) : Update - data class Scheduler(val value: com.shifthackz.aisdv1.domain.entity.Scheduler) : Update + data class Scheduler(val value: dev.minios.pdaiv1.domain.entity.Scheduler) : Update data class ADetailer(val value: ADetailerConfig) : Update diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationMviState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/core/GenerationMviState.kt similarity index 84% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationMviState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/core/GenerationMviState.kt index 5297e947b..d5542f40a 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationMviState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/core/GenerationMviState.kt @@ -1,20 +1,20 @@ -package com.shifthackz.aisdv1.presentation.core +package dev.minios.pdaiv1.presentation.core -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.domain.entity.ADetailerConfig -import com.shifthackz.aisdv1.domain.entity.ForgeModule -import com.shifthackz.aisdv1.domain.entity.HiresConfig -import com.shifthackz.aisdv1.domain.entity.ModelType -import com.shifthackz.aisdv1.domain.entity.OpenAiModel -import com.shifthackz.aisdv1.domain.entity.OpenAiQuality -import com.shifthackz.aisdv1.domain.entity.OpenAiSize -import com.shifthackz.aisdv1.domain.entity.OpenAiStyle -import com.shifthackz.aisdv1.domain.entity.Scheduler -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.entity.StabilityAiClipGuidance -import com.shifthackz.aisdv1.domain.entity.StabilityAiStylePreset -import com.shifthackz.aisdv1.presentation.model.FalAiEndpointUi -import com.shifthackz.aisdv1.presentation.model.Modal +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.domain.entity.ADetailerConfig +import dev.minios.pdaiv1.domain.entity.ForgeModule +import dev.minios.pdaiv1.domain.entity.HiresConfig +import dev.minios.pdaiv1.domain.entity.ModelType +import dev.minios.pdaiv1.domain.entity.OpenAiModel +import dev.minios.pdaiv1.domain.entity.OpenAiQuality +import dev.minios.pdaiv1.domain.entity.OpenAiSize +import dev.minios.pdaiv1.domain.entity.OpenAiStyle +import dev.minios.pdaiv1.domain.entity.Scheduler +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.entity.StabilityAiClipGuidance +import dev.minios.pdaiv1.domain.entity.StabilityAiStylePreset +import dev.minios.pdaiv1.presentation.model.FalAiEndpointUi +import dev.minios.pdaiv1.presentation.model.Modal import com.shifthackz.android.core.mvi.MviState abstract class GenerationMviState : MviState { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationMviViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/core/GenerationMviViewModel.kt similarity index 89% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationMviViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/core/GenerationMviViewModel.kt index 030a37fff..e0c1fc300 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/core/GenerationMviViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/core/GenerationMviViewModel.kt @@ -1,40 +1,40 @@ @file:Suppress("UNCHECKED_CAST") -package com.shifthackz.aisdv1.presentation.core - -import com.shifthackz.aisdv1.core.common.extensions.EmptyLambda -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread -import com.shifthackz.aisdv1.core.validation.dimension.DimensionValidator -import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel -import com.shifthackz.aisdv1.domain.entity.HordeProcessStatus -import com.shifthackz.aisdv1.domain.entity.LocalDiffusionStatus -import com.shifthackz.aisdv1.domain.entity.ModelType -import com.shifthackz.aisdv1.domain.entity.ModelType.Companion.defaultCfgScale -import com.shifthackz.aisdv1.domain.entity.ModelType.Companion.defaultHeight -import com.shifthackz.aisdv1.domain.entity.ModelType.Companion.defaultSampler -import com.shifthackz.aisdv1.domain.entity.ModelType.Companion.defaultScheduler -import com.shifthackz.aisdv1.domain.entity.ModelType.Companion.defaultWidth -import com.shifthackz.aisdv1.domain.entity.OpenAiSize -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.entity.StabilityAiSampler -import com.shifthackz.aisdv1.domain.entity.StableDiffusionSampler -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.caching.SaveLastResultToCacheUseCase -import com.shifthackz.aisdv1.domain.usecase.forgemodule.GetForgeModulesUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.InterruptGenerationUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.ObserveHordeProcessStatusUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.ObserveLocalDiffusionProcessStatusUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.SaveGenerationResultUseCase -import com.shifthackz.aisdv1.domain.usecase.sdsampler.GetStableDiffusionSamplersUseCase -import com.shifthackz.aisdv1.presentation.model.LaunchSource -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.navigation.router.drawer.DrawerRouter -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter -import com.shifthackz.aisdv1.presentation.screen.drawer.DrawerIntent -import com.shifthackz.aisdv1.presentation.screen.txt2img.mapToUi +package dev.minios.pdaiv1.presentation.core + +import dev.minios.pdaiv1.core.common.extensions.EmptyLambda +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.schedulers.subscribeOnMainThread +import dev.minios.pdaiv1.core.validation.dimension.DimensionValidator +import dev.minios.pdaiv1.core.viewmodel.MviRxViewModel +import dev.minios.pdaiv1.domain.entity.HordeProcessStatus +import dev.minios.pdaiv1.domain.entity.LocalDiffusionStatus +import dev.minios.pdaiv1.domain.entity.ModelType +import dev.minios.pdaiv1.domain.entity.ModelType.Companion.defaultCfgScale +import dev.minios.pdaiv1.domain.entity.ModelType.Companion.defaultHeight +import dev.minios.pdaiv1.domain.entity.ModelType.Companion.defaultSampler +import dev.minios.pdaiv1.domain.entity.ModelType.Companion.defaultScheduler +import dev.minios.pdaiv1.domain.entity.ModelType.Companion.defaultWidth +import dev.minios.pdaiv1.domain.entity.OpenAiSize +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.entity.StabilityAiSampler +import dev.minios.pdaiv1.domain.entity.StableDiffusionSampler +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.caching.SaveLastResultToCacheUseCase +import dev.minios.pdaiv1.domain.usecase.forgemodule.GetForgeModulesUseCase +import dev.minios.pdaiv1.domain.usecase.generation.InterruptGenerationUseCase +import dev.minios.pdaiv1.domain.usecase.generation.ObserveHordeProcessStatusUseCase +import dev.minios.pdaiv1.domain.usecase.generation.ObserveLocalDiffusionProcessStatusUseCase +import dev.minios.pdaiv1.domain.usecase.generation.SaveGenerationResultUseCase +import dev.minios.pdaiv1.domain.usecase.sdsampler.GetStableDiffusionSamplersUseCase +import dev.minios.pdaiv1.presentation.model.LaunchSource +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.navigation.router.drawer.DrawerRouter +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.presentation.screen.drawer.DrawerIntent +import dev.minios.pdaiv1.presentation.screen.txt2img.mapToUi import com.shifthackz.android.core.mvi.MviEffect import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.disposables.Disposable diff --git a/presentation/src/main/java/dev/minios/pdaiv1/presentation/di/NavigationModule.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/di/NavigationModule.kt new file mode 100644 index 000000000..a3e887981 --- /dev/null +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/di/NavigationModule.kt @@ -0,0 +1,17 @@ +package dev.minios.pdaiv1.presentation.di + +import dev.minios.pdaiv1.presentation.navigation.router.drawer.DrawerRouter +import dev.minios.pdaiv1.presentation.navigation.router.drawer.DrawerRouterImpl +import dev.minios.pdaiv1.presentation.navigation.router.home.HomeRouter +import dev.minios.pdaiv1.presentation.navigation.router.home.HomeRouterImpl +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouterImpl +import org.koin.core.module.dsl.singleOf +import org.koin.dsl.bind +import org.koin.dsl.module + +internal val navigationModule = module { + singleOf(::MainRouterImpl) bind MainRouter::class + singleOf(::DrawerRouterImpl) bind DrawerRouter::class + singleOf(::HomeRouterImpl) bind HomeRouter::class +} diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/di/PresentationModule.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/di/PresentationModule.kt similarity index 67% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/di/PresentationModule.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/di/PresentationModule.kt index e124fa1cd..abbf20b2a 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/di/PresentationModule.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/di/PresentationModule.kt @@ -1,3 +1,3 @@ -package com.shifthackz.aisdv1.presentation.di +package dev.minios.pdaiv1.presentation.di val presentationModule = (navigationModule + viewModelModule + uiUtilsModule).toTypedArray() diff --git a/presentation/src/main/java/dev/minios/pdaiv1/presentation/di/UiUtilsModule.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/di/UiUtilsModule.kt new file mode 100644 index 000000000..f324bac37 --- /dev/null +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/di/UiUtilsModule.kt @@ -0,0 +1,20 @@ +package dev.minios.pdaiv1.presentation.di + +import dev.minios.pdaiv1.presentation.core.GenerationFormUpdateEvent +import dev.minios.pdaiv1.presentation.screen.debug.DebugMenuAccessor +import dev.minios.pdaiv1.presentation.screen.gallery.detail.GalleryDetailBitmapExporter +import dev.minios.pdaiv1.presentation.screen.gallery.detail.GalleryDetailSharing +import dev.minios.pdaiv1.presentation.screen.gallery.list.GalleryExporter +import dev.minios.pdaiv1.presentation.screen.inpaint.InPaintStateProducer +import org.koin.core.module.dsl.factoryOf +import org.koin.core.module.dsl.singleOf +import org.koin.dsl.module + +internal val uiUtilsModule = module { + factoryOf(::GalleryExporter) + factoryOf(::GalleryDetailBitmapExporter) + factoryOf(::GalleryDetailSharing) + singleOf(::GenerationFormUpdateEvent) + singleOf(::DebugMenuAccessor) + singleOf(::InPaintStateProducer) +} diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/di/ViewModelModule.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/di/ViewModelModule.kt similarity index 68% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/di/ViewModelModule.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/di/ViewModelModule.kt index 7597ee014..65f556e7c 100755 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/di/ViewModelModule.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/di/ViewModelModule.kt @@ -1,34 +1,34 @@ -package com.shifthackz.aisdv1.presentation.di +package dev.minios.pdaiv1.presentation.di -import com.shifthackz.aisdv1.presentation.activity.AiStableDiffusionViewModel -import com.shifthackz.aisdv1.presentation.modal.download.DownloadDialogViewModel -import com.shifthackz.aisdv1.presentation.modal.embedding.EmbeddingViewModel -import com.shifthackz.aisdv1.presentation.modal.extras.ExtrasViewModel -import com.shifthackz.aisdv1.presentation.modal.history.InputHistoryViewModel -import com.shifthackz.aisdv1.presentation.modal.tag.EditTagViewModel -import com.shifthackz.aisdv1.presentation.model.LaunchSource -import com.shifthackz.aisdv1.presentation.screen.debug.DebugMenuViewModel -import com.shifthackz.aisdv1.presentation.screen.donate.DonateViewModel -import com.shifthackz.aisdv1.presentation.screen.drawer.DrawerViewModel -import com.shifthackz.aisdv1.presentation.screen.falai.FalAiGenerationViewModel -import com.shifthackz.aisdv1.presentation.screen.gallery.detail.GalleryDetailViewModel -import com.shifthackz.aisdv1.presentation.screen.gallery.list.GalleryViewModel -import com.shifthackz.aisdv1.presentation.screen.home.HomeNavigationViewModel -import com.shifthackz.aisdv1.presentation.screen.img2img.ImageToImageViewModel -import com.shifthackz.aisdv1.presentation.screen.inpaint.InPaintViewModel -import com.shifthackz.aisdv1.presentation.screen.loader.ConfigurationLoaderViewModel -import com.shifthackz.aisdv1.presentation.screen.logger.LoggerViewModel -import com.shifthackz.aisdv1.presentation.screen.onboarding.OnBoardingViewModel -import com.shifthackz.aisdv1.presentation.screen.report.ReportViewModel -import com.shifthackz.aisdv1.presentation.screen.settings.SettingsViewModel -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupViewModel -import com.shifthackz.aisdv1.presentation.screen.splash.SplashViewModel -import com.shifthackz.aisdv1.presentation.screen.txt2img.TextToImageViewModel -import com.shifthackz.aisdv1.presentation.screen.web.webui.WebUiViewModel -import com.shifthackz.aisdv1.presentation.theme.global.AiSdAppThemeViewModel -import com.shifthackz.aisdv1.presentation.widget.connectivity.ConnectivityViewModel -import com.shifthackz.aisdv1.presentation.widget.engine.EngineSelectionViewModel -import com.shifthackz.aisdv1.presentation.widget.work.BackgroundWorkViewModel +import dev.minios.pdaiv1.presentation.activity.AiStableDiffusionViewModel +import dev.minios.pdaiv1.presentation.modal.download.DownloadDialogViewModel +import dev.minios.pdaiv1.presentation.modal.embedding.EmbeddingViewModel +import dev.minios.pdaiv1.presentation.modal.extras.ExtrasViewModel +import dev.minios.pdaiv1.presentation.modal.history.InputHistoryViewModel +import dev.minios.pdaiv1.presentation.modal.tag.EditTagViewModel +import dev.minios.pdaiv1.presentation.model.LaunchSource +import dev.minios.pdaiv1.presentation.screen.debug.DebugMenuViewModel +import dev.minios.pdaiv1.presentation.screen.donate.DonateViewModel +import dev.minios.pdaiv1.presentation.screen.drawer.DrawerViewModel +import dev.minios.pdaiv1.presentation.screen.falai.FalAiGenerationViewModel +import dev.minios.pdaiv1.presentation.screen.gallery.detail.GalleryDetailViewModel +import dev.minios.pdaiv1.presentation.screen.gallery.list.GalleryViewModel +import dev.minios.pdaiv1.presentation.screen.home.HomeNavigationViewModel +import dev.minios.pdaiv1.presentation.screen.img2img.ImageToImageViewModel +import dev.minios.pdaiv1.presentation.screen.inpaint.InPaintViewModel +import dev.minios.pdaiv1.presentation.screen.loader.ConfigurationLoaderViewModel +import dev.minios.pdaiv1.presentation.screen.logger.LoggerViewModel +import dev.minios.pdaiv1.presentation.screen.onboarding.OnBoardingViewModel +import dev.minios.pdaiv1.presentation.screen.report.ReportViewModel +import dev.minios.pdaiv1.presentation.screen.settings.SettingsViewModel +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupViewModel +import dev.minios.pdaiv1.presentation.screen.splash.SplashViewModel +import dev.minios.pdaiv1.presentation.screen.txt2img.TextToImageViewModel +import dev.minios.pdaiv1.presentation.screen.web.webui.WebUiViewModel +import dev.minios.pdaiv1.presentation.theme.global.AiSdAppThemeViewModel +import dev.minios.pdaiv1.presentation.widget.connectivity.ConnectivityViewModel +import dev.minios.pdaiv1.presentation.widget.engine.EngineSelectionViewModel +import dev.minios.pdaiv1.presentation.widget.work.BackgroundWorkViewModel import org.koin.core.module.dsl.viewModel import org.koin.core.module.dsl.viewModelOf import org.koin.dsl.module diff --git a/presentation/src/main/java/dev/minios/pdaiv1/presentation/extensions/BooleanExtensions.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/extensions/BooleanExtensions.kt new file mode 100644 index 000000000..359ea94eb --- /dev/null +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/extensions/BooleanExtensions.kt @@ -0,0 +1,7 @@ +package dev.minios.pdaiv1.presentation.extensions + +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.core.localization.R as LocalizationR + +fun Boolean.mapToUi(): UiText = (if (this) LocalizationR.string.yes else LocalizationR.string.no).asUiText() diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/extensions/NavControllerExtensions.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/extensions/NavControllerExtensions.kt similarity index 67% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/extensions/NavControllerExtensions.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/extensions/NavControllerExtensions.kt index 96ffcf0f9..859a80494 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/extensions/NavControllerExtensions.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/extensions/NavControllerExtensions.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.presentation.extensions +package dev.minios.pdaiv1.presentation.extensions import androidx.navigation.NavController -import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute +import dev.minios.pdaiv1.presentation.navigation.NavigationRoute fun NavController.navigatePopUpToCurrent(navRoute: NavigationRoute) { navigate(navRoute) { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/ModalRenderer.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/ModalRenderer.kt similarity index 85% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/ModalRenderer.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/ModalRenderer.kt index 75f7d1fc6..a96fea1c9 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/ModalRenderer.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/ModalRenderer.kt @@ -1,6 +1,6 @@ @file:OptIn(ExperimentalMaterial3Api::class) -package com.shifthackz.aisdv1.presentation.modal +package dev.minios.pdaiv1.presentation.modal import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.material3.ExperimentalMaterial3Api @@ -14,42 +14,42 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.RectangleShape import androidx.compose.ui.platform.LocalContext -import com.shifthackz.aisdv1.core.common.extensions.openAppSettings -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.core.model.asString -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.presentation.core.GenerationFormUpdateEvent -import com.shifthackz.aisdv1.presentation.core.GenerationMviIntent -import com.shifthackz.aisdv1.presentation.core.ImageToImageIntent -import com.shifthackz.aisdv1.presentation.modal.crop.CropImageModal -import com.shifthackz.aisdv1.presentation.modal.download.DownloadDialog -import com.shifthackz.aisdv1.presentation.modal.embedding.EmbeddingScreen -import com.shifthackz.aisdv1.presentation.modal.extras.ExtrasScreen -import com.shifthackz.aisdv1.presentation.modal.grid.GridBottomSheet -import com.shifthackz.aisdv1.presentation.modal.history.InputHistoryScreen -import com.shifthackz.aisdv1.presentation.modal.language.LanguageBottomSheet -import com.shifthackz.aisdv1.presentation.modal.ldscheduler.LDSchedulerBottomSheet -import com.shifthackz.aisdv1.presentation.modal.tag.EditTagDialog -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.screen.debug.DebugMenuIntent -import com.shifthackz.aisdv1.presentation.screen.falai.FalAiGenerationIntent -import com.shifthackz.aisdv1.presentation.screen.gallery.detail.GalleryDetailIntent -import com.shifthackz.aisdv1.presentation.screen.gallery.list.GalleryIntent -import com.shifthackz.aisdv1.presentation.screen.inpaint.InPaintIntent -import com.shifthackz.aisdv1.presentation.screen.report.ReportIntent -import com.shifthackz.aisdv1.presentation.screen.settings.SettingsIntent -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupIntent -import com.shifthackz.aisdv1.presentation.widget.dialog.DecisionInteractiveDialog -import com.shifthackz.aisdv1.presentation.widget.dialog.ErrorDialog -import com.shifthackz.aisdv1.presentation.widget.dialog.GenerationImageBatchResultModal -import com.shifthackz.aisdv1.presentation.widget.dialog.GenerationImageResultDialog -import com.shifthackz.aisdv1.presentation.widget.dialog.InfoDialog -import com.shifthackz.aisdv1.presentation.widget.dialog.ProgressDialog -import com.shifthackz.aisdv1.presentation.widget.dialog.ProgressDialogCancelButton -import com.shifthackz.aisdv1.presentation.widget.input.DropdownTextField +import dev.minios.pdaiv1.core.common.extensions.openAppSettings +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.core.model.asString +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.presentation.core.GenerationFormUpdateEvent +import dev.minios.pdaiv1.presentation.core.GenerationMviIntent +import dev.minios.pdaiv1.presentation.core.ImageToImageIntent +import dev.minios.pdaiv1.presentation.modal.crop.CropImageModal +import dev.minios.pdaiv1.presentation.modal.download.DownloadDialog +import dev.minios.pdaiv1.presentation.modal.embedding.EmbeddingScreen +import dev.minios.pdaiv1.presentation.modal.extras.ExtrasScreen +import dev.minios.pdaiv1.presentation.modal.grid.GridBottomSheet +import dev.minios.pdaiv1.presentation.modal.history.InputHistoryScreen +import dev.minios.pdaiv1.presentation.modal.language.LanguageBottomSheet +import dev.minios.pdaiv1.presentation.modal.ldscheduler.LDSchedulerBottomSheet +import dev.minios.pdaiv1.presentation.modal.tag.EditTagDialog +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.screen.debug.DebugMenuIntent +import dev.minios.pdaiv1.presentation.screen.falai.FalAiGenerationIntent +import dev.minios.pdaiv1.presentation.screen.gallery.detail.GalleryDetailIntent +import dev.minios.pdaiv1.presentation.screen.gallery.list.GalleryIntent +import dev.minios.pdaiv1.presentation.screen.inpaint.InPaintIntent +import dev.minios.pdaiv1.presentation.screen.report.ReportIntent +import dev.minios.pdaiv1.presentation.screen.settings.SettingsIntent +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupIntent +import dev.minios.pdaiv1.presentation.widget.dialog.DecisionInteractiveDialog +import dev.minios.pdaiv1.presentation.widget.dialog.ErrorDialog +import dev.minios.pdaiv1.presentation.widget.dialog.GenerationImageBatchResultModal +import dev.minios.pdaiv1.presentation.widget.dialog.GenerationImageResultDialog +import dev.minios.pdaiv1.presentation.widget.dialog.InfoDialog +import dev.minios.pdaiv1.presentation.widget.dialog.ProgressDialog +import dev.minios.pdaiv1.presentation.widget.dialog.ProgressDialogCancelButton +import dev.minios.pdaiv1.presentation.widget.input.DropdownTextField import com.shifthackz.android.core.mvi.MviIntent -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun ModalRenderer( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/crop/CropImageModal.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/crop/CropImageModal.kt similarity index 94% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/crop/CropImageModal.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/crop/CropImageModal.kt index 7cedf4a0a..0061ca908 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/crop/CropImageModal.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/crop/CropImageModal.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.modal.crop +package dev.minios.pdaiv1.presentation.modal.crop import android.graphics.Bitmap import androidx.compose.material3.MaterialTheme @@ -15,7 +15,7 @@ import com.mr0xf00.easycrop.RectCropShape import com.mr0xf00.easycrop.crop import com.mr0xf00.easycrop.rememberImageCropper import com.mr0xf00.easycrop.ui.ImageCropperDialog -import com.shifthackz.aisdv1.core.common.extensions.showToast +import dev.minios.pdaiv1.core.common.extensions.showToast @Composable fun CropImageModal( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/download/DownloadDialog.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/download/DownloadDialog.kt similarity index 96% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/download/DownloadDialog.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/download/DownloadDialog.kt index 31477a1fd..71ec73f5b 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/download/DownloadDialog.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/download/DownloadDialog.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.modal.download +package dev.minios.pdaiv1.presentation.modal.download import androidx.compose.foundation.Image import androidx.compose.foundation.background @@ -42,13 +42,13 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties -import com.shifthackz.aisdv1.presentation.R +import dev.minios.pdaiv1.presentation.R import com.shifthackz.android.core.mvi.MviComponent import org.koin.androidx.compose.koinViewModel -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR private const val GITHUB_WEB_RESOURCE = "github.com" -private const val SDAI_WEB_RESOURCE = "share.moroz.cc" +private const val PDAI_WEB_RESOURCE = "share.minios.dev" @Composable fun DownloadDialog( @@ -188,9 +188,9 @@ private fun ScreenContent( contentDescription = null, ) - SDAI_WEB_RESOURCE -> Image( + PDAI_WEB_RESOURCE -> Image( modifier = iconModifier, - painter = painterResource(R.drawable.ic_sdai_logo), + painter = painterResource(R.drawable.ic_pdai_logo), contentDescription = null, ) diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/download/DownloadDialogEffect.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/download/DownloadDialogEffect.kt similarity index 79% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/download/DownloadDialogEffect.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/download/DownloadDialogEffect.kt index d672f7832..5d87d0893 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/download/DownloadDialogEffect.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/download/DownloadDialogEffect.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.modal.download +package dev.minios.pdaiv1.presentation.modal.download import com.shifthackz.android.core.mvi.MviEffect diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/download/DownloadDialogIntent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/download/DownloadDialogIntent.kt similarity index 85% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/download/DownloadDialogIntent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/download/DownloadDialogIntent.kt index 6940e12b5..0817a0bd6 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/download/DownloadDialogIntent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/download/DownloadDialogIntent.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.modal.download +package dev.minios.pdaiv1.presentation.modal.download import com.shifthackz.android.core.mvi.MviIntent diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/download/DownloadDialogState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/download/DownloadDialogState.kt similarity index 84% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/download/DownloadDialogState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/download/DownloadDialogState.kt index 70d3788ad..8a56fdbbd 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/download/DownloadDialogState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/download/DownloadDialogState.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.modal.download +package dev.minios.pdaiv1.presentation.modal.download import androidx.compose.runtime.Immutable import com.shifthackz.android.core.mvi.MviState diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/download/DownloadDialogViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/download/DownloadDialogViewModel.kt similarity index 78% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/download/DownloadDialogViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/download/DownloadDialogViewModel.kt index 66f6a72b1..42b252eab 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/download/DownloadDialogViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/download/DownloadDialogViewModel.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.presentation.modal.download - -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread -import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel -import com.shifthackz.aisdv1.domain.usecase.downloadable.GetLocalModelUseCase +package dev.minios.pdaiv1.presentation.modal.download + +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.schedulers.subscribeOnMainThread +import dev.minios.pdaiv1.core.viewmodel.MviRxViewModel +import dev.minios.pdaiv1.domain.usecase.downloadable.GetLocalModelUseCase import io.reactivex.rxjava3.kotlin.subscribeBy class DownloadDialogViewModel( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/embedding/EmbeddingIntent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/embedding/EmbeddingIntent.kt similarity index 84% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/embedding/EmbeddingIntent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/embedding/EmbeddingIntent.kt index be0e9a14d..d70156e48 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/embedding/EmbeddingIntent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/embedding/EmbeddingIntent.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.modal.embedding +package dev.minios.pdaiv1.presentation.modal.embedding import com.shifthackz.android.core.mvi.MviIntent diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/embedding/EmbeddingScreen.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/embedding/EmbeddingScreen.kt similarity index 95% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/embedding/EmbeddingScreen.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/embedding/EmbeddingScreen.kt index 04d691026..5c229be68 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/embedding/EmbeddingScreen.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/embedding/EmbeddingScreen.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.modal.embedding +package dev.minios.pdaiv1.presentation.modal.embedding import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -45,17 +45,17 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties -import com.shifthackz.aisdv1.core.extensions.shimmer -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.presentation.modal.extras.ExtrasEffect -import com.shifthackz.aisdv1.presentation.model.ErrorState -import com.shifthackz.aisdv1.presentation.widget.error.ErrorComposable -import com.shifthackz.aisdv1.presentation.widget.source.getName -import com.shifthackz.aisdv1.presentation.widget.toolbar.ModalDialogToolbar +import dev.minios.pdaiv1.core.extensions.shimmer +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.presentation.modal.extras.ExtrasEffect +import dev.minios.pdaiv1.presentation.model.ErrorState +import dev.minios.pdaiv1.presentation.widget.error.ErrorComposable +import dev.minios.pdaiv1.presentation.widget.source.getName +import dev.minios.pdaiv1.presentation.widget.toolbar.ModalDialogToolbar import com.shifthackz.android.core.mvi.MviComponent import org.koin.androidx.compose.koinViewModel -import com.shifthackz.aisdv1.core.localization.R as LocalizationR -import com.shifthackz.aisdv1.presentation.R as PresentationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.presentation.R as PresentationR @Composable fun EmbeddingScreen( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/embedding/EmbeddingState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/embedding/EmbeddingState.kt similarity index 76% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/embedding/EmbeddingState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/embedding/EmbeddingState.kt index 9898c607a..bc8e1b689 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/embedding/EmbeddingState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/embedding/EmbeddingState.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.presentation.modal.embedding +package dev.minios.pdaiv1.presentation.modal.embedding import androidx.compose.runtime.Immutable -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.presentation.model.ErrorState +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.presentation.model.ErrorState import com.shifthackz.android.core.mvi.MviState @Immutable diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/embedding/EmbeddingViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/embedding/EmbeddingViewModel.kt similarity index 83% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/embedding/EmbeddingViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/embedding/EmbeddingViewModel.kt index c01ebc72e..0e78c4db9 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/embedding/EmbeddingViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/embedding/EmbeddingViewModel.kt @@ -1,15 +1,15 @@ -package com.shifthackz.aisdv1.presentation.modal.embedding +package dev.minios.pdaiv1.presentation.modal.embedding -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread -import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.sdembedding.FetchAndGetEmbeddingsUseCase -import com.shifthackz.aisdv1.presentation.modal.extras.ExtrasEffect -import com.shifthackz.aisdv1.presentation.model.ErrorState -import com.shifthackz.aisdv1.presentation.utils.ExtrasFormatter +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.schedulers.subscribeOnMainThread +import dev.minios.pdaiv1.core.viewmodel.MviRxViewModel +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.sdembedding.FetchAndGetEmbeddingsUseCase +import dev.minios.pdaiv1.presentation.modal.extras.ExtrasEffect +import dev.minios.pdaiv1.presentation.model.ErrorState +import dev.minios.pdaiv1.presentation.utils.ExtrasFormatter import io.reactivex.rxjava3.kotlin.subscribeBy class EmbeddingViewModel( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/extras/ExtrasEffect.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/extras/ExtrasEffect.kt similarity index 81% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/extras/ExtrasEffect.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/extras/ExtrasEffect.kt index 5a8a2812b..be0b7affa 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/extras/ExtrasEffect.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/extras/ExtrasEffect.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.modal.extras +package dev.minios.pdaiv1.presentation.modal.extras import com.shifthackz.android.core.mvi.MviEffect diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/extras/ExtrasIntent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/extras/ExtrasIntent.kt similarity index 81% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/extras/ExtrasIntent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/extras/ExtrasIntent.kt index 9d4463b5b..c788e5615 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/extras/ExtrasIntent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/extras/ExtrasIntent.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.modal.extras +package dev.minios.pdaiv1.presentation.modal.extras import com.shifthackz.android.core.mvi.MviIntent diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/extras/ExtrasScreen.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/extras/ExtrasScreen.kt similarity index 94% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/extras/ExtrasScreen.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/extras/ExtrasScreen.kt index ffa0c4db7..84ad680a8 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/extras/ExtrasScreen.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/extras/ExtrasScreen.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.modal.extras +package dev.minios.pdaiv1.presentation.modal.extras import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement @@ -41,16 +41,16 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties -import com.shifthackz.aisdv1.core.extensions.shimmer -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.presentation.model.ErrorState -import com.shifthackz.aisdv1.presentation.model.ExtraType -import com.shifthackz.aisdv1.presentation.widget.error.ErrorComposable -import com.shifthackz.aisdv1.presentation.widget.source.getName -import com.shifthackz.aisdv1.presentation.widget.toolbar.ModalDialogToolbar +import dev.minios.pdaiv1.core.extensions.shimmer +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.presentation.model.ErrorState +import dev.minios.pdaiv1.presentation.model.ExtraType +import dev.minios.pdaiv1.presentation.widget.error.ErrorComposable +import dev.minios.pdaiv1.presentation.widget.source.getName +import dev.minios.pdaiv1.presentation.widget.toolbar.ModalDialogToolbar import com.shifthackz.android.core.mvi.MviComponent import org.koin.androidx.compose.koinViewModel -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun ExtrasScreen( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/extras/ExtrasState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/extras/ExtrasState.kt similarity index 73% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/extras/ExtrasState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/extras/ExtrasState.kt index 5860bfe04..e510fab4d 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/extras/ExtrasState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/extras/ExtrasState.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.presentation.modal.extras +package dev.minios.pdaiv1.presentation.modal.extras import androidx.compose.runtime.Immutable -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.presentation.model.ErrorState -import com.shifthackz.aisdv1.presentation.model.ExtraType +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.presentation.model.ErrorState +import dev.minios.pdaiv1.presentation.model.ExtraType import com.shifthackz.android.core.mvi.MviState @Immutable diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/extras/ExtrasViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/extras/ExtrasViewModel.kt similarity index 81% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/extras/ExtrasViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/extras/ExtrasViewModel.kt index ef76ad356..b09d57cd8 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/extras/ExtrasViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/extras/ExtrasViewModel.kt @@ -1,19 +1,19 @@ -package com.shifthackz.aisdv1.presentation.modal.extras +package dev.minios.pdaiv1.presentation.modal.extras -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread -import com.shifthackz.aisdv1.core.common.time.TimeProvider -import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel -import com.shifthackz.aisdv1.domain.entity.LoRA -import com.shifthackz.aisdv1.domain.entity.StableDiffusionHyperNetwork -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.sdhypernet.FetchAndGetHyperNetworksUseCase -import com.shifthackz.aisdv1.domain.usecase.sdlora.FetchAndGetLorasUseCase -import com.shifthackz.aisdv1.presentation.model.ErrorState -import com.shifthackz.aisdv1.presentation.model.ExtraType -import com.shifthackz.aisdv1.presentation.utils.ExtrasFormatter +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.schedulers.subscribeOnMainThread +import dev.minios.pdaiv1.core.common.time.TimeProvider +import dev.minios.pdaiv1.core.viewmodel.MviRxViewModel +import dev.minios.pdaiv1.domain.entity.LoRA +import dev.minios.pdaiv1.domain.entity.StableDiffusionHyperNetwork +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.sdhypernet.FetchAndGetHyperNetworksUseCase +import dev.minios.pdaiv1.domain.usecase.sdlora.FetchAndGetLorasUseCase +import dev.minios.pdaiv1.presentation.model.ErrorState +import dev.minios.pdaiv1.presentation.model.ExtraType +import dev.minios.pdaiv1.presentation.utils.ExtrasFormatter import io.reactivex.rxjava3.kotlin.subscribeBy class ExtrasViewModel( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/grid/GridBottomSheet.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/grid/GridBottomSheet.kt similarity index 83% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/grid/GridBottomSheet.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/grid/GridBottomSheet.kt index 19682cf97..85c3c9f65 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/grid/GridBottomSheet.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/grid/GridBottomSheet.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.modal.grid +package dev.minios.pdaiv1.presentation.modal.grid import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth @@ -9,11 +9,11 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.domain.entity.Grid -import com.shifthackz.aisdv1.presentation.widget.item.GridIcon -import com.shifthackz.aisdv1.presentation.widget.item.SettingsItem -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.domain.entity.Grid +import dev.minios.pdaiv1.presentation.widget.item.GridIcon +import dev.minios.pdaiv1.presentation.widget.item.SettingsItem +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun GridBottomSheet( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/history/InputHistoryItemUi.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/history/InputHistoryItemUi.kt similarity index 61% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/history/InputHistoryItemUi.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/history/InputHistoryItemUi.kt index 33eec308a..21ba8ac6e 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/history/InputHistoryItemUi.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/history/InputHistoryItemUi.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.presentation.modal.history +package dev.minios.pdaiv1.presentation.modal.history import android.graphics.Bitmap import androidx.compose.runtime.Immutable -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.AiGenerationResult @Immutable data class InputHistoryItemUi( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/history/InputHistoryPagingSource.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/history/InputHistoryPagingSource.kt similarity index 77% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/history/InputHistoryPagingSource.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/history/InputHistoryPagingSource.kt index c34118610..1a5c8eea1 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/history/InputHistoryPagingSource.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/history/InputHistoryPagingSource.kt @@ -1,16 +1,16 @@ -package com.shifthackz.aisdv1.presentation.modal.history +package dev.minios.pdaiv1.presentation.modal.history import androidx.paging.PagingSource import androidx.paging.PagingState import androidx.paging.rxjava3.RxPagingSource -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter.Input -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter.Output -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.usecase.generation.GetGenerationResultPagedUseCase -import com.shifthackz.aisdv1.presentation.utils.Constants +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter.Input +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter.Output +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.usecase.generation.GetGenerationResultPagedUseCase +import dev.minios.pdaiv1.presentation.utils.Constants import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/history/InputHistoryScreen.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/history/InputHistoryScreen.kt similarity index 97% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/history/InputHistoryScreen.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/history/InputHistoryScreen.kt index b1935ec7d..5117d60fc 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/history/InputHistoryScreen.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/history/InputHistoryScreen.kt @@ -1,6 +1,6 @@ @file:OptIn(ExperimentalLayoutApi::class) -package com.shifthackz.aisdv1.presentation.modal.history +package dev.minios.pdaiv1.presentation.modal.history import androidx.compose.foundation.Image import androidx.compose.foundation.background @@ -40,10 +40,10 @@ import androidx.paging.PagingData import androidx.paging.compose.collectAsLazyPagingItems import androidx.paging.compose.items import com.shifthackz.android.core.mvi.MviComponent -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.AiGenerationResult import kotlinx.coroutines.flow.Flow import org.koin.androidx.compose.koinViewModel -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun InputHistoryScreen( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/history/InputHistoryViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/history/InputHistoryViewModel.kt similarity index 70% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/history/InputHistoryViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/history/InputHistoryViewModel.kt index c8290722c..e709301ae 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/history/InputHistoryViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/history/InputHistoryViewModel.kt @@ -1,15 +1,15 @@ -package com.shifthackz.aisdv1.presentation.modal.history +package dev.minios.pdaiv1.presentation.modal.history import androidx.paging.Pager import androidx.paging.PagingConfig import androidx.paging.PagingData -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel -import com.shifthackz.aisdv1.domain.usecase.generation.GetGenerationResultPagedUseCase -import com.shifthackz.aisdv1.presentation.screen.gallery.list.GalleryPagingSource -import com.shifthackz.aisdv1.presentation.utils.Constants +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.core.viewmodel.MviRxViewModel +import dev.minios.pdaiv1.domain.usecase.generation.GetGenerationResultPagedUseCase +import dev.minios.pdaiv1.presentation.screen.gallery.list.GalleryPagingSource +import dev.minios.pdaiv1.presentation.utils.Constants import com.shifthackz.android.core.mvi.EmptyEffect import com.shifthackz.android.core.mvi.EmptyIntent import com.shifthackz.android.core.mvi.EmptyState diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/language/LanguageBottomSheet.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/language/LanguageBottomSheet.kt similarity index 87% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/language/LanguageBottomSheet.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/language/LanguageBottomSheet.kt index b18150d7d..778a36666 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/language/LanguageBottomSheet.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/language/LanguageBottomSheet.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.modal.language +package dev.minios.pdaiv1.presentation.modal.language import androidx.appcompat.app.AppCompatDelegate import androidx.compose.foundation.Image @@ -13,10 +13,10 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.core.os.LocaleListCompat -import com.shifthackz.aisdv1.core.localization.Localization -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.presentation.widget.item.SettingsItem -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.Localization +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.presentation.widget.item.SettingsItem +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable @Preview diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/ldscheduler/LDSchedulerBottomSheer.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/ldscheduler/LDSchedulerBottomSheer.kt similarity index 84% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/ldscheduler/LDSchedulerBottomSheer.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/ldscheduler/LDSchedulerBottomSheer.kt index 8d5b49eb3..c940671cd 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/ldscheduler/LDSchedulerBottomSheer.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/ldscheduler/LDSchedulerBottomSheer.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.modal.ldscheduler +package dev.minios.pdaiv1.presentation.modal.ldscheduler import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth @@ -10,9 +10,9 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersToken -import com.shifthackz.aisdv1.presentation.screen.debug.mapToUi -import com.shifthackz.aisdv1.presentation.widget.item.SettingsItem +import dev.minios.pdaiv1.core.common.schedulers.SchedulersToken +import dev.minios.pdaiv1.presentation.screen.debug.mapToUi +import dev.minios.pdaiv1.presentation.widget.item.SettingsItem @Composable @Preview diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/tag/EditTagDialog.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/tag/EditTagDialog.kt similarity index 90% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/tag/EditTagDialog.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/tag/EditTagDialog.kt index 92740dccf..500dff8cb 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/tag/EditTagDialog.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/tag/EditTagDialog.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.modal.tag +package dev.minios.pdaiv1.presentation.modal.tag import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -27,18 +27,18 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties import com.shifthackz.android.core.mvi.MviComponent -import com.shifthackz.aisdv1.presentation.model.ExtraType -import com.shifthackz.aisdv1.presentation.theme.sliderColors -import com.shifthackz.aisdv1.presentation.theme.textFieldColors -import com.shifthackz.aisdv1.presentation.utils.Constants.EXTRA_MAXIMUM -import com.shifthackz.aisdv1.presentation.utils.Constants.EXTRA_MINIMUM -import com.shifthackz.aisdv1.presentation.utils.Constants.EXTRA_STEP -import com.shifthackz.aisdv1.presentation.widget.input.SliderTextInputField -import com.shifthackz.aisdv1.presentation.widget.input.chip.ChipTextFieldItem -import com.shifthackz.aisdv1.presentation.widget.toolbar.ModalDialogToolbar +import dev.minios.pdaiv1.presentation.model.ExtraType +import dev.minios.pdaiv1.presentation.theme.sliderColors +import dev.minios.pdaiv1.presentation.theme.textFieldColors +import dev.minios.pdaiv1.presentation.utils.Constants.EXTRA_MAXIMUM +import dev.minios.pdaiv1.presentation.utils.Constants.EXTRA_MINIMUM +import dev.minios.pdaiv1.presentation.utils.Constants.EXTRA_STEP +import dev.minios.pdaiv1.presentation.widget.input.SliderTextInputField +import dev.minios.pdaiv1.presentation.widget.input.chip.ChipTextFieldItem +import dev.minios.pdaiv1.presentation.widget.toolbar.ModalDialogToolbar import org.koin.androidx.compose.koinViewModel import kotlin.math.abs -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun EditTagDialog( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/tag/EditTagEffect.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/tag/EditTagEffect.kt similarity index 82% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/tag/EditTagEffect.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/tag/EditTagEffect.kt index 04bb9a388..c32d1b461 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/tag/EditTagEffect.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/tag/EditTagEffect.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.modal.tag +package dev.minios.pdaiv1.presentation.modal.tag import com.shifthackz.android.core.mvi.MviEffect diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/tag/EditTagIntent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/tag/EditTagIntent.kt similarity index 91% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/tag/EditTagIntent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/tag/EditTagIntent.kt index 708199c2a..0bcd2a721 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/tag/EditTagIntent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/tag/EditTagIntent.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.modal.tag +package dev.minios.pdaiv1.presentation.modal.tag import com.shifthackz.android.core.mvi.MviIntent diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/tag/EditTagState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/tag/EditTagState.kt similarity index 88% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/tag/EditTagState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/tag/EditTagState.kt index 24f0f30b3..3b9e5ea5b 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/tag/EditTagState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/tag/EditTagState.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.presentation.modal.tag +package dev.minios.pdaiv1.presentation.modal.tag import androidx.compose.runtime.Immutable -import com.shifthackz.aisdv1.core.common.math.roundTo -import com.shifthackz.aisdv1.presentation.model.ExtraType +import dev.minios.pdaiv1.core.common.math.roundTo +import dev.minios.pdaiv1.presentation.model.ExtraType import com.shifthackz.android.core.mvi.MviState @Immutable diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/tag/EditTagViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/tag/EditTagViewModel.kt similarity index 90% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/tag/EditTagViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/tag/EditTagViewModel.kt index 7f4e98c3a..6657e2adb 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/modal/tag/EditTagViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/modal/tag/EditTagViewModel.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.presentation.modal.tag +package dev.minios.pdaiv1.presentation.modal.tag -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel -import com.shifthackz.aisdv1.presentation.utils.Constants -import com.shifthackz.aisdv1.presentation.utils.ExtrasFormatter +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.viewmodel.MviRxViewModel +import dev.minios.pdaiv1.presentation.utils.Constants +import dev.minios.pdaiv1.presentation.utils.ExtrasFormatter class EditTagViewModel( dispatchersProvider: DispatchersProvider, diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/AspectRatio.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/model/AspectRatio.kt similarity index 96% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/AspectRatio.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/model/AspectRatio.kt index 985c5bab3..04e166b03 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/AspectRatio.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/model/AspectRatio.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.model +package dev.minios.pdaiv1.presentation.model enum class AspectRatio( val widthRatio: Int, diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/ErrorState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/model/ErrorState.kt similarity index 74% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/ErrorState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/model/ErrorState.kt index edc8b381f..5c2a97f6c 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/ErrorState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/model/ErrorState.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.presentation.model +package dev.minios.pdaiv1.presentation.model import androidx.compose.runtime.Immutable -import com.shifthackz.aisdv1.core.model.UiText +import dev.minios.pdaiv1.core.model.UiText import com.shifthackz.android.core.mvi.MviState sealed interface ErrorState : MviState { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/ExtraType.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/model/ExtraType.kt similarity index 64% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/ExtraType.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/model/ExtraType.kt index fcf770894..d9515a053 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/ExtraType.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/model/ExtraType.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.model +package dev.minios.pdaiv1.presentation.model enum class ExtraType(val raw: String) { Lora("lora"), diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/FalAiState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/model/FalAiState.kt similarity index 92% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/FalAiState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/model/FalAiState.kt index bb0c4f5cf..61e09be9a 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/FalAiState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/model/FalAiState.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.presentation.model +package dev.minios.pdaiv1.presentation.model -import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint -import com.shifthackz.aisdv1.domain.entity.FalAiInputProperty -import com.shifthackz.aisdv1.domain.entity.FalAiPropertyType +import dev.minios.pdaiv1.domain.entity.FalAiEndpoint +import dev.minios.pdaiv1.domain.entity.FalAiInputProperty +import dev.minios.pdaiv1.domain.entity.FalAiPropertyType /** * UI representation of a FalAi endpoint for display. diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/InPaintModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/model/InPaintModel.kt similarity index 95% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/InPaintModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/model/InPaintModel.kt index b515c3a07..ff06ca386 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/InPaintModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/model/InPaintModel.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.model +package dev.minios.pdaiv1.presentation.model import android.graphics.Bitmap import androidx.compose.runtime.Immutable diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/LaunchSource.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/model/LaunchSource.kt similarity index 77% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/LaunchSource.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/model/LaunchSource.kt index 14fb15459..1a1c6a324 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/LaunchSource.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/model/LaunchSource.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.model +package dev.minios.pdaiv1.presentation.model enum class LaunchSource { SPLASH, diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/Modal.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/model/Modal.kt similarity index 85% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/Modal.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/model/Modal.kt index 9d11bff19..afc0d2c30 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/Modal.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/model/Modal.kt @@ -1,15 +1,15 @@ -package com.shifthackz.aisdv1.presentation.model +package dev.minios.pdaiv1.presentation.model import android.graphics.Bitmap import androidx.compose.runtime.Immutable -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersToken -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.Grid -import com.shifthackz.aisdv1.domain.entity.HordeProcessStatus -import com.shifthackz.aisdv1.domain.entity.LocalDiffusionStatus -import com.shifthackz.aisdv1.domain.feature.diffusion.LocalDiffusion -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupState +import dev.minios.pdaiv1.core.common.schedulers.SchedulersToken +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.Grid +import dev.minios.pdaiv1.domain.entity.HordeProcessStatus +import dev.minios.pdaiv1.domain.entity.LocalDiffusionStatus +import dev.minios.pdaiv1.domain.feature.diffusion.LocalDiffusion +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupState sealed interface Modal { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/MotionEvent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/model/MotionEvent.kt similarity index 51% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/MotionEvent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/model/MotionEvent.kt index 79dd12cd8..e09ec9be5 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/MotionEvent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/model/MotionEvent.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.model +package dev.minios.pdaiv1.presentation.model enum class MotionEvent { Idle, Down, Move, Up diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/NavItem.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/model/NavItem.kt similarity index 82% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/NavItem.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/model/NavItem.kt index f875f6c6c..7fae6a023 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/NavItem.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/model/NavItem.kt @@ -1,12 +1,12 @@ -package com.shifthackz.aisdv1.presentation.model +package dev.minios.pdaiv1.presentation.model import androidx.annotation.DrawableRes import androidx.compose.runtime.Composable import androidx.compose.runtime.Immutable import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.vector.ImageVector -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.presentation.navigation.NavigationRoute @Immutable data class NavItem( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/QnnResolution.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/model/QnnResolution.kt similarity index 98% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/QnnResolution.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/model/QnnResolution.kt index 7031c4b5f..b1a8252ff 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/model/QnnResolution.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/model/QnnResolution.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.model +package dev.minios.pdaiv1.presentation.model /** * Represents available resolutions for QNN models. diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/NavigationEffect.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/NavigationEffect.kt similarity index 94% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/NavigationEffect.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/NavigationEffect.kt index f66ec403b..f1504a06a 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/NavigationEffect.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/NavigationEffect.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.navigation +package dev.minios.pdaiv1.presentation.navigation import androidx.navigation.NavOptionsBuilder import com.shifthackz.android.core.mvi.MviEffect diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/NavigationRoute.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/NavigationRoute.kt similarity index 91% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/NavigationRoute.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/NavigationRoute.kt index be1188c5b..63571a4ed 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/NavigationRoute.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/NavigationRoute.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.presentation.navigation +package dev.minios.pdaiv1.presentation.navigation -import com.shifthackz.aisdv1.presentation.model.LaunchSource +import dev.minios.pdaiv1.presentation.model.LaunchSource import kotlinx.serialization.Serializable sealed interface NavigationRoute { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/DrawerNavGraph.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/graph/DrawerNavGraph.kt similarity index 72% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/DrawerNavGraph.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/graph/DrawerNavGraph.kt index e2d70bd24..bdfdb0ffa 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/DrawerNavGraph.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/graph/DrawerNavGraph.kt @@ -1,19 +1,19 @@ -package com.shifthackz.aisdv1.presentation.navigation.graph +package dev.minios.pdaiv1.presentation.navigation.graph import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.DeveloperMode import androidx.compose.material.icons.filled.SettingsEthernet import androidx.compose.material.icons.filled.Web -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.domain.entity.FeatureTag -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.entity.Settings -import com.shifthackz.aisdv1.presentation.model.LaunchSource -import com.shifthackz.aisdv1.presentation.model.NavItem -import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute -import com.shifthackz.aisdv1.presentation.widget.source.getNameUiText -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.domain.entity.FeatureTag +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.entity.Settings +import dev.minios.pdaiv1.presentation.model.LaunchSource +import dev.minios.pdaiv1.presentation.model.NavItem +import dev.minios.pdaiv1.presentation.navigation.NavigationRoute +import dev.minios.pdaiv1.presentation.widget.source.getNameUiText +import dev.minios.pdaiv1.core.localization.R as LocalizationR fun mainDrawerNavItems(settings: Settings? = null): List = buildList { if (settings?.source == ServerSource.FAL_AI) { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/HomeNavGraph.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/graph/HomeNavGraph.kt similarity index 80% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/HomeNavGraph.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/graph/HomeNavGraph.kt index 16633e573..f9cd634b5 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/HomeNavGraph.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/graph/HomeNavGraph.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.navigation.graph +package dev.minios.pdaiv1.presentation.navigation.graph import androidx.compose.foundation.layout.size import androidx.compose.material.icons.Icons @@ -14,23 +14,23 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import androidx.navigation.NavGraphBuilder import androidx.navigation.compose.composable -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.presentation.model.NavItem -import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute -import com.shifthackz.aisdv1.presentation.navigation.router.home.HomeRouter -import com.shifthackz.aisdv1.presentation.screen.falai.FalAiGenerationScreen -import com.shifthackz.aisdv1.presentation.screen.gallery.list.GalleryScreen -import com.shifthackz.aisdv1.presentation.screen.home.HomeNavigationScreen -import com.shifthackz.aisdv1.presentation.screen.img2img.ImageToImageScreen -import com.shifthackz.aisdv1.presentation.screen.settings.SettingsScreen -import com.shifthackz.aisdv1.presentation.screen.txt2img.TextToImageScreen +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.presentation.model.NavItem +import dev.minios.pdaiv1.presentation.navigation.NavigationRoute +import dev.minios.pdaiv1.presentation.navigation.router.home.HomeRouter +import dev.minios.pdaiv1.presentation.screen.falai.FalAiGenerationScreen +import dev.minios.pdaiv1.presentation.screen.gallery.list.GalleryScreen +import dev.minios.pdaiv1.presentation.screen.home.HomeNavigationScreen +import dev.minios.pdaiv1.presentation.screen.img2img.ImageToImageScreen +import dev.minios.pdaiv1.presentation.screen.settings.SettingsScreen +import dev.minios.pdaiv1.presentation.screen.txt2img.TextToImageScreen import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers import io.reactivex.rxjava3.disposables.Disposable import org.koin.compose.koinInject -import com.shifthackz.aisdv1.core.localization.R as LocalizationR -import com.shifthackz.aisdv1.presentation.R as PresentationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.presentation.R as PresentationR fun NavGraphBuilder.homeScreenNavGraph() { composable { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/MainNavGraph.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/graph/MainNavGraph.kt similarity index 65% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/MainNavGraph.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/graph/MainNavGraph.kt index e9de82a67..8765131b5 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/graph/MainNavGraph.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/graph/MainNavGraph.kt @@ -1,25 +1,25 @@ -package com.shifthackz.aisdv1.presentation.navigation.graph +package dev.minios.pdaiv1.presentation.navigation.graph import androidx.navigation.NavGraphBuilder import androidx.navigation.NavType import androidx.navigation.compose.composable import androidx.navigation.toRoute -import com.shifthackz.aisdv1.presentation.model.LaunchSource -import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute -import com.shifthackz.aisdv1.presentation.screen.debug.DebugMenuScreen -import com.shifthackz.aisdv1.presentation.screen.donate.DonateScreen -import com.shifthackz.aisdv1.presentation.screen.gallery.detail.GalleryDetailScreen -import com.shifthackz.aisdv1.presentation.screen.inpaint.InPaintScreen -import com.shifthackz.aisdv1.presentation.screen.loader.ConfigurationLoaderScreen -import com.shifthackz.aisdv1.presentation.screen.logger.LoggerScreen -import com.shifthackz.aisdv1.presentation.screen.onboarding.OnBoardingScreen -import com.shifthackz.aisdv1.presentation.screen.onboarding.OnBoardingViewModel -import com.shifthackz.aisdv1.presentation.screen.report.ReportScreen -import com.shifthackz.aisdv1.presentation.screen.report.ReportViewModel -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupScreen -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupViewModel -import com.shifthackz.aisdv1.presentation.screen.splash.SplashScreen -import com.shifthackz.aisdv1.presentation.screen.web.webui.WebUiScreen +import dev.minios.pdaiv1.presentation.model.LaunchSource +import dev.minios.pdaiv1.presentation.navigation.NavigationRoute +import dev.minios.pdaiv1.presentation.screen.debug.DebugMenuScreen +import dev.minios.pdaiv1.presentation.screen.donate.DonateScreen +import dev.minios.pdaiv1.presentation.screen.gallery.detail.GalleryDetailScreen +import dev.minios.pdaiv1.presentation.screen.inpaint.InPaintScreen +import dev.minios.pdaiv1.presentation.screen.loader.ConfigurationLoaderScreen +import dev.minios.pdaiv1.presentation.screen.logger.LoggerScreen +import dev.minios.pdaiv1.presentation.screen.onboarding.OnBoardingScreen +import dev.minios.pdaiv1.presentation.screen.onboarding.OnBoardingViewModel +import dev.minios.pdaiv1.presentation.screen.report.ReportScreen +import dev.minios.pdaiv1.presentation.screen.report.ReportViewModel +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupScreen +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupViewModel +import dev.minios.pdaiv1.presentation.screen.splash.SplashScreen +import dev.minios.pdaiv1.presentation.screen.web.webui.WebUiScreen import org.koin.androidx.compose.koinViewModel import org.koin.compose.koinInject import org.koin.core.parameter.parametersOf diff --git a/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/router/Router.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/router/Router.kt new file mode 100644 index 000000000..c21f746eb --- /dev/null +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/router/Router.kt @@ -0,0 +1,8 @@ +package dev.minios.pdaiv1.presentation.navigation.router + +import dev.minios.pdaiv1.presentation.navigation.NavigationEffect +import io.reactivex.rxjava3.core.Observable + +interface Router { + fun observe(): Observable +} diff --git a/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/router/drawer/DrawerRouter.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/router/drawer/DrawerRouter.kt new file mode 100644 index 000000000..88e1174ea --- /dev/null +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/router/drawer/DrawerRouter.kt @@ -0,0 +1,11 @@ +package dev.minios.pdaiv1.presentation.navigation.router.drawer + +import dev.minios.pdaiv1.presentation.navigation.NavigationEffect +import dev.minios.pdaiv1.presentation.navigation.router.Router + +interface DrawerRouter : Router { + + fun openDrawer() + + fun closeDrawer() +} diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/drawer/DrawerRouterImpl.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/router/drawer/DrawerRouterImpl.kt similarity index 76% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/drawer/DrawerRouterImpl.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/router/drawer/DrawerRouterImpl.kt index 94f7372c6..ce3a7e44d 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/drawer/DrawerRouterImpl.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/router/drawer/DrawerRouterImpl.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.presentation.navigation.router.drawer +package dev.minios.pdaiv1.presentation.navigation.router.drawer -import com.shifthackz.aisdv1.presentation.navigation.NavigationEffect +import dev.minios.pdaiv1.presentation.navigation.NavigationEffect import io.reactivex.rxjava3.subjects.PublishSubject internal class DrawerRouterImpl : DrawerRouter { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/home/HomeRouter.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/router/home/HomeRouter.kt similarity index 52% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/home/HomeRouter.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/router/home/HomeRouter.kt index daaafd6f4..3c4b0adcb 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/home/HomeRouter.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/router/home/HomeRouter.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.presentation.navigation.router.home +package dev.minios.pdaiv1.presentation.navigation.router.home -import com.shifthackz.aisdv1.presentation.navigation.NavigationEffect -import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute -import com.shifthackz.aisdv1.presentation.navigation.router.Router +import dev.minios.pdaiv1.presentation.navigation.NavigationEffect +import dev.minios.pdaiv1.presentation.navigation.NavigationRoute +import dev.minios.pdaiv1.presentation.navigation.router.Router interface HomeRouter : Router { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/home/HomeRouterImpl.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/router/home/HomeRouterImpl.kt similarity index 83% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/home/HomeRouterImpl.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/router/home/HomeRouterImpl.kt index 6535a888a..d82a2690b 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/home/HomeRouterImpl.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/router/home/HomeRouterImpl.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.presentation.navigation.router.home +package dev.minios.pdaiv1.presentation.navigation.router.home -import com.shifthackz.aisdv1.presentation.navigation.NavigationEffect -import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute +import dev.minios.pdaiv1.presentation.navigation.NavigationEffect +import dev.minios.pdaiv1.presentation.navigation.NavigationRoute import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.subjects.PublishSubject diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/main/MainRouter.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/router/main/MainRouter.kt similarity index 63% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/main/MainRouter.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/router/main/MainRouter.kt index ed63759da..e0b06cf52 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/main/MainRouter.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/router/main/MainRouter.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.presentation.navigation.router.main +package dev.minios.pdaiv1.presentation.navigation.router.main -import com.shifthackz.aisdv1.presentation.model.LaunchSource -import com.shifthackz.aisdv1.presentation.navigation.NavigationEffect -import com.shifthackz.aisdv1.presentation.navigation.router.Router +import dev.minios.pdaiv1.presentation.model.LaunchSource +import dev.minios.pdaiv1.presentation.navigation.NavigationEffect +import dev.minios.pdaiv1.presentation.navigation.router.Router interface MainRouter : Router { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/main/MainRouterExtensions.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/router/main/MainRouterExtensions.kt similarity index 70% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/main/MainRouterExtensions.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/router/main/MainRouterExtensions.kt index ed0df2b95..6debf6a13 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/main/MainRouterExtensions.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/router/main/MainRouterExtensions.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.presentation.navigation.router.main +package dev.minios.pdaiv1.presentation.navigation.router.main -import com.shifthackz.aisdv1.domain.usecase.splash.SplashNavigationUseCase -import com.shifthackz.aisdv1.presentation.model.LaunchSource +import dev.minios.pdaiv1.domain.usecase.splash.SplashNavigationUseCase +import dev.minios.pdaiv1.presentation.model.LaunchSource fun MainRouter.postSplashNavigation( action: SplashNavigationUseCase.Action, diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/main/MainRouterImpl.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/router/main/MainRouterImpl.kt similarity index 91% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/main/MainRouterImpl.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/router/main/MainRouterImpl.kt index 2a10039a0..a8b6cbd5b 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/navigation/router/main/MainRouterImpl.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/navigation/router/main/MainRouterImpl.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.presentation.navigation.router.main +package dev.minios.pdaiv1.presentation.navigation.router.main -import com.shifthackz.aisdv1.presentation.model.LaunchSource -import com.shifthackz.aisdv1.presentation.navigation.NavigationEffect -import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute +import dev.minios.pdaiv1.presentation.model.LaunchSource +import dev.minios.pdaiv1.presentation.navigation.NavigationEffect +import dev.minios.pdaiv1.presentation.navigation.NavigationRoute import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.subjects.PublishSubject diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/debug/DebugMenuAccessor.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/debug/DebugMenuAccessor.kt similarity index 71% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/debug/DebugMenuAccessor.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/debug/DebugMenuAccessor.kt index b080c44b0..018cf122d 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/debug/DebugMenuAccessor.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/debug/DebugMenuAccessor.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.presentation.screen.debug +package dev.minios.pdaiv1.presentation.screen.debug -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.presentation.utils.Constants +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.presentation.utils.Constants class DebugMenuAccessor( private val preferenceManager: PreferenceManager, diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/debug/DebugMenuEffect.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/debug/DebugMenuEffect.kt similarity index 61% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/debug/DebugMenuEffect.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/debug/DebugMenuEffect.kt index 132c65229..b6aada009 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/debug/DebugMenuEffect.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/debug/DebugMenuEffect.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.presentation.screen.debug +package dev.minios.pdaiv1.presentation.screen.debug -import com.shifthackz.aisdv1.core.model.UiText +import dev.minios.pdaiv1.core.model.UiText import com.shifthackz.android.core.mvi.MviEffect sealed interface DebugMenuEffect : MviEffect { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/debug/DebugMenuIntent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/debug/DebugMenuIntent.kt similarity index 84% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/debug/DebugMenuIntent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/debug/DebugMenuIntent.kt index dae80520d..0fcd623e9 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/debug/DebugMenuIntent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/debug/DebugMenuIntent.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.presentation.screen.debug +package dev.minios.pdaiv1.presentation.screen.debug -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersToken +import dev.minios.pdaiv1.core.common.schedulers.SchedulersToken import com.shifthackz.android.core.mvi.MviIntent sealed interface DebugMenuIntent : MviIntent { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/debug/DebugMenuMappers.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/debug/DebugMenuMappers.kt similarity index 56% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/debug/DebugMenuMappers.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/debug/DebugMenuMappers.kt index 3d2c705f9..19ba65e37 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/debug/DebugMenuMappers.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/debug/DebugMenuMappers.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.presentation.screen.debug +package dev.minios.pdaiv1.presentation.screen.debug -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersToken -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.common.schedulers.SchedulersToken +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.core.localization.R as LocalizationR fun SchedulersToken.mapToUi(): UiText = when (this) { SchedulersToken.MAIN_THREAD -> LocalizationR.string.scheduler_main diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/debug/DebugMenuScreen.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/debug/DebugMenuScreen.kt similarity index 94% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/debug/DebugMenuScreen.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/debug/DebugMenuScreen.kt index 7654b6c04..aec418a0b 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/debug/DebugMenuScreen.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/debug/DebugMenuScreen.kt @@ -1,6 +1,6 @@ @file:OptIn(ExperimentalMaterial3Api::class) -package com.shifthackz.aisdv1.presentation.screen.debug +package dev.minios.pdaiv1.presentation.screen.debug import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize @@ -31,14 +31,14 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.common.extensions.showToast -import com.shifthackz.aisdv1.core.model.asUiText +import dev.minios.pdaiv1.core.common.extensions.showToast +import dev.minios.pdaiv1.core.model.asUiText import com.shifthackz.android.core.mvi.MviComponent -import com.shifthackz.aisdv1.presentation.modal.ModalRenderer -import com.shifthackz.aisdv1.presentation.widget.item.SettingsHeader -import com.shifthackz.aisdv1.presentation.widget.item.SettingsItem +import dev.minios.pdaiv1.presentation.modal.ModalRenderer +import dev.minios.pdaiv1.presentation.widget.item.SettingsHeader +import dev.minios.pdaiv1.presentation.widget.item.SettingsItem import org.koin.androidx.compose.koinViewModel -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun DebugMenuScreen() { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/debug/DebugMenuState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/debug/DebugMenuState.kt similarity index 60% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/debug/DebugMenuState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/debug/DebugMenuState.kt index 20fa36e49..9b79e1c5f 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/debug/DebugMenuState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/debug/DebugMenuState.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.presentation.screen.debug +package dev.minios.pdaiv1.presentation.screen.debug -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersToken -import com.shifthackz.aisdv1.presentation.model.Modal +import dev.minios.pdaiv1.core.common.schedulers.SchedulersToken +import dev.minios.pdaiv1.presentation.model.Modal import com.shifthackz.android.core.mvi.MviState data class DebugMenuState( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/debug/DebugMenuViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/debug/DebugMenuViewModel.kt similarity index 77% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/debug/DebugMenuViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/debug/DebugMenuViewModel.kt index c6b5f7de4..9b5a95b15 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/debug/DebugMenuViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/debug/DebugMenuViewModel.kt @@ -1,20 +1,20 @@ -package com.shifthackz.aisdv1.presentation.screen.debug - -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.core.common.log.FileLoggingTree -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel -import com.shifthackz.aisdv1.domain.feature.work.BackgroundTaskManager -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.debug.DebugInsertBadBase64UseCase -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter +package dev.minios.pdaiv1.presentation.screen.debug + +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.core.common.log.FileLoggingTree +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.schedulers.subscribeOnMainThread +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.core.viewmodel.MviRxViewModel +import dev.minios.pdaiv1.domain.feature.work.BackgroundTaskManager +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.debug.DebugInsertBadBase64UseCase +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter import io.reactivex.rxjava3.kotlin.subscribeBy -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR class DebugMenuViewModel( dispatchersProvider: DispatchersProvider, diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/donate/DonateEffect.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/donate/DonateEffect.kt similarity index 72% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/donate/DonateEffect.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/donate/DonateEffect.kt index 98d548167..28c6b0842 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/donate/DonateEffect.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/donate/DonateEffect.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.donate +package dev.minios.pdaiv1.presentation.screen.donate import com.shifthackz.android.core.mvi.MviEffect diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/donate/DonateIntent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/donate/DonateIntent.kt similarity index 81% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/donate/DonateIntent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/donate/DonateIntent.kt index 72ecbf26f..7cc1d2a51 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/donate/DonateIntent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/donate/DonateIntent.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.presentation.screen.donate +package dev.minios.pdaiv1.presentation.screen.donate -import com.shifthackz.aisdv1.core.common.links.LinksProvider +import dev.minios.pdaiv1.core.common.links.LinksProvider import com.shifthackz.android.core.mvi.MviIntent import org.koin.core.component.KoinComponent import org.koin.core.component.inject diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/donate/DonateScreen.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/donate/DonateScreen.kt similarity index 94% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/donate/DonateScreen.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/donate/DonateScreen.kt index 732baf225..a88776e54 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/donate/DonateScreen.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/donate/DonateScreen.kt @@ -1,6 +1,6 @@ @file:OptIn(ExperimentalMaterial3Api::class) -package com.shifthackz.aisdv1.presentation.screen.donate +package dev.minios.pdaiv1.presentation.screen.donate import androidx.compose.animation.AnimatedContent import androidx.compose.foundation.Image @@ -46,15 +46,15 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.shifthackz.aisdv1.core.common.extensions.openUrl -import com.shifthackz.aisdv1.core.extensions.fadedEdge -import com.shifthackz.aisdv1.domain.entity.Supporter -import com.shifthackz.aisdv1.presentation.widget.item.SupporterItem +import dev.minios.pdaiv1.core.common.extensions.openUrl +import dev.minios.pdaiv1.core.extensions.fadedEdge +import dev.minios.pdaiv1.domain.entity.Supporter +import dev.minios.pdaiv1.presentation.widget.item.SupporterItem import com.shifthackz.android.core.mvi.MviComponent import org.koin.androidx.compose.koinViewModel import java.util.Date -import com.shifthackz.aisdv1.core.localization.R as LocalizationR -import com.shifthackz.aisdv1.presentation.R as PresentationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.presentation.R as PresentationR @Composable fun DonateScreen() { @@ -125,8 +125,8 @@ private fun DonateScreenContent( ) { Image( modifier = Modifier.size(36.dp), - painter = painterResource(id = PresentationR.drawable.ic_sdai_logo), - contentDescription = "SDAI Android Branding", + painter = painterResource(id = PresentationR.drawable.ic_pdai_logo), + contentDescription = "PDAI Android Branding", ) Text( text = stringResource(id = LocalizationR.string.donate_bs_title), @@ -256,13 +256,13 @@ private fun StateContentPreview() { id = 0, name = "ShiftHackZ", date = Date(), - message = "Sdai", + message = "Pdai", ), Supporter( id = 1, name = "ShiftHackZ", date = Date(), - message = "Sdai", + message = "Pdai", ), ), ), diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/donate/DonateState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/donate/DonateState.kt similarity index 67% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/donate/DonateState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/donate/DonateState.kt index 5bfc02d12..15dd5b93b 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/donate/DonateState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/donate/DonateState.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.presentation.screen.donate +package dev.minios.pdaiv1.presentation.screen.donate import androidx.compose.runtime.Immutable -import com.shifthackz.aisdv1.domain.entity.Supporter +import dev.minios.pdaiv1.domain.entity.Supporter import com.shifthackz.android.core.mvi.MviState @Immutable diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/donate/DonateViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/donate/DonateViewModel.kt similarity index 70% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/donate/DonateViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/donate/DonateViewModel.kt index dafb978af..05acc8f12 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/donate/DonateViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/donate/DonateViewModel.kt @@ -1,12 +1,12 @@ -package com.shifthackz.aisdv1.presentation.screen.donate +package dev.minios.pdaiv1.presentation.screen.donate -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread -import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel -import com.shifthackz.aisdv1.domain.usecase.donate.FetchAndGetSupportersUseCase -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.schedulers.subscribeOnMainThread +import dev.minios.pdaiv1.core.viewmodel.MviRxViewModel +import dev.minios.pdaiv1.domain.usecase.donate.FetchAndGetSupportersUseCase +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter import io.reactivex.rxjava3.kotlin.subscribeBy class DonateViewModel( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/drawer/DrawerIntent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/drawer/DrawerIntent.kt similarity index 75% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/drawer/DrawerIntent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/drawer/DrawerIntent.kt index cc8244fdd..eb74dac71 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/drawer/DrawerIntent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/drawer/DrawerIntent.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.drawer +package dev.minios.pdaiv1.presentation.screen.drawer import com.shifthackz.android.core.mvi.MviIntent diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/drawer/DrawerScreen.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/drawer/DrawerScreen.kt similarity index 90% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/drawer/DrawerScreen.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/drawer/DrawerScreen.kt index 0371b910f..374e8ecbd 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/drawer/DrawerScreen.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/drawer/DrawerScreen.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.drawer +package dev.minios.pdaiv1.presentation.screen.drawer import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Arrangement @@ -28,14 +28,14 @@ import androidx.compose.ui.unit.dp import androidx.navigation.NavBackStackEntry import androidx.navigation.NavDestination import androidx.navigation.NavDestination.Companion.hasRoute -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.core.model.asString +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.core.model.asString import com.shifthackz.android.core.mvi.MviComponent -import com.shifthackz.aisdv1.presentation.R -import com.shifthackz.aisdv1.presentation.model.NavItem -import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute -import com.shifthackz.aisdv1.presentation.utils.Constants -import com.shifthackz.aisdv1.presentation.widget.item.NavigationItemIcon +import dev.minios.pdaiv1.presentation.R +import dev.minios.pdaiv1.presentation.model.NavItem +import dev.minios.pdaiv1.presentation.navigation.NavigationRoute +import dev.minios.pdaiv1.presentation.utils.Constants +import dev.minios.pdaiv1.presentation.widget.item.NavigationItemIcon import org.koin.androidx.compose.koinViewModel import org.koin.compose.koinInject @@ -80,8 +80,8 @@ fun DrawerScreen( verticalAlignment = Alignment.CenterVertically, ) { Image( - painter = painterResource(id = R.drawable.ic_sdai_logo), - contentDescription = "SDAI Android Branding", + painter = painterResource(id = R.drawable.ic_pdai_logo), + contentDescription = "PDAI Android Branding", ) Column( modifier = Modifier.padding(start = 12.dp) @@ -91,7 +91,7 @@ fun DrawerScreen( verticalAlignment = Alignment.CenterVertically, ) { Text( - text = "SDAI", + text = "PDAI", style = MaterialTheme.typography.headlineMedium, ) Icon( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/drawer/DrawerViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/drawer/DrawerViewModel.kt similarity index 75% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/drawer/DrawerViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/drawer/DrawerViewModel.kt index 9c9ca080b..b59f3394d 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/drawer/DrawerViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/drawer/DrawerViewModel.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.presentation.screen.drawer +package dev.minios.pdaiv1.presentation.screen.drawer -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.presentation.navigation.router.drawer.DrawerRouter +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.presentation.navigation.router.drawer.DrawerRouter import com.shifthackz.android.core.mvi.EmptyEffect import com.shifthackz.android.core.mvi.EmptyState import com.shifthackz.android.core.mvi.MviViewModel diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationEffect.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/falai/FalAiGenerationEffect.kt similarity index 64% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationEffect.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/falai/FalAiGenerationEffect.kt index cf6fe7aaa..04406df71 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationEffect.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/falai/FalAiGenerationEffect.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.falai +package dev.minios.pdaiv1.presentation.screen.falai import com.shifthackz.android.core.mvi.MviEffect diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationIntent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/falai/FalAiGenerationIntent.kt similarity index 80% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationIntent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/falai/FalAiGenerationIntent.kt index e6e2a2705..2a3560ba4 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationIntent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/falai/FalAiGenerationIntent.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.presentation.screen.falai +package dev.minios.pdaiv1.presentation.screen.falai -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.screen.drawer.DrawerIntent +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.screen.drawer.DrawerIntent import com.shifthackz.android.core.mvi.MviIntent sealed interface FalAiGenerationIntent : MviIntent { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationScreen.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/falai/FalAiGenerationScreen.kt similarity index 94% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationScreen.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/falai/FalAiGenerationScreen.kt index 2ac68d175..7d83116ac 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationScreen.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/falai/FalAiGenerationScreen.kt @@ -1,6 +1,6 @@ @file:OptIn(ExperimentalMaterial3Api::class) -package com.shifthackz.aisdv1.presentation.screen.falai +package dev.minios.pdaiv1.presentation.screen.falai import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box @@ -32,13 +32,13 @@ import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.shifthackz.android.core.mvi.MviComponent -import com.shifthackz.aisdv1.presentation.modal.ModalRenderer -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.screen.drawer.DrawerIntent -import com.shifthackz.aisdv1.presentation.widget.falai.FalAiDynamicForm -import com.shifthackz.aisdv1.presentation.widget.work.BackgroundWorkWidget +import dev.minios.pdaiv1.presentation.modal.ModalRenderer +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.screen.drawer.DrawerIntent +import dev.minios.pdaiv1.presentation.widget.falai.FalAiDynamicForm +import dev.minios.pdaiv1.presentation.widget.work.BackgroundWorkWidget import org.koin.androidx.compose.koinViewModel -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun FalAiGenerationScreen() { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/falai/FalAiGenerationState.kt similarity index 78% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/falai/FalAiGenerationState.kt index 08dc73618..6ef039069 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/falai/FalAiGenerationState.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.presentation.screen.falai +package dev.minios.pdaiv1.presentation.screen.falai import androidx.compose.runtime.Immutable -import com.shifthackz.aisdv1.presentation.model.FalAiEndpointUi -import com.shifthackz.aisdv1.presentation.model.FalAiPropertyUi -import com.shifthackz.aisdv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.model.FalAiEndpointUi +import dev.minios.pdaiv1.presentation.model.FalAiPropertyUi +import dev.minios.pdaiv1.presentation.model.Modal import com.shifthackz.android.core.mvi.MviState @Immutable diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/falai/FalAiGenerationViewModel.kt similarity index 90% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/falai/FalAiGenerationViewModel.kt index c12062053..31afbb1f9 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/falai/FalAiGenerationViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/falai/FalAiGenerationViewModel.kt @@ -1,32 +1,32 @@ -package com.shifthackz.aisdv1.presentation.screen.falai - -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.core.common.appbuild.BuildType -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.core.notification.PushNotificationManager -import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.FalAiEndpoint -import com.shifthackz.aisdv1.domain.entity.FalAiPayload -import com.shifthackz.aisdv1.domain.entity.FalAiPropertyType -import com.shifthackz.aisdv1.domain.feature.work.BackgroundTaskManager -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.interactor.wakelock.WakeLockInterActor -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.repository.FalAiEndpointRepository -import com.shifthackz.aisdv1.domain.repository.FalAiGenerationRepository -import com.shifthackz.aisdv1.domain.usecase.generation.SaveGenerationResultUseCase -import com.shifthackz.aisdv1.presentation.core.GenerationFormUpdateEvent -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.model.toUi -import com.shifthackz.aisdv1.presentation.navigation.router.drawer.DrawerRouter -import com.shifthackz.aisdv1.presentation.screen.drawer.DrawerIntent +package dev.minios.pdaiv1.presentation.screen.falai + +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.core.common.appbuild.BuildType +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.schedulers.subscribeOnMainThread +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.core.notification.PushNotificationManager +import dev.minios.pdaiv1.core.viewmodel.MviRxViewModel +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.FalAiEndpoint +import dev.minios.pdaiv1.domain.entity.FalAiPayload +import dev.minios.pdaiv1.domain.entity.FalAiPropertyType +import dev.minios.pdaiv1.domain.feature.work.BackgroundTaskManager +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.interactor.wakelock.WakeLockInterActor +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.repository.FalAiEndpointRepository +import dev.minios.pdaiv1.domain.repository.FalAiGenerationRepository +import dev.minios.pdaiv1.domain.usecase.generation.SaveGenerationResultUseCase +import dev.minios.pdaiv1.presentation.core.GenerationFormUpdateEvent +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.model.toUi +import dev.minios.pdaiv1.presentation.navigation.router.drawer.DrawerRouter +import dev.minios.pdaiv1.presentation.screen.drawer.DrawerIntent import io.reactivex.rxjava3.kotlin.subscribeBy -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR class FalAiGenerationViewModel( dispatchersProvider: DispatchersProvider, diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailBitmapExporter.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailBitmapExporter.kt similarity index 65% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailBitmapExporter.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailBitmapExporter.kt index c322b6544..7aba67e55 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailBitmapExporter.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailBitmapExporter.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.presentation.screen.gallery.detail +package dev.minios.pdaiv1.presentation.screen.gallery.detail import android.graphics.Bitmap -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.presentation.utils.FileSavableExporter +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.presentation.utils.FileSavableExporter import io.reactivex.rxjava3.core.Single import java.io.File diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailEffect.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailEffect.kt similarity index 86% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailEffect.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailEffect.kt index a2b7d94b9..c52ae4338 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailEffect.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailEffect.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.gallery.detail +package dev.minios.pdaiv1.presentation.screen.gallery.detail import com.shifthackz.android.core.mvi.MviEffect import java.io.File diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailIntent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailIntent.kt similarity index 93% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailIntent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailIntent.kt index 759bc6446..18f36ce6d 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailIntent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailIntent.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.gallery.detail +package dev.minios.pdaiv1.presentation.screen.gallery.detail import com.shifthackz.android.core.mvi.MviIntent diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailMocks.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailMocks.kt similarity index 84% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailMocks.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailMocks.kt index 91a993ace..c9e0e2b6a 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailMocks.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailMocks.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.presentation.screen.gallery.detail +package dev.minios.pdaiv1.presentation.screen.gallery.detail import android.graphics.Bitmap -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.domain.entity.AiGenerationResult val mockGalleryDetailTxt2Img = GalleryDetailState.Content( tabs = listOf( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailScreen.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailScreen.kt similarity index 96% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailScreen.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailScreen.kt index a3ffa212e..1f22219cd 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailScreen.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailScreen.kt @@ -1,6 +1,6 @@ @file:OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class) -package com.shifthackz.aisdv1.presentation.screen.gallery.detail +package dev.minios.pdaiv1.presentation.screen.gallery.detail import android.widget.Toast import androidx.compose.animation.AnimatedVisibility @@ -63,25 +63,25 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.core.model.asString -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.core.sharing.shareFile +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.core.model.asString +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.core.sharing.shareFile import com.shifthackz.android.core.mvi.MviComponent -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.presentation.modal.ModalRenderer -import com.shifthackz.aisdv1.presentation.theme.colors -import com.shifthackz.aisdv1.presentation.utils.Constants -import com.shifthackz.aisdv1.presentation.widget.image.ZoomableImage -import com.shifthackz.aisdv1.presentation.widget.image.ZoomableImageSource +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.presentation.modal.ModalRenderer +import dev.minios.pdaiv1.presentation.theme.colors +import dev.minios.pdaiv1.presentation.utils.Constants +import dev.minios.pdaiv1.presentation.widget.image.ZoomableImage +import dev.minios.pdaiv1.presentation.widget.image.ZoomableImageSource import com.shifthackz.catppuccin.palette.Catppuccin import org.koin.androidx.compose.koinViewModel import org.koin.compose.koinInject import org.koin.core.parameter.parametersOf -import com.shifthackz.aisdv1.core.localization.R as LocalizationR -import com.shifthackz.aisdv1.presentation.R as PresentationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.presentation.R as PresentationR @Composable fun GalleryDetailScreen(itemId: Long) { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailSharing.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailSharing.kt similarity index 93% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailSharing.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailSharing.kt index 4cf2cb158..26212df32 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailSharing.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailSharing.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.presentation.screen.gallery.detail +package dev.minios.pdaiv1.presentation.screen.gallery.detail import android.content.Context -import com.shifthackz.aisdv1.core.sharing.shareText -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.sharing.shareText +import dev.minios.pdaiv1.core.localization.R as LocalizationR class GalleryDetailSharing { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailState.kt similarity index 90% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailState.kt index c6bb06cea..7ef174f01 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailState.kt @@ -1,19 +1,19 @@ -package com.shifthackz.aisdv1.presentation.screen.gallery.detail +package dev.minios.pdaiv1.presentation.screen.gallery.detail import android.graphics.Bitmap import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.compose.runtime.Immutable -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.presentation.extensions.mapToUi -import com.shifthackz.aisdv1.presentation.model.Modal +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.presentation.extensions.mapToUi +import dev.minios.pdaiv1.presentation.model.Modal import com.shifthackz.android.core.mvi.MviState -import com.shifthackz.aisdv1.core.localization.R as LocalizationR -import com.shifthackz.aisdv1.presentation.R as PresentationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.presentation.R as PresentationR sealed interface GalleryDetailState : MviState { val tabs: List diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailViewModel.kt similarity index 87% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailViewModel.kt index 6b2d1f2d7..a0b202fde 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailViewModel.kt @@ -1,27 +1,27 @@ -package com.shifthackz.aisdv1.presentation.screen.gallery.detail +package dev.minios.pdaiv1.presentation.screen.gallery.detail import android.graphics.Bitmap -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.core.common.appbuild.BuildType -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter.Input -import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.caching.GetLastResultFromCacheUseCase -import com.shifthackz.aisdv1.domain.usecase.gallery.DeleteGalleryItemUseCase -import com.shifthackz.aisdv1.domain.usecase.gallery.GetGalleryPagedIdsUseCase -import com.shifthackz.aisdv1.domain.usecase.gallery.ToggleImageVisibilityUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.GetGenerationResultUseCase -import com.shifthackz.aisdv1.presentation.core.GenerationFormUpdateEvent -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.core.common.appbuild.BuildType +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.schedulers.subscribeOnMainThread +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter.Input +import dev.minios.pdaiv1.core.viewmodel.MviRxViewModel +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.caching.GetLastResultFromCacheUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.DeleteGalleryItemUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.GetGalleryPagedIdsUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.ToggleImageVisibilityUseCase +import dev.minios.pdaiv1.domain.usecase.generation.GetGenerationResultUseCase +import dev.minios.pdaiv1.presentation.core.GenerationFormUpdateEvent +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.kotlin.subscribeBy @@ -188,7 +188,7 @@ class GalleryDetailViewModel( val stream = ByteArrayOutputStream() bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream) mediaStoreGateway.exportToFile( - fileName = "sdai_${System.currentTimeMillis()}", + fileName = "pdai_${System.currentTimeMillis()}", content = stream.toByteArray(), ) } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryEffect.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryEffect.kt similarity index 84% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryEffect.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryEffect.kt index a67ae1207..18fe3f57b 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryEffect.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryEffect.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.gallery.list +package dev.minios.pdaiv1.presentation.screen.gallery.list import android.net.Uri import com.shifthackz.android.core.mvi.MviEffect diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryExporter.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryExporter.kt similarity index 64% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryExporter.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryExporter.kt index bbdd70e45..7cac159eb 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryExporter.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryExporter.kt @@ -1,14 +1,14 @@ -package com.shifthackz.aisdv1.presentation.screen.gallery.list +package dev.minios.pdaiv1.presentation.screen.gallery.list -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter.Input -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter.Output -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.usecase.gallery.GetAllGalleryUseCase -import com.shifthackz.aisdv1.domain.usecase.gallery.GetGalleryItemsUseCase -import com.shifthackz.aisdv1.presentation.utils.FileSavableExporter +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter.Input +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter.Output +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.usecase.gallery.GetAllGalleryUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.GetGalleryItemsUseCase +import dev.minios.pdaiv1.presentation.utils.FileSavableExporter import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single import java.io.File diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryIntent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryIntent.kt similarity index 90% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryIntent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryIntent.kt index 51d3b7abd..083474d1a 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryIntent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryIntent.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.presentation.screen.gallery.list +package dev.minios.pdaiv1.presentation.screen.gallery.list import android.net.Uri -import com.shifthackz.aisdv1.presentation.screen.drawer.DrawerIntent +import dev.minios.pdaiv1.presentation.screen.drawer.DrawerIntent import com.shifthackz.android.core.mvi.MviIntent sealed interface GalleryIntent : MviIntent { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryPagingSource.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryPagingSource.kt similarity index 83% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryPagingSource.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryPagingSource.kt index c2a2fa3ac..470ad5c15 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryPagingSource.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryPagingSource.kt @@ -1,15 +1,15 @@ -package com.shifthackz.aisdv1.presentation.screen.gallery.list +package dev.minios.pdaiv1.presentation.screen.gallery.list import androidx.paging.PagingSource import androidx.paging.PagingState import androidx.paging.rxjava3.RxPagingSource -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter.Input -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter.Output -import com.shifthackz.aisdv1.domain.usecase.generation.GetGenerationResultPagedUseCase -import com.shifthackz.aisdv1.presentation.utils.Constants +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter.Input +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter.Output +import dev.minios.pdaiv1.domain.usecase.generation.GetGenerationResultPagedUseCase +import dev.minios.pdaiv1.presentation.utils.Constants import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.core.Single diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryScreen.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryScreen.kt similarity index 97% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryScreen.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryScreen.kt index fd45b0a00..a2d41ad45 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryScreen.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryScreen.kt @@ -3,7 +3,7 @@ ExperimentalFoundationApi::class, ) -package com.shifthackz.aisdv1.presentation.screen.gallery.list +package dev.minios.pdaiv1.presentation.screen.gallery.list import android.content.Intent import android.provider.DocumentsContract @@ -94,21 +94,21 @@ import androidx.compose.ui.unit.sp import androidx.paging.LoadState import androidx.paging.compose.LazyPagingItems import androidx.paging.compose.collectAsLazyPagingItems -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.core.extensions.items -import com.shifthackz.aisdv1.core.extensions.shake -import com.shifthackz.aisdv1.core.extensions.shimmer -import com.shifthackz.aisdv1.core.sharing.shareFile -import com.shifthackz.aisdv1.domain.entity.Grid -import com.shifthackz.aisdv1.presentation.R -import com.shifthackz.aisdv1.presentation.modal.ModalRenderer -import com.shifthackz.aisdv1.presentation.screen.drawer.DrawerIntent -import com.shifthackz.aisdv1.presentation.utils.Constants -import com.shifthackz.aisdv1.presentation.widget.work.BackgroundWorkWidget +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.core.extensions.items +import dev.minios.pdaiv1.core.extensions.shake +import dev.minios.pdaiv1.core.extensions.shimmer +import dev.minios.pdaiv1.core.sharing.shareFile +import dev.minios.pdaiv1.domain.entity.Grid +import dev.minios.pdaiv1.presentation.R +import dev.minios.pdaiv1.presentation.modal.ModalRenderer +import dev.minios.pdaiv1.presentation.screen.drawer.DrawerIntent +import dev.minios.pdaiv1.presentation.utils.Constants +import dev.minios.pdaiv1.presentation.widget.work.BackgroundWorkWidget import com.shifthackz.android.core.mvi.MviComponent import org.koin.androidx.compose.koinViewModel import org.koin.compose.koinInject -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun GalleryScreen() { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryState.kt similarity index 80% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryState.kt index cfa13b1a2..ca2d7f200 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryState.kt @@ -1,12 +1,12 @@ -package com.shifthackz.aisdv1.presentation.screen.gallery.list +package dev.minios.pdaiv1.presentation.screen.gallery.list import android.graphics.Bitmap import androidx.compose.runtime.Immutable import androidx.compose.ui.graphics.ImageBitmap import androidx.compose.ui.graphics.asImageBitmap -import com.shifthackz.aisdv1.domain.entity.Grid -import com.shifthackz.aisdv1.domain.entity.MediaStoreInfo -import com.shifthackz.aisdv1.presentation.model.Modal +import dev.minios.pdaiv1.domain.entity.Grid +import dev.minios.pdaiv1.domain.entity.MediaStoreInfo +import dev.minios.pdaiv1.presentation.model.Modal import com.shifthackz.android.core.mvi.MviState @Immutable diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryViewModel.kt similarity index 84% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryViewModel.kt index 4101269a7..bfd9f0ea1 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryViewModel.kt @@ -1,30 +1,30 @@ -package com.shifthackz.aisdv1.presentation.screen.gallery.list +package dev.minios.pdaiv1.presentation.screen.gallery.list import androidx.paging.Pager import androidx.paging.PagingConfig import androidx.paging.PagingData -import com.shifthackz.aisdv1.core.common.extensions.EmptyLambda -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel -import com.shifthackz.aisdv1.domain.entity.BackgroundWorkResult -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.gallery.DeleteAllGalleryUseCase -import com.shifthackz.aisdv1.domain.usecase.gallery.DeleteGalleryItemsUseCase -import com.shifthackz.aisdv1.domain.usecase.gallery.GetAllGalleryUseCase -import com.shifthackz.aisdv1.domain.usecase.gallery.GetMediaStoreInfoUseCase -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway -import com.shifthackz.aisdv1.domain.usecase.generation.GetGenerationResultPagedUseCase -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.navigation.router.drawer.DrawerRouter -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter -import com.shifthackz.aisdv1.presentation.screen.drawer.DrawerIntent -import com.shifthackz.aisdv1.presentation.utils.Constants +import dev.minios.pdaiv1.core.common.extensions.EmptyLambda +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.schedulers.subscribeOnMainThread +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.core.viewmodel.MviRxViewModel +import dev.minios.pdaiv1.domain.entity.BackgroundWorkResult +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.gallery.DeleteAllGalleryUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.DeleteGalleryItemsUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.GetAllGalleryUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.GetMediaStoreInfoUseCase +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.domain.usecase.generation.GetGenerationResultPagedUseCase +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.navigation.router.drawer.DrawerRouter +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.presentation.screen.drawer.DrawerIntent +import dev.minios.pdaiv1.presentation.utils.Constants import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.kotlin.subscribeBy import kotlinx.coroutines.flow.Flow @@ -227,7 +227,7 @@ class GalleryViewModel( val stream = java.io.ByteArrayOutputStream() output.bitmap.compress(android.graphics.Bitmap.CompressFormat.PNG, 100, stream) mediaStoreGateway.exportToFile( - fileName = "sdai_${item.id}_${System.currentTimeMillis()}", + fileName = "pdai_${item.id}_${System.currentTimeMillis()}", content = stream.toByteArray(), ) } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationIntent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/home/HomeNavigationIntent.kt similarity index 67% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationIntent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/home/HomeNavigationIntent.kt index 84550d55a..c4f72fda6 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationIntent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/home/HomeNavigationIntent.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.presentation.screen.home +package dev.minios.pdaiv1.presentation.screen.home -import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute +import dev.minios.pdaiv1.presentation.navigation.NavigationRoute import com.shifthackz.android.core.mvi.MviIntent sealed interface HomeNavigationIntent : MviIntent { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationMappers.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/home/HomeNavigationMappers.kt similarity index 57% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationMappers.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/home/HomeNavigationMappers.kt index 4c30dc640..b57836fbd 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationMappers.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/home/HomeNavigationMappers.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.presentation.screen.home +package dev.minios.pdaiv1.presentation.screen.home -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.presentation.navigation.NavigationRoute fun AiGenerationResult.Type.mapToRoute(): NavigationRoute = when (this) { AiGenerationResult.Type.TEXT_TO_IMAGE -> NavigationRoute.HomeNavigation.TxtToImg diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationScreen.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/home/HomeNavigationScreen.kt similarity index 93% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationScreen.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/home/HomeNavigationScreen.kt index b43e304f5..9d19e551f 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationScreen.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/home/HomeNavigationScreen.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.home +package dev.minios.pdaiv1.presentation.screen.home import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box @@ -23,12 +23,12 @@ import androidx.navigation.compose.NavHost import androidx.navigation.compose.composable import androidx.navigation.compose.currentBackStackEntryAsState import androidx.navigation.compose.rememberNavController -import com.shifthackz.aisdv1.core.model.asString +import dev.minios.pdaiv1.core.model.asString import com.shifthackz.android.core.mvi.MviComponent -import com.shifthackz.aisdv1.presentation.model.NavItem -import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute.HomeNavigation -import com.shifthackz.aisdv1.presentation.widget.connectivity.ConnectivityComposable -import com.shifthackz.aisdv1.presentation.widget.item.NavigationItemIcon +import dev.minios.pdaiv1.presentation.model.NavItem +import dev.minios.pdaiv1.presentation.navigation.NavigationRoute.HomeNavigation +import dev.minios.pdaiv1.presentation.widget.connectivity.ConnectivityComposable +import dev.minios.pdaiv1.presentation.widget.item.NavigationItemIcon import org.koin.androidx.compose.koinViewModel @Composable diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/home/HomeNavigationViewModel.kt similarity index 69% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/home/HomeNavigationViewModel.kt index 09ad7c5b0..cd9200643 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/home/HomeNavigationViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/home/HomeNavigationViewModel.kt @@ -1,17 +1,17 @@ -package com.shifthackz.aisdv1.presentation.screen.home +package dev.minios.pdaiv1.presentation.screen.home -import com.shifthackz.aisdv1.core.common.extensions.EmptyLambda -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread -import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.presentation.core.GenerationFormUpdateEvent -import com.shifthackz.aisdv1.presentation.navigation.NavigationEffect -import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute -import com.shifthackz.aisdv1.presentation.navigation.router.home.HomeRouter +import dev.minios.pdaiv1.core.common.extensions.EmptyLambda +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.schedulers.subscribeOnMainThread +import dev.minios.pdaiv1.core.viewmodel.MviRxViewModel +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.presentation.core.GenerationFormUpdateEvent +import dev.minios.pdaiv1.presentation.navigation.NavigationEffect +import dev.minios.pdaiv1.presentation.navigation.NavigationRoute +import dev.minios.pdaiv1.presentation.navigation.router.home.HomeRouter import com.shifthackz.android.core.mvi.EmptyState import io.reactivex.rxjava3.core.Observable import io.reactivex.rxjava3.kotlin.subscribeBy diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageEffect.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/img2img/ImageToImageEffect.kt similarity index 69% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageEffect.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/img2img/ImageToImageEffect.kt index 9a46b6b82..130b98583 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageEffect.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/img2img/ImageToImageEffect.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.img2img +package dev.minios.pdaiv1.presentation.screen.img2img import com.shifthackz.android.core.mvi.MviEffect diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageScreen.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/img2img/ImageToImageScreen.kt similarity index 94% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageScreen.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/img2img/ImageToImageScreen.kt index c68859da0..fc008235b 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageScreen.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/img2img/ImageToImageScreen.kt @@ -1,6 +1,6 @@ @file:OptIn(ExperimentalMaterial3Api::class) -package com.shifthackz.aisdv1.presentation.screen.img2img +package dev.minios.pdaiv1.presentation.screen.img2img import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.PickVisualMediaRequest @@ -62,31 +62,31 @@ import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.core.content.FileProvider -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.core.common.math.roundTo -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.core.model.asString -import com.shifthackz.aisdv1.core.model.asUiText +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.core.common.math.roundTo +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.core.model.asString +import dev.minios.pdaiv1.core.model.asUiText import com.shifthackz.android.core.mvi.MviComponent -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.presentation.core.GenerationMviIntent -import com.shifthackz.aisdv1.presentation.core.ImageToImageIntent -import com.shifthackz.aisdv1.presentation.modal.ModalRenderer -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.screen.drawer.DrawerIntent -import com.shifthackz.aisdv1.presentation.theme.sliderColors -import com.shifthackz.aisdv1.presentation.utils.Constants.DENOISING_STRENGTH_MAX -import com.shifthackz.aisdv1.presentation.utils.Constants.DENOISING_STRENGTH_MIN -import com.shifthackz.aisdv1.presentation.utils.PermissionUtil -import com.shifthackz.aisdv1.presentation.utils.uriToBitmap -import com.shifthackz.aisdv1.presentation.widget.input.GenerationInputForm -import com.shifthackz.aisdv1.presentation.widget.toolbar.GenerationBottomToolbar -import com.shifthackz.aisdv1.presentation.widget.work.BackgroundWorkWidget +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.presentation.core.GenerationMviIntent +import dev.minios.pdaiv1.presentation.core.ImageToImageIntent +import dev.minios.pdaiv1.presentation.modal.ModalRenderer +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.screen.drawer.DrawerIntent +import dev.minios.pdaiv1.presentation.theme.sliderColors +import dev.minios.pdaiv1.presentation.utils.Constants.DENOISING_STRENGTH_MAX +import dev.minios.pdaiv1.presentation.utils.Constants.DENOISING_STRENGTH_MIN +import dev.minios.pdaiv1.presentation.utils.PermissionUtil +import dev.minios.pdaiv1.presentation.utils.uriToBitmap +import dev.minios.pdaiv1.presentation.widget.input.GenerationInputForm +import dev.minios.pdaiv1.presentation.widget.toolbar.GenerationBottomToolbar +import dev.minios.pdaiv1.presentation.widget.work.BackgroundWorkWidget import org.koin.androidx.compose.koinViewModel import org.koin.compose.koinInject import java.io.File -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun ImageToImageScreen() { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/img2img/ImageToImageState.kt similarity index 87% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/img2img/ImageToImageState.kt index d561faa47..48f32f702 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/img2img/ImageToImageState.kt @@ -1,25 +1,25 @@ -package com.shifthackz.aisdv1.presentation.screen.img2img +package dev.minios.pdaiv1.presentation.screen.img2img import android.graphics.Bitmap import androidx.compose.runtime.Immutable -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.domain.entity.ADetailerConfig -import com.shifthackz.aisdv1.domain.entity.ForgeModule -import com.shifthackz.aisdv1.domain.entity.HiresConfig -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.ModelType -import com.shifthackz.aisdv1.domain.entity.OpenAiModel -import com.shifthackz.aisdv1.domain.entity.OpenAiQuality -import com.shifthackz.aisdv1.domain.entity.OpenAiSize -import com.shifthackz.aisdv1.domain.entity.OpenAiStyle -import com.shifthackz.aisdv1.domain.entity.Scheduler -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.entity.StabilityAiClipGuidance -import com.shifthackz.aisdv1.domain.entity.StabilityAiStylePreset -import com.shifthackz.aisdv1.presentation.core.GenerationMviState -import com.shifthackz.aisdv1.presentation.model.FalAiEndpointUi -import com.shifthackz.aisdv1.presentation.model.InPaintModel -import com.shifthackz.aisdv1.presentation.model.Modal +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.domain.entity.ADetailerConfig +import dev.minios.pdaiv1.domain.entity.ForgeModule +import dev.minios.pdaiv1.domain.entity.HiresConfig +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.ModelType +import dev.minios.pdaiv1.domain.entity.OpenAiModel +import dev.minios.pdaiv1.domain.entity.OpenAiQuality +import dev.minios.pdaiv1.domain.entity.OpenAiSize +import dev.minios.pdaiv1.domain.entity.OpenAiStyle +import dev.minios.pdaiv1.domain.entity.Scheduler +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.entity.StabilityAiClipGuidance +import dev.minios.pdaiv1.domain.entity.StabilityAiStylePreset +import dev.minios.pdaiv1.presentation.core.GenerationMviState +import dev.minios.pdaiv1.presentation.model.FalAiEndpointUi +import dev.minios.pdaiv1.presentation.model.InPaintModel +import dev.minios.pdaiv1.presentation.model.Modal @Immutable data class ImageToImageState( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/img2img/ImageToImageViewModel.kt similarity index 79% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/img2img/ImageToImageViewModel.kt index 2b783ae76..93c9209e9 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/img2img/ImageToImageViewModel.kt @@ -1,46 +1,46 @@ -package com.shifthackz.aisdv1.presentation.screen.img2img +package dev.minios.pdaiv1.presentation.screen.img2img -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.core.common.appbuild.BuildType -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.core.imageprocessing.BitmapToBase64Converter -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.core.notification.PushNotificationManager -import com.shifthackz.aisdv1.core.validation.dimension.DimensionValidator -import com.shifthackz.aisdv1.domain.entity.HordeProcessStatus -import com.shifthackz.aisdv1.domain.entity.ImageToImagePayload -import com.shifthackz.aisdv1.domain.entity.LocalDiffusionStatus -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.feature.work.BackgroundTaskManager -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.interactor.wakelock.WakeLockInterActor -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.caching.SaveLastResultToCacheUseCase -import com.shifthackz.aisdv1.domain.usecase.forgemodule.GetForgeModulesUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.GetRandomImageUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.ImageToImageUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.InterruptGenerationUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.ObserveHordeProcessStatusUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.ObserveLocalDiffusionProcessStatusUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.SaveGenerationResultUseCase -import com.shifthackz.aisdv1.domain.usecase.sdsampler.GetStableDiffusionSamplersUseCase -import com.shifthackz.aisdv1.presentation.core.GenerationFormUpdateEvent -import com.shifthackz.aisdv1.presentation.core.GenerationMviIntent -import com.shifthackz.aisdv1.presentation.core.GenerationMviViewModel -import com.shifthackz.aisdv1.presentation.core.ImageToImageIntent -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.navigation.router.drawer.DrawerRouter -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter -import com.shifthackz.aisdv1.presentation.screen.inpaint.InPaintStateProducer +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.core.common.appbuild.BuildType +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.schedulers.subscribeOnMainThread +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.core.imageprocessing.BitmapToBase64Converter +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.core.notification.PushNotificationManager +import dev.minios.pdaiv1.core.validation.dimension.DimensionValidator +import dev.minios.pdaiv1.domain.entity.HordeProcessStatus +import dev.minios.pdaiv1.domain.entity.ImageToImagePayload +import dev.minios.pdaiv1.domain.entity.LocalDiffusionStatus +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.feature.work.BackgroundTaskManager +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.interactor.wakelock.WakeLockInterActor +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.caching.SaveLastResultToCacheUseCase +import dev.minios.pdaiv1.domain.usecase.forgemodule.GetForgeModulesUseCase +import dev.minios.pdaiv1.domain.usecase.generation.GetRandomImageUseCase +import dev.minios.pdaiv1.domain.usecase.generation.ImageToImageUseCase +import dev.minios.pdaiv1.domain.usecase.generation.InterruptGenerationUseCase +import dev.minios.pdaiv1.domain.usecase.generation.ObserveHordeProcessStatusUseCase +import dev.minios.pdaiv1.domain.usecase.generation.ObserveLocalDiffusionProcessStatusUseCase +import dev.minios.pdaiv1.domain.usecase.generation.SaveGenerationResultUseCase +import dev.minios.pdaiv1.domain.usecase.sdsampler.GetStableDiffusionSamplersUseCase +import dev.minios.pdaiv1.presentation.core.GenerationFormUpdateEvent +import dev.minios.pdaiv1.presentation.core.GenerationMviIntent +import dev.minios.pdaiv1.presentation.core.GenerationMviViewModel +import dev.minios.pdaiv1.presentation.core.ImageToImageIntent +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.navigation.router.drawer.DrawerRouter +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.presentation.screen.inpaint.InPaintStateProducer import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.kotlin.subscribeBy -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR class ImageToImageViewModel( dispatchersProvider: DispatchersProvider, diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintIntent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/InPaintIntent.kt similarity index 87% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintIntent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/InPaintIntent.kt index a14c811cf..6aeea1a7c 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintIntent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/InPaintIntent.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.presentation.screen.inpaint +package dev.minios.pdaiv1.presentation.screen.inpaint import android.graphics.Bitmap import androidx.compose.ui.graphics.Path -import com.shifthackz.aisdv1.presentation.model.InPaintModel -import com.shifthackz.aisdv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.model.InPaintModel +import dev.minios.pdaiv1.presentation.model.Modal import com.shifthackz.android.core.mvi.MviIntent sealed interface InPaintIntent : MviIntent { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintScreen.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/InPaintScreen.kt similarity index 95% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintScreen.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/InPaintScreen.kt index 8c3050ed3..f5dc10177 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintScreen.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/InPaintScreen.kt @@ -1,6 +1,6 @@ @file:OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class) -package com.shifthackz.aisdv1.presentation.screen.inpaint +package dev.minios.pdaiv1.presentation.screen.inpaint import androidx.activity.compose.BackHandler import androidx.compose.animation.AnimatedVisibility @@ -46,13 +46,13 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import com.shifthackz.android.core.mvi.MviComponent -import com.shifthackz.aisdv1.presentation.modal.ModalRenderer -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.screen.inpaint.components.CapSizeSlider -import com.shifthackz.aisdv1.presentation.screen.inpaint.forms.ImageDrawForm -import com.shifthackz.aisdv1.presentation.screen.inpaint.forms.InPaintParamsForm +import dev.minios.pdaiv1.presentation.modal.ModalRenderer +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.screen.inpaint.components.CapSizeSlider +import dev.minios.pdaiv1.presentation.screen.inpaint.forms.ImageDrawForm +import dev.minios.pdaiv1.presentation.screen.inpaint.forms.InPaintParamsForm import org.koin.androidx.compose.koinViewModel -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun InPaintScreen( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/InPaintState.kt similarity index 76% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/InPaintState.kt index 31dccd25b..789600ab4 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/InPaintState.kt @@ -1,14 +1,14 @@ -package com.shifthackz.aisdv1.presentation.screen.inpaint +package dev.minios.pdaiv1.presentation.screen.inpaint import android.graphics.Bitmap import androidx.annotation.DrawableRes import androidx.annotation.StringRes import androidx.compose.runtime.Immutable -import com.shifthackz.aisdv1.presentation.model.InPaintModel -import com.shifthackz.aisdv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.model.InPaintModel +import dev.minios.pdaiv1.presentation.model.Modal import com.shifthackz.android.core.mvi.MviState -import com.shifthackz.aisdv1.core.localization.R as LocalizationR -import com.shifthackz.aisdv1.presentation.R as PresentationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.presentation.R as PresentationR @Immutable data class InPaintState( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintStateProducer.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/InPaintStateProducer.kt similarity index 84% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintStateProducer.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/InPaintStateProducer.kt index 0aa615c74..1601d8bf1 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintStateProducer.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/InPaintStateProducer.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.presentation.screen.inpaint +package dev.minios.pdaiv1.presentation.screen.inpaint import android.graphics.Bitmap -import com.shifthackz.aisdv1.presentation.model.InPaintModel +import dev.minios.pdaiv1.presentation.model.InPaintModel import io.reactivex.rxjava3.core.BackpressureStrategy import io.reactivex.rxjava3.subjects.BehaviorSubject diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/InPaintViewModel.kt similarity index 89% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/InPaintViewModel.kt index bbfda2154..7543549a9 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/InPaintViewModel.kt @@ -1,12 +1,12 @@ -package com.shifthackz.aisdv1.presentation.screen.inpaint - -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread -import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter +package dev.minios.pdaiv1.presentation.screen.inpaint + +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.schedulers.subscribeOnMainThread +import dev.minios.pdaiv1.core.viewmodel.MviRxViewModel +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter import com.shifthackz.android.core.mvi.EmptyEffect import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.kotlin.subscribeBy diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/components/CapSizeSlider.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/components/CapSizeSlider.kt similarity index 93% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/components/CapSizeSlider.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/components/CapSizeSlider.kt index 38ffe76a4..d36fb0c3d 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/components/CapSizeSlider.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/components/CapSizeSlider.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.inpaint.components +package dev.minios.pdaiv1.presentation.screen.inpaint.components import androidx.compose.foundation.background import androidx.compose.foundation.border @@ -20,8 +20,8 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.presentation.theme.sliderColors -import com.shifthackz.aisdv1.presentation.utils.Constants +import dev.minios.pdaiv1.presentation.theme.sliderColors +import dev.minios.pdaiv1.presentation.utils.Constants import kotlin.math.abs import kotlin.math.roundToInt diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/components/InPaintComponent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/components/InPaintComponent.kt similarity index 98% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/components/InPaintComponent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/components/InPaintComponent.kt index 185fea0eb..5eadcd142 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/components/InPaintComponent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/components/InPaintComponent.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.inpaint.components +package dev.minios.pdaiv1.presentation.screen.inpaint.components import android.graphics.Bitmap import android.graphics.Picture @@ -37,8 +37,8 @@ import androidx.compose.ui.input.pointer.PointerInputChange import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.presentation.model.InPaintModel -import com.shifthackz.aisdv1.presentation.model.MotionEvent +import dev.minios.pdaiv1.presentation.model.InPaintModel +import dev.minios.pdaiv1.presentation.model.MotionEvent import com.smarttoolfactory.gesture.pointerMotionEvents import kotlinx.coroutines.delay import kotlinx.coroutines.launch diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/forms/ImageDrawForm.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/forms/ImageDrawForm.kt similarity index 92% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/forms/ImageDrawForm.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/forms/ImageDrawForm.kt index 75f40c0bc..1aca215e6 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/forms/ImageDrawForm.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/forms/ImageDrawForm.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.inpaint.forms +package dev.minios.pdaiv1.presentation.screen.inpaint.forms import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -21,9 +21,9 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.presentation.screen.inpaint.InPaintIntent -import com.shifthackz.aisdv1.presentation.screen.inpaint.InPaintState -import com.shifthackz.aisdv1.presentation.screen.inpaint.components.InPaintComponent +import dev.minios.pdaiv1.presentation.screen.inpaint.InPaintIntent +import dev.minios.pdaiv1.presentation.screen.inpaint.InPaintState +import dev.minios.pdaiv1.presentation.screen.inpaint.components.InPaintComponent @Composable fun ImageDrawForm( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/forms/InPaintParamsForm.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/forms/InPaintParamsForm.kt similarity index 94% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/forms/InPaintParamsForm.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/forms/InPaintParamsForm.kt index 19650c740..da6e71908 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/inpaint/forms/InPaintParamsForm.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/inpaint/forms/InPaintParamsForm.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.inpaint.forms +package dev.minios.pdaiv1.presentation.screen.inpaint.forms import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column @@ -17,13 +17,13 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.presentation.model.InPaintModel -import com.shifthackz.aisdv1.presentation.screen.inpaint.InPaintIntent -import com.shifthackz.aisdv1.presentation.theme.sliderColors -import com.shifthackz.aisdv1.presentation.utils.Constants +import dev.minios.pdaiv1.presentation.model.InPaintModel +import dev.minios.pdaiv1.presentation.screen.inpaint.InPaintIntent +import dev.minios.pdaiv1.presentation.theme.sliderColors +import dev.minios.pdaiv1.presentation.utils.Constants import kotlin.math.abs import kotlin.math.roundToInt -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable @Preview diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/loader/ConfigurationLoaderScreen.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/loader/ConfigurationLoaderScreen.kt similarity index 93% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/loader/ConfigurationLoaderScreen.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/loader/ConfigurationLoaderScreen.kt index ac0c74d74..959b25767 100755 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/loader/ConfigurationLoaderScreen.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/loader/ConfigurationLoaderScreen.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.loader +package dev.minios.pdaiv1.presentation.screen.loader import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -17,8 +17,8 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.model.asString -import com.shifthackz.aisdv1.core.model.asUiText +import dev.minios.pdaiv1.core.model.asString +import dev.minios.pdaiv1.core.model.asUiText import com.shifthackz.android.core.mvi.MviComponent import org.koin.androidx.compose.koinViewModel diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/loader/ConfigurationLoaderState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/loader/ConfigurationLoaderState.kt similarity index 70% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/loader/ConfigurationLoaderState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/loader/ConfigurationLoaderState.kt index f78977425..f20ef985a 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/loader/ConfigurationLoaderState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/loader/ConfigurationLoaderState.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.presentation.screen.loader +package dev.minios.pdaiv1.presentation.screen.loader import androidx.compose.runtime.Immutable -import com.shifthackz.aisdv1.core.model.UiText +import dev.minios.pdaiv1.core.model.UiText import com.shifthackz.android.core.mvi.MviState interface ConfigurationLoaderState : MviState { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/loader/ConfigurationLoaderViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/loader/ConfigurationLoaderViewModel.kt similarity index 73% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/loader/ConfigurationLoaderViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/loader/ConfigurationLoaderViewModel.kt index e38335340..8d3e0cbb8 100755 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/loader/ConfigurationLoaderViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/loader/ConfigurationLoaderViewModel.kt @@ -1,18 +1,18 @@ -package com.shifthackz.aisdv1.presentation.screen.loader +package dev.minios.pdaiv1.presentation.screen.loader -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel -import com.shifthackz.aisdv1.domain.usecase.caching.DataPreLoaderUseCase -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.schedulers.subscribeOnMainThread +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.core.viewmodel.MviRxViewModel +import dev.minios.pdaiv1.domain.usecase.caching.DataPreLoaderUseCase +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter import com.shifthackz.android.core.mvi.EmptyEffect import com.shifthackz.android.core.mvi.EmptyIntent import io.reactivex.rxjava3.kotlin.subscribeBy import java.util.concurrent.TimeUnit -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR class ConfigurationLoaderViewModel( dataPreLoaderUseCase: DataPreLoaderUseCase, diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerEffect.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/logger/LoggerEffect.kt similarity index 79% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerEffect.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/logger/LoggerEffect.kt index ef816c6c5..90407d238 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerEffect.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/logger/LoggerEffect.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.logger +package dev.minios.pdaiv1.presentation.screen.logger import com.shifthackz.android.core.mvi.MviEffect diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerIntent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/logger/LoggerIntent.kt similarity index 82% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerIntent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/logger/LoggerIntent.kt index d5ec6f147..7bfc488a9 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerIntent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/logger/LoggerIntent.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.logger +package dev.minios.pdaiv1.presentation.screen.logger import com.shifthackz.android.core.mvi.MviIntent diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerScreen.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/logger/LoggerScreen.kt similarity index 98% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerScreen.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/logger/LoggerScreen.kt index e52513d3e..d62abdbd8 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerScreen.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/logger/LoggerScreen.kt @@ -1,6 +1,6 @@ @file:OptIn(ExperimentalMaterial3Api::class) -package com.shifthackz.aisdv1.presentation.screen.logger +package dev.minios.pdaiv1.presentation.screen.logger import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn @@ -46,12 +46,12 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.shifthackz.aisdv1.core.common.extensions.copyToClipboard +import dev.minios.pdaiv1.core.common.extensions.copyToClipboard import com.shifthackz.android.core.mvi.MviComponent import kotlinx.coroutines.launch import org.koin.androidx.compose.koinViewModel import android.content.Intent -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun LoggerScreen() { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/logger/LoggerState.kt similarity index 77% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/logger/LoggerState.kt index 0571411aa..ce92280a2 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/logger/LoggerState.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.logger +package dev.minios.pdaiv1.presentation.screen.logger import androidx.compose.runtime.Immutable import com.shifthackz.android.core.mvi.MviState diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/logger/LoggerViewModel.kt similarity index 78% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/logger/LoggerViewModel.kt index 1e8db3aa7..a5bdc784a 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/logger/LoggerViewModel.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.presentation.screen.logger +package dev.minios.pdaiv1.presentation.screen.logger -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.core.common.log.FileLoggingTree -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.core.common.log.FileLoggingTree +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.viewmodel.MviRxViewModel +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter import java.io.File class LoggerViewModel( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingDensity.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/OnBoardingDensity.kt similarity index 85% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingDensity.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/OnBoardingDensity.kt index 9ee89f1e0..1c3a41eca 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingDensity.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/OnBoardingDensity.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.onboarding +package dev.minios.pdaiv1.presentation.screen.onboarding import androidx.compose.animation.core.FastOutSlowInEasing import androidx.compose.animation.core.tween diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingIntent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/OnBoardingIntent.kt similarity index 70% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingIntent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/OnBoardingIntent.kt index f91f592cb..30badfd73 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingIntent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/OnBoardingIntent.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.onboarding +package dev.minios.pdaiv1.presentation.screen.onboarding import com.shifthackz.android.core.mvi.MviIntent diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingPage.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/OnBoardingPage.kt similarity index 60% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingPage.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/OnBoardingPage.kt index 560da13ec..0f5451261 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingPage.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/OnBoardingPage.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.onboarding +package dev.minios.pdaiv1.presentation.screen.onboarding enum class OnBoardingPage { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingScreen.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/OnBoardingScreen.kt similarity index 94% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingScreen.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/OnBoardingScreen.kt index 2352d6bf1..c04e52f8f 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingScreen.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/OnBoardingScreen.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.onboarding +package dev.minios.pdaiv1.presentation.screen.onboarding import androidx.activity.compose.BackHandler import androidx.compose.animation.core.animateFloatAsState @@ -37,11 +37,11 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.draw.drawBehind import androidx.compose.ui.draw.rotate import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.presentation.model.LaunchSource -import com.shifthackz.aisdv1.presentation.screen.onboarding.page.FormPageContent -import com.shifthackz.aisdv1.presentation.screen.onboarding.page.LocalDiffusionPageContent -import com.shifthackz.aisdv1.presentation.screen.onboarding.page.LookAndFeelPageContent -import com.shifthackz.aisdv1.presentation.screen.onboarding.page.ProviderPageContent +import dev.minios.pdaiv1.presentation.model.LaunchSource +import dev.minios.pdaiv1.presentation.screen.onboarding.page.FormPageContent +import dev.minios.pdaiv1.presentation.screen.onboarding.page.LocalDiffusionPageContent +import dev.minios.pdaiv1.presentation.screen.onboarding.page.LookAndFeelPageContent +import dev.minios.pdaiv1.presentation.screen.onboarding.page.ProviderPageContent import com.shifthackz.android.core.mvi.MviComponent import kotlinx.coroutines.Job import kotlinx.coroutines.launch diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/OnBoardingState.kt similarity index 61% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/OnBoardingState.kt index cd5f6872d..06952606a 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/OnBoardingState.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.presentation.screen.onboarding +package dev.minios.pdaiv1.presentation.screen.onboarding -import com.shifthackz.aisdv1.domain.entity.DarkThemeToken +import dev.minios.pdaiv1.domain.entity.DarkThemeToken import com.shifthackz.android.core.mvi.MviState data class OnBoardingState( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingText.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/OnBoardingText.kt similarity index 96% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingText.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/OnBoardingText.kt index a40aed1e8..7227975fa 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingText.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/OnBoardingText.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.onboarding +package dev.minios.pdaiv1.presentation.screen.onboarding import androidx.annotation.StringRes import androidx.compose.runtime.Composable diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/OnBoardingViewModel.kt similarity index 64% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/OnBoardingViewModel.kt index 309a018d4..2417764ca 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/OnBoardingViewModel.kt @@ -1,17 +1,17 @@ -package com.shifthackz.aisdv1.presentation.screen.onboarding +package dev.minios.pdaiv1.presentation.screen.onboarding -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread -import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel -import com.shifthackz.aisdv1.domain.entity.DarkThemeToken -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.splash.SplashNavigationUseCase -import com.shifthackz.aisdv1.presentation.model.LaunchSource -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter -import com.shifthackz.aisdv1.presentation.navigation.router.main.postSplashNavigation +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.schedulers.subscribeOnMainThread +import dev.minios.pdaiv1.core.viewmodel.MviRxViewModel +import dev.minios.pdaiv1.domain.entity.DarkThemeToken +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.splash.SplashNavigationUseCase +import dev.minios.pdaiv1.presentation.model.LaunchSource +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.presentation.navigation.router.main.postSplashNavigation import com.shifthackz.android.core.mvi.EmptyEffect import io.reactivex.rxjava3.kotlin.subscribeBy diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/FormPageContent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/page/FormPageContent.kt similarity index 81% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/FormPageContent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/page/FormPageContent.kt index 4e1f8b31a..d2e344a23 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/FormPageContent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/page/FormPageContent.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.onboarding.page +package dev.minios.pdaiv1.presentation.screen.onboarding.page import androidx.compose.animation.core.tween import androidx.compose.foundation.layout.Box @@ -18,17 +18,17 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.sp -import com.shifthackz.aisdv1.core.extensions.gesturesDisabled -import com.shifthackz.aisdv1.presentation.screen.onboarding.buildOnBoardingText -import com.shifthackz.aisdv1.presentation.screen.onboarding.onBoardingDensity -import com.shifthackz.aisdv1.presentation.screen.onboarding.onBoardingPhoneAspectRatio -import com.shifthackz.aisdv1.presentation.screen.onboarding.onBoardingPhoneWidthFraction -import com.shifthackz.aisdv1.presentation.screen.txt2img.TextToImageScreenContent -import com.shifthackz.aisdv1.presentation.screen.txt2img.TextToImageState -import com.shifthackz.aisdv1.presentation.widget.frame.PhoneFrame +import dev.minios.pdaiv1.core.extensions.gesturesDisabled +import dev.minios.pdaiv1.presentation.screen.onboarding.buildOnBoardingText +import dev.minios.pdaiv1.presentation.screen.onboarding.onBoardingDensity +import dev.minios.pdaiv1.presentation.screen.onboarding.onBoardingPhoneAspectRatio +import dev.minios.pdaiv1.presentation.screen.onboarding.onBoardingPhoneWidthFraction +import dev.minios.pdaiv1.presentation.screen.txt2img.TextToImageScreenContent +import dev.minios.pdaiv1.presentation.screen.txt2img.TextToImageState +import dev.minios.pdaiv1.presentation.widget.frame.PhoneFrame import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun FormPageContent( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/LocalDiffusionPageContent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/page/LocalDiffusionPageContent.kt similarity index 78% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/LocalDiffusionPageContent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/page/LocalDiffusionPageContent.kt index e410c2a71..dab127e0c 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/LocalDiffusionPageContent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/page/LocalDiffusionPageContent.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.onboarding.page +package dev.minios.pdaiv1.presentation.screen.onboarding.page import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box @@ -17,17 +17,17 @@ import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.sp -import com.shifthackz.aisdv1.core.extensions.gesturesDisabled -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.presentation.screen.onboarding.buildOnBoardingText -import com.shifthackz.aisdv1.presentation.screen.onboarding.onBoardingDensity -import com.shifthackz.aisdv1.presentation.screen.onboarding.onBoardingPhoneAspectRatio -import com.shifthackz.aisdv1.presentation.screen.onboarding.onBoardingPhoneWidthFraction -import com.shifthackz.aisdv1.presentation.screen.txt2img.TextToImageScreenContent -import com.shifthackz.aisdv1.presentation.screen.txt2img.TextToImageState -import com.shifthackz.aisdv1.presentation.widget.dialog.GeneratingProgressDialogContent -import com.shifthackz.aisdv1.presentation.widget.frame.PhoneFrame -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.extensions.gesturesDisabled +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.presentation.screen.onboarding.buildOnBoardingText +import dev.minios.pdaiv1.presentation.screen.onboarding.onBoardingDensity +import dev.minios.pdaiv1.presentation.screen.onboarding.onBoardingPhoneAspectRatio +import dev.minios.pdaiv1.presentation.screen.onboarding.onBoardingPhoneWidthFraction +import dev.minios.pdaiv1.presentation.screen.txt2img.TextToImageScreenContent +import dev.minios.pdaiv1.presentation.screen.txt2img.TextToImageState +import dev.minios.pdaiv1.presentation.widget.dialog.GeneratingProgressDialogContent +import dev.minios.pdaiv1.presentation.widget.frame.PhoneFrame +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun LocalDiffusionPageContent( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/LookAndFeelPageContent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/page/LookAndFeelPageContent.kt similarity index 76% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/LookAndFeelPageContent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/page/LookAndFeelPageContent.kt index 37df5acda..58d692ee8 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/LookAndFeelPageContent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/page/LookAndFeelPageContent.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.onboarding.page +package dev.minios.pdaiv1.presentation.screen.onboarding.page import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -21,23 +21,23 @@ import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.sp -import com.shifthackz.aisdv1.core.extensions.gesturesDisabled -import com.shifthackz.aisdv1.domain.entity.ColorToken -import com.shifthackz.aisdv1.domain.entity.DarkThemeToken -import com.shifthackz.aisdv1.domain.entity.Grid -import com.shifthackz.aisdv1.presentation.screen.onboarding.buildOnBoardingText -import com.shifthackz.aisdv1.presentation.screen.onboarding.onBoardingDensity -import com.shifthackz.aisdv1.presentation.screen.onboarding.onBoardingPhoneAspectRatio -import com.shifthackz.aisdv1.presentation.screen.onboarding.onBoardingPhoneWidthFraction -import com.shifthackz.aisdv1.presentation.screen.settings.SettingsScreenContent -import com.shifthackz.aisdv1.presentation.screen.settings.SettingsState -import com.shifthackz.aisdv1.presentation.theme.global.AiSdAppTheme -import com.shifthackz.aisdv1.presentation.theme.global.AiSdAppThemeState -import com.shifthackz.aisdv1.presentation.theme.isSdAppInDarkTheme -import com.shifthackz.aisdv1.presentation.widget.frame.PhoneFrame +import dev.minios.pdaiv1.core.extensions.gesturesDisabled +import dev.minios.pdaiv1.domain.entity.ColorToken +import dev.minios.pdaiv1.domain.entity.DarkThemeToken +import dev.minios.pdaiv1.domain.entity.Grid +import dev.minios.pdaiv1.presentation.screen.onboarding.buildOnBoardingText +import dev.minios.pdaiv1.presentation.screen.onboarding.onBoardingDensity +import dev.minios.pdaiv1.presentation.screen.onboarding.onBoardingPhoneAspectRatio +import dev.minios.pdaiv1.presentation.screen.onboarding.onBoardingPhoneWidthFraction +import dev.minios.pdaiv1.presentation.screen.settings.SettingsScreenContent +import dev.minios.pdaiv1.presentation.screen.settings.SettingsState +import dev.minios.pdaiv1.presentation.theme.global.AiSdAppTheme +import dev.minios.pdaiv1.presentation.theme.global.AiSdAppThemeState +import dev.minios.pdaiv1.presentation.theme.isSdAppInDarkTheme +import dev.minios.pdaiv1.presentation.widget.frame.PhoneFrame import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun LookAndFeelPageContent( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/ProvidersPageContent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/page/ProvidersPageContent.kt similarity index 77% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/ProvidersPageContent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/page/ProvidersPageContent.kt index 6c2a881e1..6cab33dde 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/onboarding/page/ProvidersPageContent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/onboarding/page/ProvidersPageContent.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.onboarding.page +package dev.minios.pdaiv1.presentation.screen.onboarding.page import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -21,18 +21,18 @@ import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.sp -import com.shifthackz.aisdv1.core.extensions.gesturesDisabled -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.presentation.screen.onboarding.buildOnBoardingText -import com.shifthackz.aisdv1.presentation.screen.onboarding.onBoardingDensity -import com.shifthackz.aisdv1.presentation.screen.onboarding.onBoardingPhoneAspectRatio -import com.shifthackz.aisdv1.presentation.screen.onboarding.onBoardingPhoneWidthFraction -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupScreenContent -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupState -import com.shifthackz.aisdv1.presentation.widget.frame.PhoneFrame +import dev.minios.pdaiv1.core.extensions.gesturesDisabled +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.presentation.screen.onboarding.buildOnBoardingText +import dev.minios.pdaiv1.presentation.screen.onboarding.onBoardingDensity +import dev.minios.pdaiv1.presentation.screen.onboarding.onBoardingPhoneAspectRatio +import dev.minios.pdaiv1.presentation.screen.onboarding.onBoardingPhoneWidthFraction +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupScreenContent +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupState +import dev.minios.pdaiv1.presentation.widget.frame.PhoneFrame import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun ProviderPageContent( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/report/ReportIntent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/report/ReportIntent.kt similarity index 75% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/report/ReportIntent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/report/ReportIntent.kt index 60cb4ed1f..e23161c29 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/report/ReportIntent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/report/ReportIntent.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.presentation.screen.report +package dev.minios.pdaiv1.presentation.screen.report -import com.shifthackz.aisdv1.domain.entity.ReportReason +import dev.minios.pdaiv1.domain.entity.ReportReason import com.shifthackz.android.core.mvi.MviIntent sealed interface ReportIntent : MviIntent { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/report/ReportScreen.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/report/ReportScreen.kt similarity index 96% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/report/ReportScreen.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/report/ReportScreen.kt index f98ab6e73..3109ba2e1 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/report/ReportScreen.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/report/ReportScreen.kt @@ -1,6 +1,6 @@ @file:OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class) -package com.shifthackz.aisdv1.presentation.screen.report +package dev.minios.pdaiv1.presentation.screen.report import androidx.compose.animation.AnimatedContent import androidx.compose.foundation.Image @@ -50,11 +50,11 @@ import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.domain.entity.ReportReason -import com.shifthackz.aisdv1.core.localization.R as LocalizationR -import com.shifthackz.aisdv1.presentation.modal.ModalRenderer -import com.shifthackz.aisdv1.presentation.theme.isSdAppInDarkTheme -import com.shifthackz.aisdv1.presentation.widget.input.chip.ChipTextFieldItem +import dev.minios.pdaiv1.domain.entity.ReportReason +import dev.minios.pdaiv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.presentation.modal.ModalRenderer +import dev.minios.pdaiv1.presentation.theme.isSdAppInDarkTheme +import dev.minios.pdaiv1.presentation.widget.input.chip.ChipTextFieldItem import com.shifthackz.android.core.mvi.MviComponent @Composable diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/report/ReportState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/report/ReportState.kt similarity index 69% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/report/ReportState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/report/ReportState.kt index 8bc9c1111..c4f4ad5cd 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/report/ReportState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/report/ReportState.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.presentation.screen.report +package dev.minios.pdaiv1.presentation.screen.report import android.graphics.Bitmap -import com.shifthackz.aisdv1.domain.entity.ReportReason -import com.shifthackz.aisdv1.presentation.model.Modal +import dev.minios.pdaiv1.domain.entity.ReportReason +import dev.minios.pdaiv1.presentation.model.Modal import com.shifthackz.android.core.mvi.MviState data class ReportState( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/report/ReportViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/report/ReportViewModel.kt similarity index 76% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/report/ReportViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/report/ReportViewModel.kt index 6599d4587..dfdf7d17c 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/report/ReportViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/report/ReportViewModel.kt @@ -1,20 +1,20 @@ -package com.shifthackz.aisdv1.presentation.screen.report +package dev.minios.pdaiv1.presentation.screen.report -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.core.common.appbuild.BuildType -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.entity.ReportReason -import com.shifthackz.aisdv1.domain.usecase.caching.GetLastResultFromCacheUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.GetGenerationResultUseCase -import com.shifthackz.aisdv1.domain.usecase.report.SendReportUseCase -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.core.common.appbuild.BuildType +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.schedulers.subscribeOnMainThread +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.core.viewmodel.MviRxViewModel +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.ReportReason +import dev.minios.pdaiv1.domain.usecase.caching.GetLastResultFromCacheUseCase +import dev.minios.pdaiv1.domain.usecase.generation.GetGenerationResultUseCase +import dev.minios.pdaiv1.domain.usecase.report.SendReportUseCase +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter import com.shifthackz.android.core.mvi.EmptyEffect import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.kotlin.subscribeBy diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsEffect.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/settings/SettingsEffect.kt similarity index 87% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsEffect.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/settings/SettingsEffect.kt index f43aeca44..70760108b 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsEffect.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/settings/SettingsEffect.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.settings +package dev.minios.pdaiv1.presentation.screen.settings import com.shifthackz.android.core.mvi.MviEffect diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsIntent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/settings/SettingsIntent.kt similarity index 88% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsIntent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/settings/SettingsIntent.kt index 41f68563b..bcdafa15a 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsIntent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/settings/SettingsIntent.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.presentation.screen.settings +package dev.minios.pdaiv1.presentation.screen.settings -import com.shifthackz.aisdv1.core.common.links.LinksProvider -import com.shifthackz.aisdv1.domain.entity.ColorToken -import com.shifthackz.aisdv1.domain.entity.DarkThemeToken -import com.shifthackz.aisdv1.domain.entity.Grid -import com.shifthackz.aisdv1.presentation.screen.drawer.DrawerIntent +import dev.minios.pdaiv1.core.common.links.LinksProvider +import dev.minios.pdaiv1.domain.entity.ColorToken +import dev.minios.pdaiv1.domain.entity.DarkThemeToken +import dev.minios.pdaiv1.domain.entity.Grid +import dev.minios.pdaiv1.presentation.screen.drawer.DrawerIntent import com.shifthackz.android.core.mvi.MviIntent import org.koin.core.component.KoinComponent import org.koin.core.component.inject diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsScreen.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/settings/SettingsScreen.kt similarity index 95% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsScreen.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/settings/SettingsScreen.kt index c5f3fe7ec..a8e7e35f2 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsScreen.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/settings/SettingsScreen.kt @@ -1,6 +1,6 @@ @file:OptIn(ExperimentalMaterial3Api::class) -package com.shifthackz.aisdv1.presentation.screen.settings +package dev.minios.pdaiv1.presentation.screen.settings import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts @@ -62,29 +62,29 @@ import androidx.compose.ui.platform.LocalLayoutDirection import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.common.extensions.openUrl -import com.shifthackz.aisdv1.core.common.extensions.showToast -import com.shifthackz.aisdv1.core.common.math.roundTo -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.core.model.asUiText +import dev.minios.pdaiv1.core.common.extensions.openUrl +import dev.minios.pdaiv1.core.common.extensions.showToast +import dev.minios.pdaiv1.core.common.math.roundTo +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.core.model.asUiText import com.shifthackz.android.core.mvi.MviComponent -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.presentation.modal.ModalRenderer -import com.shifthackz.aisdv1.presentation.screen.drawer.DrawerIntent -import com.shifthackz.aisdv1.presentation.theme.colorTokenPalette -import com.shifthackz.aisdv1.presentation.theme.isSdAppInDarkTheme -import com.shifthackz.aisdv1.presentation.utils.PermissionUtil -import com.shifthackz.aisdv1.presentation.utils.ReportProblemEmailComposer -import com.shifthackz.aisdv1.presentation.widget.color.AccentColorSelector -import com.shifthackz.aisdv1.presentation.widget.color.DarkThemeColorSelector -import com.shifthackz.aisdv1.presentation.widget.item.GridIcon -import com.shifthackz.aisdv1.presentation.widget.item.SettingsHeader -import com.shifthackz.aisdv1.presentation.widget.item.SettingsItem -import com.shifthackz.aisdv1.presentation.widget.item.SettingsItemContent -import com.shifthackz.aisdv1.presentation.widget.work.BackgroundWorkWidget +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.presentation.modal.ModalRenderer +import dev.minios.pdaiv1.presentation.screen.drawer.DrawerIntent +import dev.minios.pdaiv1.presentation.theme.colorTokenPalette +import dev.minios.pdaiv1.presentation.theme.isSdAppInDarkTheme +import dev.minios.pdaiv1.presentation.utils.PermissionUtil +import dev.minios.pdaiv1.presentation.utils.ReportProblemEmailComposer +import dev.minios.pdaiv1.presentation.widget.color.AccentColorSelector +import dev.minios.pdaiv1.presentation.widget.color.DarkThemeColorSelector +import dev.minios.pdaiv1.presentation.widget.item.GridIcon +import dev.minios.pdaiv1.presentation.widget.item.SettingsHeader +import dev.minios.pdaiv1.presentation.widget.item.SettingsItem +import dev.minios.pdaiv1.presentation.widget.item.SettingsItemContent +import dev.minios.pdaiv1.presentation.widget.work.BackgroundWorkWidget import com.shifthackz.android.compose.daynightswitch.DayNightSwitch import org.koin.androidx.compose.koinViewModel -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun SettingsScreen() { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/settings/SettingsState.kt similarity index 84% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/settings/SettingsState.kt index 2ab9a9324..878982678 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/settings/SettingsState.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.presentation.screen.settings +package dev.minios.pdaiv1.presentation.screen.settings import androidx.compose.runtime.Immutable -import com.shifthackz.aisdv1.domain.entity.ColorToken -import com.shifthackz.aisdv1.domain.entity.DarkThemeToken -import com.shifthackz.aisdv1.domain.entity.Grid -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.presentation.model.Modal +import dev.minios.pdaiv1.domain.entity.ColorToken +import dev.minios.pdaiv1.domain.entity.DarkThemeToken +import dev.minios.pdaiv1.domain.entity.Grid +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.presentation.model.Modal import com.shifthackz.android.core.mvi.MviState @Immutable diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/settings/SettingsViewModel.kt similarity index 85% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/settings/SettingsViewModel.kt index d77565826..ef1ae29f8 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/settings/SettingsViewModel.kt @@ -1,32 +1,32 @@ -package com.shifthackz.aisdv1.presentation.screen.settings - -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.core.common.extensions.EmptyLambda -import com.shifthackz.aisdv1.core.common.extensions.shouldUseNewMediaStore -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.common.model.Quadruple -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel -import com.shifthackz.aisdv1.domain.entity.ColorToken -import com.shifthackz.aisdv1.domain.entity.DarkThemeToken -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.caching.ClearAppCacheUseCase -import com.shifthackz.aisdv1.domain.usecase.sdmodel.GetStableDiffusionModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.sdmodel.SelectStableDiffusionModelUseCase -import com.shifthackz.aisdv1.domain.usecase.stabilityai.ObserveStabilityAiCreditsUseCase -import com.shifthackz.aisdv1.presentation.model.LaunchSource -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.navigation.router.drawer.DrawerRouter -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter -import com.shifthackz.aisdv1.presentation.screen.debug.DebugMenuAccessor -import com.shifthackz.aisdv1.presentation.screen.drawer.DrawerIntent +package dev.minios.pdaiv1.presentation.screen.settings + +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.core.common.extensions.EmptyLambda +import dev.minios.pdaiv1.core.common.extensions.shouldUseNewMediaStore +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.model.Quadruple +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.schedulers.subscribeOnMainThread +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.core.viewmodel.MviRxViewModel +import dev.minios.pdaiv1.domain.entity.ColorToken +import dev.minios.pdaiv1.domain.entity.DarkThemeToken +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.caching.ClearAppCacheUseCase +import dev.minios.pdaiv1.domain.usecase.sdmodel.GetStableDiffusionModelsUseCase +import dev.minios.pdaiv1.domain.usecase.sdmodel.SelectStableDiffusionModelUseCase +import dev.minios.pdaiv1.domain.usecase.stabilityai.ObserveStabilityAiCreditsUseCase +import dev.minios.pdaiv1.presentation.model.LaunchSource +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.navigation.router.drawer.DrawerRouter +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.presentation.screen.debug.DebugMenuAccessor +import dev.minios.pdaiv1.presentation.screen.drawer.DrawerIntent import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.kotlin.subscribeBy import java.util.concurrent.TimeUnit -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR class SettingsViewModel( dispatchersProvider: DispatchersProvider, diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupEffect.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/ServerSetupEffect.kt similarity index 83% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupEffect.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/ServerSetupEffect.kt index f1501ff15..9825e5c37 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupEffect.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/ServerSetupEffect.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.setup +package dev.minios.pdaiv1.presentation.screen.setup import com.shifthackz.android.core.mvi.MviEffect diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupIntent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/ServerSetupIntent.kt similarity index 95% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupIntent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/ServerSetupIntent.kt index e39afed6b..e0c08026f 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupIntent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/ServerSetupIntent.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.presentation.screen.setup +package dev.minios.pdaiv1.presentation.screen.setup -import com.shifthackz.aisdv1.core.common.links.LinksProvider -import com.shifthackz.aisdv1.domain.entity.ServerSource +import dev.minios.pdaiv1.core.common.links.LinksProvider +import dev.minios.pdaiv1.domain.entity.ServerSource import com.shifthackz.android.core.mvi.MviIntent import org.koin.core.component.KoinComponent import org.koin.core.component.inject diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupScreen.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/ServerSetupScreen.kt similarity index 92% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupScreen.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/ServerSetupScreen.kt index cddbeec1c..41b61545f 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupScreen.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/ServerSetupScreen.kt @@ -1,6 +1,6 @@ @file:OptIn(ExperimentalMaterial3Api::class, ExperimentalFoundationApi::class) -package com.shifthackz.aisdv1.presentation.screen.setup +package dev.minios.pdaiv1.presentation.screen.setup import android.content.Intent import android.os.Build @@ -40,17 +40,17 @@ import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.core.common.extensions.openUrl -import com.shifthackz.aisdv1.core.common.extensions.showToast +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.core.common.extensions.openUrl +import dev.minios.pdaiv1.core.common.extensions.showToast import com.shifthackz.android.core.mvi.MviComponent -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.presentation.modal.ModalRenderer -import com.shifthackz.aisdv1.presentation.screen.setup.components.ConfigurationStepBar -import com.shifthackz.aisdv1.presentation.screen.setup.steps.ConfigurationStep -import com.shifthackz.aisdv1.presentation.screen.setup.steps.SourceSelectionStep -import com.shifthackz.aisdv1.presentation.utils.PermissionUtil -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.presentation.modal.ModalRenderer +import dev.minios.pdaiv1.presentation.screen.setup.components.ConfigurationStepBar +import dev.minios.pdaiv1.presentation.screen.setup.steps.ConfigurationStep +import dev.minios.pdaiv1.presentation.screen.setup.steps.SourceSelectionStep +import dev.minios.pdaiv1.presentation.utils.PermissionUtil +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun ServerSetupScreen( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupScreenTags.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/ServerSetupScreenTags.kt similarity index 71% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupScreenTags.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/ServerSetupScreenTags.kt index 48fa95ea9..23cd56de0 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupScreenTags.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/ServerSetupScreenTags.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.setup +package dev.minios.pdaiv1.presentation.screen.setup object ServerSetupScreenTags { const val MAIN_BUTTON = "ServerSetupMainButton" diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/ServerSetupState.kt similarity index 94% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/ServerSetupState.kt index 731157286..9ed85b714 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/ServerSetupState.kt @@ -1,16 +1,16 @@ -package com.shifthackz.aisdv1.presentation.screen.setup +package dev.minios.pdaiv1.presentation.screen.setup import androidx.compose.runtime.Immutable -import com.shifthackz.aisdv1.core.common.links.LinksProvider -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.domain.entity.Configuration -import com.shifthackz.aisdv1.domain.entity.DownloadState -import com.shifthackz.aisdv1.domain.entity.LocalAiModel -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationCredentials -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.screen.setup.mappers.withNewState -import com.shifthackz.aisdv1.presentation.utils.Constants +import dev.minios.pdaiv1.core.common.links.LinksProvider +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.domain.entity.Configuration +import dev.minios.pdaiv1.domain.entity.DownloadState +import dev.minios.pdaiv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.feature.auth.AuthorizationCredentials +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.screen.setup.mappers.withNewState +import dev.minios.pdaiv1.presentation.utils.Constants import com.shifthackz.android.core.mvi.MviState import org.koin.core.component.KoinComponent import org.koin.core.component.inject diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/ServerSetupViewModel.kt similarity index 89% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/ServerSetupViewModel.kt index b5c6318c9..18d0780e8 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/ServerSetupViewModel.kt @@ -1,44 +1,44 @@ -package com.shifthackz.aisdv1.presentation.screen.setup - -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.core.common.appbuild.BuildType -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.core.common.model.Quadruple -import com.shifthackz.aisdv1.core.common.model.Quintuple -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.core.validation.common.CommonStringValidator -import com.shifthackz.aisdv1.core.validation.path.FilePathValidator -import com.shifthackz.aisdv1.core.validation.url.UrlValidator -import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel -import com.shifthackz.aisdv1.domain.entity.DownloadState -import com.shifthackz.aisdv1.domain.entity.HuggingFaceModel -import com.shifthackz.aisdv1.domain.entity.LocalAiModel -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationCredentials -import com.shifthackz.aisdv1.domain.interactor.settings.SetupConnectionInterActor -import com.shifthackz.aisdv1.domain.interactor.wakelock.WakeLockInterActor -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.downloadable.DeleteModelUseCase -import com.shifthackz.aisdv1.domain.usecase.downloadable.DownloadModelUseCase -import com.shifthackz.aisdv1.domain.usecase.downloadable.GetLocalMediaPipeModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.downloadable.GetLocalOnnxModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.downloadable.GetLocalQnnModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.downloadable.ScanCustomModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.huggingface.FetchAndGetHuggingFaceModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.GetConfigurationUseCase -import com.shifthackz.aisdv1.domain.repository.FalAiEndpointRepository -import com.shifthackz.aisdv1.presentation.model.LaunchSource -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter -import com.shifthackz.aisdv1.presentation.screen.setup.mappers.allowedModes -import com.shifthackz.aisdv1.presentation.screen.setup.mappers.mapLocalCustomMediaPipeSwitchState -import com.shifthackz.aisdv1.presentation.screen.setup.mappers.mapLocalCustomOnnxSwitchState -import com.shifthackz.aisdv1.presentation.screen.setup.mappers.mapLocalCustomQnnSwitchState -import com.shifthackz.aisdv1.presentation.screen.setup.mappers.mapToUi -import com.shifthackz.aisdv1.presentation.utils.Constants +package dev.minios.pdaiv1.presentation.screen.setup + +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.core.common.appbuild.BuildType +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.common.model.Quadruple +import dev.minios.pdaiv1.core.common.model.Quintuple +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.schedulers.subscribeOnMainThread +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.core.validation.common.CommonStringValidator +import dev.minios.pdaiv1.core.validation.path.FilePathValidator +import dev.minios.pdaiv1.core.validation.url.UrlValidator +import dev.minios.pdaiv1.core.viewmodel.MviRxViewModel +import dev.minios.pdaiv1.domain.entity.DownloadState +import dev.minios.pdaiv1.domain.entity.HuggingFaceModel +import dev.minios.pdaiv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.feature.auth.AuthorizationCredentials +import dev.minios.pdaiv1.domain.interactor.settings.SetupConnectionInterActor +import dev.minios.pdaiv1.domain.interactor.wakelock.WakeLockInterActor +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.downloadable.DeleteModelUseCase +import dev.minios.pdaiv1.domain.usecase.downloadable.DownloadModelUseCase +import dev.minios.pdaiv1.domain.usecase.downloadable.GetLocalMediaPipeModelsUseCase +import dev.minios.pdaiv1.domain.usecase.downloadable.GetLocalOnnxModelsUseCase +import dev.minios.pdaiv1.domain.usecase.downloadable.GetLocalQnnModelsUseCase +import dev.minios.pdaiv1.domain.usecase.downloadable.ScanCustomModelsUseCase +import dev.minios.pdaiv1.domain.usecase.huggingface.FetchAndGetHuggingFaceModelsUseCase +import dev.minios.pdaiv1.domain.usecase.settings.GetConfigurationUseCase +import dev.minios.pdaiv1.domain.repository.FalAiEndpointRepository +import dev.minios.pdaiv1.presentation.model.LaunchSource +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.presentation.screen.setup.mappers.allowedModes +import dev.minios.pdaiv1.presentation.screen.setup.mappers.mapLocalCustomMediaPipeSwitchState +import dev.minios.pdaiv1.presentation.screen.setup.mappers.mapLocalCustomOnnxSwitchState +import dev.minios.pdaiv1.presentation.screen.setup.mappers.mapLocalCustomQnnSwitchState +import dev.minios.pdaiv1.presentation.screen.setup.mappers.mapToUi +import dev.minios.pdaiv1.presentation.utils.Constants import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.disposables.Disposable import io.reactivex.rxjava3.kotlin.subscribeBy diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/components/ConfigurationModeButton.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/components/ConfigurationModeButton.kt similarity index 93% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/components/ConfigurationModeButton.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/components/ConfigurationModeButton.kt index b76d89f8f..91ff1a7a8 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/components/ConfigurationModeButton.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/components/ConfigurationModeButton.kt @@ -1,6 +1,6 @@ @file:OptIn(ExperimentalLayoutApi::class) -package com.shifthackz.aisdv1.presentation.screen.setup.components +package dev.minios.pdaiv1.presentation.screen.setup.components import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -31,11 +31,11 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupState -import com.shifthackz.aisdv1.presentation.screen.setup.mappers.mapToUi -import com.shifthackz.aisdv1.presentation.widget.source.getName -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupState +import dev.minios.pdaiv1.presentation.screen.setup.mappers.mapToUi +import dev.minios.pdaiv1.presentation.widget.source.getName +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun ConfigurationModeButton( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/components/ConfigurationStepBar.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/components/ConfigurationStepBar.kt similarity index 96% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/components/ConfigurationStepBar.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/components/ConfigurationStepBar.kt index 8b1275928..2e348a19e 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/components/ConfigurationStepBar.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/components/ConfigurationStepBar.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.setup.components +package dev.minios.pdaiv1.presentation.screen.setup.components import androidx.compose.foundation.background import androidx.compose.foundation.border @@ -25,8 +25,8 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupState -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupState +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun ConfigurationStepBar( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/AuthCredentialsForm.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/AuthCredentialsForm.kt similarity index 88% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/AuthCredentialsForm.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/AuthCredentialsForm.kt index 8fd0ae780..c26e9bb6a 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/AuthCredentialsForm.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/AuthCredentialsForm.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.setup.forms +package dev.minios.pdaiv1.presentation.screen.setup.forms import androidx.compose.foundation.layout.ColumnScope import androidx.compose.foundation.text.KeyboardOptions @@ -16,13 +16,13 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.PasswordVisualTransformation import androidx.compose.ui.text.input.VisualTransformation -import com.shifthackz.aisdv1.core.model.asString -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupIntent -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupState -import com.shifthackz.aisdv1.presentation.theme.textFieldColors -import com.shifthackz.aisdv1.presentation.widget.input.DropdownTextField -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.model.asString +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupIntent +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupState +import dev.minios.pdaiv1.presentation.theme.textFieldColors +import dev.minios.pdaiv1.presentation.widget.input.DropdownTextField +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun ColumnScope.AuthCredentialsForm( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/Automatic1111Form.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/Automatic1111Form.kt similarity index 89% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/Automatic1111Form.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/Automatic1111Form.kt index 42e70a9f5..798177aa3 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/Automatic1111Form.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/Automatic1111Form.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.setup.forms +package dev.minios.pdaiv1.presentation.screen.setup.forms import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth @@ -16,13 +16,13 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.model.asString -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupIntent -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupState -import com.shifthackz.aisdv1.presentation.theme.textFieldColors -import com.shifthackz.aisdv1.presentation.widget.item.SettingsItem -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.model.asString +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupIntent +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupState +import dev.minios.pdaiv1.presentation.theme.textFieldColors +import dev.minios.pdaiv1.presentation.widget.item.SettingsItem +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun Automatic1111Form( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/FalAiForm.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/FalAiForm.kt similarity index 83% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/FalAiForm.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/FalAiForm.kt index 45edfa722..93b7cf77a 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/FalAiForm.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/FalAiForm.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.setup.forms +package dev.minios.pdaiv1.presentation.screen.setup.forms import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth @@ -14,13 +14,13 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.model.asString -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupIntent -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupState -import com.shifthackz.aisdv1.presentation.theme.textFieldColors -import com.shifthackz.aisdv1.presentation.widget.item.SettingsItem -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.model.asString +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupIntent +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupState +import dev.minios.pdaiv1.presentation.theme.textFieldColors +import dev.minios.pdaiv1.presentation.widget.item.SettingsItem +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun FalAiForm( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/HordeForm.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/HordeForm.kt similarity index 88% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/HordeForm.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/HordeForm.kt index 0dea761e4..1deba8a4f 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/HordeForm.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/HordeForm.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.setup.forms +package dev.minios.pdaiv1.presentation.screen.setup.forms import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -19,14 +19,14 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.model.asString -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupIntent -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupState -import com.shifthackz.aisdv1.presentation.theme.textFieldColors -import com.shifthackz.aisdv1.presentation.utils.Constants -import com.shifthackz.aisdv1.presentation.widget.item.SettingsItem -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.model.asString +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupIntent +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupState +import dev.minios.pdaiv1.presentation.theme.textFieldColors +import dev.minios.pdaiv1.presentation.utils.Constants +import dev.minios.pdaiv1.presentation.widget.item.SettingsItem +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun HordeForm( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/HuggingFaceForm.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/HuggingFaceForm.kt similarity index 87% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/HuggingFaceForm.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/HuggingFaceForm.kt index 20195c4e5..9255ed47a 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/HuggingFaceForm.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/HuggingFaceForm.kt @@ -1,6 +1,6 @@ @file:OptIn(ExperimentalFoundationApi::class) -package com.shifthackz.aisdv1.presentation.screen.setup.forms +package dev.minios.pdaiv1.presentation.screen.setup.forms import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.layout.Column @@ -22,16 +22,16 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.model.asString -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupIntent -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupState -import com.shifthackz.aisdv1.presentation.theme.textFieldColors -import com.shifthackz.aisdv1.presentation.widget.input.DropdownTextField -import com.shifthackz.aisdv1.presentation.widget.item.SettingsItem +import dev.minios.pdaiv1.core.model.asString +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupIntent +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupState +import dev.minios.pdaiv1.presentation.theme.textFieldColors +import dev.minios.pdaiv1.presentation.widget.input.DropdownTextField +import dev.minios.pdaiv1.presentation.widget.item.SettingsItem import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/LocalDiffusionForm.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/LocalDiffusionForm.kt similarity index 95% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/LocalDiffusionForm.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/LocalDiffusionForm.kt index 630e4f396..59f0bb569 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/LocalDiffusionForm.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/LocalDiffusionForm.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.setup.forms +package dev.minios.pdaiv1.presentation.screen.setup.forms import android.content.Intent import android.provider.DocumentsContract @@ -47,19 +47,19 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.times -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.core.common.appbuild.BuildType -import com.shifthackz.aisdv1.core.common.file.LOCAL_DIFFUSION_CUSTOM_PATH -import com.shifthackz.aisdv1.core.extensions.getRealPath -import com.shifthackz.aisdv1.core.model.asString -import com.shifthackz.aisdv1.domain.entity.DownloadState -import com.shifthackz.aisdv1.domain.entity.LocalAiModel -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupIntent -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupScreenTags.CUSTOM_MODEL_SWITCH -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupState -import com.shifthackz.aisdv1.presentation.theme.textFieldColors -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.core.common.appbuild.BuildType +import dev.minios.pdaiv1.core.common.file.LOCAL_DIFFUSION_CUSTOM_PATH +import dev.minios.pdaiv1.core.extensions.getRealPath +import dev.minios.pdaiv1.core.model.asString +import dev.minios.pdaiv1.domain.entity.DownloadState +import dev.minios.pdaiv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupIntent +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupScreenTags.CUSTOM_MODEL_SWITCH +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupState +import dev.minios.pdaiv1.presentation.theme.textFieldColors +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun LocalDiffusionForm( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/MediaPipeForm.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/MediaPipeForm.kt similarity index 63% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/MediaPipeForm.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/MediaPipeForm.kt index 3bb26b1dd..622d3e12b 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/MediaPipeForm.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/MediaPipeForm.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.presentation.screen.setup.forms +package dev.minios.pdaiv1.presentation.screen.setup.forms import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.core.common.appbuild.BuildType -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupIntent -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupState +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.core.common.appbuild.BuildType +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupIntent +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupState @Composable fun MediaPipeForm( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/OpenAiForm.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/OpenAiForm.kt similarity index 87% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/OpenAiForm.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/OpenAiForm.kt index d6f95c2da..02db6ac47 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/OpenAiForm.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/OpenAiForm.kt @@ -1,6 +1,6 @@ @file:OptIn(ExperimentalFoundationApi::class) -package com.shifthackz.aisdv1.presentation.screen.setup.forms +package dev.minios.pdaiv1.presentation.screen.setup.forms import androidx.compose.foundation.ExperimentalFoundationApi import androidx.compose.foundation.layout.Column @@ -22,15 +22,15 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.model.asString -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupIntent -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupState -import com.shifthackz.aisdv1.presentation.theme.textFieldColors -import com.shifthackz.aisdv1.presentation.widget.item.SettingsItem +import dev.minios.pdaiv1.core.model.asString +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupIntent +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupState +import dev.minios.pdaiv1.presentation.theme.textFieldColors +import dev.minios.pdaiv1.presentation.widget.item.SettingsItem import kotlinx.coroutines.delay import kotlinx.coroutines.launch -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/QnnForm.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/QnnForm.kt similarity index 96% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/QnnForm.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/QnnForm.kt index 05a428340..d2afdb65f 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/QnnForm.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/QnnForm.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.setup.forms +package dev.minios.pdaiv1.presentation.screen.setup.forms import android.content.Intent import android.provider.DocumentsContract @@ -45,17 +45,17 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.core.common.appbuild.BuildType -import com.shifthackz.aisdv1.core.common.file.LOCAL_DIFFUSION_CUSTOM_PATH -import com.shifthackz.aisdv1.core.extensions.getRealPath -import com.shifthackz.aisdv1.core.model.asString -import com.shifthackz.aisdv1.domain.entity.DownloadState -import com.shifthackz.aisdv1.domain.entity.LocalAiModel -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupIntent -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupState -import com.shifthackz.aisdv1.presentation.theme.textFieldColors -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.core.common.appbuild.BuildType +import dev.minios.pdaiv1.core.common.file.LOCAL_DIFFUSION_CUSTOM_PATH +import dev.minios.pdaiv1.core.extensions.getRealPath +import dev.minios.pdaiv1.core.model.asString +import dev.minios.pdaiv1.domain.entity.DownloadState +import dev.minios.pdaiv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupIntent +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupState +import dev.minios.pdaiv1.presentation.theme.textFieldColors +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun QnnForm( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/StabilityAiForm.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/StabilityAiForm.kt similarity index 83% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/StabilityAiForm.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/StabilityAiForm.kt index 4bf059c71..505164410 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/StabilityAiForm.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/StabilityAiForm.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.setup.forms +package dev.minios.pdaiv1.presentation.screen.setup.forms import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth @@ -14,13 +14,13 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.model.asString -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupIntent -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupState -import com.shifthackz.aisdv1.presentation.theme.textFieldColors -import com.shifthackz.aisdv1.presentation.widget.item.SettingsItem -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.model.asString +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupIntent +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupState +import dev.minios.pdaiv1.presentation.theme.textFieldColors +import dev.minios.pdaiv1.presentation.widget.item.SettingsItem +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun StabilityAiForm( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/SwarmUiForm.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/SwarmUiForm.kt similarity index 85% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/SwarmUiForm.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/SwarmUiForm.kt index b562c19b1..fd2f69ada 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/forms/SwarmUiForm.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/forms/SwarmUiForm.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.setup.forms +package dev.minios.pdaiv1.presentation.screen.setup.forms import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxWidth @@ -14,13 +14,13 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.model.asString -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupIntent -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupState -import com.shifthackz.aisdv1.presentation.theme.textFieldColors -import com.shifthackz.aisdv1.presentation.widget.item.SettingsItem -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.model.asString +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupIntent +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupState +import dev.minios.pdaiv1.presentation.theme.textFieldColors +import dev.minios.pdaiv1.presentation.widget.item.SettingsItem +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun SwarmUiForm( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/mappers/FeatureTagMapper.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/mappers/FeatureTagMapper.kt similarity index 82% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/mappers/FeatureTagMapper.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/mappers/FeatureTagMapper.kt index e5a55208d..fae9acdfc 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/mappers/FeatureTagMapper.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/mappers/FeatureTagMapper.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.presentation.screen.setup.mappers +package dev.minios.pdaiv1.presentation.screen.setup.mappers import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource -import com.shifthackz.aisdv1.domain.entity.FeatureTag -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.domain.entity.FeatureTag +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun FeatureTag.mapToUi(): String { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/mappers/LocalModelMappers.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/mappers/LocalModelMappers.kt similarity index 85% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/mappers/LocalModelMappers.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/mappers/LocalModelMappers.kt index 33f323f28..728328d6d 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/mappers/LocalModelMappers.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/mappers/LocalModelMappers.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.presentation.screen.setup.mappers +package dev.minios.pdaiv1.presentation.screen.setup.mappers -import com.shifthackz.aisdv1.domain.entity.LocalAiModel -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupState +import dev.minios.pdaiv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupState fun List.mapToUi(): List = map(LocalAiModel::mapToUi) diff --git a/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/mappers/ModesMapper.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/mappers/ModesMapper.kt new file mode 100644 index 000000000..401e66508 --- /dev/null +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/mappers/ModesMapper.kt @@ -0,0 +1,9 @@ +package dev.minios.pdaiv1.presentation.screen.setup.mappers + +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.domain.entity.ServerSource + +val BuildInfoProvider.allowedModes: List + get() = ServerSource + .entries + .filter { it.allowedInBuilds.contains(type) } diff --git a/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/mappers/ServerSetupValidationFilePathErrorMapper.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/mappers/ServerSetupValidationFilePathErrorMapper.kt new file mode 100644 index 000000000..70cd36ee9 --- /dev/null +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/mappers/ServerSetupValidationFilePathErrorMapper.kt @@ -0,0 +1,15 @@ +package dev.minios.pdaiv1.presentation.screen.setup.mappers + +import dev.minios.pdaiv1.core.localization.R +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.core.validation.ValidationResult +import dev.minios.pdaiv1.core.validation.path.FilePathValidator + +fun ValidationResult.mapToUi(): UiText? { + if (this.isValid) return null + return when (validationError as FilePathValidator.Error) { + FilePathValidator.Error.Empty -> R.string.error_empty_field + FilePathValidator.Error.Invalid -> R.string.error_invalid + }.asUiText() +} diff --git a/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/mappers/ServerSetupValidationStringErrorMapper.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/mappers/ServerSetupValidationStringErrorMapper.kt new file mode 100644 index 000000000..10ed8cbbc --- /dev/null +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/mappers/ServerSetupValidationStringErrorMapper.kt @@ -0,0 +1,14 @@ +package dev.minios.pdaiv1.presentation.screen.setup.mappers + +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.core.validation.ValidationResult +import dev.minios.pdaiv1.core.validation.common.CommonStringValidator +import dev.minios.pdaiv1.core.localization.R as LocalizationR + +fun ValidationResult.mapToUi(): UiText? { + if (this.isValid) return null + return when (validationError as CommonStringValidator.Error) { + CommonStringValidator.Error.Empty -> LocalizationR.string.error_empty_field + }.asUiText() +} diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/mappers/ServerSetupValidationUrlMapper.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/mappers/ServerSetupValidationUrlMapper.kt similarity index 60% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/mappers/ServerSetupValidationUrlMapper.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/mappers/ServerSetupValidationUrlMapper.kt index 99955e3e1..c523f7779 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/mappers/ServerSetupValidationUrlMapper.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/mappers/ServerSetupValidationUrlMapper.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.presentation.screen.setup.mappers +package dev.minios.pdaiv1.presentation.screen.setup.mappers -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.core.validation.ValidationResult -import com.shifthackz.aisdv1.core.validation.url.UrlValidator -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.core.validation.ValidationResult +import dev.minios.pdaiv1.core.validation.url.UrlValidator +import dev.minios.pdaiv1.core.localization.R as LocalizationR fun ValidationResult.mapToUi(): UiText? { if (this.isValid) return null diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/steps/BaseStepWrapper.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/steps/BaseStepWrapper.kt similarity index 91% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/steps/BaseStepWrapper.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/steps/BaseStepWrapper.kt index 415a6e80b..eb3bad461 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/steps/BaseStepWrapper.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/steps/BaseStepWrapper.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.setup.steps +package dev.minios.pdaiv1.presentation.screen.setup.steps import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Spacer diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/steps/ConfigurationStep.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/steps/ConfigurationStep.kt similarity index 65% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/steps/ConfigurationStep.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/steps/ConfigurationStep.kt index 695a4032b..fc9b47ce3 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/steps/ConfigurationStep.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/steps/ConfigurationStep.kt @@ -1,21 +1,21 @@ -package com.shifthackz.aisdv1.presentation.screen.setup.steps +package dev.minios.pdaiv1.presentation.screen.setup.steps import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupIntent -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupState -import com.shifthackz.aisdv1.presentation.screen.setup.forms.Automatic1111Form -import com.shifthackz.aisdv1.presentation.screen.setup.forms.FalAiForm -import com.shifthackz.aisdv1.presentation.screen.setup.forms.HordeForm -import com.shifthackz.aisdv1.presentation.screen.setup.forms.HuggingFaceForm -import com.shifthackz.aisdv1.presentation.screen.setup.forms.LocalDiffusionForm -import com.shifthackz.aisdv1.presentation.screen.setup.forms.MediaPipeForm -import com.shifthackz.aisdv1.presentation.screen.setup.forms.OpenAiForm -import com.shifthackz.aisdv1.presentation.screen.setup.forms.QnnForm -import com.shifthackz.aisdv1.presentation.screen.setup.forms.StabilityAiForm -import com.shifthackz.aisdv1.presentation.screen.setup.forms.SwarmUiForm +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupIntent +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupState +import dev.minios.pdaiv1.presentation.screen.setup.forms.Automatic1111Form +import dev.minios.pdaiv1.presentation.screen.setup.forms.FalAiForm +import dev.minios.pdaiv1.presentation.screen.setup.forms.HordeForm +import dev.minios.pdaiv1.presentation.screen.setup.forms.HuggingFaceForm +import dev.minios.pdaiv1.presentation.screen.setup.forms.LocalDiffusionForm +import dev.minios.pdaiv1.presentation.screen.setup.forms.MediaPipeForm +import dev.minios.pdaiv1.presentation.screen.setup.forms.OpenAiForm +import dev.minios.pdaiv1.presentation.screen.setup.forms.QnnForm +import dev.minios.pdaiv1.presentation.screen.setup.forms.StabilityAiForm +import dev.minios.pdaiv1.presentation.screen.setup.forms.SwarmUiForm @Composable fun ConfigurationStep( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/steps/SourceSelectionStep.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/steps/SourceSelectionStep.kt similarity index 88% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/steps/SourceSelectionStep.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/steps/SourceSelectionStep.kt index f77794584..0266b6d73 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/setup/steps/SourceSelectionStep.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/setup/steps/SourceSelectionStep.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.setup.steps +package dev.minios.pdaiv1.presentation.screen.setup.steps import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth @@ -17,10 +17,10 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupIntent -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupState -import com.shifthackz.aisdv1.presentation.screen.setup.components.ConfigurationModeButton +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupIntent +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupState +import dev.minios.pdaiv1.presentation.screen.setup.components.ConfigurationModeButton import kotlin.math.abs @Composable diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/splash/SplashScreen.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/splash/SplashScreen.kt similarity index 91% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/splash/SplashScreen.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/splash/SplashScreen.kt index e1424eeba..8eb3eed59 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/splash/SplashScreen.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/splash/SplashScreen.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.splash +package dev.minios.pdaiv1.presentation.screen.splash import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/splash/SplashViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/splash/SplashViewModel.kt similarity index 55% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/splash/SplashViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/splash/SplashViewModel.kt index 721ccbb30..bba61405c 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/splash/SplashViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/splash/SplashViewModel.kt @@ -1,13 +1,13 @@ -package com.shifthackz.aisdv1.presentation.screen.splash +package dev.minios.pdaiv1.presentation.screen.splash -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread -import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel -import com.shifthackz.aisdv1.domain.usecase.splash.SplashNavigationUseCase -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter -import com.shifthackz.aisdv1.presentation.navigation.router.main.postSplashNavigation +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.schedulers.subscribeOnMainThread +import dev.minios.pdaiv1.core.viewmodel.MviRxViewModel +import dev.minios.pdaiv1.domain.usecase.splash.SplashNavigationUseCase +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.presentation.navigation.router.main.postSplashNavigation import com.shifthackz.android.core.mvi.EmptyEffect import com.shifthackz.android.core.mvi.EmptyIntent import com.shifthackz.android.core.mvi.EmptyState diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/txt2img/TextToImageScreen.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/txt2img/TextToImageScreen.kt similarity index 92% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/txt2img/TextToImageScreen.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/txt2img/TextToImageScreen.kt index b511674a3..b65cb2e80 100755 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/txt2img/TextToImageScreen.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/txt2img/TextToImageScreen.kt @@ -1,6 +1,6 @@ @file:OptIn(ExperimentalMaterial3Api::class) -package com.shifthackz.aisdv1.presentation.screen.txt2img +package dev.minios.pdaiv1.presentation.screen.txt2img import androidx.compose.foundation.ScrollState import androidx.compose.foundation.background @@ -37,16 +37,16 @@ import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.shifthackz.android.core.mvi.MviComponent -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.presentation.core.GenerationMviIntent -import com.shifthackz.aisdv1.presentation.modal.ModalRenderer -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.screen.drawer.DrawerIntent -import com.shifthackz.aisdv1.presentation.widget.input.GenerationInputForm -import com.shifthackz.aisdv1.presentation.widget.toolbar.GenerationBottomToolbar -import com.shifthackz.aisdv1.presentation.widget.work.BackgroundWorkWidget +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.presentation.core.GenerationMviIntent +import dev.minios.pdaiv1.presentation.modal.ModalRenderer +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.screen.drawer.DrawerIntent +import dev.minios.pdaiv1.presentation.widget.input.GenerationInputForm +import dev.minios.pdaiv1.presentation.widget.toolbar.GenerationBottomToolbar +import dev.minios.pdaiv1.presentation.widget.work.BackgroundWorkWidget import org.koin.androidx.compose.koinViewModel -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun TextToImageScreen() { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/txt2img/TextToImageState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/txt2img/TextToImageState.kt similarity index 86% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/txt2img/TextToImageState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/txt2img/TextToImageState.kt index 84b91f0f3..53cddbbad 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/txt2img/TextToImageState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/txt2img/TextToImageState.kt @@ -1,27 +1,27 @@ -package com.shifthackz.aisdv1.presentation.screen.txt2img +package dev.minios.pdaiv1.presentation.screen.txt2img import androidx.compose.runtime.Immutable -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.core.validation.ValidationResult -import com.shifthackz.aisdv1.core.validation.dimension.DimensionValidator -import com.shifthackz.aisdv1.domain.entity.ADetailerConfig -import com.shifthackz.aisdv1.domain.entity.ForgeModule -import com.shifthackz.aisdv1.domain.entity.HiresConfig -import com.shifthackz.aisdv1.domain.entity.ModelType -import com.shifthackz.aisdv1.domain.entity.OpenAiModel -import com.shifthackz.aisdv1.domain.entity.OpenAiQuality -import com.shifthackz.aisdv1.domain.entity.OpenAiSize -import com.shifthackz.aisdv1.domain.entity.OpenAiStyle -import com.shifthackz.aisdv1.domain.entity.Scheduler -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.entity.StabilityAiClipGuidance -import com.shifthackz.aisdv1.domain.entity.StabilityAiStylePreset -import com.shifthackz.aisdv1.domain.entity.TextToImagePayload -import com.shifthackz.aisdv1.presentation.core.GenerationMviState -import com.shifthackz.aisdv1.presentation.model.FalAiEndpointUi -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.core.validation.ValidationResult +import dev.minios.pdaiv1.core.validation.dimension.DimensionValidator +import dev.minios.pdaiv1.domain.entity.ADetailerConfig +import dev.minios.pdaiv1.domain.entity.ForgeModule +import dev.minios.pdaiv1.domain.entity.HiresConfig +import dev.minios.pdaiv1.domain.entity.ModelType +import dev.minios.pdaiv1.domain.entity.OpenAiModel +import dev.minios.pdaiv1.domain.entity.OpenAiQuality +import dev.minios.pdaiv1.domain.entity.OpenAiSize +import dev.minios.pdaiv1.domain.entity.OpenAiStyle +import dev.minios.pdaiv1.domain.entity.Scheduler +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.entity.StabilityAiClipGuidance +import dev.minios.pdaiv1.domain.entity.StabilityAiStylePreset +import dev.minios.pdaiv1.domain.entity.TextToImagePayload +import dev.minios.pdaiv1.presentation.core.GenerationMviState +import dev.minios.pdaiv1.presentation.model.FalAiEndpointUi +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Immutable data class TextToImageState( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/txt2img/TextToImageViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/txt2img/TextToImageViewModel.kt similarity index 69% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/txt2img/TextToImageViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/txt2img/TextToImageViewModel.kt index 072bd5084..dff989c86 100755 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/txt2img/TextToImageViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/txt2img/TextToImageViewModel.kt @@ -1,39 +1,39 @@ -package com.shifthackz.aisdv1.presentation.screen.txt2img +package dev.minios.pdaiv1.presentation.screen.txt2img -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.core.common.appbuild.BuildType -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.core.notification.PushNotificationManager -import com.shifthackz.aisdv1.core.validation.dimension.DimensionValidator -import com.shifthackz.aisdv1.domain.entity.HordeProcessStatus -import com.shifthackz.aisdv1.domain.entity.LocalDiffusionStatus -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.feature.diffusion.LocalDiffusion -import com.shifthackz.aisdv1.domain.feature.work.BackgroundTaskManager -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.interactor.wakelock.WakeLockInterActor -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.caching.SaveLastResultToCacheUseCase -import com.shifthackz.aisdv1.domain.usecase.forgemodule.GetForgeModulesUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.InterruptGenerationUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.ObserveHordeProcessStatusUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.ObserveLocalDiffusionProcessStatusUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.SaveGenerationResultUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.TextToImageUseCase -import com.shifthackz.aisdv1.domain.usecase.sdsampler.GetStableDiffusionSamplersUseCase -import com.shifthackz.aisdv1.presentation.core.GenerationFormUpdateEvent -import com.shifthackz.aisdv1.presentation.core.GenerationMviIntent -import com.shifthackz.aisdv1.presentation.core.GenerationMviViewModel -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.navigation.router.drawer.DrawerRouter -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.core.common.appbuild.BuildType +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.schedulers.subscribeOnMainThread +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.core.notification.PushNotificationManager +import dev.minios.pdaiv1.core.validation.dimension.DimensionValidator +import dev.minios.pdaiv1.domain.entity.HordeProcessStatus +import dev.minios.pdaiv1.domain.entity.LocalDiffusionStatus +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.feature.diffusion.LocalDiffusion +import dev.minios.pdaiv1.domain.feature.work.BackgroundTaskManager +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.interactor.wakelock.WakeLockInterActor +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.caching.SaveLastResultToCacheUseCase +import dev.minios.pdaiv1.domain.usecase.forgemodule.GetForgeModulesUseCase +import dev.minios.pdaiv1.domain.usecase.generation.InterruptGenerationUseCase +import dev.minios.pdaiv1.domain.usecase.generation.ObserveHordeProcessStatusUseCase +import dev.minios.pdaiv1.domain.usecase.generation.ObserveLocalDiffusionProcessStatusUseCase +import dev.minios.pdaiv1.domain.usecase.generation.SaveGenerationResultUseCase +import dev.minios.pdaiv1.domain.usecase.generation.TextToImageUseCase +import dev.minios.pdaiv1.domain.usecase.sdsampler.GetStableDiffusionSamplersUseCase +import dev.minios.pdaiv1.presentation.core.GenerationFormUpdateEvent +import dev.minios.pdaiv1.presentation.core.GenerationMviIntent +import dev.minios.pdaiv1.presentation.core.GenerationMviViewModel +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.navigation.router.drawer.DrawerRouter +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter import com.shifthackz.android.core.mvi.EmptyEffect import io.reactivex.rxjava3.kotlin.subscribeBy -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR class TextToImageViewModel( dispatchersProvider: DispatchersProvider, diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/web/SdaiWebViewClient.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/web/PdaiWebViewClient.kt similarity index 91% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/web/SdaiWebViewClient.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/web/PdaiWebViewClient.kt index 220cd3631..e323e8a14 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/web/SdaiWebViewClient.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/web/PdaiWebViewClient.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.presentation.screen.web +package dev.minios.pdaiv1.presentation.screen.web import android.graphics.Bitmap import android.webkit.WebResourceRequest import android.webkit.WebView import android.webkit.WebViewClient -class SdaiWebViewClient( +class PdaiWebViewClient( private val onLoadingChanged: (Boolean) -> Unit = {}, ) : WebViewClient() { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/web/WebViewScreen.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/web/WebViewScreen.kt similarity index 90% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/web/WebViewScreen.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/web/WebViewScreen.kt index c45e312d6..52efddf9a 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/web/WebViewScreen.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/web/WebViewScreen.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.web +package dev.minios.pdaiv1.presentation.screen.web import android.annotation.SuppressLint import android.view.ViewGroup @@ -28,7 +28,7 @@ fun WebViewScreen( domStorageEnabled = true javaScriptEnabled = true setSupportZoom(true) - webViewClient = client ?: SdaiWebViewClient() + webViewClient = client ?: PdaiWebViewClient() } loadUrl(url) webViewCallback(this) diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/web/webui/WebUiIntent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/web/webui/WebUiIntent.kt similarity index 69% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/web/webui/WebUiIntent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/web/webui/WebUiIntent.kt index d55d0ac31..7586e35ab 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/web/webui/WebUiIntent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/web/webui/WebUiIntent.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.screen.web.webui +package dev.minios.pdaiv1.presentation.screen.web.webui import com.shifthackz.android.core.mvi.MviIntent diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/web/webui/WebUiScreen.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/web/webui/WebUiScreen.kt similarity index 93% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/web/webui/WebUiScreen.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/web/webui/WebUiScreen.kt index 3d289807c..442f50075 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/web/webui/WebUiScreen.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/web/webui/WebUiScreen.kt @@ -1,6 +1,6 @@ @file:OptIn(ExperimentalMaterial3Api::class) -package com.shifthackz.aisdv1.presentation.screen.web.webui +package dev.minios.pdaiv1.presentation.screen.web.webui import android.webkit.WebView import android.webkit.WebViewClient @@ -36,10 +36,10 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp import com.shifthackz.android.core.mvi.MviComponent -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.presentation.screen.web.SdaiWebViewClient -import com.shifthackz.aisdv1.presentation.screen.web.WebViewScreen -import com.shifthackz.aisdv1.presentation.widget.source.getName +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.presentation.screen.web.PdaiWebViewClient +import dev.minios.pdaiv1.presentation.screen.web.WebViewScreen +import dev.minios.pdaiv1.presentation.widget.source.getName import org.koin.androidx.compose.koinViewModel @Composable @@ -59,7 +59,7 @@ private fun WebUiScreenContent( var pageLoading by remember { mutableStateOf(true) } var webView: WebView? by remember { mutableStateOf(null) } val client: WebViewClient = remember { - SdaiWebViewClient( + PdaiWebViewClient( onLoadingChanged = { pageLoading = it }, ) } diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/web/webui/WebUiState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/web/webui/WebUiState.kt similarity index 63% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/web/webui/WebUiState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/web/webui/WebUiState.kt index f3aa45858..c2b00e403 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/web/webui/WebUiState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/web/webui/WebUiState.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.presentation.screen.web.webui +package dev.minios.pdaiv1.presentation.screen.web.webui -import com.shifthackz.aisdv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.entity.ServerSource import com.shifthackz.android.core.mvi.MviState data class WebUiState( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/web/webui/WebUiViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/web/webui/WebUiViewModel.kt similarity index 72% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/web/webui/WebUiViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/web/webui/WebUiViewModel.kt index f17cbb22a..1f7a32b6a 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/screen/web/webui/WebUiViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/web/webui/WebUiViewModel.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.presentation.screen.web.webui +package dev.minios.pdaiv1.presentation.screen.web.webui -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.viewmodel.MviRxViewModel +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter import com.shifthackz.android.core.mvi.EmptyEffect class WebUiViewModel( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/theme/ColorTheme.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/theme/ColorTheme.kt similarity index 92% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/theme/ColorTheme.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/theme/ColorTheme.kt index 4c91fbd63..381ef54f0 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/theme/ColorTheme.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/theme/ColorTheme.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.presentation.theme +package dev.minios.pdaiv1.presentation.theme import androidx.compose.foundation.isSystemInDarkTheme import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.Color -import com.shifthackz.aisdv1.domain.entity.ColorToken -import com.shifthackz.aisdv1.domain.entity.DarkThemeToken -import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.entity.ColorToken +import dev.minios.pdaiv1.domain.entity.DarkThemeToken +import dev.minios.pdaiv1.domain.preference.PreferenceManager import com.shifthackz.catppuccin.compose.CatppuccinMaterial import com.shifthackz.catppuccin.palette.Catppuccin import com.shifthackz.catppuccin.palette.CatppuccinPalette diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/theme/SliderTheme.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/theme/SliderTheme.kt similarity index 87% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/theme/SliderTheme.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/theme/SliderTheme.kt index 99a17d1e6..954b28cb4 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/theme/SliderTheme.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/theme/SliderTheme.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.theme +package dev.minios.pdaiv1.presentation.theme import androidx.compose.material3.SliderColors import androidx.compose.material3.SliderDefaults diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/theme/TextFieldColors.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/theme/TextFieldColors.kt similarity index 92% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/theme/TextFieldColors.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/theme/TextFieldColors.kt index 1e7660055..13bfe6d14 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/theme/TextFieldColors.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/theme/TextFieldColors.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.theme +package dev.minios.pdaiv1.presentation.theme import androidx.compose.material3.MaterialTheme import androidx.compose.material3.TextFieldColors diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/theme/global/AiSdAppTheme.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/theme/global/AiSdAppTheme.kt similarity index 92% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/theme/global/AiSdAppTheme.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/theme/global/AiSdAppTheme.kt index ed1f5940c..a61bbdf39 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/theme/global/AiSdAppTheme.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/theme/global/AiSdAppTheme.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.theme.global +package dev.minios.pdaiv1.presentation.theme.global import android.os.Build import androidx.compose.foundation.isSystemInDarkTheme @@ -8,7 +8,7 @@ import androidx.compose.material3.dynamicLightColorScheme import androidx.compose.runtime.Composable import androidx.compose.ui.platform.LocalContext import com.shifthackz.android.core.mvi.MviComponent -import com.shifthackz.aisdv1.presentation.theme.colorTokenPalette +import dev.minios.pdaiv1.presentation.theme.colorTokenPalette import com.shifthackz.catppuccin.compose.CatppuccinTheme import org.koin.androidx.compose.koinViewModel diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/theme/global/AiSdAppThemeState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/theme/global/AiSdAppThemeState.kt similarity index 72% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/theme/global/AiSdAppThemeState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/theme/global/AiSdAppThemeState.kt index 19f84211f..96fae6356 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/theme/global/AiSdAppThemeState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/theme/global/AiSdAppThemeState.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.presentation.theme.global +package dev.minios.pdaiv1.presentation.theme.global import androidx.compose.runtime.Immutable -import com.shifthackz.aisdv1.domain.entity.ColorToken -import com.shifthackz.aisdv1.domain.entity.DarkThemeToken +import dev.minios.pdaiv1.domain.entity.ColorToken +import dev.minios.pdaiv1.domain.entity.DarkThemeToken import com.shifthackz.android.core.mvi.MviState @Immutable diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/theme/global/AiSdAppThemeViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/theme/global/AiSdAppThemeViewModel.kt similarity index 65% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/theme/global/AiSdAppThemeViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/theme/global/AiSdAppThemeViewModel.kt index 66a230853..7dc07e762 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/theme/global/AiSdAppThemeViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/theme/global/AiSdAppThemeViewModel.kt @@ -1,15 +1,15 @@ -package com.shifthackz.aisdv1.presentation.theme.global +package dev.minios.pdaiv1.presentation.theme.global -import com.shifthackz.aisdv1.core.common.extensions.EmptyLambda -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread -import com.shifthackz.aisdv1.core.common.time.TimeProvider -import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel -import com.shifthackz.aisdv1.domain.entity.ColorToken -import com.shifthackz.aisdv1.domain.entity.DarkThemeToken -import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.core.common.extensions.EmptyLambda +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.schedulers.subscribeOnMainThread +import dev.minios.pdaiv1.core.common.time.TimeProvider +import dev.minios.pdaiv1.core.viewmodel.MviRxViewModel +import dev.minios.pdaiv1.domain.entity.ColorToken +import dev.minios.pdaiv1.domain.entity.DarkThemeToken +import dev.minios.pdaiv1.domain.preference.PreferenceManager import com.shifthackz.android.core.mvi.EmptyEffect import com.shifthackz.android.core.mvi.EmptyIntent import io.reactivex.rxjava3.kotlin.subscribeBy diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/Constants.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/utils/Constants.kt similarity index 91% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/Constants.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/utils/Constants.kt index 89a87adba..a6f0f67f3 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/Constants.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/utils/Constants.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.presentation.utils +package dev.minios.pdaiv1.presentation.utils -import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute.HomeNavigation +import dev.minios.pdaiv1.presentation.navigation.NavigationRoute.HomeNavigation object Constants { const val PAGINATION_PAYLOAD_SIZE = 30 diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/ExtrasFormatter.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/utils/ExtrasFormatter.kt similarity index 98% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/ExtrasFormatter.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/utils/ExtrasFormatter.kt index d36b7ac67..046e572fa 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/ExtrasFormatter.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/utils/ExtrasFormatter.kt @@ -1,8 +1,8 @@ @file:Suppress("unused") -package com.shifthackz.aisdv1.presentation.utils +package dev.minios.pdaiv1.presentation.utils -import com.shifthackz.aisdv1.presentation.model.ExtraType +import dev.minios.pdaiv1.presentation.model.ExtraType object ExtrasFormatter { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/FileSavableExporter.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/utils/FileSavableExporter.kt similarity index 82% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/FileSavableExporter.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/utils/FileSavableExporter.kt index f131720c7..a4391b4f5 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/FileSavableExporter.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/utils/FileSavableExporter.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.presentation.utils +package dev.minios.pdaiv1.presentation.utils import android.graphics.Bitmap -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.core.common.file.writeBitmap -import com.shifthackz.aisdv1.core.common.file.writeFilesToZip +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.core.common.file.writeBitmap +import dev.minios.pdaiv1.core.common.file.writeFilesToZip import io.reactivex.rxjava3.core.Single import java.io.File diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/PermissionUtil.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/utils/PermissionUtil.kt similarity index 97% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/PermissionUtil.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/utils/PermissionUtil.kt index 9e0b83edf..ff059f2e1 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/PermissionUtil.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/utils/PermissionUtil.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.utils +package dev.minios.pdaiv1.presentation.utils import android.Manifest import android.content.Context diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/ReportProblemEmailComposer.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/utils/ReportProblemEmailComposer.kt similarity index 62% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/ReportProblemEmailComposer.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/utils/ReportProblemEmailComposer.kt index 2f29dc76e..d9c329799 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/ReportProblemEmailComposer.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/utils/ReportProblemEmailComposer.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.presentation.utils +package dev.minios.pdaiv1.presentation.utils import android.content.Context -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.core.common.log.FileLoggingTree -import com.shifthackz.aisdv1.core.sharing.shareEmail +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.core.common.log.FileLoggingTree +import dev.minios.pdaiv1.core.sharing.shareEmail import org.koin.core.component.KoinComponent import org.koin.core.component.inject import java.io.File @@ -21,9 +21,9 @@ class ReportProblemEmailComposer : KoinComponent { FileLoggingTree.LOGGER_FILENAME ) context.shareEmail( - email = "sdai@moroz.cc", - subject = "SDAI - Problem report", - body = "SDAI : $buildInfoProvider", + email = "crims0n@minios.dev", + subject = "PDAI - Problem report", + body = "PDAI : $buildInfoProvider", file = if (!logFile.exists()) null else logFile, fileProviderPath = fileProviderDescriptor.providerPath, ) diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/UriToBitmap.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/utils/UriToBitmap.kt similarity index 79% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/UriToBitmap.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/utils/UriToBitmap.kt index 56930b013..fc1789ed5 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/utils/UriToBitmap.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/utils/UriToBitmap.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.presentation.utils +package dev.minios.pdaiv1.presentation.utils import android.content.Context import android.graphics.Bitmap import android.graphics.BitmapFactory import android.net.Uri -import com.shifthackz.aisdv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.log.errorLog fun uriToBitmap(context: Context, uri: Uri): Bitmap? = try { val inputStream = context.contentResolver.openInputStream(uri) diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/color/AccentColorSelector.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/color/AccentColorSelector.kt similarity index 97% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/color/AccentColorSelector.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/color/AccentColorSelector.kt index 6c6c77260..456ddac70 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/color/AccentColorSelector.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/color/AccentColorSelector.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.color +package dev.minios.pdaiv1.presentation.widget.color import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -11,7 +11,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.domain.entity.ColorToken +import dev.minios.pdaiv1.domain.entity.ColorToken import com.shifthackz.catppuccin.palette.Catppuccin import com.shifthackz.catppuccin.palette.CatppuccinPalette diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/color/ColorComposable.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/color/ColorComposable.kt similarity index 97% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/color/ColorComposable.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/color/ColorComposable.kt index 9d7384bc4..1b1a08272 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/color/ColorComposable.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/color/ColorComposable.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.color +package dev.minios.pdaiv1.presentation.widget.color import androidx.compose.foundation.background import androidx.compose.foundation.clickable diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/color/DarkThemeColorSelector.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/color/DarkThemeColorSelector.kt similarity index 90% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/color/DarkThemeColorSelector.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/color/DarkThemeColorSelector.kt index ee8c3145d..24b494473 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/color/DarkThemeColorSelector.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/color/DarkThemeColorSelector.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.color +package dev.minios.pdaiv1.presentation.widget.color import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -12,9 +12,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.domain.entity.ColorToken -import com.shifthackz.aisdv1.domain.entity.DarkThemeToken -import com.shifthackz.aisdv1.presentation.theme.toColor +import dev.minios.pdaiv1.domain.entity.ColorToken +import dev.minios.pdaiv1.domain.entity.DarkThemeToken +import dev.minios.pdaiv1.presentation.theme.toColor import com.shifthackz.catppuccin.palette.Catppuccin @Composable diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/connectivity/ConnectivityComposable.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/connectivity/ConnectivityComposable.kt similarity index 95% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/connectivity/ConnectivityComposable.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/connectivity/ConnectivityComposable.kt index 28987940a..885ba4cfb 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/connectivity/ConnectivityComposable.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/connectivity/ConnectivityComposable.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.connectivity +package dev.minios.pdaiv1.presentation.widget.connectivity import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.core.LinearEasing @@ -25,12 +25,12 @@ import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.extensions.measureTextWidth -import com.shifthackz.aisdv1.presentation.theme.colors +import dev.minios.pdaiv1.core.extensions.measureTextWidth +import dev.minios.pdaiv1.presentation.theme.colors import com.shifthackz.android.core.mvi.MviComponent import com.shifthackz.catppuccin.palette.Catppuccin import org.koin.androidx.compose.koinViewModel -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun ConnectivityComposable() { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/connectivity/ConnectivityState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/connectivity/ConnectivityState.kt similarity index 90% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/connectivity/ConnectivityState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/connectivity/ConnectivityState.kt index 9893b38fd..f4faa8cbb 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/connectivity/ConnectivityState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/connectivity/ConnectivityState.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.connectivity +package dev.minios.pdaiv1.presentation.widget.connectivity import com.shifthackz.android.core.mvi.MviState diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/connectivity/ConnectivityViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/connectivity/ConnectivityViewModel.kt similarity index 60% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/connectivity/ConnectivityViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/connectivity/ConnectivityViewModel.kt index fb99f9578..4a490fcd2 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/connectivity/ConnectivityViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/connectivity/ConnectivityViewModel.kt @@ -1,14 +1,14 @@ -package com.shifthackz.aisdv1.presentation.widget.connectivity +package dev.minios.pdaiv1.presentation.widget.connectivity -import com.shifthackz.aisdv1.core.common.extensions.EmptyLambda -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread -import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel -import com.shifthackz.aisdv1.domain.entity.Settings -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.connectivity.ObserveSeverConnectivityUseCase +import dev.minios.pdaiv1.core.common.extensions.EmptyLambda +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.schedulers.subscribeOnMainThread +import dev.minios.pdaiv1.core.viewmodel.MviRxViewModel +import dev.minios.pdaiv1.domain.entity.Settings +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.connectivity.ObserveSeverConnectivityUseCase import com.shifthackz.android.core.mvi.EmptyEffect import com.shifthackz.android.core.mvi.EmptyIntent import io.reactivex.rxjava3.core.Flowable diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/dialog/DecisionInteractiveDialog.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/dialog/DecisionInteractiveDialog.kt similarity index 88% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/dialog/DecisionInteractiveDialog.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/dialog/DecisionInteractiveDialog.kt index 8c1d3248e..8c830fe0d 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/dialog/DecisionInteractiveDialog.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/dialog/DecisionInteractiveDialog.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.dialog +package dev.minios.pdaiv1.presentation.widget.dialog import androidx.annotation.StringRes import androidx.compose.foundation.shape.RoundedCornerShape @@ -11,9 +11,9 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.core.model.asString -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.core.model.asString +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun DecisionInteractiveDialog( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/dialog/ErrorDialog.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/dialog/ErrorDialog.kt similarity index 85% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/dialog/ErrorDialog.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/dialog/ErrorDialog.kt index 0cb700084..38dff7b26 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/dialog/ErrorDialog.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/dialog/ErrorDialog.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.dialog +package dev.minios.pdaiv1.presentation.widget.dialog import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.AlertDialog @@ -10,9 +10,9 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.core.model.asString -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.core.model.asString +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun ErrorDialog( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/dialog/GenerationImageResultDialog.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/dialog/GenerationImageResultDialog.kt similarity index 94% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/dialog/GenerationImageResultDialog.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/dialog/GenerationImageResultDialog.kt index 11a0b958f..fda4bb596 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/dialog/GenerationImageResultDialog.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/dialog/GenerationImageResultDialog.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.dialog +package dev.minios.pdaiv1.presentation.widget.dialog import androidx.compose.foundation.Image import androidx.compose.foundation.clickable @@ -35,11 +35,11 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Dialog -import com.shifthackz.aisdv1.core.imageprocessing.utils.base64ToBitmap -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.presentation.screen.gallery.list.GalleryGridItemUi -import com.shifthackz.aisdv1.presentation.screen.gallery.list.GalleryUiItem -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.imageprocessing.utils.base64ToBitmap +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.presentation.screen.gallery.list.GalleryGridItemUi +import dev.minios.pdaiv1.presentation.screen.gallery.list.GalleryUiItem +import dev.minios.pdaiv1.core.localization.R as LocalizationR private const val MOCK_BASE_64 = "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAYAAADgdz34AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAApgAAAKYB3X3/OAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANCSURBVEiJtZZPbBtFFMZ/M7ubXdtdb1xSFyeilBapySVU8h8OoFaooFSqiihIVIpQBKci6KEg9Q6H9kovIHoCIVQJJCKE1ENFjnAgcaSGC6rEnxBwA04Tx43t2FnvDAfjkNibxgHxnWb2e/u992bee7tCa00YFsffekFY+nUzFtjW0LrvjRXrCDIAaPLlW0nHL0SsZtVoaF98mLrx3pdhOqLtYPHChahZcYYO7KvPFxvRl5XPp1sN3adWiD1ZAqD6XYK1b/dvE5IWryTt2udLFedwc1+9kLp+vbbpoDh+6TklxBeAi9TL0taeWpdmZzQDry0AcO+jQ12RyohqqoYoo8RDwJrU+qXkjWtfi8Xxt58BdQuwQs9qC/afLwCw8tnQbqYAPsgxE1S6F3EAIXux2oQFKm0ihMsOF71dHYx+f3NND68ghCu1YIoePPQN1pGRABkJ6Bus96CutRZMydTl+TvuiRW1m3n0eDl0vRPcEysqdXn+jsQPsrHMquGeXEaY4Yk4wxWcY5V/9scqOMOVUFthatyTy8QyqwZ+kDURKoMWxNKr2EeqVKcTNOajqKoBgOE28U4tdQl5p5bwCw7BWquaZSzAPlwjlithJtp3pTImSqQRrb2Z8PHGigD4RZuNX6JYj6wj7O4TFLbCO/Mn/m8R+h6rYSUb3ekokRY6f/YukArN979jcW+V/S8g0eT/N3VN3kTqWbQ428m9/8k0P/1aIhF36PccEl6EhOcAUCrXKZXXWS3XKd2vc/TRBG9O5ELC17MmWubD2nKhUKZa26Ba2+D3P+4/MNCFwg59oWVeYhkzgN/JDR8deKBoD7Y+ljEjGZ0sosXVTvbc6RHirr2reNy1OXd6pJsQ+gqjk8VWFYmHrwBzW/n+uMPFiRwHB2I7ih8ciHFxIkd/3Omk5tCDV1t+2nNu5sxxpDFNx+huNhVT3/zMDz8usXC3ddaHBj1GHj/As08fwTS7Kt1HBTmyN29vdwAw+/wbwLVOJ3uAD1wi/dUH7Qei66PfyuRj4Ik9is+hglfbkbfR3cnZm7chlUWLdwmprtCohX4HUtlOcQjLYCu+fzGJH2QRKvP3UNz8bWk1qMxjGTOMThZ3kvgLI5AzFfo379UAAAAASUVORK5CYII=" diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/dialog/InfoDialog.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/dialog/InfoDialog.kt similarity index 86% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/dialog/InfoDialog.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/dialog/InfoDialog.kt index f1a4933e9..9695d2d12 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/dialog/InfoDialog.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/dialog/InfoDialog.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.dialog +package dev.minios.pdaiv1.presentation.widget.dialog import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material3.AlertDialog @@ -10,9 +10,9 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.shifthackz.aisdv1.core.localization.R -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.core.model.asString +import dev.minios.pdaiv1.core.localization.R +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.core.model.asString @Composable fun InfoDialog( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/dialog/ProgressDialog.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/dialog/ProgressDialog.kt similarity index 96% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/dialog/ProgressDialog.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/dialog/ProgressDialog.kt index 91add3589..1b61a1cbd 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/dialog/ProgressDialog.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/dialog/ProgressDialog.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.dialog +package dev.minios.pdaiv1.presentation.widget.dialog import androidx.annotation.StringRes import androidx.compose.foundation.layout.Box @@ -24,8 +24,8 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties -import com.shifthackz.aisdv1.core.localization.formatter.DurationFormatter -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.formatter.DurationFormatter +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun ProgressDialog( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/engine/EngineSelectionComponent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/engine/EngineSelectionComponent.kt similarity index 91% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/engine/EngineSelectionComponent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/engine/EngineSelectionComponent.kt index b70641e43..83b6ffa4a 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/engine/EngineSelectionComponent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/engine/EngineSelectionComponent.kt @@ -1,13 +1,13 @@ -package com.shifthackz.aisdv1.presentation.widget.engine +package dev.minios.pdaiv1.presentation.widget.engine import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import com.shifthackz.aisdv1.core.model.asUiText +import dev.minios.pdaiv1.core.model.asUiText import com.shifthackz.android.core.mvi.MviComponent -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.presentation.widget.input.DropdownTextField +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.presentation.widget.input.DropdownTextField import org.koin.androidx.compose.koinViewModel -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun EngineSelectionComponent( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/engine/EngineSelectionIntent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/engine/EngineSelectionIntent.kt similarity index 66% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/engine/EngineSelectionIntent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/engine/EngineSelectionIntent.kt index 9875b587c..fdb606d09 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/engine/EngineSelectionIntent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/engine/EngineSelectionIntent.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.engine +package dev.minios.pdaiv1.presentation.widget.engine import com.shifthackz.android.core.mvi.MviIntent diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/engine/EngineSelectionState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/engine/EngineSelectionState.kt similarity index 82% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/engine/EngineSelectionState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/engine/EngineSelectionState.kt index ba0a02834..19b0df190 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/engine/EngineSelectionState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/engine/EngineSelectionState.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.presentation.widget.engine +package dev.minios.pdaiv1.presentation.widget.engine import androidx.compose.runtime.Immutable -import com.shifthackz.aisdv1.domain.entity.LocalAiModel -import com.shifthackz.aisdv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.domain.entity.ServerSource import com.shifthackz.android.core.mvi.MviState @Immutable diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/engine/EngineSelectionViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/engine/EngineSelectionViewModel.kt similarity index 81% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/engine/EngineSelectionViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/engine/EngineSelectionViewModel.kt index 0d22ca9cf..25d96a94c 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/engine/EngineSelectionViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/engine/EngineSelectionViewModel.kt @@ -1,25 +1,25 @@ -package com.shifthackz.aisdv1.presentation.widget.engine - -import com.shifthackz.aisdv1.core.common.extensions.EmptyLambda -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.common.model.Heptagonal -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread -import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel -import com.shifthackz.aisdv1.domain.entity.Configuration -import com.shifthackz.aisdv1.domain.entity.LocalAiModel -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.downloadable.GetLocalQnnModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.downloadable.ObserveLocalOnnxModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.downloadable.ScanCustomModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.huggingface.FetchAndGetHuggingFaceModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.sdmodel.GetStableDiffusionModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.sdmodel.SelectStableDiffusionModelUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.GetConfigurationUseCase -import com.shifthackz.aisdv1.domain.usecase.stabilityai.FetchAndGetStabilityAiEnginesUseCase -import com.shifthackz.aisdv1.domain.usecase.swarmmodel.FetchAndGetSwarmUiModelsUseCase +package dev.minios.pdaiv1.presentation.widget.engine + +import dev.minios.pdaiv1.core.common.extensions.EmptyLambda +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.model.Heptagonal +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.schedulers.subscribeOnMainThread +import dev.minios.pdaiv1.core.viewmodel.MviRxViewModel +import dev.minios.pdaiv1.domain.entity.Configuration +import dev.minios.pdaiv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.downloadable.GetLocalQnnModelsUseCase +import dev.minios.pdaiv1.domain.usecase.downloadable.ObserveLocalOnnxModelsUseCase +import dev.minios.pdaiv1.domain.usecase.downloadable.ScanCustomModelsUseCase +import dev.minios.pdaiv1.domain.usecase.huggingface.FetchAndGetHuggingFaceModelsUseCase +import dev.minios.pdaiv1.domain.usecase.sdmodel.GetStableDiffusionModelsUseCase +import dev.minios.pdaiv1.domain.usecase.sdmodel.SelectStableDiffusionModelUseCase +import dev.minios.pdaiv1.domain.usecase.settings.GetConfigurationUseCase +import dev.minios.pdaiv1.domain.usecase.stabilityai.FetchAndGetStabilityAiEnginesUseCase +import dev.minios.pdaiv1.domain.usecase.swarmmodel.FetchAndGetSwarmUiModelsUseCase import com.shifthackz.android.core.mvi.EmptyEffect import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.kotlin.subscribeBy diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/engine/QnnRuntimeSelectionComponent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/engine/QnnRuntimeSelectionComponent.kt similarity index 94% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/engine/QnnRuntimeSelectionComponent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/engine/QnnRuntimeSelectionComponent.kt index 5f0f462f5..0518c8a5f 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/engine/QnnRuntimeSelectionComponent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/engine/QnnRuntimeSelectionComponent.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.engine +package dev.minios.pdaiv1.presentation.widget.engine import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row @@ -18,9 +18,9 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.preference.PreferenceManager import org.koin.compose.koinInject -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR /** * Component for selecting QNN runtime mode (CPU or GPU/OpenCL). diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/error/ErrorComposable.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/error/ErrorComposable.kt similarity index 85% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/error/ErrorComposable.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/error/ErrorComposable.kt index 085524efd..1dad09f67 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/error/ErrorComposable.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/error/ErrorComposable.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.error +package dev.minios.pdaiv1.presentation.widget.error import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column @@ -11,9 +11,9 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.shifthackz.aisdv1.core.model.asString -import com.shifthackz.aisdv1.presentation.model.ErrorState -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.model.asString +import dev.minios.pdaiv1.presentation.model.ErrorState +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun ErrorComposable( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/falai/FalAiDynamicForm.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/falai/FalAiDynamicForm.kt similarity index 95% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/falai/FalAiDynamicForm.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/falai/FalAiDynamicForm.kt index 056971dce..f4b0eb58b 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/falai/FalAiDynamicForm.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/falai/FalAiDynamicForm.kt @@ -1,6 +1,6 @@ @file:OptIn(ExperimentalMaterial3Api::class) -package com.shifthackz.aisdv1.presentation.widget.falai +package dev.minios.pdaiv1.presentation.widget.falai import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts @@ -33,12 +33,12 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.domain.entity.FalAiPropertyType -import com.shifthackz.aisdv1.presentation.model.FalAiEndpointUi -import com.shifthackz.aisdv1.presentation.model.FalAiPropertyUi -import com.shifthackz.aisdv1.presentation.screen.falai.FalAiGenerationState -import com.shifthackz.aisdv1.presentation.widget.input.DropdownTextField +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.domain.entity.FalAiPropertyType +import dev.minios.pdaiv1.presentation.model.FalAiEndpointUi +import dev.minios.pdaiv1.presentation.model.FalAiPropertyUi +import dev.minios.pdaiv1.presentation.screen.falai.FalAiGenerationState +import dev.minios.pdaiv1.presentation.widget.input.DropdownTextField @Composable fun FalAiDynamicForm( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/falai/FalAiInpaintField.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/falai/FalAiInpaintField.kt similarity index 96% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/falai/FalAiInpaintField.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/falai/FalAiInpaintField.kt index 977996497..92e5fe007 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/falai/FalAiInpaintField.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/falai/FalAiInpaintField.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.falai +package dev.minios.pdaiv1.presentation.widget.falai import android.graphics.Bitmap import android.graphics.BitmapFactory @@ -34,10 +34,10 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Path import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.presentation.model.FalAiPropertyUi -import com.shifthackz.aisdv1.presentation.model.InPaintModel -import com.shifthackz.aisdv1.presentation.screen.inpaint.components.InPaintComponent -import com.shifthackz.aisdv1.presentation.utils.uriToBitmap +import dev.minios.pdaiv1.presentation.model.FalAiPropertyUi +import dev.minios.pdaiv1.presentation.model.InPaintModel +import dev.minios.pdaiv1.presentation.screen.inpaint.components.InPaintComponent +import dev.minios.pdaiv1.presentation.utils.uriToBitmap import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import java.io.ByteArrayOutputStream diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/falai/FalAiPropertyField.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/falai/FalAiPropertyField.kt similarity index 98% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/falai/FalAiPropertyField.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/falai/FalAiPropertyField.kt index 207e330e6..8f7c886ff 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/falai/FalAiPropertyField.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/falai/FalAiPropertyField.kt @@ -1,6 +1,6 @@ @file:OptIn(ExperimentalMaterial3Api::class) -package com.shifthackz.aisdv1.presentation.widget.falai +package dev.minios.pdaiv1.presentation.widget.falai import android.graphics.Bitmap import android.graphics.BitmapFactory @@ -55,13 +55,13 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.domain.entity.FalAiPropertyType -import com.shifthackz.aisdv1.presentation.model.FalAiPropertyUi -import com.shifthackz.aisdv1.presentation.theme.textFieldColors -import com.shifthackz.aisdv1.presentation.utils.uriToBitmap -import com.shifthackz.aisdv1.presentation.widget.input.DropdownTextField -import com.shifthackz.aisdv1.presentation.widget.input.SliderTextInputField +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.domain.entity.FalAiPropertyType +import dev.minios.pdaiv1.presentation.model.FalAiPropertyUi +import dev.minios.pdaiv1.presentation.theme.textFieldColors +import dev.minios.pdaiv1.presentation.utils.uriToBitmap +import dev.minios.pdaiv1.presentation.widget.input.DropdownTextField +import dev.minios.pdaiv1.presentation.widget.input.SliderTextInputField import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext import java.io.ByteArrayOutputStream diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/frame/PhoneFrame.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/frame/PhoneFrame.kt similarity index 96% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/frame/PhoneFrame.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/frame/PhoneFrame.kt index b30b8117b..a8c51b070 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/frame/PhoneFrame.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/frame/PhoneFrame.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.frame +package dev.minios.pdaiv1.presentation.widget.frame import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.Image @@ -21,7 +21,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.presentation.R +import dev.minios.pdaiv1.presentation.R @Composable fun PhoneFrame( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/image/ZoomableImage.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/image/ZoomableImage.kt similarity index 98% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/image/ZoomableImage.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/image/ZoomableImage.kt index 29d8b8d01..3e1498d94 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/image/ZoomableImage.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/image/ZoomableImage.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.image +package dev.minios.pdaiv1.presentation.widget.image import android.graphics.Bitmap import androidx.annotation.DrawableRes @@ -37,7 +37,7 @@ import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import kotlinx.coroutines.launch -import com.shifthackz.aisdv1.presentation.R as PresentationR +import dev.minios.pdaiv1.presentation.R as PresentationR sealed interface ZoomableImageSource { data class Bmp(val bitmap: Bitmap) : ZoomableImageSource diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/ADetailerSection.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/ADetailerSection.kt similarity index 91% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/ADetailerSection.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/ADetailerSection.kt index f0063e4e2..94507a143 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/ADetailerSection.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/ADetailerSection.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.input +package dev.minios.pdaiv1.presentation.widget.input import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.layout.Arrangement @@ -15,11 +15,11 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.common.math.roundTo -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.domain.entity.ADetailerConfig -import com.shifthackz.aisdv1.presentation.theme.sliderColors -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.common.math.roundTo +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.domain.entity.ADetailerConfig +import dev.minios.pdaiv1.presentation.theme.sliderColors +import dev.minios.pdaiv1.core.localization.R as LocalizationR /** * Composable for configuring ADetailer extension settings. diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/DropdownTextField.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/DropdownTextField.kt similarity index 90% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/DropdownTextField.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/DropdownTextField.kt index 708b7c1fb..6b3ffe0fe 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/DropdownTextField.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/DropdownTextField.kt @@ -1,6 +1,6 @@ @file:OptIn(ExperimentalMaterial3Api::class) -package com.shifthackz.aisdv1.presentation.widget.input +package dev.minios.pdaiv1.presentation.widget.input import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.fillMaxWidth @@ -22,11 +22,11 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.extensions.shimmer -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.core.model.asString -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.presentation.theme.textFieldColors +import dev.minios.pdaiv1.core.extensions.shimmer +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.core.model.asString +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.presentation.theme.textFieldColors @Composable fun DropdownTextField( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/GenerationInputForm.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/GenerationInputForm.kt similarity index 93% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/GenerationInputForm.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/GenerationInputForm.kt index 8d9d610c4..540b14307 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/GenerationInputForm.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/GenerationInputForm.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.input +package dev.minios.pdaiv1.presentation.widget.input import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.layout.Arrangement @@ -38,48 +38,48 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.common.math.roundTo -import com.shifthackz.aisdv1.core.model.asString -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.domain.entity.ADetailerConfig -import com.shifthackz.aisdv1.domain.entity.ForgeModule -import com.shifthackz.aisdv1.domain.entity.ModelType -import com.shifthackz.aisdv1.domain.entity.OpenAiModel -import com.shifthackz.aisdv1.domain.entity.OpenAiQuality -import com.shifthackz.aisdv1.domain.entity.OpenAiSize -import com.shifthackz.aisdv1.domain.entity.OpenAiStyle -import com.shifthackz.aisdv1.domain.entity.Scheduler -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.entity.StabilityAiClipGuidance -import com.shifthackz.aisdv1.domain.entity.StabilityAiSampler -import com.shifthackz.aisdv1.domain.entity.StabilityAiStylePreset -import com.shifthackz.aisdv1.presentation.core.GenerationMviIntent -import com.shifthackz.aisdv1.presentation.core.GenerationMviState -import com.shifthackz.aisdv1.presentation.model.AspectRatio -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.model.QnnResolution -import com.shifthackz.aisdv1.presentation.theme.sliderColors -import com.shifthackz.aisdv1.presentation.theme.textFieldColors -import com.shifthackz.aisdv1.presentation.utils.Constants -import com.shifthackz.aisdv1.presentation.utils.Constants.BATCH_RANGE_MAX -import com.shifthackz.aisdv1.presentation.utils.Constants.BATCH_RANGE_MIN -import com.shifthackz.aisdv1.presentation.utils.Constants.CFG_SCALE_RANGE_MAX -import com.shifthackz.aisdv1.presentation.utils.Constants.CFG_SCALE_RANGE_MIN -import com.shifthackz.aisdv1.presentation.utils.Constants.SAMPLING_STEPS_LOCAL_DIFFUSION_MAX -import com.shifthackz.aisdv1.presentation.utils.Constants.SAMPLING_STEPS_RANGE_MAX -import com.shifthackz.aisdv1.presentation.utils.Constants.SAMPLING_STEPS_RANGE_MIN -import com.shifthackz.aisdv1.presentation.utils.Constants.SAMPLING_STEPS_RANGE_STABILITY_AI_MAX -import com.shifthackz.aisdv1.presentation.utils.Constants.SUB_SEED_STRENGTH_MAX -import com.shifthackz.aisdv1.presentation.utils.Constants.SUB_SEED_STRENGTH_MIN -import com.shifthackz.aisdv1.presentation.widget.engine.EngineSelectionComponent -import com.shifthackz.aisdv1.presentation.widget.engine.QnnRuntimeSelectionComponent -import com.shifthackz.aisdv1.presentation.widget.input.chip.ChipTextFieldEvent -import com.shifthackz.aisdv1.presentation.widget.input.chip.ChipTextFieldWithItem +import dev.minios.pdaiv1.core.common.math.roundTo +import dev.minios.pdaiv1.core.model.asString +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.domain.entity.ADetailerConfig +import dev.minios.pdaiv1.domain.entity.ForgeModule +import dev.minios.pdaiv1.domain.entity.ModelType +import dev.minios.pdaiv1.domain.entity.OpenAiModel +import dev.minios.pdaiv1.domain.entity.OpenAiQuality +import dev.minios.pdaiv1.domain.entity.OpenAiSize +import dev.minios.pdaiv1.domain.entity.OpenAiStyle +import dev.minios.pdaiv1.domain.entity.Scheduler +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.entity.StabilityAiClipGuidance +import dev.minios.pdaiv1.domain.entity.StabilityAiSampler +import dev.minios.pdaiv1.domain.entity.StabilityAiStylePreset +import dev.minios.pdaiv1.presentation.core.GenerationMviIntent +import dev.minios.pdaiv1.presentation.core.GenerationMviState +import dev.minios.pdaiv1.presentation.model.AspectRatio +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.model.QnnResolution +import dev.minios.pdaiv1.presentation.theme.sliderColors +import dev.minios.pdaiv1.presentation.theme.textFieldColors +import dev.minios.pdaiv1.presentation.utils.Constants +import dev.minios.pdaiv1.presentation.utils.Constants.BATCH_RANGE_MAX +import dev.minios.pdaiv1.presentation.utils.Constants.BATCH_RANGE_MIN +import dev.minios.pdaiv1.presentation.utils.Constants.CFG_SCALE_RANGE_MAX +import dev.minios.pdaiv1.presentation.utils.Constants.CFG_SCALE_RANGE_MIN +import dev.minios.pdaiv1.presentation.utils.Constants.SAMPLING_STEPS_LOCAL_DIFFUSION_MAX +import dev.minios.pdaiv1.presentation.utils.Constants.SAMPLING_STEPS_RANGE_MAX +import dev.minios.pdaiv1.presentation.utils.Constants.SAMPLING_STEPS_RANGE_MIN +import dev.minios.pdaiv1.presentation.utils.Constants.SAMPLING_STEPS_RANGE_STABILITY_AI_MAX +import dev.minios.pdaiv1.presentation.utils.Constants.SUB_SEED_STRENGTH_MAX +import dev.minios.pdaiv1.presentation.utils.Constants.SUB_SEED_STRENGTH_MIN +import dev.minios.pdaiv1.presentation.widget.engine.EngineSelectionComponent +import dev.minios.pdaiv1.presentation.widget.engine.QnnRuntimeSelectionComponent +import dev.minios.pdaiv1.presentation.widget.input.chip.ChipTextFieldEvent +import dev.minios.pdaiv1.presentation.widget.input.chip.ChipTextFieldWithItem import kotlin.math.abs import kotlin.math.absoluteValue import kotlin.math.roundToInt import kotlin.random.Random -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun GenerationInputForm( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/HiresSection.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/HiresSection.kt similarity index 92% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/HiresSection.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/HiresSection.kt index 9919cc085..f5a029ac5 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/HiresSection.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/HiresSection.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.input +package dev.minios.pdaiv1.presentation.widget.input import androidx.compose.animation.AnimatedVisibility import androidx.compose.foundation.layout.Arrangement @@ -15,11 +15,11 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.common.math.roundTo -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.domain.entity.HiresConfig -import com.shifthackz.aisdv1.presentation.theme.sliderColors -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.common.math.roundTo +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.domain.entity.HiresConfig +import dev.minios.pdaiv1.presentation.theme.sliderColors +import dev.minios.pdaiv1.core.localization.R as LocalizationR /** * Composable for configuring Hires. Fix settings. diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/MultiSelectDropdownField.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/MultiSelectDropdownField.kt similarity index 93% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/MultiSelectDropdownField.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/MultiSelectDropdownField.kt index 500b45387..c26e54a4d 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/MultiSelectDropdownField.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/MultiSelectDropdownField.kt @@ -1,6 +1,6 @@ @file:OptIn(ExperimentalMaterial3Api::class, ExperimentalLayoutApi::class) -package com.shifthackz.aisdv1.presentation.widget.input +package dev.minios.pdaiv1.presentation.widget.input import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Column @@ -27,10 +27,10 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.core.model.asString -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.presentation.theme.textFieldColors +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.core.model.asString +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.presentation.theme.textFieldColors @Composable fun MultiSelectDropdownField( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/SliderTextInputField.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/SliderTextInputField.kt similarity index 96% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/SliderTextInputField.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/SliderTextInputField.kt index 243e36441..1d1c2e2d4 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/SliderTextInputField.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/SliderTextInputField.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.input +package dev.minios.pdaiv1.presentation.widget.input import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row @@ -30,9 +30,9 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.KeyboardType import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.common.math.roundTo -import com.shifthackz.aisdv1.core.localization.R -import com.shifthackz.aisdv1.presentation.theme.textFieldColors +import dev.minios.pdaiv1.core.common.math.roundTo +import dev.minios.pdaiv1.core.localization.R +import dev.minios.pdaiv1.presentation.theme.textFieldColors @Composable fun SliderTextInputField( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/chip/ChipTextField.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/chip/ChipTextField.kt similarity index 98% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/chip/ChipTextField.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/chip/ChipTextField.kt index f28ad38fc..5ea79e96f 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/chip/ChipTextField.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/chip/ChipTextField.kt @@ -1,6 +1,6 @@ @file:OptIn(ExperimentalLayoutApi::class, ExperimentalMaterial3Api::class) -package com.shifthackz.aisdv1.presentation.widget.input.chip +package dev.minios.pdaiv1.presentation.widget.input.chip import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource @@ -36,7 +36,7 @@ import androidx.compose.ui.text.input.ImeAction import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.text.input.VisualTransformation import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.presentation.theme.textFieldColors +import dev.minios.pdaiv1.presentation.theme.textFieldColors import org.apache.commons.lang3.StringUtils sealed interface ChipTextFieldEvent { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/chip/ChipTextFieldItem.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/chip/ChipTextFieldItem.kt similarity index 93% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/chip/ChipTextFieldItem.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/chip/ChipTextFieldItem.kt index 7ffade3bf..b26eaf1a8 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/chip/ChipTextFieldItem.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/chip/ChipTextFieldItem.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.input.chip +package dev.minios.pdaiv1.presentation.widget.input.chip import androidx.compose.foundation.background import androidx.compose.foundation.clickable @@ -18,8 +18,8 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Shape import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.presentation.model.ExtraType -import com.shifthackz.aisdv1.presentation.theme.isSdAppInDarkTheme +import dev.minios.pdaiv1.presentation.model.ExtraType +import dev.minios.pdaiv1.presentation.theme.isSdAppInDarkTheme import com.shifthackz.catppuccin.palette.Catppuccin @Composable diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/chip/ChipTextFieldWithItem.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/chip/ChipTextFieldWithItem.kt similarity index 91% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/chip/ChipTextFieldWithItem.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/chip/ChipTextFieldWithItem.kt index d5806c12f..c256e6ebb 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/input/chip/ChipTextFieldWithItem.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/input/chip/ChipTextFieldWithItem.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.input.chip +package dev.minios.pdaiv1.presentation.widget.input.chip import androidx.compose.foundation.layout.Arrangement import androidx.compose.material3.LocalTextStyle @@ -9,7 +9,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.input.TextFieldValue import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.presentation.utils.ExtrasFormatter +import dev.minios.pdaiv1.presentation.utils.ExtrasFormatter @Composable fun ChipTextFieldWithItem( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/item/GridIcon.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/item/GridIcon.kt similarity index 94% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/item/GridIcon.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/item/GridIcon.kt index 06a004bbb..ee5046b19 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/item/GridIcon.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/item/GridIcon.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.item +package dev.minios.pdaiv1.presentation.widget.item import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -14,7 +14,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.domain.entity.Grid +import dev.minios.pdaiv1.domain.entity.Grid @Composable fun GridIcon( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/item/NavigationItemIcon.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/item/NavigationItemIcon.kt similarity index 88% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/item/NavigationItemIcon.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/item/NavigationItemIcon.kt index 3d213aa6c..b825a10f1 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/item/NavigationItemIcon.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/item/NavigationItemIcon.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.item +package dev.minios.pdaiv1.presentation.widget.item import androidx.compose.foundation.Image import androidx.compose.material3.Icon @@ -6,7 +6,7 @@ import androidx.compose.material3.LocalContentColor import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.ColorFilter import androidx.compose.ui.res.painterResource -import com.shifthackz.aisdv1.presentation.model.NavItem +import dev.minios.pdaiv1.presentation.model.NavItem @Composable fun NavigationItemIcon(icon: NavItem.Icon) { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/item/SettingsHeader.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/item/SettingsHeader.kt similarity index 95% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/item/SettingsHeader.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/item/SettingsHeader.kt index 0de235fbc..89d50edd4 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/item/SettingsHeader.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/item/SettingsHeader.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.item +package dev.minios.pdaiv1.presentation.widget.item import androidx.compose.animation.AnimatedContent import androidx.compose.animation.AnimatedVisibility @@ -27,9 +27,9 @@ import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.extensions.shimmer -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.core.model.asString +import dev.minios.pdaiv1.core.extensions.shimmer +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.core.model.asString @Composable fun SettingsHeader( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/item/SettingsItem.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/item/SettingsItem.kt similarity index 96% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/item/SettingsItem.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/item/SettingsItem.kt index ba4d3f969..32c72662b 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/item/SettingsItem.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/item/SettingsItem.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.item +package dev.minios.pdaiv1.presentation.widget.item import androidx.compose.animation.Animatable import androidx.compose.animation.AnimatedVisibility @@ -36,9 +36,9 @@ import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.extensions.shimmer -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.core.model.asString +import dev.minios.pdaiv1.core.extensions.shimmer +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.core.model.asString import kotlinx.coroutines.delay @Composable diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/item/SupporterItem.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/item/SupporterItem.kt similarity index 93% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/item/SupporterItem.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/item/SupporterItem.kt index 903cc0fef..67aac2641 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/item/SupporterItem.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/item/SupporterItem.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.item +package dev.minios.pdaiv1.presentation.widget.item import androidx.compose.foundation.background import androidx.compose.foundation.layout.Arrangement @@ -23,8 +23,8 @@ import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp -import com.shifthackz.aisdv1.core.common.extensions.format -import com.shifthackz.aisdv1.domain.entity.Supporter +import dev.minios.pdaiv1.core.common.extensions.format +import dev.minios.pdaiv1.domain.entity.Supporter @Composable @Preview diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/source/ServerSourceLabel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/source/ServerSourceLabel.kt similarity index 73% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/source/ServerSourceLabel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/source/ServerSourceLabel.kt index 9f7dffe93..bdbb548dc 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/source/ServerSourceLabel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/source/ServerSourceLabel.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.presentation.widget.source +package dev.minios.pdaiv1.presentation.widget.source import androidx.compose.runtime.Composable -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.core.model.asString -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.core.model.asString +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun ServerSource.getName(): String { diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/toolbar/GenearionBottomToolbar.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/toolbar/GenearionBottomToolbar.kt similarity index 93% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/toolbar/GenearionBottomToolbar.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/toolbar/GenearionBottomToolbar.kt index cbc655c4b..8ac6fa159 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/toolbar/GenearionBottomToolbar.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/toolbar/GenearionBottomToolbar.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.toolbar +package dev.minios.pdaiv1.presentation.widget.toolbar import androidx.compose.foundation.background import androidx.compose.foundation.border @@ -27,12 +27,12 @@ import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.presentation.core.GenerationMviIntent -import com.shifthackz.aisdv1.presentation.core.GenerationMviState -import com.shifthackz.aisdv1.presentation.model.ExtraType -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.presentation.core.GenerationMviIntent +import dev.minios.pdaiv1.presentation.core.GenerationMviState +import dev.minios.pdaiv1.presentation.model.ExtraType +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun GenerationBottomToolbar( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/toolbar/ModalDialogToolbar.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/toolbar/ModalDialogToolbar.kt similarity index 94% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/toolbar/ModalDialogToolbar.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/toolbar/ModalDialogToolbar.kt index 5d53ad8a1..8bc552f9f 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/toolbar/ModalDialogToolbar.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/toolbar/ModalDialogToolbar.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.toolbar +package dev.minios.pdaiv1.presentation.widget.toolbar import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box @@ -19,7 +19,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.extensions.shimmer +import dev.minios.pdaiv1.core.extensions.shimmer @Composable fun ModalDialogToolbar( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/work/BackgroundWorkIntent.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/work/BackgroundWorkIntent.kt similarity index 73% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/work/BackgroundWorkIntent.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/work/BackgroundWorkIntent.kt index 064439d65..2160f7e0d 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/work/BackgroundWorkIntent.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/work/BackgroundWorkIntent.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.work +package dev.minios.pdaiv1.presentation.widget.work import com.shifthackz.android.core.mvi.MviIntent diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/work/BackgroundWorkState.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/work/BackgroundWorkState.kt similarity index 74% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/work/BackgroundWorkState.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/work/BackgroundWorkState.kt index 2f7cbe460..662d1ed2b 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/work/BackgroundWorkState.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/work/BackgroundWorkState.kt @@ -1,7 +1,7 @@ -package com.shifthackz.aisdv1.presentation.widget.work +package dev.minios.pdaiv1.presentation.widget.work import android.graphics.Bitmap -import com.shifthackz.aisdv1.core.model.UiText +import dev.minios.pdaiv1.core.model.UiText import com.shifthackz.android.core.mvi.MviState data class BackgroundWorkState( diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/work/BackgroundWorkViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/work/BackgroundWorkViewModel.kt similarity index 77% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/work/BackgroundWorkViewModel.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/work/BackgroundWorkViewModel.kt index 0202687a6..445bd4dc2 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/work/BackgroundWorkViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/work/BackgroundWorkViewModel.kt @@ -1,19 +1,19 @@ -package com.shifthackz.aisdv1.presentation.widget.work +package dev.minios.pdaiv1.presentation.widget.work -import com.shifthackz.aisdv1.core.common.log.errorLog -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.common.schedulers.subscribeOnMainThread -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.core.model.UiText -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.core.viewmodel.MviRxViewModel -import com.shifthackz.aisdv1.domain.entity.BackgroundWorkResult -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.core.common.log.errorLog +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.schedulers.subscribeOnMainThread +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.core.model.UiText +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.core.viewmodel.MviRxViewModel +import dev.minios.pdaiv1.domain.entity.BackgroundWorkResult +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver import com.shifthackz.android.core.mvi.EmptyEffect import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.kotlin.subscribeBy -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR class BackgroundWorkViewModel( dispatchersProvider: DispatchersProvider, diff --git a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/work/BackgroundWorkWidget.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/work/BackgroundWorkWidget.kt similarity index 96% rename from presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/work/BackgroundWorkWidget.kt rename to presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/work/BackgroundWorkWidget.kt index 31bd4a488..2e12b3556 100644 --- a/presentation/src/main/java/com/shifthackz/aisdv1/presentation/widget/work/BackgroundWorkWidget.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/work/BackgroundWorkWidget.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.widget.work +package dev.minios.pdaiv1.presentation.widget.work import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.fadeIn @@ -32,11 +32,11 @@ import androidx.compose.ui.graphics.asImageBitmap import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp -import com.shifthackz.aisdv1.core.model.asString -import com.shifthackz.aisdv1.core.model.asUiText +import dev.minios.pdaiv1.core.model.asString +import dev.minios.pdaiv1.core.model.asUiText import com.shifthackz.android.core.mvi.MviComponent import org.koin.androidx.compose.koinViewModel -import com.shifthackz.aisdv1.core.localization.R as LocalizationR +import dev.minios.pdaiv1.core.localization.R as LocalizationR @Composable fun BackgroundWorkWidget( diff --git a/presentation/src/main/res/drawable/ic_pdai_logo.webp b/presentation/src/main/res/drawable/ic_pdai_logo.webp new file mode 100644 index 0000000000000000000000000000000000000000..d19c5c9f15a1d90f4a32965e9706a3b6608ac5cd GIT binary patch literal 6358 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 diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/StableDiffusionEmbeddingMocks.kt b/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/StableDiffusionEmbeddingMocks.kt deleted file mode 100644 index 5b8f9b453..000000000 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/StableDiffusionEmbeddingMocks.kt +++ /dev/null @@ -1,8 +0,0 @@ -package com.shifthackz.aisdv1.presentation.mocks - -import com.shifthackz.aisdv1.domain.entity.Embedding - -val mockEmbeddings = listOf( - Embedding("5598"), - Embedding("151297"), -) diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionViewModelTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/activity/AiStableDiffusionViewModelTest.kt similarity index 90% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionViewModelTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/activity/AiStableDiffusionViewModelTest.kt index a943e9337..1d3ea3090 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/activity/AiStableDiffusionViewModelTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/activity/AiStableDiffusionViewModelTest.kt @@ -1,20 +1,20 @@ @file:OptIn(ExperimentalCoroutinesApi::class) -package com.shifthackz.aisdv1.presentation.activity +package dev.minios.pdaiv1.presentation.activity import androidx.navigation.NavOptionsBuilder import app.cash.turbine.test -import com.shifthackz.aisdv1.domain.entity.Settings -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.presentation.core.CoreViewModelInitializeStrategy -import com.shifthackz.aisdv1.presentation.core.CoreViewModelTest -import com.shifthackz.aisdv1.presentation.navigation.NavigationEffect -import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute -import com.shifthackz.aisdv1.presentation.navigation.router.drawer.DrawerRouter -import com.shifthackz.aisdv1.presentation.navigation.router.home.HomeRouter -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter -import com.shifthackz.aisdv1.presentation.stub.stubDispatchersProvider -import com.shifthackz.aisdv1.presentation.stub.stubSchedulersProvider +import dev.minios.pdaiv1.domain.entity.Settings +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.presentation.core.CoreViewModelInitializeStrategy +import dev.minios.pdaiv1.presentation.core.CoreViewModelTest +import dev.minios.pdaiv1.presentation.navigation.NavigationEffect +import dev.minios.pdaiv1.presentation.navigation.NavigationRoute +import dev.minios.pdaiv1.presentation.navigation.router.drawer.DrawerRouter +import dev.minios.pdaiv1.presentation.navigation.router.home.HomeRouter +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.presentation.stub.stubDispatchersProvider +import dev.minios.pdaiv1.presentation.stub.stubSchedulersProvider import io.mockk.every import io.mockk.mockk import io.mockk.verify diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/core/CoreComposeTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/core/CoreComposeTest.kt similarity index 97% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/core/CoreComposeTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/core/CoreComposeTest.kt index b7a857deb..8790f7ec4 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/core/CoreComposeTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/core/CoreComposeTest.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.core +package dev.minios.pdaiv1.presentation.core import androidx.compose.ui.test.SemanticsNodeInteraction import androidx.compose.ui.test.assertIsDisplayed diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/core/CoreGenerationMviViewModelTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/core/CoreGenerationMviViewModelTest.kt similarity index 69% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/core/CoreGenerationMviViewModelTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/core/CoreGenerationMviViewModelTest.kt index 6dbf6e5e0..8a0609d4d 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/core/CoreGenerationMviViewModelTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/core/CoreGenerationMviViewModelTest.kt @@ -1,26 +1,26 @@ -package com.shifthackz.aisdv1.presentation.core - -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider -import com.shifthackz.aisdv1.core.notification.PushNotificationManager -import com.shifthackz.aisdv1.core.validation.dimension.DimensionValidator -import com.shifthackz.aisdv1.domain.entity.HordeProcessStatus -import com.shifthackz.aisdv1.domain.entity.LocalDiffusionStatus -import com.shifthackz.aisdv1.domain.entity.Settings -import com.shifthackz.aisdv1.domain.feature.work.BackgroundTaskManager -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.interactor.wakelock.WakeLockInterActor -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.caching.SaveLastResultToCacheUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.InterruptGenerationUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.ObserveHordeProcessStatusUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.ObserveLocalDiffusionProcessStatusUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.SaveGenerationResultUseCase -import com.shifthackz.aisdv1.domain.usecase.sdsampler.GetStableDiffusionSamplersUseCase -import com.shifthackz.aisdv1.domain.usecase.forgemodule.GetForgeModulesUseCase -import com.shifthackz.aisdv1.domain.usecase.wakelock.AcquireWakelockUseCase -import com.shifthackz.aisdv1.domain.usecase.wakelock.ReleaseWakeLockUseCase -import com.shifthackz.aisdv1.presentation.navigation.router.drawer.DrawerRouter -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter +package dev.minios.pdaiv1.presentation.core + +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.notification.PushNotificationManager +import dev.minios.pdaiv1.core.validation.dimension.DimensionValidator +import dev.minios.pdaiv1.domain.entity.HordeProcessStatus +import dev.minios.pdaiv1.domain.entity.LocalDiffusionStatus +import dev.minios.pdaiv1.domain.entity.Settings +import dev.minios.pdaiv1.domain.feature.work.BackgroundTaskManager +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.interactor.wakelock.WakeLockInterActor +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.caching.SaveLastResultToCacheUseCase +import dev.minios.pdaiv1.domain.usecase.generation.InterruptGenerationUseCase +import dev.minios.pdaiv1.domain.usecase.generation.ObserveHordeProcessStatusUseCase +import dev.minios.pdaiv1.domain.usecase.generation.ObserveLocalDiffusionProcessStatusUseCase +import dev.minios.pdaiv1.domain.usecase.generation.SaveGenerationResultUseCase +import dev.minios.pdaiv1.domain.usecase.sdsampler.GetStableDiffusionSamplersUseCase +import dev.minios.pdaiv1.domain.usecase.forgemodule.GetForgeModulesUseCase +import dev.minios.pdaiv1.domain.usecase.wakelock.AcquireWakelockUseCase +import dev.minios.pdaiv1.domain.usecase.wakelock.ReleaseWakeLockUseCase +import dev.minios.pdaiv1.presentation.navigation.router.drawer.DrawerRouter +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/core/CoreViewModelInitializeStrategy.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/core/CoreViewModelInitializeStrategy.kt similarity index 65% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/core/CoreViewModelInitializeStrategy.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/core/CoreViewModelInitializeStrategy.kt index 5a247d66e..2b8fb723e 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/core/CoreViewModelInitializeStrategy.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/core/CoreViewModelInitializeStrategy.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.presentation.core +package dev.minios.pdaiv1.presentation.core enum class CoreViewModelInitializeStrategy { InitializeOnce, diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/core/CoreViewModelTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/core/CoreViewModelTest.kt similarity index 96% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/core/CoreViewModelTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/core/CoreViewModelTest.kt index 9a0c4a9a0..e86146925 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/core/CoreViewModelTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/core/CoreViewModelTest.kt @@ -1,6 +1,6 @@ @file:OptIn(ExperimentalCoroutinesApi::class) -package com.shifthackz.aisdv1.presentation.core +package dev.minios.pdaiv1.presentation.core import androidx.lifecycle.ViewModel import kotlinx.coroutines.CoroutineDispatcher diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/AiGenerationResultMocks.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/AiGenerationResultMocks.kt similarity index 83% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/AiGenerationResultMocks.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/AiGenerationResultMocks.kt index e48b7d973..57fdd201f 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/AiGenerationResultMocks.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/AiGenerationResultMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.presentation.mocks +package dev.minios.pdaiv1.presentation.mocks -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.entity.AiGenerationResult import java.util.Date val mockAiGenerationResult = AiGenerationResult( diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/HuggingFaceModelMocks.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/HuggingFaceModelMocks.kt similarity index 71% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/HuggingFaceModelMocks.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/HuggingFaceModelMocks.kt index a18196bb0..4a2b2e58f 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/HuggingFaceModelMocks.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/HuggingFaceModelMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.presentation.mocks +package dev.minios.pdaiv1.presentation.mocks -import com.shifthackz.aisdv1.domain.entity.HuggingFaceModel +import dev.minios.pdaiv1.domain.entity.HuggingFaceModel val mockHuggingFaceModels = listOf( HuggingFaceModel.default, diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/LocalAiModelMocks.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/LocalAiModelMocks.kt similarity index 68% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/LocalAiModelMocks.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/LocalAiModelMocks.kt index 62884de93..0e789c4ee 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/LocalAiModelMocks.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/LocalAiModelMocks.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.presentation.mocks +package dev.minios.pdaiv1.presentation.mocks -import com.shifthackz.aisdv1.domain.entity.DownloadState -import com.shifthackz.aisdv1.domain.entity.LocalAiModel -import com.shifthackz.aisdv1.presentation.screen.setup.ServerSetupState +import dev.minios.pdaiv1.domain.entity.DownloadState +import dev.minios.pdaiv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.presentation.screen.setup.ServerSetupState val mockLocalAiModels = listOf( LocalAiModel.CustomOnnx, diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/StabilityAiEngineMocks.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/StabilityAiEngineMocks.kt similarity index 52% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/StabilityAiEngineMocks.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/StabilityAiEngineMocks.kt index e4f514ea6..2f3c0f705 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/StabilityAiEngineMocks.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/StabilityAiEngineMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.presentation.mocks +package dev.minios.pdaiv1.presentation.mocks -import com.shifthackz.aisdv1.domain.entity.StabilityAiEngine +import dev.minios.pdaiv1.domain.entity.StabilityAiEngine val mockStabilityAiEngines = listOf( StabilityAiEngine( diff --git a/presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/StableDiffusionEmbeddingMocks.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/StableDiffusionEmbeddingMocks.kt new file mode 100644 index 000000000..515dc4036 --- /dev/null +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/StableDiffusionEmbeddingMocks.kt @@ -0,0 +1,8 @@ +package dev.minios.pdaiv1.presentation.mocks + +import dev.minios.pdaiv1.domain.entity.Embedding + +val mockEmbeddings = listOf( + Embedding("5598"), + Embedding("151297"), +) diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/StableDiffusionLoraMocks.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/StableDiffusionLoraMocks.kt similarity index 72% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/StableDiffusionLoraMocks.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/StableDiffusionLoraMocks.kt index 8cadd9724..5d8ecf955 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/StableDiffusionLoraMocks.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/StableDiffusionLoraMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.presentation.mocks +package dev.minios.pdaiv1.presentation.mocks -import com.shifthackz.aisdv1.domain.entity.LoRA +import dev.minios.pdaiv1.domain.entity.LoRA val mockStableDiffusionLoras = listOf( LoRA( diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/StableDiffusionModelMocks.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/StableDiffusionModelMocks.kt similarity index 81% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/StableDiffusionModelMocks.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/StableDiffusionModelMocks.kt index 29149f1da..ff3044280 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/StableDiffusionModelMocks.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/StableDiffusionModelMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.presentation.mocks +package dev.minios.pdaiv1.presentation.mocks -import com.shifthackz.aisdv1.domain.entity.StableDiffusionModel +import dev.minios.pdaiv1.domain.entity.StableDiffusionModel val mockStableDiffusionModels = listOf( StableDiffusionModel( diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/StableDiffusionSamplerMocks.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/StableDiffusionSamplerMocks.kt similarity index 74% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/StableDiffusionSamplerMocks.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/StableDiffusionSamplerMocks.kt index 53d1f9430..1a30b90cc 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/StableDiffusionSamplerMocks.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/StableDiffusionSamplerMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.presentation.mocks +package dev.minios.pdaiv1.presentation.mocks -import com.shifthackz.aisdv1.domain.entity.StableDiffusionSampler +import dev.minios.pdaiv1.domain.entity.StableDiffusionSampler val mockStableDiffusionSamplers = listOf( StableDiffusionSampler( diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/SupporterMocks.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/SupporterMocks.kt similarity index 66% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/SupporterMocks.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/SupporterMocks.kt index 8116e28b9..9a4306b9b 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/SupporterMocks.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/SupporterMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.presentation.mocks +package dev.minios.pdaiv1.presentation.mocks -import com.shifthackz.aisdv1.domain.entity.Supporter +import dev.minios.pdaiv1.domain.entity.Supporter import java.util.Date val mockSupporters = listOf( diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/SwarmUiModelMocks.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/SwarmUiModelMocks.kt similarity index 56% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/SwarmUiModelMocks.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/SwarmUiModelMocks.kt index 167c49a17..1b1393466 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/mocks/SwarmUiModelMocks.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/mocks/SwarmUiModelMocks.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.presentation.mocks +package dev.minios.pdaiv1.presentation.mocks -import com.shifthackz.aisdv1.domain.entity.SwarmUiModel +import dev.minios.pdaiv1.domain.entity.SwarmUiModel val mockSwarmUiModels = listOf( SwarmUiModel( diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/modal/embedding/EmbeddingViewModelTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/modal/embedding/EmbeddingViewModelTest.kt similarity index 88% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/modal/embedding/EmbeddingViewModelTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/modal/embedding/EmbeddingViewModelTest.kt index 100fa9f9f..c574ff7d0 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/modal/embedding/EmbeddingViewModelTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/modal/embedding/EmbeddingViewModelTest.kt @@ -1,14 +1,14 @@ -package com.shifthackz.aisdv1.presentation.modal.embedding - -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.sdembedding.FetchAndGetEmbeddingsUseCase -import com.shifthackz.aisdv1.presentation.core.CoreViewModelTest -import com.shifthackz.aisdv1.presentation.mocks.mockEmbeddings -import com.shifthackz.aisdv1.presentation.modal.extras.ExtrasEffect -import com.shifthackz.aisdv1.presentation.model.ErrorState -import com.shifthackz.aisdv1.presentation.stub.stubDispatchersProvider -import com.shifthackz.aisdv1.presentation.stub.stubSchedulersProvider +package dev.minios.pdaiv1.presentation.modal.embedding + +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.sdembedding.FetchAndGetEmbeddingsUseCase +import dev.minios.pdaiv1.presentation.core.CoreViewModelTest +import dev.minios.pdaiv1.presentation.mocks.mockEmbeddings +import dev.minios.pdaiv1.presentation.modal.extras.ExtrasEffect +import dev.minios.pdaiv1.presentation.model.ErrorState +import dev.minios.pdaiv1.presentation.stub.stubDispatchersProvider +import dev.minios.pdaiv1.presentation.stub.stubSchedulersProvider import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Single diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/modal/extras/ExtrasViewModelTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/modal/extras/ExtrasViewModelTest.kt similarity index 87% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/modal/extras/ExtrasViewModelTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/modal/extras/ExtrasViewModelTest.kt index 2e503c53b..361651ee0 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/modal/extras/ExtrasViewModelTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/modal/extras/ExtrasViewModelTest.kt @@ -1,16 +1,16 @@ -package com.shifthackz.aisdv1.presentation.modal.extras - -import com.shifthackz.aisdv1.core.common.time.TimeProvider -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.sdhypernet.FetchAndGetHyperNetworksUseCase -import com.shifthackz.aisdv1.domain.usecase.sdlora.FetchAndGetLorasUseCase -import com.shifthackz.aisdv1.presentation.core.CoreViewModelTest -import com.shifthackz.aisdv1.presentation.mocks.mockStableDiffusionLoras -import com.shifthackz.aisdv1.presentation.model.ErrorState -import com.shifthackz.aisdv1.presentation.model.ExtraType -import com.shifthackz.aisdv1.presentation.stub.stubDispatchersProvider -import com.shifthackz.aisdv1.presentation.stub.stubSchedulersProvider +package dev.minios.pdaiv1.presentation.modal.extras + +import dev.minios.pdaiv1.core.common.time.TimeProvider +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.sdhypernet.FetchAndGetHyperNetworksUseCase +import dev.minios.pdaiv1.domain.usecase.sdlora.FetchAndGetLorasUseCase +import dev.minios.pdaiv1.presentation.core.CoreViewModelTest +import dev.minios.pdaiv1.presentation.mocks.mockStableDiffusionLoras +import dev.minios.pdaiv1.presentation.model.ErrorState +import dev.minios.pdaiv1.presentation.model.ExtraType +import dev.minios.pdaiv1.presentation.stub.stubDispatchersProvider +import dev.minios.pdaiv1.presentation.stub.stubSchedulersProvider import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Single diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/modal/tag/EditTagViewModelTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/modal/tag/EditTagViewModelTest.kt similarity index 93% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/modal/tag/EditTagViewModelTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/modal/tag/EditTagViewModelTest.kt index 4035f93f7..797922aef 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/modal/tag/EditTagViewModelTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/modal/tag/EditTagViewModelTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.presentation.modal.tag +package dev.minios.pdaiv1.presentation.modal.tag -import com.shifthackz.aisdv1.presentation.core.CoreViewModelTest -import com.shifthackz.aisdv1.presentation.model.ExtraType -import com.shifthackz.aisdv1.presentation.stub.stubDispatchersProvider +import dev.minios.pdaiv1.presentation.core.CoreViewModelTest +import dev.minios.pdaiv1.presentation.model.ExtraType +import dev.minios.pdaiv1.presentation.stub.stubDispatchersProvider import kotlinx.coroutines.flow.firstOrNull import kotlinx.coroutines.test.runTest import org.junit.Assert diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/navigation/router/drawer/DrawerRouterImplTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/navigation/router/drawer/DrawerRouterImplTest.kt similarity index 88% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/navigation/router/drawer/DrawerRouterImplTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/navigation/router/drawer/DrawerRouterImplTest.kt index dbc4295d6..402bc92c1 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/navigation/router/drawer/DrawerRouterImplTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/navigation/router/drawer/DrawerRouterImplTest.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.presentation.navigation.router.drawer +package dev.minios.pdaiv1.presentation.navigation.router.drawer -import com.shifthackz.aisdv1.presentation.navigation.NavigationEffect +import dev.minios.pdaiv1.presentation.navigation.NavigationEffect import org.junit.Test class DrawerRouterImplTest { diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/navigation/router/main/MainRouterImplTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/navigation/router/main/MainRouterImplTest.kt similarity index 93% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/navigation/router/main/MainRouterImplTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/navigation/router/main/MainRouterImplTest.kt index af3c57efe..0e6071ac7 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/navigation/router/main/MainRouterImplTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/navigation/router/main/MainRouterImplTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.presentation.navigation.router.main +package dev.minios.pdaiv1.presentation.navigation.router.main -import com.shifthackz.aisdv1.presentation.model.LaunchSource -import com.shifthackz.aisdv1.presentation.navigation.NavigationEffect -import com.shifthackz.aisdv1.presentation.navigation.NavigationRoute +import dev.minios.pdaiv1.presentation.model.LaunchSource +import dev.minios.pdaiv1.presentation.navigation.NavigationEffect +import dev.minios.pdaiv1.presentation.navigation.NavigationRoute import org.junit.Test class MainRouterImplTest { diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/debug/DebugMenuViewModelTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/debug/DebugMenuViewModelTest.kt similarity index 75% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/debug/DebugMenuViewModelTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/debug/DebugMenuViewModelTest.kt index 537596865..8e28686d8 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/debug/DebugMenuViewModelTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/debug/DebugMenuViewModelTest.kt @@ -1,14 +1,14 @@ -package com.shifthackz.aisdv1.presentation.screen.debug +package dev.minios.pdaiv1.presentation.screen.debug -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.domain.entity.Settings -import com.shifthackz.aisdv1.domain.feature.work.BackgroundTaskManager -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.debug.DebugInsertBadBase64UseCase -import com.shifthackz.aisdv1.presentation.core.CoreViewModelTest -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter -import com.shifthackz.aisdv1.presentation.stub.stubDispatchersProvider -import com.shifthackz.aisdv1.presentation.stub.stubSchedulersProvider +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.domain.entity.Settings +import dev.minios.pdaiv1.domain.feature.work.BackgroundTaskManager +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.debug.DebugInsertBadBase64UseCase +import dev.minios.pdaiv1.presentation.core.CoreViewModelTest +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.presentation.stub.stubDispatchersProvider +import dev.minios.pdaiv1.presentation.stub.stubSchedulersProvider import io.mockk.every import io.mockk.mockk import io.mockk.verify diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/donate/DonateViewModelTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/donate/DonateViewModelTest.kt similarity index 81% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/donate/DonateViewModelTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/donate/DonateViewModelTest.kt index f65d03966..a034b6dfa 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/donate/DonateViewModelTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/donate/DonateViewModelTest.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.presentation.screen.donate +package dev.minios.pdaiv1.presentation.screen.donate -import com.shifthackz.aisdv1.domain.usecase.donate.FetchAndGetSupportersUseCase -import com.shifthackz.aisdv1.presentation.core.CoreViewModelTest -import com.shifthackz.aisdv1.presentation.mocks.mockSupporters -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter -import com.shifthackz.aisdv1.presentation.stub.stubDispatchersProvider -import com.shifthackz.aisdv1.presentation.stub.stubSchedulersProvider +import dev.minios.pdaiv1.domain.usecase.donate.FetchAndGetSupportersUseCase +import dev.minios.pdaiv1.presentation.core.CoreViewModelTest +import dev.minios.pdaiv1.presentation.mocks.mockSupporters +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.presentation.stub.stubDispatchersProvider +import dev.minios.pdaiv1.presentation.stub.stubSchedulersProvider import io.mockk.every import io.mockk.mockk import io.mockk.verify diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/drawer/DrawerViewModelTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/drawer/DrawerViewModelTest.kt similarity index 80% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/drawer/DrawerViewModelTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/drawer/DrawerViewModelTest.kt index 9f5983f7b..915d1713d 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/drawer/DrawerViewModelTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/drawer/DrawerViewModelTest.kt @@ -1,8 +1,8 @@ -package com.shifthackz.aisdv1.presentation.screen.drawer +package dev.minios.pdaiv1.presentation.screen.drawer -import com.shifthackz.aisdv1.presentation.core.CoreViewModelTest -import com.shifthackz.aisdv1.presentation.navigation.router.drawer.DrawerRouter -import com.shifthackz.aisdv1.presentation.stub.stubDispatchersProvider +import dev.minios.pdaiv1.presentation.core.CoreViewModelTest +import dev.minios.pdaiv1.presentation.navigation.router.drawer.DrawerRouter +import dev.minios.pdaiv1.presentation.stub.stubDispatchersProvider import io.mockk.every import io.mockk.mockk import io.mockk.verify diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailViewModelTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailViewModelTest.kt similarity index 88% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailViewModelTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailViewModelTest.kt index d2729cab3..3a1ae158d 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/gallery/detail/GalleryDetailViewModelTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/gallery/detail/GalleryDetailViewModelTest.kt @@ -1,28 +1,28 @@ @file:OptIn(ExperimentalCoroutinesApi::class) -package com.shifthackz.aisdv1.presentation.screen.gallery.detail +package dev.minios.pdaiv1.presentation.screen.gallery.detail import android.graphics.Bitmap import app.cash.turbine.test -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.core.model.asUiText -import com.shifthackz.aisdv1.domain.entity.AiGenerationResult -import com.shifthackz.aisdv1.domain.usecase.caching.GetLastResultFromCacheUseCase -import com.shifthackz.aisdv1.domain.usecase.gallery.DeleteGalleryItemUseCase -import com.shifthackz.aisdv1.domain.usecase.gallery.GetGalleryPagedIdsUseCase -import com.shifthackz.aisdv1.domain.usecase.gallery.ToggleImageVisibilityUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.GetGenerationResultUseCase -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway -import com.shifthackz.aisdv1.presentation.core.CoreViewModelTest -import com.shifthackz.aisdv1.presentation.core.GenerationFormUpdateEvent -import com.shifthackz.aisdv1.presentation.extensions.mapToUi -import com.shifthackz.aisdv1.presentation.mocks.mockAiGenerationResult -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter -import com.shifthackz.aisdv1.presentation.stub.stubDispatchersProvider -import com.shifthackz.aisdv1.presentation.stub.stubSchedulersProvider +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.core.model.asUiText +import dev.minios.pdaiv1.domain.entity.AiGenerationResult +import dev.minios.pdaiv1.domain.usecase.caching.GetLastResultFromCacheUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.DeleteGalleryItemUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.GetGalleryPagedIdsUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.ToggleImageVisibilityUseCase +import dev.minios.pdaiv1.domain.usecase.generation.GetGenerationResultUseCase +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.presentation.core.CoreViewModelTest +import dev.minios.pdaiv1.presentation.core.GenerationFormUpdateEvent +import dev.minios.pdaiv1.presentation.extensions.mapToUi +import dev.minios.pdaiv1.presentation.mocks.mockAiGenerationResult +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.presentation.stub.stubDispatchersProvider +import dev.minios.pdaiv1.presentation.stub.stubSchedulersProvider import io.mockk.every import io.mockk.mockk import io.mockk.verify diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryViewModelTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryViewModelTest.kt similarity index 82% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryViewModelTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryViewModelTest.kt index fa329725c..cd7557ae9 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/gallery/list/GalleryViewModelTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryViewModelTest.kt @@ -1,26 +1,26 @@ @file:OptIn(ExperimentalCoroutinesApi::class) -package com.shifthackz.aisdv1.presentation.screen.gallery.list +package dev.minios.pdaiv1.presentation.screen.gallery.list import android.graphics.Bitmap import android.net.Uri -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.domain.entity.MediaStoreInfo -import com.shifthackz.aisdv1.domain.entity.Settings -import com.shifthackz.aisdv1.domain.feature.work.BackgroundWorkObserver -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.gallery.DeleteAllGalleryUseCase -import com.shifthackz.aisdv1.domain.usecase.gallery.DeleteGalleryItemsUseCase -import com.shifthackz.aisdv1.domain.usecase.gallery.GetAllGalleryUseCase -import com.shifthackz.aisdv1.domain.usecase.gallery.GetMediaStoreInfoUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.GetGenerationResultPagedUseCase -import com.shifthackz.aisdv1.domain.gateway.MediaStoreGateway -import com.shifthackz.aisdv1.presentation.core.CoreViewModelTest -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.navigation.router.drawer.DrawerRouter -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter -import com.shifthackz.aisdv1.presentation.stub.stubDispatchersProvider -import com.shifthackz.aisdv1.presentation.stub.stubSchedulersProvider +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.domain.entity.MediaStoreInfo +import dev.minios.pdaiv1.domain.entity.Settings +import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.gallery.DeleteAllGalleryUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.DeleteGalleryItemsUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.GetAllGalleryUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.GetMediaStoreInfoUseCase +import dev.minios.pdaiv1.domain.usecase.generation.GetGenerationResultPagedUseCase +import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway +import dev.minios.pdaiv1.presentation.core.CoreViewModelTest +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.navigation.router.drawer.DrawerRouter +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.presentation.stub.stubDispatchersProvider +import dev.minios.pdaiv1.presentation.stub.stubSchedulersProvider import io.mockk.every import io.mockk.mockk import io.mockk.verify diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageViewModelTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/img2img/ImageToImageViewModelTest.kt similarity index 91% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageViewModelTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/img2img/ImageToImageViewModelTest.kt index d24493552..e87ec5a17 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/img2img/ImageToImageViewModelTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/img2img/ImageToImageViewModelTest.kt @@ -1,30 +1,30 @@ -package com.shifthackz.aisdv1.presentation.screen.img2img +package dev.minios.pdaiv1.presentation.screen.img2img import android.graphics.Bitmap -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.core.imageprocessing.Base64ToBitmapConverter -import com.shifthackz.aisdv1.core.imageprocessing.BitmapToBase64Converter -import com.shifthackz.aisdv1.core.validation.ValidationResult -import com.shifthackz.aisdv1.core.validation.dimension.DimensionValidator.Error -import com.shifthackz.aisdv1.domain.entity.OpenAiModel -import com.shifthackz.aisdv1.domain.entity.OpenAiQuality -import com.shifthackz.aisdv1.domain.entity.OpenAiSize -import com.shifthackz.aisdv1.domain.entity.OpenAiStyle -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.entity.Settings -import com.shifthackz.aisdv1.domain.entity.StableDiffusionSampler -import com.shifthackz.aisdv1.domain.usecase.generation.GetRandomImageUseCase -import com.shifthackz.aisdv1.domain.usecase.generation.ImageToImageUseCase -import com.shifthackz.aisdv1.presentation.core.CoreGenerationMviViewModelTest -import com.shifthackz.aisdv1.presentation.core.GenerationFormUpdateEvent -import com.shifthackz.aisdv1.presentation.core.GenerationMviIntent -import com.shifthackz.aisdv1.presentation.mocks.mockAiGenerationResult -import com.shifthackz.aisdv1.presentation.model.InPaintModel -import com.shifthackz.aisdv1.presentation.model.LaunchSource -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.screen.drawer.DrawerIntent -import com.shifthackz.aisdv1.presentation.screen.inpaint.InPaintStateProducer -import com.shifthackz.aisdv1.presentation.stub.stubDispatchersProvider +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.core.imageprocessing.BitmapToBase64Converter +import dev.minios.pdaiv1.core.validation.ValidationResult +import dev.minios.pdaiv1.core.validation.dimension.DimensionValidator.Error +import dev.minios.pdaiv1.domain.entity.OpenAiModel +import dev.minios.pdaiv1.domain.entity.OpenAiQuality +import dev.minios.pdaiv1.domain.entity.OpenAiSize +import dev.minios.pdaiv1.domain.entity.OpenAiStyle +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.entity.Settings +import dev.minios.pdaiv1.domain.entity.StableDiffusionSampler +import dev.minios.pdaiv1.domain.usecase.generation.GetRandomImageUseCase +import dev.minios.pdaiv1.domain.usecase.generation.ImageToImageUseCase +import dev.minios.pdaiv1.presentation.core.CoreGenerationMviViewModelTest +import dev.minios.pdaiv1.presentation.core.GenerationFormUpdateEvent +import dev.minios.pdaiv1.presentation.core.GenerationMviIntent +import dev.minios.pdaiv1.presentation.mocks.mockAiGenerationResult +import dev.minios.pdaiv1.presentation.model.InPaintModel +import dev.minios.pdaiv1.presentation.model.LaunchSource +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.screen.drawer.DrawerIntent +import dev.minios.pdaiv1.presentation.screen.inpaint.InPaintStateProducer +import dev.minios.pdaiv1.presentation.stub.stubDispatchersProvider import io.mockk.every import io.mockk.mockk import io.mockk.unmockkAll diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintViewModelTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/inpaint/InPaintViewModelTest.kt similarity index 94% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintViewModelTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/inpaint/InPaintViewModelTest.kt index 6d5eba17b..c8b5d7e80 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/inpaint/InPaintViewModelTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/inpaint/InPaintViewModelTest.kt @@ -1,13 +1,13 @@ -package com.shifthackz.aisdv1.presentation.screen.inpaint +package dev.minios.pdaiv1.presentation.screen.inpaint import android.graphics.Bitmap import androidx.compose.ui.graphics.Path -import com.shifthackz.aisdv1.presentation.core.CoreViewModelTest -import com.shifthackz.aisdv1.presentation.model.InPaintModel -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter -import com.shifthackz.aisdv1.presentation.stub.stubDispatchersProvider -import com.shifthackz.aisdv1.presentation.stub.stubSchedulersProvider +import dev.minios.pdaiv1.presentation.core.CoreViewModelTest +import dev.minios.pdaiv1.presentation.model.InPaintModel +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.presentation.stub.stubDispatchersProvider +import dev.minios.pdaiv1.presentation.stub.stubSchedulersProvider import io.mockk.every import io.mockk.mockk import io.mockk.verify diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/loader/ConfigurationLoaderViewModelTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/loader/ConfigurationLoaderViewModelTest.kt similarity index 83% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/loader/ConfigurationLoaderViewModelTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/loader/ConfigurationLoaderViewModelTest.kt index 4e4e2e1e7..40286a8fb 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/loader/ConfigurationLoaderViewModelTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/loader/ConfigurationLoaderViewModelTest.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.presentation.screen.loader +package dev.minios.pdaiv1.presentation.screen.loader -import com.shifthackz.aisdv1.domain.usecase.caching.DataPreLoaderUseCase -import com.shifthackz.aisdv1.presentation.core.CoreViewModelTest -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter -import com.shifthackz.aisdv1.presentation.stub.stubDispatchersProvider -import com.shifthackz.aisdv1.presentation.stub.stubSchedulersProvider +import dev.minios.pdaiv1.domain.usecase.caching.DataPreLoaderUseCase +import dev.minios.pdaiv1.presentation.core.CoreViewModelTest +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.presentation.stub.stubDispatchersProvider +import dev.minios.pdaiv1.presentation.stub.stubSchedulersProvider import io.mockk.every import io.mockk.mockk import io.mockk.verify diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerViewModelTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/logger/LoggerViewModelTest.kt similarity index 81% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerViewModelTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/logger/LoggerViewModelTest.kt index 8c5750ca9..e64734904 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/logger/LoggerViewModelTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/logger/LoggerViewModelTest.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.presentation.screen.logger +package dev.minios.pdaiv1.presentation.screen.logger -import com.shifthackz.aisdv1.core.common.file.FileProviderDescriptor -import com.shifthackz.aisdv1.presentation.core.CoreViewModelTest -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter -import com.shifthackz.aisdv1.presentation.stub.stubDispatchersProvider +import dev.minios.pdaiv1.core.common.file.FileProviderDescriptor +import dev.minios.pdaiv1.presentation.core.CoreViewModelTest +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.presentation.stub.stubDispatchersProvider import io.mockk.every import io.mockk.mockk import io.mockk.verify diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingViewModelSplashSourceTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/onboarding/OnBoardingViewModelSplashSourceTest.kt similarity index 77% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingViewModelSplashSourceTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/onboarding/OnBoardingViewModelSplashSourceTest.kt index c46e040c3..3fa0f32a5 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/onboarding/OnBoardingViewModelSplashSourceTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/onboarding/OnBoardingViewModelSplashSourceTest.kt @@ -1,15 +1,15 @@ -package com.shifthackz.aisdv1.presentation.screen.onboarding - -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.domain.entity.DarkThemeToken -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.splash.SplashNavigationUseCase -import com.shifthackz.aisdv1.presentation.core.CoreViewModelInitializeStrategy -import com.shifthackz.aisdv1.presentation.core.CoreViewModelTest -import com.shifthackz.aisdv1.presentation.model.LaunchSource -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter -import com.shifthackz.aisdv1.presentation.stub.stubDispatchersProvider -import com.shifthackz.aisdv1.presentation.stub.stubSchedulersProvider +package dev.minios.pdaiv1.presentation.screen.onboarding + +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.domain.entity.DarkThemeToken +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.splash.SplashNavigationUseCase +import dev.minios.pdaiv1.presentation.core.CoreViewModelInitializeStrategy +import dev.minios.pdaiv1.presentation.core.CoreViewModelTest +import dev.minios.pdaiv1.presentation.model.LaunchSource +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.presentation.stub.stubDispatchersProvider +import dev.minios.pdaiv1.presentation.stub.stubSchedulersProvider import io.mockk.every import io.mockk.mockk import io.mockk.verify diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsViewModelTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/settings/SettingsViewModelTest.kt similarity index 92% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsViewModelTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/settings/SettingsViewModelTest.kt index a973ed404..def58d295 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/settings/SettingsViewModelTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/settings/SettingsViewModelTest.kt @@ -1,25 +1,25 @@ -package com.shifthackz.aisdv1.presentation.screen.settings +package dev.minios.pdaiv1.presentation.screen.settings import android.os.Build import app.cash.turbine.test -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.domain.entity.ColorToken -import com.shifthackz.aisdv1.domain.entity.DarkThemeToken -import com.shifthackz.aisdv1.domain.entity.Settings -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.caching.ClearAppCacheUseCase -import com.shifthackz.aisdv1.domain.usecase.sdmodel.GetStableDiffusionModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.sdmodel.SelectStableDiffusionModelUseCase -import com.shifthackz.aisdv1.domain.usecase.stabilityai.ObserveStabilityAiCreditsUseCase -import com.shifthackz.aisdv1.presentation.core.CoreViewModelTest -import com.shifthackz.aisdv1.presentation.mocks.mockStableDiffusionModels -import com.shifthackz.aisdv1.presentation.model.LaunchSource -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.navigation.router.drawer.DrawerRouter -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter -import com.shifthackz.aisdv1.presentation.screen.debug.DebugMenuAccessor -import com.shifthackz.aisdv1.presentation.stub.stubDispatchersProvider -import com.shifthackz.aisdv1.presentation.stub.stubSchedulersProvider +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.domain.entity.ColorToken +import dev.minios.pdaiv1.domain.entity.DarkThemeToken +import dev.minios.pdaiv1.domain.entity.Settings +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.caching.ClearAppCacheUseCase +import dev.minios.pdaiv1.domain.usecase.sdmodel.GetStableDiffusionModelsUseCase +import dev.minios.pdaiv1.domain.usecase.sdmodel.SelectStableDiffusionModelUseCase +import dev.minios.pdaiv1.domain.usecase.stabilityai.ObserveStabilityAiCreditsUseCase +import dev.minios.pdaiv1.presentation.core.CoreViewModelTest +import dev.minios.pdaiv1.presentation.mocks.mockStableDiffusionModels +import dev.minios.pdaiv1.presentation.model.LaunchSource +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.navigation.router.drawer.DrawerRouter +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.presentation.screen.debug.DebugMenuAccessor +import dev.minios.pdaiv1.presentation.stub.stubDispatchersProvider +import dev.minios.pdaiv1.presentation.stub.stubSchedulersProvider import io.mockk.every import io.mockk.mockk import io.mockk.verify diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupScreenTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/setup/ServerSetupScreenTest.kt similarity index 90% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupScreenTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/setup/ServerSetupScreenTest.kt index 27eb75b16..f24f89101 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupScreenTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/setup/ServerSetupScreenTest.kt @@ -1,6 +1,6 @@ @file:OptIn(ExperimentalCoroutinesApi::class) -package com.shifthackz.aisdv1.presentation.screen.setup +package dev.minios.pdaiv1.presentation.screen.setup import androidx.compose.ui.test.assertIsDisplayed import androidx.compose.ui.test.assertIsEnabled @@ -11,15 +11,15 @@ import androidx.compose.ui.test.assertTextEquals import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.performClick import androidx.test.ext.junit.runners.AndroidJUnit4 -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.core.common.appbuild.BuildType -import com.shifthackz.aisdv1.core.common.appbuild.BuildVersion -import com.shifthackz.aisdv1.domain.entity.LocalAiModel -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.presentation.core.CoreComposeTest -import com.shifthackz.aisdv1.presentation.mocks.mockLocalAiModels -import com.shifthackz.aisdv1.presentation.screen.setup.mappers.mapToUi -import com.shifthackz.aisdv1.presentation.screen.setup.mappers.withNewState +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.core.common.appbuild.BuildType +import dev.minios.pdaiv1.core.common.appbuild.BuildVersion +import dev.minios.pdaiv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.presentation.core.CoreComposeTest +import dev.minios.pdaiv1.presentation.mocks.mockLocalAiModels +import dev.minios.pdaiv1.presentation.screen.setup.mappers.mapToUi +import dev.minios.pdaiv1.presentation.screen.setup.mappers.withNewState import io.mockk.every import io.mockk.mockk import kotlinx.coroutines.Dispatchers diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupViewModelTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/setup/ServerSetupViewModelTest.kt similarity index 87% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupViewModelTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/setup/ServerSetupViewModelTest.kt index 3e3c783d4..1157cc38e 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/setup/ServerSetupViewModelTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/setup/ServerSetupViewModelTest.kt @@ -1,33 +1,33 @@ -package com.shifthackz.aisdv1.presentation.screen.setup - -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.core.validation.common.CommonStringValidator -import com.shifthackz.aisdv1.core.validation.path.FilePathValidator -import com.shifthackz.aisdv1.core.validation.url.UrlValidator -import com.shifthackz.aisdv1.domain.entity.Configuration -import com.shifthackz.aisdv1.domain.entity.DownloadState -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.interactor.settings.SetupConnectionInterActor -import com.shifthackz.aisdv1.domain.interactor.wakelock.WakeLockInterActor -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.downloadable.DeleteModelUseCase -import com.shifthackz.aisdv1.domain.usecase.downloadable.DownloadModelUseCase -import com.shifthackz.aisdv1.domain.usecase.downloadable.GetLocalMediaPipeModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.downloadable.GetLocalOnnxModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.downloadable.GetLocalQnnModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.downloadable.ScanCustomModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.huggingface.FetchAndGetHuggingFaceModelsUseCase -import com.shifthackz.aisdv1.domain.repository.FalAiEndpointRepository -import com.shifthackz.aisdv1.domain.usecase.settings.GetConfigurationUseCase -import com.shifthackz.aisdv1.presentation.core.CoreViewModelTest -import com.shifthackz.aisdv1.presentation.mocks.mockHuggingFaceModels -import com.shifthackz.aisdv1.presentation.mocks.mockLocalAiModels -import com.shifthackz.aisdv1.presentation.mocks.mockServerSetupStateLocalModel -import com.shifthackz.aisdv1.presentation.model.LaunchSource -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter -import com.shifthackz.aisdv1.presentation.stub.stubDispatchersProvider -import com.shifthackz.aisdv1.presentation.stub.stubSchedulersProvider +package dev.minios.pdaiv1.presentation.screen.setup + +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.core.validation.common.CommonStringValidator +import dev.minios.pdaiv1.core.validation.path.FilePathValidator +import dev.minios.pdaiv1.core.validation.url.UrlValidator +import dev.minios.pdaiv1.domain.entity.Configuration +import dev.minios.pdaiv1.domain.entity.DownloadState +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.interactor.settings.SetupConnectionInterActor +import dev.minios.pdaiv1.domain.interactor.wakelock.WakeLockInterActor +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.downloadable.DeleteModelUseCase +import dev.minios.pdaiv1.domain.usecase.downloadable.DownloadModelUseCase +import dev.minios.pdaiv1.domain.usecase.downloadable.GetLocalMediaPipeModelsUseCase +import dev.minios.pdaiv1.domain.usecase.downloadable.GetLocalOnnxModelsUseCase +import dev.minios.pdaiv1.domain.usecase.downloadable.GetLocalQnnModelsUseCase +import dev.minios.pdaiv1.domain.usecase.downloadable.ScanCustomModelsUseCase +import dev.minios.pdaiv1.domain.usecase.huggingface.FetchAndGetHuggingFaceModelsUseCase +import dev.minios.pdaiv1.domain.repository.FalAiEndpointRepository +import dev.minios.pdaiv1.domain.usecase.settings.GetConfigurationUseCase +import dev.minios.pdaiv1.presentation.core.CoreViewModelTest +import dev.minios.pdaiv1.presentation.mocks.mockHuggingFaceModels +import dev.minios.pdaiv1.presentation.mocks.mockLocalAiModels +import dev.minios.pdaiv1.presentation.mocks.mockServerSetupStateLocalModel +import dev.minios.pdaiv1.presentation.model.LaunchSource +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.presentation.stub.stubDispatchersProvider +import dev.minios.pdaiv1.presentation.stub.stubSchedulersProvider import io.mockk.every import io.mockk.mockk import io.mockk.unmockkAll diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/splash/SplashViewModelTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/splash/SplashViewModelTest.kt similarity index 80% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/splash/SplashViewModelTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/splash/SplashViewModelTest.kt index a7f7bdd92..c91a06265 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/splash/SplashViewModelTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/splash/SplashViewModelTest.kt @@ -1,12 +1,12 @@ -package com.shifthackz.aisdv1.presentation.screen.splash - -import com.shifthackz.aisdv1.domain.usecase.splash.SplashNavigationUseCase -import com.shifthackz.aisdv1.presentation.core.CoreViewModelInitializeStrategy -import com.shifthackz.aisdv1.presentation.core.CoreViewModelTest -import com.shifthackz.aisdv1.presentation.model.LaunchSource -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter -import com.shifthackz.aisdv1.presentation.stub.stubDispatchersProvider -import com.shifthackz.aisdv1.presentation.stub.stubSchedulersProvider +package dev.minios.pdaiv1.presentation.screen.splash + +import dev.minios.pdaiv1.domain.usecase.splash.SplashNavigationUseCase +import dev.minios.pdaiv1.presentation.core.CoreViewModelInitializeStrategy +import dev.minios.pdaiv1.presentation.core.CoreViewModelTest +import dev.minios.pdaiv1.presentation.model.LaunchSource +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.presentation.stub.stubDispatchersProvider +import dev.minios.pdaiv1.presentation.stub.stubSchedulersProvider import io.mockk.every import io.mockk.mockk import io.mockk.verify diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/txt2img/TextToImageViewModelTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/txt2img/TextToImageViewModelTest.kt similarity index 93% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/txt2img/TextToImageViewModelTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/txt2img/TextToImageViewModelTest.kt index c4eef6e85..7894d4a98 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/txt2img/TextToImageViewModelTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/txt2img/TextToImageViewModelTest.kt @@ -1,24 +1,24 @@ -package com.shifthackz.aisdv1.presentation.screen.txt2img - -import com.shifthackz.aisdv1.core.common.appbuild.BuildInfoProvider -import com.shifthackz.aisdv1.core.validation.ValidationResult -import com.shifthackz.aisdv1.core.validation.dimension.DimensionValidator.Error -import com.shifthackz.aisdv1.domain.entity.OpenAiModel -import com.shifthackz.aisdv1.domain.entity.OpenAiQuality -import com.shifthackz.aisdv1.domain.entity.OpenAiSize -import com.shifthackz.aisdv1.domain.entity.OpenAiStyle -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.entity.Settings -import com.shifthackz.aisdv1.domain.entity.StableDiffusionSampler -import com.shifthackz.aisdv1.domain.usecase.generation.TextToImageUseCase -import com.shifthackz.aisdv1.presentation.core.CoreGenerationMviViewModelTest -import com.shifthackz.aisdv1.presentation.core.GenerationFormUpdateEvent -import com.shifthackz.aisdv1.presentation.core.GenerationMviIntent -import com.shifthackz.aisdv1.presentation.mocks.mockAiGenerationResult -import com.shifthackz.aisdv1.presentation.model.LaunchSource -import com.shifthackz.aisdv1.presentation.model.Modal -import com.shifthackz.aisdv1.presentation.screen.drawer.DrawerIntent -import com.shifthackz.aisdv1.presentation.stub.stubDispatchersProvider +package dev.minios.pdaiv1.presentation.screen.txt2img + +import dev.minios.pdaiv1.core.common.appbuild.BuildInfoProvider +import dev.minios.pdaiv1.core.validation.ValidationResult +import dev.minios.pdaiv1.core.validation.dimension.DimensionValidator.Error +import dev.minios.pdaiv1.domain.entity.OpenAiModel +import dev.minios.pdaiv1.domain.entity.OpenAiQuality +import dev.minios.pdaiv1.domain.entity.OpenAiSize +import dev.minios.pdaiv1.domain.entity.OpenAiStyle +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.entity.Settings +import dev.minios.pdaiv1.domain.entity.StableDiffusionSampler +import dev.minios.pdaiv1.domain.usecase.generation.TextToImageUseCase +import dev.minios.pdaiv1.presentation.core.CoreGenerationMviViewModelTest +import dev.minios.pdaiv1.presentation.core.GenerationFormUpdateEvent +import dev.minios.pdaiv1.presentation.core.GenerationMviIntent +import dev.minios.pdaiv1.presentation.mocks.mockAiGenerationResult +import dev.minios.pdaiv1.presentation.model.LaunchSource +import dev.minios.pdaiv1.presentation.model.Modal +import dev.minios.pdaiv1.presentation.screen.drawer.DrawerIntent +import dev.minios.pdaiv1.presentation.stub.stubDispatchersProvider import io.mockk.every import io.mockk.mockk import io.mockk.unmockkAll diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/web/webui/WebUiViewModelTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/web/webui/WebUiViewModelTest.kt similarity index 81% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/web/webui/WebUiViewModelTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/web/webui/WebUiViewModelTest.kt index 46bcfc458..2aadea260 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/screen/web/webui/WebUiViewModelTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/web/webui/WebUiViewModelTest.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.presentation.screen.web.webui +package dev.minios.pdaiv1.presentation.screen.web.webui -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.presentation.core.CoreViewModelTest -import com.shifthackz.aisdv1.presentation.navigation.router.main.MainRouter -import com.shifthackz.aisdv1.presentation.stub.stubDispatchersProvider +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.presentation.core.CoreViewModelTest +import dev.minios.pdaiv1.presentation.navigation.router.main.MainRouter +import dev.minios.pdaiv1.presentation.stub.stubDispatchersProvider import io.mockk.every import io.mockk.mockk import io.mockk.verify diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/stub/DispatchersProviderStub.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/stub/DispatchersProviderStub.kt similarity index 74% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/stub/DispatchersProviderStub.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/stub/DispatchersProviderStub.kt index f5fce850e..2a4842545 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/stub/DispatchersProviderStub.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/stub/DispatchersProviderStub.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.presentation.stub +package dev.minios.pdaiv1.presentation.stub -import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider +import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider import kotlinx.coroutines.CoroutineDispatcher import kotlinx.coroutines.Dispatchers diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/stub/SchedulersProviderStub.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/stub/SchedulersProviderStub.kt similarity index 80% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/stub/SchedulersProviderStub.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/stub/SchedulersProviderStub.kt index bc25478df..ec0f40ab0 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/stub/SchedulersProviderStub.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/stub/SchedulersProviderStub.kt @@ -1,6 +1,6 @@ -package com.shifthackz.aisdv1.presentation.stub +package dev.minios.pdaiv1.presentation.stub -import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider import io.reactivex.rxjava3.core.Scheduler import io.reactivex.rxjava3.schedulers.Schedulers import java.util.concurrent.Executor diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/widget/connectivity/ConnectivityViewModelTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/widget/connectivity/ConnectivityViewModelTest.kt similarity index 89% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/widget/connectivity/ConnectivityViewModelTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/widget/connectivity/ConnectivityViewModelTest.kt index ac7eaa1f2..985389888 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/widget/connectivity/ConnectivityViewModelTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/widget/connectivity/ConnectivityViewModelTest.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.presentation.widget.connectivity +package dev.minios.pdaiv1.presentation.widget.connectivity -import com.shifthackz.aisdv1.domain.entity.Settings -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.connectivity.ObserveSeverConnectivityUseCase -import com.shifthackz.aisdv1.presentation.core.CoreViewModelTest -import com.shifthackz.aisdv1.presentation.stub.stubDispatchersProvider -import com.shifthackz.aisdv1.presentation.stub.stubSchedulersProvider +import dev.minios.pdaiv1.domain.entity.Settings +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.connectivity.ObserveSeverConnectivityUseCase +import dev.minios.pdaiv1.presentation.core.CoreViewModelTest +import dev.minios.pdaiv1.presentation.stub.stubDispatchersProvider +import dev.minios.pdaiv1.presentation.stub.stubSchedulersProvider import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.BackpressureStrategy diff --git a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/widget/engine/EngineSelectionViewModelTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/widget/engine/EngineSelectionViewModelTest.kt similarity index 87% rename from presentation/src/test/java/com/shifthackz/aisdv1/presentation/widget/engine/EngineSelectionViewModelTest.kt rename to presentation/src/test/java/dev/minios/pdaiv1/presentation/widget/engine/EngineSelectionViewModelTest.kt index e9a62ec8e..29ec26dac 100644 --- a/presentation/src/test/java/com/shifthackz/aisdv1/presentation/widget/engine/EngineSelectionViewModelTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/widget/engine/EngineSelectionViewModelTest.kt @@ -1,27 +1,27 @@ -package com.shifthackz.aisdv1.presentation.widget.engine - -import com.shifthackz.aisdv1.domain.entity.Configuration -import com.shifthackz.aisdv1.domain.entity.LocalAiModel -import com.shifthackz.aisdv1.domain.entity.ServerSource -import com.shifthackz.aisdv1.domain.entity.Settings -import com.shifthackz.aisdv1.domain.preference.PreferenceManager -import com.shifthackz.aisdv1.domain.usecase.downloadable.ObserveLocalOnnxModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.downloadable.GetLocalQnnModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.downloadable.ScanCustomModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.huggingface.FetchAndGetHuggingFaceModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.sdmodel.GetStableDiffusionModelsUseCase -import com.shifthackz.aisdv1.domain.usecase.sdmodel.SelectStableDiffusionModelUseCase -import com.shifthackz.aisdv1.domain.usecase.settings.GetConfigurationUseCase -import com.shifthackz.aisdv1.domain.usecase.stabilityai.FetchAndGetStabilityAiEnginesUseCase -import com.shifthackz.aisdv1.domain.usecase.swarmmodel.FetchAndGetSwarmUiModelsUseCase -import com.shifthackz.aisdv1.presentation.core.CoreViewModelTest -import com.shifthackz.aisdv1.presentation.mocks.mockHuggingFaceModels -import com.shifthackz.aisdv1.presentation.mocks.mockLocalAiModels -import com.shifthackz.aisdv1.presentation.mocks.mockStabilityAiEngines -import com.shifthackz.aisdv1.presentation.mocks.mockStableDiffusionModels -import com.shifthackz.aisdv1.presentation.mocks.mockSwarmUiModels -import com.shifthackz.aisdv1.presentation.stub.stubDispatchersProvider -import com.shifthackz.aisdv1.presentation.stub.stubSchedulersProvider +package dev.minios.pdaiv1.presentation.widget.engine + +import dev.minios.pdaiv1.domain.entity.Configuration +import dev.minios.pdaiv1.domain.entity.LocalAiModel +import dev.minios.pdaiv1.domain.entity.ServerSource +import dev.minios.pdaiv1.domain.entity.Settings +import dev.minios.pdaiv1.domain.preference.PreferenceManager +import dev.minios.pdaiv1.domain.usecase.downloadable.ObserveLocalOnnxModelsUseCase +import dev.minios.pdaiv1.domain.usecase.downloadable.GetLocalQnnModelsUseCase +import dev.minios.pdaiv1.domain.usecase.downloadable.ScanCustomModelsUseCase +import dev.minios.pdaiv1.domain.usecase.huggingface.FetchAndGetHuggingFaceModelsUseCase +import dev.minios.pdaiv1.domain.usecase.sdmodel.GetStableDiffusionModelsUseCase +import dev.minios.pdaiv1.domain.usecase.sdmodel.SelectStableDiffusionModelUseCase +import dev.minios.pdaiv1.domain.usecase.settings.GetConfigurationUseCase +import dev.minios.pdaiv1.domain.usecase.stabilityai.FetchAndGetStabilityAiEnginesUseCase +import dev.minios.pdaiv1.domain.usecase.swarmmodel.FetchAndGetSwarmUiModelsUseCase +import dev.minios.pdaiv1.presentation.core.CoreViewModelTest +import dev.minios.pdaiv1.presentation.mocks.mockHuggingFaceModels +import dev.minios.pdaiv1.presentation.mocks.mockLocalAiModels +import dev.minios.pdaiv1.presentation.mocks.mockStabilityAiEngines +import dev.minios.pdaiv1.presentation.mocks.mockStableDiffusionModels +import dev.minios.pdaiv1.presentation.mocks.mockSwarmUiModels +import dev.minios.pdaiv1.presentation.stub.stubDispatchersProvider +import dev.minios.pdaiv1.presentation.stub.stubSchedulersProvider import io.mockk.every import io.mockk.mockk import io.mockk.unmockkAll diff --git a/storage/build.gradle.kts b/storage/build.gradle.kts index 18843b63c..c5f461b3d 100755 --- a/storage/build.gradle.kts +++ b/storage/build.gradle.kts @@ -5,7 +5,7 @@ plugins { } android { - namespace = "com.shifthackz.aisdv1.storage" + namespace = "dev.minios.pdaiv1.storage" defaultConfig { ksp { arg("room.incremental", "true") diff --git a/storage/schemas/com.shifthackz.aisdv1.storage.db.cache.CacheDatabase/1.json b/storage/schemas/dev.minios.pdaiv1.storage.db.cache.CacheDatabase/1.json similarity index 100% rename from storage/schemas/com.shifthackz.aisdv1.storage.db.cache.CacheDatabase/1.json rename to storage/schemas/dev.minios.pdaiv1.storage.db.cache.CacheDatabase/1.json diff --git a/storage/schemas/com.shifthackz.aisdv1.storage.db.persistent.PersistentDatabase/1.json b/storage/schemas/dev.minios.pdaiv1.storage.db.persistent.PersistentDatabase/1.json similarity index 100% rename from storage/schemas/com.shifthackz.aisdv1.storage.db.persistent.PersistentDatabase/1.json rename to storage/schemas/dev.minios.pdaiv1.storage.db.persistent.PersistentDatabase/1.json diff --git a/storage/schemas/dev.minios.pdaiv1.storage.db.persistent.PersistentDatabase/10.json b/storage/schemas/dev.minios.pdaiv1.storage.db.persistent.PersistentDatabase/10.json new file mode 100644 index 000000000..67a4cac4b --- /dev/null +++ b/storage/schemas/dev.minios.pdaiv1.storage.db.persistent.PersistentDatabase/10.json @@ -0,0 +1,385 @@ +{ + "formatVersion": 1, + "database": { + "version": 10, + "identityHash": "028b5ecb18e9d8e60fd31ee372744b2d", + "entities": [ + { + "tableName": "generation_results", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `image_base_64` TEXT NOT NULL, `original_image_base_64` TEXT NOT NULL, `created_at` INTEGER NOT NULL, `generation_type` TEXT NOT NULL, `prompt` TEXT NOT NULL, `negative_prompt` TEXT NOT NULL, `width` INTEGER NOT NULL, `height` INTEGER NOT NULL, `sampling_steps` INTEGER NOT NULL, `cfg_scale` REAL NOT NULL, `restore_faces` INTEGER NOT NULL, `sampler` TEXT NOT NULL, `seed` TEXT NOT NULL, `sub_seed` TEXT NOT NULL DEFAULT '', `sub_seed_strength` REAL NOT NULL DEFAULT 0.0, `denoising_strength` REAL NOT NULL DEFAULT 0.0, `hidden` INTEGER NOT NULL DEFAULT 0, `media_path` TEXT NOT NULL DEFAULT '', `input_media_path` TEXT NOT NULL DEFAULT '', `media_type` TEXT NOT NULL DEFAULT 'IMAGE', `model_name` TEXT NOT NULL DEFAULT '')", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "imageBase64", + "columnName": "image_base_64", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "originalImageBase64", + "columnName": "original_image_base_64", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "createdAt", + "columnName": "created_at", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "generationType", + "columnName": "generation_type", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "prompt", + "columnName": "prompt", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "negativePrompt", + "columnName": "negative_prompt", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "width", + "columnName": "width", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "height", + "columnName": "height", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "samplingSteps", + "columnName": "sampling_steps", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "cfgScale", + "columnName": "cfg_scale", + "affinity": "REAL", + "notNull": true + }, + { + "fieldPath": "restoreFaces", + "columnName": "restore_faces", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "sampler", + "columnName": "sampler", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "seed", + "columnName": "seed", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "subSeed", + "columnName": "sub_seed", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "subSeedStrength", + "columnName": "sub_seed_strength", + "affinity": "REAL", + "notNull": true, + "defaultValue": "0.0" + }, + { + "fieldPath": "denoisingStrength", + "columnName": "denoising_strength", + "affinity": "REAL", + "notNull": true, + "defaultValue": "0.0" + }, + { + "fieldPath": "hidden", + "columnName": "hidden", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + }, + { + "fieldPath": "mediaPath", + "columnName": "media_path", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "inputMediaPath", + "columnName": "input_media_path", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + }, + { + "fieldPath": "mediaType", + "columnName": "media_type", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'IMAGE'" + }, + { + "fieldPath": "modelName", + "columnName": "model_name", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "''" + } + ], + "primaryKey": { + "autoGenerate": true, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "local_models", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `type` TEXT NOT NULL DEFAULT 'onnx', `name` TEXT NOT NULL, `size` TEXT NOT NULL, `sources` TEXT NOT NULL, `chipset_suffix` TEXT DEFAULT NULL, `run_on_cpu` INTEGER NOT NULL DEFAULT 0, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "type", + "columnName": "type", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'onnx'" + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "size", + "columnName": "size", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "sources", + "columnName": "sources", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "chipsetSuffix", + "columnName": "chipset_suffix", + "affinity": "TEXT", + "notNull": false, + "defaultValue": "NULL" + }, + { + "fieldPath": "runOnCpu", + "columnName": "run_on_cpu", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "0" + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "hugging_face_models", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `name` TEXT NOT NULL, `alias` TEXT NOT NULL, `source` TEXT NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "alias", + "columnName": "alias", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "source", + "columnName": "source", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "supporters", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, `name` TEXT NOT NULL, `date` INTEGER NOT NULL, `message` TEXT NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "name", + "columnName": "name", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "date", + "columnName": "date", + "affinity": "INTEGER", + "notNull": true + }, + { + "fieldPath": "message", + "columnName": "message", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + }, + { + "tableName": "fal_ai_endpoints", + "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` TEXT NOT NULL, `endpoint_id` TEXT NOT NULL, `title` TEXT NOT NULL, `description` TEXT NOT NULL, `category` TEXT NOT NULL, `group_name` TEXT NOT NULL DEFAULT 'Custom', `thumbnail_url` TEXT NOT NULL, `playground_url` TEXT NOT NULL, `documentation_url` TEXT NOT NULL, `is_custom` INTEGER NOT NULL DEFAULT 1, `schema_json` TEXT NOT NULL, PRIMARY KEY(`id`))", + "fields": [ + { + "fieldPath": "id", + "columnName": "id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "endpointId", + "columnName": "endpoint_id", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "title", + "columnName": "title", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "description", + "columnName": "description", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "category", + "columnName": "category", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "group", + "columnName": "group_name", + "affinity": "TEXT", + "notNull": true, + "defaultValue": "'Custom'" + }, + { + "fieldPath": "thumbnailUrl", + "columnName": "thumbnail_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "playgroundUrl", + "columnName": "playground_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "documentationUrl", + "columnName": "documentation_url", + "affinity": "TEXT", + "notNull": true + }, + { + "fieldPath": "isCustom", + "columnName": "is_custom", + "affinity": "INTEGER", + "notNull": true, + "defaultValue": "1" + }, + { + "fieldPath": "schemaJson", + "columnName": "schema_json", + "affinity": "TEXT", + "notNull": true + } + ], + "primaryKey": { + "autoGenerate": false, + "columnNames": [ + "id" + ] + }, + "indices": [], + "foreignKeys": [] + } + ], + "views": [], + "setupQueries": [ + "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", + "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '028b5ecb18e9d8e60fd31ee372744b2d')" + ] + } +} \ No newline at end of file diff --git a/storage/schemas/com.shifthackz.aisdv1.storage.db.persistent.PersistentDatabase/2.json b/storage/schemas/dev.minios.pdaiv1.storage.db.persistent.PersistentDatabase/2.json similarity index 100% rename from storage/schemas/com.shifthackz.aisdv1.storage.db.persistent.PersistentDatabase/2.json rename to storage/schemas/dev.minios.pdaiv1.storage.db.persistent.PersistentDatabase/2.json diff --git a/storage/schemas/com.shifthackz.aisdv1.storage.db.persistent.PersistentDatabase/3.json b/storage/schemas/dev.minios.pdaiv1.storage.db.persistent.PersistentDatabase/3.json similarity index 100% rename from storage/schemas/com.shifthackz.aisdv1.storage.db.persistent.PersistentDatabase/3.json rename to storage/schemas/dev.minios.pdaiv1.storage.db.persistent.PersistentDatabase/3.json diff --git a/storage/schemas/com.shifthackz.aisdv1.storage.db.persistent.PersistentDatabase/4.json b/storage/schemas/dev.minios.pdaiv1.storage.db.persistent.PersistentDatabase/4.json similarity index 100% rename from storage/schemas/com.shifthackz.aisdv1.storage.db.persistent.PersistentDatabase/4.json rename to storage/schemas/dev.minios.pdaiv1.storage.db.persistent.PersistentDatabase/4.json diff --git a/storage/schemas/com.shifthackz.aisdv1.storage.db.persistent.PersistentDatabase/5.json b/storage/schemas/dev.minios.pdaiv1.storage.db.persistent.PersistentDatabase/5.json similarity index 100% rename from storage/schemas/com.shifthackz.aisdv1.storage.db.persistent.PersistentDatabase/5.json rename to storage/schemas/dev.minios.pdaiv1.storage.db.persistent.PersistentDatabase/5.json diff --git a/storage/schemas/com.shifthackz.aisdv1.storage.db.persistent.PersistentDatabase/6.json b/storage/schemas/dev.minios.pdaiv1.storage.db.persistent.PersistentDatabase/6.json similarity index 100% rename from storage/schemas/com.shifthackz.aisdv1.storage.db.persistent.PersistentDatabase/6.json rename to storage/schemas/dev.minios.pdaiv1.storage.db.persistent.PersistentDatabase/6.json diff --git a/storage/schemas/com.shifthackz.aisdv1.storage.db.persistent.PersistentDatabase/7.json b/storage/schemas/dev.minios.pdaiv1.storage.db.persistent.PersistentDatabase/7.json similarity index 100% rename from storage/schemas/com.shifthackz.aisdv1.storage.db.persistent.PersistentDatabase/7.json rename to storage/schemas/dev.minios.pdaiv1.storage.db.persistent.PersistentDatabase/7.json diff --git a/storage/schemas/com.shifthackz.aisdv1.storage.db.persistent.PersistentDatabase/8.json b/storage/schemas/dev.minios.pdaiv1.storage.db.persistent.PersistentDatabase/8.json similarity index 100% rename from storage/schemas/com.shifthackz.aisdv1.storage.db.persistent.PersistentDatabase/8.json rename to storage/schemas/dev.minios.pdaiv1.storage.db.persistent.PersistentDatabase/8.json diff --git a/storage/schemas/com.shifthackz.aisdv1.storage.db.persistent.PersistentDatabase/9.json b/storage/schemas/dev.minios.pdaiv1.storage.db.persistent.PersistentDatabase/9.json similarity index 100% rename from storage/schemas/com.shifthackz.aisdv1.storage.db.persistent.PersistentDatabase/9.json rename to storage/schemas/dev.minios.pdaiv1.storage.db.persistent.PersistentDatabase/9.json diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/CacheDatabase.kt b/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/CacheDatabase.kt deleted file mode 100755 index 3dc34f746..000000000 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/CacheDatabase.kt +++ /dev/null @@ -1,53 +0,0 @@ -package com.shifthackz.aisdv1.storage.db.cache - -import androidx.room.Database -import androidx.room.RoomDatabase -import androidx.room.TypeConverters -import com.shifthackz.aisdv1.storage.converters.ListConverters -import com.shifthackz.aisdv1.storage.converters.MapConverters -import com.shifthackz.aisdv1.storage.db.cache.CacheDatabase.Companion.DB_VERSION -import com.shifthackz.aisdv1.storage.db.cache.dao.ServerConfigurationDao -import com.shifthackz.aisdv1.storage.db.cache.dao.StableDiffusionEmbeddingDao -import com.shifthackz.aisdv1.storage.db.cache.dao.StableDiffusionHyperNetworkDao -import com.shifthackz.aisdv1.storage.db.cache.dao.StableDiffusionLoraDao -import com.shifthackz.aisdv1.storage.db.cache.dao.StableDiffusionModelDao -import com.shifthackz.aisdv1.storage.db.cache.dao.StableDiffusionSamplerDao -import com.shifthackz.aisdv1.storage.db.cache.dao.SwarmUiModelDao -import com.shifthackz.aisdv1.storage.db.cache.entity.ServerConfigurationEntity -import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionEmbeddingEntity -import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionHyperNetworkEntity -import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionLoraEntity -import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionModelEntity -import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionSamplerEntity -import com.shifthackz.aisdv1.storage.db.cache.entity.SwarmUiModelEntity - -@Database( - version = DB_VERSION, - exportSchema = true, - entities = [ - ServerConfigurationEntity::class, - StableDiffusionModelEntity::class, - StableDiffusionSamplerEntity::class, - StableDiffusionLoraEntity::class, - StableDiffusionHyperNetworkEntity::class, - StableDiffusionEmbeddingEntity::class, - SwarmUiModelEntity::class, - ], -) -@TypeConverters( - MapConverters::class, - ListConverters::class, -) -internal abstract class CacheDatabase : RoomDatabase() { - abstract fun serverConfigurationDao(): ServerConfigurationDao - abstract fun sdModelDao(): StableDiffusionModelDao - abstract fun sdSamplerDao(): StableDiffusionSamplerDao - abstract fun sdLoraDao(): StableDiffusionLoraDao - abstract fun sdHyperNetworkDao(): StableDiffusionHyperNetworkDao - abstract fun sdEmbeddingDao(): StableDiffusionEmbeddingDao - abstract fun swarmUiModelDao(): SwarmUiModelDao - - companion object { - const val DB_VERSION = 1 - } -} diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/converters/DateConverters.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/converters/DateConverters.kt similarity index 82% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/converters/DateConverters.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/converters/DateConverters.kt index 703845c8d..8b07f7780 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/converters/DateConverters.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/converters/DateConverters.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.storage.converters +package dev.minios.pdaiv1.storage.converters import androidx.room.TypeConverter import java.util.* diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/converters/ListConverters.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/converters/ListConverters.kt similarity index 89% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/converters/ListConverters.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/converters/ListConverters.kt index a8751785a..e83869d4c 100755 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/converters/ListConverters.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/converters/ListConverters.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.storage.converters +package dev.minios.pdaiv1.storage.converters import androidx.room.TypeConverter import com.google.gson.Gson diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/converters/MapConverters.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/converters/MapConverters.kt similarity index 89% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/converters/MapConverters.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/converters/MapConverters.kt index b21d9bbae..f5f285711 100755 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/converters/MapConverters.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/converters/MapConverters.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.storage.converters +package dev.minios.pdaiv1.storage.converters import androidx.room.TypeConverter import com.google.gson.Gson diff --git a/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/CacheDatabase.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/CacheDatabase.kt new file mode 100755 index 000000000..c6b39b18b --- /dev/null +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/CacheDatabase.kt @@ -0,0 +1,53 @@ +package dev.minios.pdaiv1.storage.db.cache + +import androidx.room.Database +import androidx.room.RoomDatabase +import androidx.room.TypeConverters +import dev.minios.pdaiv1.storage.converters.ListConverters +import dev.minios.pdaiv1.storage.converters.MapConverters +import dev.minios.pdaiv1.storage.db.cache.CacheDatabase.Companion.DB_VERSION +import dev.minios.pdaiv1.storage.db.cache.dao.ServerConfigurationDao +import dev.minios.pdaiv1.storage.db.cache.dao.StableDiffusionEmbeddingDao +import dev.minios.pdaiv1.storage.db.cache.dao.StableDiffusionHyperNetworkDao +import dev.minios.pdaiv1.storage.db.cache.dao.StableDiffusionLoraDao +import dev.minios.pdaiv1.storage.db.cache.dao.StableDiffusionModelDao +import dev.minios.pdaiv1.storage.db.cache.dao.StableDiffusionSamplerDao +import dev.minios.pdaiv1.storage.db.cache.dao.SwarmUiModelDao +import dev.minios.pdaiv1.storage.db.cache.entity.ServerConfigurationEntity +import dev.minios.pdaiv1.storage.db.cache.entity.StableDiffusionEmbeddingEntity +import dev.minios.pdaiv1.storage.db.cache.entity.StableDiffusionHyperNetworkEntity +import dev.minios.pdaiv1.storage.db.cache.entity.StableDiffusionLoraEntity +import dev.minios.pdaiv1.storage.db.cache.entity.StableDiffusionModelEntity +import dev.minios.pdaiv1.storage.db.cache.entity.StableDiffusionSamplerEntity +import dev.minios.pdaiv1.storage.db.cache.entity.SwarmUiModelEntity + +@Database( + version = DB_VERSION, + exportSchema = true, + entities = [ + ServerConfigurationEntity::class, + StableDiffusionModelEntity::class, + StableDiffusionSamplerEntity::class, + StableDiffusionLoraEntity::class, + StableDiffusionHyperNetworkEntity::class, + StableDiffusionEmbeddingEntity::class, + SwarmUiModelEntity::class, + ], +) +@TypeConverters( + MapConverters::class, + ListConverters::class, +) +internal abstract class CacheDatabase : RoomDatabase() { + abstract fun serverConfigurationDao(): ServerConfigurationDao + abstract fun sdModelDao(): StableDiffusionModelDao + abstract fun sdSamplerDao(): StableDiffusionSamplerDao + abstract fun sdLoraDao(): StableDiffusionLoraDao + abstract fun sdHyperNetworkDao(): StableDiffusionHyperNetworkDao + abstract fun sdEmbeddingDao(): StableDiffusionEmbeddingDao + abstract fun swarmUiModelDao(): SwarmUiModelDao + + companion object { + const val DB_VERSION = 1 + } +} diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/ServerConfigurationContract.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/contract/ServerConfigurationContract.kt similarity index 76% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/ServerConfigurationContract.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/contract/ServerConfigurationContract.kt index fa098eda3..7e771cd5c 100755 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/ServerConfigurationContract.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/contract/ServerConfigurationContract.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.storage.db.cache.contract +package dev.minios.pdaiv1.storage.db.cache.contract internal object ServerConfigurationContract { const val TABLE = "server_config" diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/StableDiffusionEmbeddingContract.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/contract/StableDiffusionEmbeddingContract.kt similarity index 71% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/StableDiffusionEmbeddingContract.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/contract/StableDiffusionEmbeddingContract.kt index e4e1cc180..691f1f10b 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/StableDiffusionEmbeddingContract.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/contract/StableDiffusionEmbeddingContract.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.storage.db.cache.contract +package dev.minios.pdaiv1.storage.db.cache.contract object StableDiffusionEmbeddingContract { const val TABLE = "embeddings" diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/StableDiffusionHyperNetworkContract.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/contract/StableDiffusionHyperNetworkContract.kt similarity index 75% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/StableDiffusionHyperNetworkContract.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/contract/StableDiffusionHyperNetworkContract.kt index 417761ab3..a4575937b 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/StableDiffusionHyperNetworkContract.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/contract/StableDiffusionHyperNetworkContract.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.storage.db.cache.contract +package dev.minios.pdaiv1.storage.db.cache.contract object StableDiffusionHyperNetworkContract { const val TABLE = "hyper_networks" diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/StableDiffusionLoraContract.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/contract/StableDiffusionLoraContract.kt similarity index 76% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/StableDiffusionLoraContract.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/contract/StableDiffusionLoraContract.kt index e15120c12..ff2504dac 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/StableDiffusionLoraContract.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/contract/StableDiffusionLoraContract.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.storage.db.cache.contract +package dev.minios.pdaiv1.storage.db.cache.contract object StableDiffusionLoraContract { const val TABLE = "loras" diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/StableDiffusionModelContract.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/contract/StableDiffusionModelContract.kt similarity index 84% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/StableDiffusionModelContract.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/contract/StableDiffusionModelContract.kt index a2db1fa9e..6ba217f0d 100755 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/StableDiffusionModelContract.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/contract/StableDiffusionModelContract.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.storage.db.cache.contract +package dev.minios.pdaiv1.storage.db.cache.contract internal object StableDiffusionModelContract { const val TABLE = "sd_models" diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/StableDiffusionSamplerContract.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/contract/StableDiffusionSamplerContract.kt similarity index 78% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/StableDiffusionSamplerContract.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/contract/StableDiffusionSamplerContract.kt index 9f68a22dc..3a479d0c3 100755 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/StableDiffusionSamplerContract.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/contract/StableDiffusionSamplerContract.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.storage.db.cache.contract +package dev.minios.pdaiv1.storage.db.cache.contract internal object StableDiffusionSamplerContract { const val TABLE = "sd_samplers" diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/SwarmUiModelContract.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/contract/SwarmUiModelContract.kt similarity index 77% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/SwarmUiModelContract.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/contract/SwarmUiModelContract.kt index 2a900c591..f03cd81f8 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/contract/SwarmUiModelContract.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/contract/SwarmUiModelContract.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.storage.db.cache.contract +package dev.minios.pdaiv1.storage.db.cache.contract internal object SwarmUiModelContract { const val TABLE = "swarm_models" diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/dao/ServerConfigurationDao.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/dao/ServerConfigurationDao.kt similarity index 69% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/dao/ServerConfigurationDao.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/dao/ServerConfigurationDao.kt index b126618b6..54ed6203b 100755 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/dao/ServerConfigurationDao.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/dao/ServerConfigurationDao.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.storage.db.cache.dao +package dev.minios.pdaiv1.storage.db.cache.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import com.shifthackz.aisdv1.storage.db.cache.contract.ServerConfigurationContract -import com.shifthackz.aisdv1.storage.db.cache.entity.ServerConfigurationEntity +import dev.minios.pdaiv1.storage.db.cache.contract.ServerConfigurationContract +import dev.minios.pdaiv1.storage.db.cache.entity.ServerConfigurationEntity import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/dao/StableDiffusionEmbeddingDao.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/dao/StableDiffusionEmbeddingDao.kt similarity index 73% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/dao/StableDiffusionEmbeddingDao.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/dao/StableDiffusionEmbeddingDao.kt index a5323ed61..da69e261c 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/dao/StableDiffusionEmbeddingDao.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/dao/StableDiffusionEmbeddingDao.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.storage.db.cache.dao +package dev.minios.pdaiv1.storage.db.cache.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import com.shifthackz.aisdv1.storage.db.cache.contract.StableDiffusionEmbeddingContract -import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionEmbeddingEntity +import dev.minios.pdaiv1.storage.db.cache.contract.StableDiffusionEmbeddingContract +import dev.minios.pdaiv1.storage.db.cache.entity.StableDiffusionEmbeddingEntity import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/dao/StableDiffusionHyperNetworkDao.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/dao/StableDiffusionHyperNetworkDao.kt similarity index 73% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/dao/StableDiffusionHyperNetworkDao.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/dao/StableDiffusionHyperNetworkDao.kt index a29aafe1b..f770e77db 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/dao/StableDiffusionHyperNetworkDao.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/dao/StableDiffusionHyperNetworkDao.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.storage.db.cache.dao +package dev.minios.pdaiv1.storage.db.cache.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import com.shifthackz.aisdv1.storage.db.cache.contract.StableDiffusionHyperNetworkContract -import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionHyperNetworkEntity +import dev.minios.pdaiv1.storage.db.cache.contract.StableDiffusionHyperNetworkContract +import dev.minios.pdaiv1.storage.db.cache.entity.StableDiffusionHyperNetworkEntity import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/dao/StableDiffusionLoraDao.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/dao/StableDiffusionLoraDao.kt similarity index 73% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/dao/StableDiffusionLoraDao.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/dao/StableDiffusionLoraDao.kt index b7efb3cf8..475852e4e 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/dao/StableDiffusionLoraDao.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/dao/StableDiffusionLoraDao.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.storage.db.cache.dao +package dev.minios.pdaiv1.storage.db.cache.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import com.shifthackz.aisdv1.storage.db.cache.contract.StableDiffusionLoraContract -import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionLoraEntity +import dev.minios.pdaiv1.storage.db.cache.contract.StableDiffusionLoraContract +import dev.minios.pdaiv1.storage.db.cache.entity.StableDiffusionLoraEntity import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/dao/StableDiffusionModelDao.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/dao/StableDiffusionModelDao.kt similarity index 73% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/dao/StableDiffusionModelDao.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/dao/StableDiffusionModelDao.kt index 6d76581a8..061a358ed 100755 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/dao/StableDiffusionModelDao.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/dao/StableDiffusionModelDao.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.storage.db.cache.dao +package dev.minios.pdaiv1.storage.db.cache.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import com.shifthackz.aisdv1.storage.db.cache.contract.StableDiffusionModelContract -import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionModelEntity +import dev.minios.pdaiv1.storage.db.cache.contract.StableDiffusionModelContract +import dev.minios.pdaiv1.storage.db.cache.entity.StableDiffusionModelEntity import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/dao/StableDiffusionSamplerDao.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/dao/StableDiffusionSamplerDao.kt similarity index 73% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/dao/StableDiffusionSamplerDao.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/dao/StableDiffusionSamplerDao.kt index 81fd07db8..c0ebe624f 100755 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/dao/StableDiffusionSamplerDao.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/dao/StableDiffusionSamplerDao.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.storage.db.cache.dao +package dev.minios.pdaiv1.storage.db.cache.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import com.shifthackz.aisdv1.storage.db.cache.contract.StableDiffusionSamplerContract -import com.shifthackz.aisdv1.storage.db.cache.entity.StableDiffusionSamplerEntity +import dev.minios.pdaiv1.storage.db.cache.contract.StableDiffusionSamplerContract +import dev.minios.pdaiv1.storage.db.cache.entity.StableDiffusionSamplerEntity import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/dao/SwarmUiModelDao.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/dao/SwarmUiModelDao.kt similarity index 73% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/dao/SwarmUiModelDao.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/dao/SwarmUiModelDao.kt index bda49f52e..012c32997 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/dao/SwarmUiModelDao.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/dao/SwarmUiModelDao.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.storage.db.cache.dao +package dev.minios.pdaiv1.storage.db.cache.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import com.shifthackz.aisdv1.storage.db.cache.contract.SwarmUiModelContract -import com.shifthackz.aisdv1.storage.db.cache.entity.SwarmUiModelEntity +import dev.minios.pdaiv1.storage.db.cache.contract.SwarmUiModelContract +import dev.minios.pdaiv1.storage.db.cache.entity.SwarmUiModelEntity import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/entity/ServerConfigurationEntity.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/entity/ServerConfigurationEntity.kt similarity index 75% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/entity/ServerConfigurationEntity.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/entity/ServerConfigurationEntity.kt index ce72c816f..f80829c12 100755 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/entity/ServerConfigurationEntity.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/entity/ServerConfigurationEntity.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.storage.db.cache.entity +package dev.minios.pdaiv1.storage.db.cache.entity import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import com.shifthackz.aisdv1.storage.db.cache.contract.ServerConfigurationContract +import dev.minios.pdaiv1.storage.db.cache.contract.ServerConfigurationContract @Entity(tableName = ServerConfigurationContract.TABLE) data class ServerConfigurationEntity( diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/entity/StableDiffusionEmbeddingEntity.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/entity/StableDiffusionEmbeddingEntity.kt similarity index 74% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/entity/StableDiffusionEmbeddingEntity.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/entity/StableDiffusionEmbeddingEntity.kt index b0d41cf03..a91ac5e63 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/entity/StableDiffusionEmbeddingEntity.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/entity/StableDiffusionEmbeddingEntity.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.storage.db.cache.entity +package dev.minios.pdaiv1.storage.db.cache.entity import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import com.shifthackz.aisdv1.storage.db.cache.contract.StableDiffusionEmbeddingContract +import dev.minios.pdaiv1.storage.db.cache.contract.StableDiffusionEmbeddingContract @Entity(tableName = StableDiffusionEmbeddingContract.TABLE) data class StableDiffusionEmbeddingEntity( diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/entity/StableDiffusionHyperNetworkEntity.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/entity/StableDiffusionHyperNetworkEntity.kt similarity index 77% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/entity/StableDiffusionHyperNetworkEntity.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/entity/StableDiffusionHyperNetworkEntity.kt index a78d82aa5..c65824d28 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/entity/StableDiffusionHyperNetworkEntity.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/entity/StableDiffusionHyperNetworkEntity.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.storage.db.cache.entity +package dev.minios.pdaiv1.storage.db.cache.entity import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import com.shifthackz.aisdv1.storage.db.cache.contract.StableDiffusionHyperNetworkContract +import dev.minios.pdaiv1.storage.db.cache.contract.StableDiffusionHyperNetworkContract @Entity(tableName = StableDiffusionHyperNetworkContract.TABLE) data class StableDiffusionHyperNetworkEntity( diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/entity/StableDiffusionLoraEntity.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/entity/StableDiffusionLoraEntity.kt similarity index 79% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/entity/StableDiffusionLoraEntity.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/entity/StableDiffusionLoraEntity.kt index 9b7f63f15..674096bc2 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/entity/StableDiffusionLoraEntity.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/entity/StableDiffusionLoraEntity.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.storage.db.cache.entity +package dev.minios.pdaiv1.storage.db.cache.entity import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import com.shifthackz.aisdv1.storage.db.cache.contract.StableDiffusionLoraContract +import dev.minios.pdaiv1.storage.db.cache.contract.StableDiffusionLoraContract @Entity(tableName = StableDiffusionLoraContract.TABLE) data class StableDiffusionLoraEntity( diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/entity/StableDiffusionModelEntity.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/entity/StableDiffusionModelEntity.kt similarity index 85% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/entity/StableDiffusionModelEntity.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/entity/StableDiffusionModelEntity.kt index b185f07cc..04ec574a4 100755 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/entity/StableDiffusionModelEntity.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/entity/StableDiffusionModelEntity.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.storage.db.cache.entity +package dev.minios.pdaiv1.storage.db.cache.entity import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import com.shifthackz.aisdv1.storage.db.cache.contract.StableDiffusionModelContract +import dev.minios.pdaiv1.storage.db.cache.contract.StableDiffusionModelContract @Entity(tableName = StableDiffusionModelContract.TABLE) data class StableDiffusionModelEntity( diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/entity/StableDiffusionSamplerEntity.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/entity/StableDiffusionSamplerEntity.kt similarity index 80% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/entity/StableDiffusionSamplerEntity.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/entity/StableDiffusionSamplerEntity.kt index 14a54c2d7..323d3502d 100755 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/entity/StableDiffusionSamplerEntity.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/entity/StableDiffusionSamplerEntity.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.storage.db.cache.entity +package dev.minios.pdaiv1.storage.db.cache.entity import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import com.shifthackz.aisdv1.storage.db.cache.contract.StableDiffusionSamplerContract +import dev.minios.pdaiv1.storage.db.cache.contract.StableDiffusionSamplerContract @Entity(tableName = StableDiffusionSamplerContract.TABLE) data class StableDiffusionSamplerEntity( diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/entity/SwarmUiModelEntity.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/entity/SwarmUiModelEntity.kt similarity index 79% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/entity/SwarmUiModelEntity.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/entity/SwarmUiModelEntity.kt index f79f12b0f..cabc9a521 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/cache/entity/SwarmUiModelEntity.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/cache/entity/SwarmUiModelEntity.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.storage.db.cache.entity +package dev.minios.pdaiv1.storage.db.cache.entity import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import com.shifthackz.aisdv1.storage.db.cache.contract.SwarmUiModelContract +import dev.minios.pdaiv1.storage.db.cache.contract.SwarmUiModelContract @Entity(tableName = SwarmUiModelContract.TABLE) data class SwarmUiModelEntity( diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/PersistentDatabase.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/PersistentDatabase.kt similarity index 79% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/PersistentDatabase.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/PersistentDatabase.kt index 24b49b3a0..dea9aca07 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/PersistentDatabase.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/PersistentDatabase.kt @@ -1,14 +1,14 @@ -package com.shifthackz.aisdv1.storage.db.persistent +package dev.minios.pdaiv1.storage.db.persistent import androidx.room.AutoMigration import androidx.room.Database import androidx.room.RoomDatabase import androidx.room.TypeConverters -import com.shifthackz.aisdv1.storage.converters.* -import com.shifthackz.aisdv1.storage.db.persistent.PersistentDatabase.Companion.DB_VERSION -import com.shifthackz.aisdv1.storage.db.persistent.contract.* -import com.shifthackz.aisdv1.storage.db.persistent.dao.* -import com.shifthackz.aisdv1.storage.db.persistent.entity.* +import dev.minios.pdaiv1.storage.converters.* +import dev.minios.pdaiv1.storage.db.persistent.PersistentDatabase.Companion.DB_VERSION +import dev.minios.pdaiv1.storage.db.persistent.contract.* +import dev.minios.pdaiv1.storage.db.persistent.dao.* +import dev.minios.pdaiv1.storage.db.persistent.entity.* @Database( version = DB_VERSION, @@ -64,6 +64,12 @@ import com.shifthackz.aisdv1.storage.db.persistent.entity.* * - [GenerationResultContract.MODEL_NAME] */ AutoMigration(from = 8, to = 9), + /** + * Added 2 fields to [LocalModelEntity] for chipset filtering: + * - [LocalModelContract.CHIPSET_SUFFIX] + * - [LocalModelContract.RUN_ON_CPU] + */ + AutoMigration(from = 9, to = 10), ], ) @TypeConverters( @@ -79,6 +85,6 @@ internal abstract class PersistentDatabase : RoomDatabase() { companion object { const val DB_NAME = "ai_sd_v1_storage_db" - const val DB_VERSION = 9 + const val DB_VERSION = 10 } } diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/contract/FalAiEndpointContract.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/contract/FalAiEndpointContract.kt similarity index 89% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/contract/FalAiEndpointContract.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/contract/FalAiEndpointContract.kt index d07624265..d668ec206 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/contract/FalAiEndpointContract.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/contract/FalAiEndpointContract.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.storage.db.persistent.contract +package dev.minios.pdaiv1.storage.db.persistent.contract internal object FalAiEndpointContract { const val TABLE = "fal_ai_endpoints" diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/contract/GenerationResultContract.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/contract/GenerationResultContract.kt similarity index 94% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/contract/GenerationResultContract.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/contract/GenerationResultContract.kt index 68456d2a7..dea60e7e0 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/contract/GenerationResultContract.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/contract/GenerationResultContract.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.storage.db.persistent.contract +package dev.minios.pdaiv1.storage.db.persistent.contract internal object GenerationResultContract { const val TABLE = "generation_results" diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/contract/HuggingFaceModelContract.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/contract/HuggingFaceModelContract.kt similarity index 76% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/contract/HuggingFaceModelContract.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/contract/HuggingFaceModelContract.kt index 6623d3def..f827c1819 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/contract/HuggingFaceModelContract.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/contract/HuggingFaceModelContract.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.storage.db.persistent.contract +package dev.minios.pdaiv1.storage.db.persistent.contract object HuggingFaceModelContract { const val TABLE = "hugging_face_models" diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/contract/LocalModelContract.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/contract/LocalModelContract.kt similarity index 59% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/contract/LocalModelContract.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/contract/LocalModelContract.kt index 2ffebf43e..045b0d87a 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/contract/LocalModelContract.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/contract/LocalModelContract.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.storage.db.persistent.contract +package dev.minios.pdaiv1.storage.db.persistent.contract object LocalModelContract { const val TABLE = "local_models" @@ -8,4 +8,6 @@ object LocalModelContract { const val NAME = "name" const val SIZE = "size" const val SOURCES = "sources" + const val CHIPSET_SUFFIX = "chipset_suffix" + const val RUN_ON_CPU = "run_on_cpu" } diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/contract/SupporterContract.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/contract/SupporterContract.kt similarity index 75% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/contract/SupporterContract.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/contract/SupporterContract.kt index a9bdb7301..dde5ef759 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/contract/SupporterContract.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/contract/SupporterContract.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.storage.db.persistent.contract +package dev.minios.pdaiv1.storage.db.persistent.contract internal object SupporterContract { const val TABLE = "supporters" diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/dao/FalAiEndpointDao.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/dao/FalAiEndpointDao.kt similarity index 82% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/dao/FalAiEndpointDao.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/dao/FalAiEndpointDao.kt index 6089d592d..70545495d 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/dao/FalAiEndpointDao.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/dao/FalAiEndpointDao.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.storage.db.persistent.dao +package dev.minios.pdaiv1.storage.db.persistent.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import com.shifthackz.aisdv1.storage.db.persistent.contract.FalAiEndpointContract -import com.shifthackz.aisdv1.storage.db.persistent.entity.FalAiEndpointEntity +import dev.minios.pdaiv1.storage.db.persistent.contract.FalAiEndpointContract +import dev.minios.pdaiv1.storage.db.persistent.entity.FalAiEndpointEntity import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Single diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/dao/GenerationResultDao.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/dao/GenerationResultDao.kt similarity index 89% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/dao/GenerationResultDao.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/dao/GenerationResultDao.kt index 70038c0ba..bf26ee4da 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/dao/GenerationResultDao.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/dao/GenerationResultDao.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.storage.db.persistent.dao +package dev.minios.pdaiv1.storage.db.persistent.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import com.shifthackz.aisdv1.storage.db.persistent.contract.GenerationResultContract -import com.shifthackz.aisdv1.storage.db.persistent.entity.GenerationResultEntity +import dev.minios.pdaiv1.storage.db.persistent.contract.GenerationResultContract +import dev.minios.pdaiv1.storage.db.persistent.entity.GenerationResultEntity import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/dao/HuggingFaceModelDao.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/dao/HuggingFaceModelDao.kt similarity index 79% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/dao/HuggingFaceModelDao.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/dao/HuggingFaceModelDao.kt index f93e87531..2909068ae 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/dao/HuggingFaceModelDao.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/dao/HuggingFaceModelDao.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.storage.db.persistent.dao +package dev.minios.pdaiv1.storage.db.persistent.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import com.shifthackz.aisdv1.storage.db.persistent.contract.HuggingFaceModelContract -import com.shifthackz.aisdv1.storage.db.persistent.entity.HuggingFaceModelEntity +import dev.minios.pdaiv1.storage.db.persistent.contract.HuggingFaceModelContract +import dev.minios.pdaiv1.storage.db.persistent.entity.HuggingFaceModelEntity import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/dao/LocalModelDao.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/dao/LocalModelDao.kt similarity index 85% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/dao/LocalModelDao.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/dao/LocalModelDao.kt index a2b94a16b..a76e82022 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/dao/LocalModelDao.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/dao/LocalModelDao.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.storage.db.persistent.dao +package dev.minios.pdaiv1.storage.db.persistent.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import com.shifthackz.aisdv1.storage.db.persistent.contract.LocalModelContract -import com.shifthackz.aisdv1.storage.db.persistent.entity.LocalModelEntity +import dev.minios.pdaiv1.storage.db.persistent.contract.LocalModelContract +import dev.minios.pdaiv1.storage.db.persistent.entity.LocalModelEntity import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Flowable import io.reactivex.rxjava3.core.Single diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/dao/SupporterDao.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/dao/SupporterDao.kt similarity index 73% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/dao/SupporterDao.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/dao/SupporterDao.kt index 58846287d..25337af5b 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/dao/SupporterDao.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/dao/SupporterDao.kt @@ -1,11 +1,11 @@ -package com.shifthackz.aisdv1.storage.db.persistent.dao +package dev.minios.pdaiv1.storage.db.persistent.dao import androidx.room.Dao import androidx.room.Insert import androidx.room.OnConflictStrategy import androidx.room.Query -import com.shifthackz.aisdv1.storage.db.persistent.contract.SupporterContract -import com.shifthackz.aisdv1.storage.db.persistent.entity.SupporterEntity +import dev.minios.pdaiv1.storage.db.persistent.contract.SupporterContract +import dev.minios.pdaiv1.storage.db.persistent.entity.SupporterEntity import io.reactivex.rxjava3.core.Completable import io.reactivex.rxjava3.core.Single diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/entity/FalAiEndpointEntity.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/entity/FalAiEndpointEntity.kt similarity index 89% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/entity/FalAiEndpointEntity.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/entity/FalAiEndpointEntity.kt index a1563693c..4829ee9d9 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/entity/FalAiEndpointEntity.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/entity/FalAiEndpointEntity.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.storage.db.persistent.entity +package dev.minios.pdaiv1.storage.db.persistent.entity import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import com.shifthackz.aisdv1.storage.db.persistent.contract.FalAiEndpointContract +import dev.minios.pdaiv1.storage.db.persistent.contract.FalAiEndpointContract @Entity(tableName = FalAiEndpointContract.TABLE) data class FalAiEndpointEntity( diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/entity/GenerationResultEntity.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/entity/GenerationResultEntity.kt similarity index 94% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/entity/GenerationResultEntity.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/entity/GenerationResultEntity.kt index 8f42f4415..6cf8d1ba7 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/entity/GenerationResultEntity.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/entity/GenerationResultEntity.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.storage.db.persistent.entity +package dev.minios.pdaiv1.storage.db.persistent.entity import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import com.shifthackz.aisdv1.storage.db.persistent.contract.GenerationResultContract +import dev.minios.pdaiv1.storage.db.persistent.contract.GenerationResultContract import java.util.Date @Entity(tableName = GenerationResultContract.TABLE) diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/entity/HuggingFaceModelEntity.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/entity/HuggingFaceModelEntity.kt similarity index 78% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/entity/HuggingFaceModelEntity.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/entity/HuggingFaceModelEntity.kt index dc5672abc..6215df01a 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/entity/HuggingFaceModelEntity.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/entity/HuggingFaceModelEntity.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.storage.db.persistent.entity +package dev.minios.pdaiv1.storage.db.persistent.entity import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import com.shifthackz.aisdv1.storage.db.persistent.contract.HuggingFaceModelContract +import dev.minios.pdaiv1.storage.db.persistent.contract.HuggingFaceModelContract @Entity(tableName = HuggingFaceModelContract.TABLE) data class HuggingFaceModelEntity( diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/entity/LocalModelEntity.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/entity/LocalModelEntity.kt similarity index 62% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/entity/LocalModelEntity.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/entity/LocalModelEntity.kt index d69856d25..f7c5d01f3 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/entity/LocalModelEntity.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/entity/LocalModelEntity.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.storage.db.persistent.entity +package dev.minios.pdaiv1.storage.db.persistent.entity import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import com.shifthackz.aisdv1.storage.db.persistent.contract.LocalModelContract +import dev.minios.pdaiv1.storage.db.persistent.contract.LocalModelContract @Entity(tableName = LocalModelContract.TABLE) data class LocalModelEntity( @@ -18,4 +18,8 @@ data class LocalModelEntity( val size: String, @ColumnInfo(name = LocalModelContract.SOURCES) val sources: List, + @ColumnInfo(name = LocalModelContract.CHIPSET_SUFFIX, defaultValue = "NULL") + val chipsetSuffix: String? = null, + @ColumnInfo(name = LocalModelContract.RUN_ON_CPU, defaultValue = "0") + val runOnCpu: Boolean = false, ) diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/entity/SupporterEntity.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/entity/SupporterEntity.kt similarity index 78% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/entity/SupporterEntity.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/entity/SupporterEntity.kt index 81e56da43..8339e7e3e 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/db/persistent/entity/SupporterEntity.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/entity/SupporterEntity.kt @@ -1,9 +1,9 @@ -package com.shifthackz.aisdv1.storage.db.persistent.entity +package dev.minios.pdaiv1.storage.db.persistent.entity import androidx.room.ColumnInfo import androidx.room.Entity import androidx.room.PrimaryKey -import com.shifthackz.aisdv1.storage.db.persistent.contract.SupporterContract +import dev.minios.pdaiv1.storage.db.persistent.contract.SupporterContract import java.util.Date @Entity(tableName = SupporterContract.TABLE) diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/di/DatabaseModule.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/di/DatabaseModule.kt similarity index 83% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/di/DatabaseModule.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/di/DatabaseModule.kt index 000de3fdd..dbec9ad9d 100755 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/di/DatabaseModule.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/di/DatabaseModule.kt @@ -1,10 +1,10 @@ -package com.shifthackz.aisdv1.storage.di +package dev.minios.pdaiv1.storage.di import androidx.room.Room -import com.shifthackz.aisdv1.storage.db.cache.CacheDatabase -import com.shifthackz.aisdv1.storage.db.persistent.PersistentDatabase -import com.shifthackz.aisdv1.storage.gateway.GatewayClearCacheDb -import com.shifthackz.aisdv1.storage.gateway.GatewayClearPersistentDb +import dev.minios.pdaiv1.storage.db.cache.CacheDatabase +import dev.minios.pdaiv1.storage.db.persistent.PersistentDatabase +import dev.minios.pdaiv1.storage.gateway.GatewayClearCacheDb +import dev.minios.pdaiv1.storage.gateway.GatewayClearPersistentDb import org.koin.android.ext.koin.androidApplication import org.koin.dsl.module diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/gateway/GatewayClearCacheDb.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/gateway/GatewayClearCacheDb.kt similarity index 58% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/gateway/GatewayClearCacheDb.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/gateway/GatewayClearCacheDb.kt index bf9c48b01..66b5df581 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/gateway/GatewayClearCacheDb.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/gateway/GatewayClearCacheDb.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.storage.gateway +package dev.minios.pdaiv1.storage.gateway fun interface GatewayClearCacheDb { operator fun invoke() diff --git a/storage/src/main/java/com/shifthackz/aisdv1/storage/gateway/GatewayClearPersistentDb.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/gateway/GatewayClearPersistentDb.kt similarity index 60% rename from storage/src/main/java/com/shifthackz/aisdv1/storage/gateway/GatewayClearPersistentDb.kt rename to storage/src/main/java/dev/minios/pdaiv1/storage/gateway/GatewayClearPersistentDb.kt index dc8b49611..721b282b8 100644 --- a/storage/src/main/java/com/shifthackz/aisdv1/storage/gateway/GatewayClearPersistentDb.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/gateway/GatewayClearPersistentDb.kt @@ -1,4 +1,4 @@ -package com.shifthackz.aisdv1.storage.gateway +package dev.minios.pdaiv1.storage.gateway fun interface GatewayClearPersistentDb { operator fun invoke() From 4df17065047090af2c4cd79fe08e147332fe6ae7 Mon Sep 17 00:00:00 2001 From: crim50n Date: Fri, 2 Jan 2026 00:01:45 +0300 Subject: [PATCH 17/42] docs: update website for PDAI rebrand --- docs/app-ads.txt | 9 - docs/assets/4pda.png | Bin 6796 -> 0 bytes docs/assets/fdroid.png | Bin 10283 -> 0 bytes docs/assets/github-header-image.png | Bin 81001 -> 0 bytes docs/assets/google_play.png | Bin 8331 -> 0 bytes docs/assets/pdai.png | Bin 0 -> 167207 bytes docs/assets/sdai.png | Bin 32165 -> 0 bytes docs/assets/tlogo_1024.png | Bin 0 -> 1395441 bytes docs/assets/tlogo_256.png | Bin 0 -> 53458 bytes docs/assets/wlogo_1024.png | Bin 0 -> 571081 bytes docs/index.html | 388 ++++++++++--------- docs/mediapipe.json | 12 +- docs/models.json | 90 ++--- docs/motd.json | 8 +- docs/policy.html | 210 +++++----- docs/qnn.json | 570 ++++++++++++++++++++++++++-- docs/supporters.json | 66 +--- docs/version.json | 5 +- 18 files changed, 893 insertions(+), 465 deletions(-) delete mode 100644 docs/app-ads.txt delete mode 100644 docs/assets/4pda.png delete mode 100644 docs/assets/fdroid.png delete mode 100644 docs/assets/github-header-image.png delete mode 100644 docs/assets/google_play.png create mode 100644 docs/assets/pdai.png delete mode 100644 docs/assets/sdai.png create mode 100644 docs/assets/tlogo_1024.png create mode 100644 docs/assets/tlogo_256.png create mode 100644 docs/assets/wlogo_1024.png diff --git a/docs/app-ads.txt b/docs/app-ads.txt deleted file mode 100644 index d0292b1c4..000000000 --- a/docs/app-ads.txt +++ /dev/null @@ -1,9 +0,0 @@ -applovin.com, b31d4c3b02df6a3d84596566b17b0318, DIRECT -loopme.com, 11303, RESELLER, 6c8d5f95897a5a3b -rubiconproject.com, 16356, RESELLER, 0bfd66d529a55807 -rubiconproject.com, 20744, RESELLER, 0bfd66d529a55807 -pubmatic.com, 158154, RESELLER, 5d62403b186f2ace -pubmatic.com, 158862, RESELLER, 5d62403b186f2ace -pubmatic.com, 159509, RESELLER, 5d62403b186f2ace -xandr.com, 13799, RESELLER -media.net, 8CUD06Z68, RESELLER diff --git a/docs/assets/4pda.png b/docs/assets/4pda.png deleted file mode 100644 index c6618de24c5a30295cf6661afda28ad05e090c44..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6796 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 LiOxMO=h*)RhtR2u diff --git a/docs/assets/github-header-image.png b/docs/assets/github-header-image.png deleted file mode 100644 index e4842a01cbc79c2864e1b07db1493b387ef61bee..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 81001 zcmX_nWl&pf*L8s4UMR)2xNDIXDN>4if(LggF2%J#(c(~C1Hs*k7nfkgio3h@%l*u} z-()7|%K4LhwybUId{a~Tgo{Ov1pokWKg-K#001aGi1QEz+JE0wo7w;XE#R|^l$Mv# zks)d>B^)l!KCyv`$x9DZjVHk(_GI>oZUeG9I#voFh^j&qAi5c2TQnn<4iu)xGP=mX!|<4+f#=Ycm2U#{sncn?*?-U*7vEKVB{mih3N;BO$vwKLN5|k< z>6Wd4k&q-Cf{t6s?@ZWga#v8aNc4+DHF7L#)8j<>(kIT^u3HiqKKTbdRwzyWd2RhE zyxX(Rp6!}N=smrBFOUUuG#N`iX63cL=xTby8 zVeKy1$~=C8geCDt2ZVi?@joF~Y=3kywxMGLSX1tFdffoxn#LV+cx<25v7;K)34jw> zB2F@=)aL=F40gnJLr+Me>?MY zch$q;usfV z-rU#;rd?+olW2TXs4I7KDbY=4QHHhs5@5>s1odsuzySDKnIe6;ZEfH2 zz%`h*e|#R4GouvJ@IWCBtU?p7|6bBcHov;{l#Q>?A47SEkU5 z&1*MyBaFVEmfL=wJg{weyV61fh5j{nLMW|0pThxh5vYWPCxKdu2#*}++XDW9I*#3t zd!lzH0tnwBwWXt8zY*paeu0)k$}RPig$zS-T!Sm>OmwqTK!dqc+b_*yC)zH!@gVEctkyC4*C z)@W?iGmuM28M16T;fHh|T4r()w0rdgQ=IkkU%Hp0s1XowSq{9JHKnz=x>BQ*0p9Bi~nc) zxfEapY!12c*OL@f==xMbb`2LDXa?MCn7p|kF;z%XJSX_XU;VTnd9|T*oSe}pb1R!5 z03H6lGw_pBc+j-AHb);5jQ9W(0u4bS@@00vt*aHg_CHPk>A$BKB5pjinri7eYP5%I7vKckPn|xHc5pz>Nfj!rMQk)Pc*=G@l zKdm~*I>=KBfq0dX>H5^&5r&`w_;(ilk(xI)v;SC$8)s5dQVgu*NsgT3`;Li&ziC?{ZaaQ&InkmOKgl=s-_l5V6+JY8gxj3n`lP-;5(sp=b)gJQD}@wmYi42#YMubl&z1oKFbS2Cu`rE zUqStfaDYR1g}Cm~clO0P^gQe~seEj5a#puwRJ_Tv8o`c)@+tE=pq1N&6Qtks-cV?m zh4noA!kwd>qynaAc&wnPuasFYR;>J>kJIIKz{{wyD)UR~b!SJmP+nr|5Kcys>Kewv zPMeEA#ka)gh>%!*dlB-kpP+@-|5-3fj_WA|80? zRTO|XXt|n1Ne8s87Kqog`2_)t&~qJ7uL2GtUjAB;$l@XbvIqgB?W4%>Axnut`Ke9Q z5faWN;q2jdqEd~7kN)0OQ8i_vHUdFb5=jRv1KKJSMQLuSGdY!Zh`>|x#!Rz>_Kj`_ zM*hi4mZLwadEvCIgq#03Zq=jmqh)_9ay5$Dm490JmFdQRDz8l3&?Lw?j||}`PtV-5 z(v`)l^KchNaC;{rD*3Q9ej)IRHH^ELY07nXRD?5K{)w&}LjB;D6)xSa z^G|t7Ksg@T1uk97ZHeer<;@_6TZD)eIo>FJ9Q}a6XM|X~nAWb^yoSd(Kgv7}0ymum$FFlhFm)U9?1W^0^iqwHiaxXTT{WfZx{N|r?yiU4W)hIRJ}7+R`!O`;Ac z`g3Xf1mY&ML|r2szGuEauK_x=Jq6oK+K(SCdKOG9^Dcd29dy~trOwukr!}1tSz`H+ zSj}O|ru@dQ7{wBG#TmF?r(w~~{E~bSv2<-l^&_)DwTXlPbYZm6SP2Z4m*jV^9~ibf zzZLM4IBq?_|2Q0))@@bOekpY#9nZH!8P{DUWLA8dtMM?A`YegAUHE8hhu)3|YwK?a zEH5N>;DkbphU+pOwLg4pgZ=jGT0se&S%l5O2V}k~;e?p_g%8Zr%P_i`_hHr1g`nhhrQ&~*|V=EC}jGN0OsNQ!_4u@x`^#MYvTlMr? zqjrWf2S~WV1mse$FV#)KmNGVmwdQ0>Ip-e)gam()Dlw|FPvxNORcOlOfW5|Ad+Yyl z{#m5t{#J{L9K4d{cYMQ1q|=EAzU~VS1Ta3Vt(YF#&Wh&w1+YT&_|j?Cxh5o=)0F;G3uiGy!$r&g zpfEqWf560DP}H!J1!JyPz%OJNKTV~t!@qk;hSr!%wsqffo$RB^hS@IKSpScbyEVI> z@t*E4EjuyW2O*VC;IF`TD-&}|>e>b0;Q#lBc1|;9GU!@PfPGQ>$KLF18k1KU=BTBStEl#DCH# z!n1AX>;B7MOQIm#0EBo`@Tg!&7xz;ZO)_ve>fz$Se~WZyyhWm8N>6acfTQTMIDhk3 ze`}KhV^6f61`@ysek6-zg<~liCl^y(9OqF(yMm;|8yA4=OX^gv_Op^5AS;g0(do3b zMZP_`dEUd2QIX!WwL@X31)M2`C;hwxP6(|2&xrj$3-s=n|MPOaseaSV>Q?e>m<|r` z%|rg_LEmNZhYtH{*L#W2_oG_sA^{f8qc!^-jg21QW@}ynQv#?_htJOSDQEGhe@>f} zb0rD{S=7k-&`F-WK|R4K_0q+RFGHP7TrRjaE1{s(X`{dew!@2Imj20T#pFRkTN zax9<031xn%(>(m+`K$bR=QE+-NOd|OewC;`n6qo?^#@63P8^--16vc3MRzz1+Visz z#%vfDgmiH}G@u7A^gKX-k_)Wn?A!YA$>Df6NUw{Z1>Q>G6- zpbhJ69%Y#=UQDTTZ@c}AX=C>3L08%sq3LI&nE$mixng06$&TL!3r_}HjMzcZ^}H`+ z!?}czq0p^~?6P~UZ-zDKEX86b;!TK>NzcO&x8QR!x7~kE$XJt{>9c}apXtII z=mRS+Q8uFhJ=oP|U7Mp+hg(NWVlYulXSRMB3L;>)Yd;Lpb zzR1)2G!E{k-;Y6fvF3q0^zTvzOBbx2u$V#Gr=)`2nvkU|=sTVy*Q)mp*3PHM_aXvE zC#&xwc)xdP>Wg2V8Vro(9-O=U!PAFP+^z}-AYF1^hym35ISFDd`)dwu-41O9 zJZ1DSDacyY)<&=i8WABV_}i)?(LwirqCZE~Iw0yOI9y(mXXUNJKS|3t6BRetcTKfP zF&cEw!FkrSO6&9)5aY14b`~q5M$RxF4B;9l7!5Lm`L=f#kub5|jGZ`ztpJ``4CKAB zKAxQePpS%YxM71Sf5%%G@ikvlx!IT{dqT4k%x~vVfoeOuR9&0~;<4%}X-DmR5NPuc z1*Pkz#WyVII_CO=K*@#=XA=)IJtOmFU@jEjrB$rC`mmgmN3IDLu4jTp68iv{KPX37 zq9pqyr2^KvZ8ERj2GcpvjczqWJjXn|R?4}>a%|}-Xc}F1Ta2`U{@^CcFI^@Ty_Q7E z*=lJbuG;-E97`$jcA04s^)zA8nc!ds+y47Nhkb)(xN`1Ea$}n!O_DWgtgHBXHrW>& z{?xg_INo{t^5Ib*lO~i=*M&cfqPGhxJVqmi4BFYgi~AG(;=4QPV#dxBBZAD*9IzXu zMRw;4X0Pt`h-C zpCLE6ZhkRO_0=Dv-$ii@az3+~K@?#Y+IEMwMFTTbo!Db-X8#4cnVIxieTv6 zkA+Rs{oc@1u#t@nI1-%r>+5&S7uMZrBrJ^3A1K8mWYT%9CcAoNxEe(}Z`uv1dKW`H z+L?N>)JU#+iulMU%ht#-L~}?{v19|ew%9Yx1TR0u7oWH;Oy&xA5ZAD>OjxaYnVblH z$2<@swqfu7Gm_+s|7uhk?UdHw7r(d`Eu1iLeJ-o0^}MAudv&7Sr^j^`Vx+uqh=07y zT<5ZTw%nu5m7loMzbtU1rz!s)(ObxSzaRVI`_b55O9zzHFQaum(JP+XP>WvO%2xjB z=4H{n;UJFmG-R)(Oe^<&8*IrPt_oE|?opR@=0`77{?59frBxQ5?-iry$I~`~0y2<` zvNdm<$wV6rtr4$M=Gb+iO~yA6Y>z3%Tr~((pcCpURl?)B2I#J&`uy4cSB_L#e#p~T zt~yf%@87ss$1Uc^cf9u1xAg&Q)R{39HdcM+H&Y*5@EL1x4b%;1VH#VlX?u2ewTamB zgNIK%^ZO;~$}s(@JWZPKS%Bn3AL?%_%s%kj%p)4+PLdN7#*-w^od%wXkDdju_^N#a zHy&sjWe_*v+UsD{GA;5Wf58g59d0LgZJN2l1aM5MGMDXVeM8QQf;=f_wS(3lp9*wT zRL5#k`HS_|hJY=f$ScwT3l5HldE{iCWK)%Xi(1^y>^zBISu{ZB!P}JC!;CIL8Otby z6`#c04A=$-$R(E?xGF@oHm8Dml!$Eoyf(>#k>=eCZ5d1(_}wEc-52x(1!kf$)k_{R zf+9{$lU!YymgX2FrHx{=Q3n;;@Y?LsWZE3R|4gR?2F;hFmhd{Jxex63u_x0mz41%e z6MWZjXnW?n0zb56JWXarg+hDW^Aj1{E~&c@Y|%m*i-jRJv%FTnr=k`1?L^FK5zc#} zQ0>8fUy)MqrbmvZQ%l4wN&_Sv1o6vP`-U1O1GbZ@%_ndpb_fMkMcN97(lU_exXBxZ zvORm?$yvmFO5d_&()^9>bzpvVC~(Ru>0TNYQ7wQeAMTFh@~l?do(iqf)x|wohKx&j zmCsOuwd@ zlb|gwhQ1+gfG1)sld4NBSb@0Y!{KLq(fQ$si$;tB2qgsKr=V_g8E5OrgZ0gDAR#zB z{31kL#=Y(r^fR%bi=j;6CqT)`X;>eFA+7KlxJV){c5t2QbH=1_8Ac~m>`CZ#dS+vCb zP$W+-!z3IY^iEfKcns4q@PUuP);IJhvHCt#{IM-_R2iJ<<7zl~q~AK{*sMTr>n0$;$q4`EGlB%? zz<77$S=}nFO!2N@^6A3gGN{^Ua|l$Kq2$IWbR#vNx@}>2{9D-xS2#-8Aq8XMib0+)$zr+;FXfaNrxFtUH!GvFz%el3}e%QoE^yv>ESx|du^;A;s zxduT(5@vBdkSj#GcN`VZOT(Qi14UYzDO4|!F|t*Qvgq{$v7x-WIDFIOjochIlzdvk zL{^g2Bc{k(q$z(Tv`Ww%T>-^Cj+P=ewL3lAC?b-%QbXKA48`Kfmv!yO#Y)ON70g+# zHgoT*GSVzp7Oxh^u0fyA zpl;Vr&q_i9vmi!3KM)Mb!;n+;Px(2Ox^<`yXrwKm-xjp_qH}m(HDFKyivl8C{b-o& zsRa(d*m_gk2-j|^zX)D;Vcp?**I#AdKog~*Ntetwp?7|c#pmG}MIEk;OiZxVESV`6 zgQxI%a@zn)vlT-Yz0~K&bYQ#D$EncoeB@24l_T`v>(2zd)OKN4wNAABr_w`QnRt_( zYSpIgn7Lns`_LURhC4TDQI#=taId0sg^Q)76eFlLjeQvKz5vI7rEkWRdfqv42DhvU zNRMm?37GYr_t(YS%S%eH0dc?$m~vI~_-L^<$XBB8n7B&S1HGLawbCHBX*iz7gBuyU z-4^g=oE|JZ4=Vmrw6WXSdO@_3SC$l=f=X2Cnu5wm!7PyE-&%*EvoL6KTOJ$?Vjs3f zPezQla}%*Zj^6*9x_kZ`VRg8LZp*6%Z|JZ^c}^xQA}XoEU&+vGclaA1$c&#*CI&9> zul#0TUT~L0X3pQjU}rLFUoeDlMBjh?a}b;1LWH^?(vLuX6xo*U{RsM}^JS;87#0bmUmKe+U>(kkFxb$H54j*#u#H#p%d7gsa{W~Hb5PMdT%n0ZiwO}l3T$32+YSg+6uj$* z%QqL?M$Aj2#O7LX5zxUsuQv}@p>2kyV_lM1OCT+6&BL|FbvvOu1`acgF0*Z#^$=X- z^p4rUF#$TAn`#)v@5m{ndJXo}+qrK$6<@ONTTDNr-e4-6^dXD+(c#F_QaasJE-|fQ z;&QG@y$W)~`V(2A*@w-rA(cA{0jJ9{d>oT}RcjO2SPakmTVf^E>KK0|#Wc;NU`1k} zRF-5d_dM=bXL2E-89y{jmphREtv=9*?%TcKchMxZ+{~q4eCa@vlSQ;Y)J<$SRGgGSaeQGCa`h;W9gOXUVKCu1wYf^`J!r66M(?68)qRA3h|bX1#xcSh4nVh>GB6`%TA@2zAZ(iF-hS2!)?k} zEWEyXB?2XQjFkLVz3t2H-6j~6Yww19Krj>Z%kr9*GuXX}+V)|v%R_n$8%?Vr2pT}d z-T<3h>Zotk>vZI-`Y#J@AIdF|{8tn96}JDkbJ9^k%qi(VpabVKUS+&%(kPLE|DMuS zQfF^4VV`q4pHL=ORoML+`ixY;wna}Y7~}e9BO~{>Iiui9k{)vNx9^PnR%A#)pS=6o zD#+=LEllkbkWSKY_HVhvAM7doIl6U5b5NrPCvh?=GhdSy-;k2d?AqUFA-Qdb&G~0a zK9lSwQ6Zy`f7G{ijA;F|fIVhB_;)+Hgf84crkcZYbo8Nikv}#od=mf>c@IglK8jq} z!{Hrx|LLfz6Bn=jtFrap;QNL@?w}xTKlIrG_7a?d{zNs}rGyp+s&xLiF{Dx>@R9Af zZwMtCs3dH|cb(_zq-Mx!d@(|FaWVvR$*J>P>&4H9X~vpUQgQ(YkEGG64dyWyUCqbQ z@OAdkR?si=*C=8|M{3hD!u3D>6&=d72p;3V$C0ZeY;zk7S-p@bSBe#7yXaWv$&L6vf974gPqqU9F4-CL=&ZKkK ztAB7Dp2vUXHW;|D1D8c7@`lAad)6}8P@>%)Kq_dOp^A9 zl(BQ*?6oYd(yTM(U*6Y6#SPp%ofFe$fQrCsD`D#j+-r93un-t2^HBvK#hZKil5_!u zQU=UpPK*q(_?3a1r0XxGc9GKgu|5R+_Az`tor6Yq372^(k7Z*E9ZYbTuW|>w1p)3J z4#YKRde$nOwINQsK_h*e0^^X|qYakQ_9_`9@!P#&u9IJB_y3%9)lMnS0i9N27uW#nl5B#WKs5? z6pk3tvqxq+l?7mAv_eLiNk}M3c5TsIV(7+*CNZSxQ`d^NGY$*4rPUkh$HK>4$CJ!> zr6jWY3#2*8v_B?FT=uod1EcX9hZQev3~0t(;@CScPJ{xEHJC9STaIWOH8_qx7GUIK zMI}Y+=LM_1=R%V2le>qezfTHRb7#EU90dBj#uz_4G?gftF zQvmH8ry_coKJ%wkhS=nAhv6IF<8|gtqowOmqK7}4R*zg4afvcZuOR@=37QO9wnV9+ zm;E`{68&MR@FX2==hfwi9fe>mYMDS2NTTZTjJ<5SqMN@=rr4+~q~6 zTgipfn0>lc59aO5+Nw6@YyA5Tu?yY#udmu=9{g{dY6~lA57M%#Gnhu~u=T)gDCR2VDi?5=L^N-2IidR^lYy zs(A7(i#138)tI)gotwR6Dj6f0fK(l*L4Lxa^hMzEnx#1dJ7%q5@f zijk&g88rDvm?|VzKrVhDP(Ngj67SerB)cB~#_@lR!of62{$3%fECxviH7<$O9sQz* zjI>=vtfFJeIZf0CPwBy$tZ(VDx}r9#H!WX3I=f+1Cf$0Fcl`}D8bLvp0~i>Q(?NGd z&ZS9r3B~enQ&`an<&na*)q+eL4n|Bb(K~5F{fvoM zcnO_(bMtSi+(3oy4a>xo>eQrK3L^-IPqnX0CtYC1B{u9Ed69`gB7pxq(hH zOH2NtZ4*+@j^&ThM#bwHs0B@j0*hCRLn{M@9Y>K1s@>5HCMCOlAL%flC+fbiTl*X= zX8uM3^Bd|vN#Xfm+NgX%q9KbYEdWm@=M2sn4WI5n7g-={;HVNCojmfu9og$RqDURG z?*cO;$CzK(M)?{dyTeDz$O3tX=5~5`@77@x3CWH!72jyz3@)|yk5}(Ac5Qw>KL_62 z-w`@}9IR)meNWP4)>n+8V~i@A0R&i8!_4q1gYwHq+M)FM+b@x+Jg!{}IZF5xGQL(f z1eV0AN#=1@usl~xcKHdjd~xre9IZkNC+jBFHQ?32+Ub#{a z@};q1AQ``xUDy7_P_Zb|vNuqDf+%uSOG+N&R-SdDZ5XJ^rjtDA4t!hJ(=~H-2p>a( zRv2T?mHbevbpFLiA^F_xVKPz1`i73<7UcSiNxx!o@gr^eU_Z+F6!uDLMw9b^UX}UP z%5ma%nwAr51`NU{hHL@y}L)$!Gu#(OS(%zv6*zme5bHxTxo@#gUAGa=D zpM2?`llyNYq**2~8_aHnpgDNZHfv>Go#UB_N9_q21B3s%3Pd^!6O?uG15 z8h9argPO-Bgv+PN713&6SIGS<;!~P2?|HKP*l+xFGShOo3eJ~-(hi&?%*zWaV7TBA zT%a`V9Y2afw+3%---2zqmJ;lBlyr(NKU5&__9O#i(Gu7*R8c(juhF|h*`)5!X;%fK z@0FMTUf@5#sKZ7hzi=_m1M01=A4{PRA;Whk7oWEYD5zx{T~|)z#b$C9Mf6A2F>22x zNY#n-k1ymEwG?s+P9J@+o0SW^-3>L_DFfhf1ZkIBuNjUkLtNhtH`laM!3w8foe>%; zmPJmj;%Mi=`q!P0pcCi5y;`yMS?1zCj6;ZMMnhQxDT>Kf3wpnmCrHNUKtCx!Tbu6aaYsJw?dHznVj6ID!{V+ny9F23;?{v}`&o6PL9rq5g zs~p8+;2&eTWmqZwvjWS^=mXQ3VL+hbnHf^kk%V$RJCe|`*T~KAodl9TIZfs#Gebws z1G_cj8nI$=;%2iSlo7Y5FC=`NUn*49Q#LVz-vy1q+N9GUSroiI_|#`;=DR`~QO5PN z11?nVlUB;Wo*xIP&q3a7II|*K#B++SkD^PpQ9|DXG%=Be^V!LPM8_QV?Z{2P>$4c- z#Qa+i#P{{0S}oRWpSY8)L!MR0P^3YFHKx8Uimtb^x4V+yo(X#C`-sEs6EnxMN%g$s ztHQ+afnwtt>U8{^z@OIXcp5a_vxr}U-ziU?N&Ibg=?o;R*t^=L;)G`8%5H?HNI|Zsf%6q zE52Bz)pLBFT}rUi&zu+``wZ*if*VtZ}zH>k ziE3p1r_4Z@qkOX2r43&aQ!$u#g6%sY($ekeJxOgJQ1cB~R`Sg7J-!du5amP9^CYvE zKMEs}Wn=2a?Tw)oOFaWdabCJT7wY_U%GM~j4h&?$UQu43kHPp^6w?)(rOfVz8`Xk0 zoc1+_Y*_JuiIv@Q!=|uoc-N=lJB3Mv^rsq*`o$&+SX6ucY16HmG(IExkl+YcQ}7=R zrkSTEQyA6c2nmV{Cdr97ByEoD;d8<2l#|2xWDwI+UDqR$UZy@|Yv}J}!KZ>t5q(-= zyD~!%ys~Q8SgJ?Xlc%VmbxF5Br33*Gh>h6X7X1M~%YQiA77eRaJqvDeC5*#Ri|5wh zP5sePnHKnaAT|xpv^Vs8&vve0azN&hd@}3cfXC^3$43Rp^l{M!;7Rkcw6bJ@TCA=j z3iUH}P^tNWtGr6vE4#)oG8R->Y~hw;_MG;>CJpmq!~jmMLf7ydRp*GiuAN+S1N-`& z6@e)&XSdq+$BhZh_(Tz*M_jR;KYK(mw4^*V-0!|iaFUYRT^>ea3Q3&>5CYA*v4B11 zJ6WIM(m4&hhD5;-zA#H7E8K8QpxBuvp!yDdCM;}7CW}VMJ0eF0Z9K|bJ6D5-Nj?_B zIx3RZ(q2CDP9Bw_m$G+JhP|T6LSn%!CvT{H^G@V-lI5;oARHZ6#QG>uzkl^0B$D#0 zd$Vb(kqFcDsOfG6;A*Q`2R9f(PE^T!l{qKjGv*mF-zm%|?{z1IPW$u9;$Edz5Yl*P zJ7iIU9fgjhunokE_EFFQxxO--x&a_4S+vtIs5*j@)@1eHAmK{ywO=$&F!nuS-^GAK z^h}b=LE(1HTpGmZ;3f!xh1=w!wfgrcv}(Sc*mJT2a*DeB%;Xr$LjzUm zpE=)_7zDP45JqE~@Xbj=QeL@Q%c&SKrKag9*u1^zxe)o3Aa_Grpuq3-)?g@5=#93X z#@>bm7KUOVXE`*NvPkG-c$_jUos7hI>-HoaXHm#p2XoZ)e(pK|EA#mT??gINdaX-> zujlfBxAaX-;}EfF@VftIxD*y=A!|b-iV|kwt2E0+XHuTG9s1QO=x=Ky)Ak{sv%Y%c zh@^nG9FZ-_1d~nZ)~keTJ1PP0W5PFblw5o>>2Fgeg;s}v1xGi+7Q{IED4OC4{{(9K z1QfrAW(yVB>`wDp+;OD_f_CerljoBQgE52M_31q<$Y@y>_DWm1uYCrXj?xtMsw@N? zky|r*aLt6s=Hlc=5bA|@+=lrubkMGyeC-))-FWOnkUyWngtrLwUmk|7RFMQ&mh1ld zUlVem&+7LYwWnVQ@2bV}gMiu`U~!BIJDRd#xPgXfhDvE(p+z?t#?V{eMSKLbz@2#Uh%U<_V2 zfK-q!x2*-xw&hZPHV_alo)xjiTXEt*8~8>1StE{sUucXLEWE7Mj-sAT)N>@IuC45 z0DawOi!{llL72c9(OgdbD{_krHam}ZSkWmg=^r~Bm)sks*?+b@e;t)2kSkbDKr|nQ z!R#CVHGf`y2%3Rcx~zIH;>?O5k#W~)*!@5a4so+ZHXUo-67p;rYe*xvtvk$ea;d>B z_wTkgHZ(S#uPl&6OR(A=VbRz9{()?`+=zzMSy!|V&l#^=2hpp5dFAnnW7LDVP5io21hARwH&B{Rwj*Uo8^055W@NScxyY_O$5jAZoldd5ySJ^rvqHi(K zF;PGe+hgj3lMxM~l1jgVHYM;4Mc}H}7C){zU<-?n!QZ>si7(m4&Q993QQ+YplZc6H zCHf5(eJU4gK`^O^dG-M3?-=+O3qkZ<@Q|s_%BW|W*)2n$g>hcl8Q;)sT#(nl$~*?% zEIW+*1>`br?jULh455Ty=4(c#A($Z6l$3NeqHaDN&8$KsXOUWg9y<$HrOqy514Wf- zAja<3h<<@3q(4iE89j9mC;=V5|A+-5m?RZ=UZ=0)`eW&<{e(E2!~vdGQC35*+JSsM zU*z+29YhV$Q3minE4fmb%Q3nHEo>-=FaExuVI#AvZhn6r75Lv$IzL3tuVXsC~3 z4|J;kl$5fjT**tKa-tmsXs9vNlD(%?^Q~}VJIw{&CT?xATP~aa%?esv;|lA?&NMm3 z4R>C1iK6o#T2pq2SbN^V73V2eOpJ3yCii86^bPq}zohFlOQ9FJ;9IfKJxJXPD(c4zl@syc3;zG_?*DLa)pb%UWCYUebt zU(DWj7hptNa%H{x|dB%UbJEF;5e48TulA4R2G-+tMz#g~gG)%dibxubDSL;T} z?w6AXvUF)PGNJ#hY3;8>D?Agr=}IqT$M39U7Mfjrz|X_ZOQ>TEl^FfWOQiB|dxGxg zUbjaL6|jHyX8x2Tc%C{lM11-hCpb)zgokq%1q-t2Ypn7}i3VFj%JF}|rF7|Qte%j{ z=^uBj( z4OQ%W*AHNCpj?_qnsv~|h5UX}BA4cD#<8%qPh>`RAo;>YBW$`p*q_cWI(lwS2;5G( zNtz2EkbE*KONsMta6_anM=EI12T74uQSSq-yHovtVYdc-)2v7OZ<|dKXJ_ zba>&2_k^DI%MC&7H_bBBXHnJY-5+{>*0iim3^OHJFYSN+NBE7HeHnu@#;w3Do&xPH z>3Ql4j3f=`Vw=^1ICW=%d{?rSm5EQg^2H)o-`!^uLX|8H3ZdcpJmp3R=$#Hg8tuS0 zq0Bf%cz}O1Msiv@V;2ay&-^Ac)S{y?G<=GPl+tX7DJC|?J)lh{y$CsHKEGe1av`d%29&tW4+MY%p# z(OCg(Lvu1_&BpQ&+LyEo$+SF zvK95fXFTMQ`Vn_0O*t=e5=b7z-tS?=!;hl6{GO1(xWJHaJacIx$Rq;`X_@_jqGFYp0$e{EoT;dCaw$Vo$(`93|S)`pWcT&ak2(mcN#P{emy%!M@F~!7={$gW;aI5KS?*9#$svY zEuP$}N`GDI-5|=6(pl_(ajAfyBVRNK(Oo?A*rM$zm;QBc35`*`CX&d7cZSBc>s4=!G76t&FkSg z1*_O~T<;KHwzuZCpGSQ572Zrc~V zRV|Ce^ZxjsE`$Q+mY)e2&1D!@5`KNcf<*1tUR=uxHB+^WUv(Si;Zd2-T&_mkc}__4 z!GBrK{yLdH(d=p&@-V|wtyYesDS{!COhYLW@1>F z^JJ*!cfgjm-WzR@LZ zS3r&xcH$T}400BYnrc`K)oaKPKt(--pAC2XT;JAd)CYBf7P$ z-?H1G14{iC*T=Q64?b4_WOr$_DjX;d4W8M&9=3md&qL|R<{jW|d9>U9#O(@xocQ_M zQ_#(V14#JzN78v9U$Y=7TGBOnH%fL-3WAAshV28vJ$FUtQ5vx)j=Zu{De))??apw zaHCuO;&UkC!d?tz|LxzPftcv;p8pw6GFd~xKhZLu&-M&nGy3AK701_fIgt4;Omkd# z2ENmKyMkh-LzVOfDkB<*L9RdL21n|7+s5K*DCf+5Aw+1I^$`AQWQ9t(gN=1?+<~1) zPnM4FXyac$sSX7}Qj7i9;gR?>*SJ7IwEQSb{kY5ur4HHJ_9`L{NgJ@RR}8HFmQT}Bn3if6B==e{$HM5CSKWavLs zqF?Lh#PR0&h-!J%UZW3*yKwMV;e;kj@J@WqcxNNUHt zERCUnb+I%i@(#vEPV+VUonutm+d41O`jPc%u%*qV#+~Ep*FAX#hL|H~p+9KzYy8v? zc)9CFrgGwcdCY^mWULz}Y>yhqo3_XCErtvppU zto6L-I`}I$;dgoP@#wwEB6}e4R|NK8C?h_r5Z|4<6rQ+VdFss+ZeWlmL{j$X0Z1yY+{(A)O@f7KS2&hU2zi@U^^qNEx1W$V*w*~BDq%X0h?jN~E`5W5z%CUh-OtTtGz$(iFBCn;8i1SQ1 z6Q+;rtMq{?9^CDV*;hZ6>HnlKSAU%08&;MQa~xjqW)vt&j(7HXm+!tu?~MJ1I${(;zAdZYA*r7;Kvh^PCc&2;Sp| z$noY$Q~U+uP``V{_r2vxo{#a{D^8tNH-f<7glY|b4_o1Lrs`@l*D_-D#v&Nc#%!aQKzj*{0?L@ zX&IJtMh0uTFe6qmX1Zi0*1Vilp#Kl|KnTB-h}XlAm4@R+W&qS7@Fkx|?dK=~vNY>Y zbZ`oWuNj9!Pob!cHhaHyxhJFlzc2l&U^?|=vY@-PFvD6Y*m-4u>J>Im3)qm80y zE|NA(-%>Bw4YE0)=Ue-MX{MLHbEqv1h-)1LFHd`bN`PQf(SEYwhH&~RC%G8Eu!?x} z2@~Lhk3M!)8$N6(y!dpErT1&o)YXeFyBuElzrQ=hC{Wcyf4&<=BO{sb3Zkn|J@YJF zdgWEFCVqe2wXoebTZf%y#md*hy88CJ@4*SD{G!twFTdzQ*lm}c`HX)>-mg|;UCpOp zbU?Aw9^+vNT0r<+r=5Hfeh(cPnSSO2!E3L%ro~o~NjchvI)Pw)>P_9$l0U8ANm3Y5 zlv_VcU&~KfV*8Y7vf?4>on#ChRwtd0zQFUu6q)zMWP&U}kF)=9aH?EhUrGC;O_>#o zsG~Tm_l4c$MmVsRWC&8Ai`ydFRsF3^r?Ck2DS3hgSf>!^X4X9#5^Lp>ZX4C~pizxi*7f*?h;4 z3BCblevPJ^7#W&O~k7VMA7dUQGy$5%?w($ZXSZB9HZ*SM{NO8Ju_hW*pp$ zztt@W4)vIK*L8K?{Q2;UGtPp~zx=Y`eCbrZU%!5sDy##RA#>D@zk^%^B*=7d%{5jJ zQrsy+@|^hfB=l>29}YYCpip)F3Y%tneilReAT`WMz6pqF?IU*hfI|L(m~ zY$(>rPge;5KmWJ?bK3n8x-{H(=j~yqSkdyepsOEz_z@gE;lxh!yz-JuVCNlo2nB$3 zBg@NvwOZ>c9W?r_+kOW*=8d8Qr{|w~GBPXCLLj&nbk*-+ELYdctzXdvB0%GvK(PK2 zB$F`8k65h;%Z0|O8DQGbmpdM2%Frw!pD%F$nJvFXOw5b3)bQ6_mkhA_T&7m&`-Zunam<$Oe;dFXp|z@u35uM_=Wei|y~XxT;YQ+}4I3=gJhd79Udm zWzk*MRr38k{J7&`^5iL<#JTFKqhW__wt+1--yBw7jr^S&opqJw`NI!$;hV|d!bfN# z`No@X!l$2op7)l}=H;lv4rMb-0@H;qGCBOiEw{ou2pq`Ak?MZ<)|(~Y?x0`b8YEEG zfl_=z^#*9agAaje)22D&tu=FKbFJ_0djLNWeB$xP!T8;GD`=WX_o@w}WiMH}1jq&8 ztBI4~y${|msKY}B55~Y^SHgPht{X}hU;fuCaP}{M<*IY;nP>PO?D**_nJjOy-43q$ zci;9WGYb7U}m{N2o<&GxOvkt0Y{e<=H)N9Qb ztU<6If)KS*NaYgNPP?%*ZJaxxrC}9l*yeml^%x}#DVh`~VhCoJ{s8|x`A`^$8|ZrS z*~7P*(BH4`pnB*%41r)z9BTtIv}h(w$o$=>WZksVW^cL6O&U2;3i+qi5 zA`rZQqC=BcH2#Nqf`_j=60!{n1iOGR4V_G`MNT{w@_)t`cBggq%=6BNf4%yeOB}ShJN2X!Ie?G%aYrnnsf{QQsbwTkH^LyM$Ie*D=KyaAv7FwfpAgnN^jo!(4 z&7psRz~YEQ53Ty)jbC6aZ`z#hq^o{P;|GE@z$|4CKnF07Klv2=<*~;xrBrLDE*lye z;F`-XW54$>*WX`yncGaEJItQD?+ynYuzx3i@_f2VW7=)+eO=v=pX0!lR^so1a&(p2 zHT_&KzTg7bV^?%Bs=0VP;q;SF=HF3VrRZuD{g&EBSFEeN zGsHDoyRFa|zWiz;GV~LiY0!S>AJ0FF@15kb#-Zr^H~r4-mtX4Ki-BNjx2ttk&n?V- z3M!9os;lFDK`>2P2mBzj=&neeqj4#)#MGhf8!Qwbk;YEf56XhOfw%R?MOQaNw)ZP9PX< zoyiM0h33;E)*S_z24as@lrSc0X)Kg#N#-gul)3PK_;CtlvJ}ms7a|aD!${egwhp-J zj_skLC*|#wlq`F1e+i_T`$5n89HZR@nch8n!lMs82xOjC=!yyi>o05iZVSqmMG=wK3xdzY=+I=&U2RCZZzx%^Y&il0AdGYC|U?@gAFZT)pg1h^=T1-aWO;^#y z$)5?<6D`FTs+f?1e6IV|X(@u#30o$p$wt_AyI*-X(@Wq-0I?lKLh5xud16Kmb1YX5-mxE&wNH*ACda3jKa(U{R{Cf%fG8w4>wE!~$%W{bs zcH8i6AhyxTocMXYk)s4}*bZ+K<4V^5NDaaI8ZB+*pT`nX#uzUZhsA= zTY55R?cJjF}-aeylt^T|iv1k)#`al?=1&=jnP ze1gd=nu7LFdL#tF^m_Q2=oZN8J z&G6g{vProPO-Xm&!EM&**H5`1SdWc8}tbVK66p+xbXE zR3b3OrptnL*+19;!3rEZtgl3tc6^En&JlS`OsQsmm1(pFj%*ICnBFYr=S}Z=Gh};? zVE^3&eSlG*=e+(LOuhCp=!I#6$TT{M;IhDzwc<08GR-vbAXh!K22m3h4$q z1yFM*BWMD#EEWxd)nNfm6Dt#dC9^dWBt?yGMMk)#bs3yJy z4g$Ic5J$l*hFKqiuB#MDbE_S8Qoi5PLq0#nLj4C>S6_MU-{@=k8JvnyI)hy0fM9(> zO@|-Fe2@LcqWya5xhOR@MKKU;_FG9^4FiI^>mDEo2-flrqN{#7F=OT|I0JJ(e~pZ+ zc@0G$;YTnvNlJh~#XxYibT#OBb-7wySHsRDU-?pXHLCu- z?F7};eEmnUu6o;k@Zm?`x*LD*ygg!-Rp7ZNALo4%jraWDTm=7k`DN$xL72+w|DJui zR{D%SA`6=Ng$lXpic-0=qeL!8M(}vQ~1)~4ESl}RH}ndC{Ml$^BZII zYLR6Y4jq3hbS!JcIS6B0SJwb5uQV7VlJ;SSn@yOB^<`1VVEpleVbygc>NCml#KVaR z#uQ296O5pb4g{zj4vxh@n1ZO_Zwz}zz!wo@*Q zuI2;56sfvgIfenjmDJVH0_=vm8g`DQ>T1}2ij@zetA*MsS697lcXm5D1&%uWaHrUN zAAA7Eo_MmW+Etfc3S=@}j{9X;5ZoQt)nYo~{k+z7H82R4FJX+dOWR~*k}7f0sR6NK zVa?Q{8jE&VCqPl^Nq?zh(VH9^Lzm2-8Al_cvzmwiVZ;0wff|9}*eB;9E~3cG1iUoB zRVk2^X*7GlQa~(rR8?&&zg1$2$)8pO+H6MrYZ-8nDKu#sBWj{!m3gsZmFX?Pm-r8| zva>&Ih9#@*3jNmI1g1WBKh%Bl0s1YYuQAT4j_xIb-+Baeq_)HeCon%S;ynC~;E{3# zV_dCxJTw>( ztpli~Wy3eh7?Nr;h`ICmebc%$P(0=6Wy_%q%d0 zX#~SDlnpb%lrI?b2U9FDN}n{ae?J7w*e(qff&Jb`^@66JtyOwKNRIa&YsUX-CeiXV| z3J9)6T`i=PVL>ppRjRH|nKBg)KI&*_Zf4CfN44g-}6kRO@g3Hy_QbBOkx?0M@ z)7^BnlsT5FtEKeity7Aw7V5WLT{YYG9^#VK4+X>;(7(TH2;Q~$r<-m9w_v2`a^f?T z0)nlsMxl}U+bE{1fk7~D*%=74t!hc;Wch}v+oj)O{c@rfUsu?&>&1*VXr-9xMIi&7 zZimTNMdu19Z2ATZXiY4hib(MciK>hs6rm&oL7k>Z;GOvWa$qf$`&UPI&N2fm7?vw? z8DUkmZ?LA6C3i6D9QMOLxf~D+&4_u@!a}!9?SSv!pAXAgkVWT#2pA_OlLKKPi%EXK zi6k+>2>2+vB?8_!zK-z^zNT{>WR1z6_k(}W6LV<%kGSQQA8#(^(AadG*ijt+)d#twN14IHq~iIf7!tslPZLEFi;v?4|2M z9mby0(V>su|6XWYhAc3G)FcMQYCsm2{Cb-jdqR&MjTqUv9s#dJlSW<|_B?JdtT`5Q zAuEu2!eKXKiX<|JZbBWSGy=i|b987GA(|p-ONt~4goiRhP~3k&FAgL|1KsDS9%!Q7 zjQ+sAp=aL#(Ab30r?E`Az#K>CeYLl@vzh(3-%f^w=*QZE5y^Y?>;Zkz#D2}ySBF(c zkLER~6kQD~)0wko!=!H}!Q8p?U>;gNP`?y`e4Vw{f;CoOt*q|`8cVslYR>1JU;Y|i z`q#glw|3omC;06Zmv@@-{SW=c6(EZWJc}mNqehJ2vZd&1DImDmx*GOgndPgct3k#X z)gB;7U%E_?bu|oQBaLmO@uQXvHi0dEcb5>mY!01)D-Zc6 zf?)hyG21Bw!K<&m8uo!5(0H{|w2*{N-zYeFJeXdK4FZ}f>SY`OIvPBzoUH#*q zZi7290&f)8rW^kR?zrWT1)KWpi!b2ifBp;p{hv4C+sTtVMg8?w9zA*#?1$#Ad+#+q zl;39|5KLhAL5y7b@~f``F^l;wdS*A>cwqs=?{^;Y6BWb&- zsR`bC?G;yBcViUzn{NG+^WKj(*Z}Uk6AzT}3aYDSgLF8w%lN%reLRZ3*K4o2rtci| zx=Q<$SN{EPpo5Bc-~XVXo>HnS%Co%X=09a!9fFN z=s&K&PTq19QGZ)Z$F=WXd*OJ;F+oLEgkb_c7Fv(!Fz}&AAA`TY^b$<`dQx5;S$X9_ zuotHGIuxVad)d}7ibZ-}Zd$J&e)s`)*=rxy{k`+nTVRu)Y}9Ee6#0CoJ@#}3$T|}9 z)t`0Rsh!FO)zwl#Fm+fuT8cb@`y!Dl`bD4m7%!=(MGqLw2P(M-ahQ z(w1EmK4<>jwLn5RU%H%eC^p#51XBS7pL4&2k52eGthUD(SZNFeenPOsX^{y0D$vRV zub47(yTpL9udn_-p|cu(q0VfDwkgff z(T0(lRX<5iAtXVu2YyyAtYn2l>lf<@BmzOTgz-RByS3$9uYlfEfF;DRC z?sVosA6{|T-=Sq5XAUMV7_eJR9kdb*8G?S341)Ek0#BahCbATBWz7u>GfXl-Nsw%@ ztqd{2SF8*5P3m9)8I|LI{s5*<>cPIe6p)HdnGt~2<7@i6o>INwefadNk6^*l1#s0Z z2f=zj9wd2^@%?F~Y?BQlw~<8JkseJvM~q`!Hx=KiKa` zWP%X{*Ecj`V65H{GM^kKFF33aG&CBQ$Yg!xV87BXsa@RpEl3H0;Cr_RN`y6rS19fvb)^>c~j$UXXRQ8X$NnGD6Qj|2+KV(Z^x>3{3l0!bQH9zdZMB%%8ezpxS<$ z&chBl81DG1w%~c50iz#Pxsp15BLwb+KW( zJ|Bf__OH%82R1|V!%FS}$_2qR=pedkPL2Y-opJ7YuKAKL;+d!Ba$D;UY5k!5+1@aSMz z043eP5S7BNt09_JhY7*4RY@S&{BkJO&r08HZDtr|lGQ9*Zsa?^vFe9N%%3acUmZ?H z553IK3aC{e26On(bG69yLS8_nY z=GEjo%zuc(FdJDTxD)J6AW#Ew8i?amY@}CG0kW7yR%|eVX$I>ENZQa;e`Xt`=b;H} zJC!9fR`QWWEXU@~SdLA7aW-V$OCJyuOy%S zD~U-GR+WJLRmZ&qOJ@nNPa)9GU_NAwLk(k)A)@pYnnUN&a&+Y!t1bXJ=MSxB#9$gJ zXcP-F!B=j8AXu1K(wCDCegIM!9l9PPLpQKLulhmewjN*4UpN=0&YTJz=~k>$2N&M3 z7i_%wDl|o!Fibe&R+#o>8`eXgU{tv}W{xQ^maxE*GDu9I=`etQupWV84o-&t-xJOn ziD{b<1fy?dLk~2=?$rlb=w1k(%lEYmr?0h9S~FNt2G-JF4qd&j(#Cv-R2ruM03ZNK zL_t*6?AeZ>Nv9vW=g&Y4XcSkmb+ytU`27z*gwxJC2M7p9aUF*T1VJKPdpDg&A8|N* z_W9@V&U^2dHH-uH+ZWD1`>ecXoL*hM_Qo6Gug^T|^l7q##Rfuc-FD|)4BY8HmUf>-<14?M-MrrCvuKei)pE`Om{%@|>l3e^Cl4MEbJ(KKr?z zJz{l<-OYFT1<1Pc(o4_+AlRX%cU>iap@8+b#uL zF$kXj!w*^71cz0;Qk~hgvX_%@F{n_YD5uR7=y$n6tAbMWQH(oi8#=v?B7<}I&0&M( zE%6RUzuOs0XW^=`lS2MeU znw3v1foRPD^X^0W6e|`vi=dh7k{NVL7-XT75u~*vKy5~E*oAlkgucOIR*m%u^b*^P zXpqQij-bp)Snzck|5>)I4dzUr56w%k9D=|M`4lq%6cF6&u#;f*!%uQRJ@xs=U%v{| zKSlwNpF9F!VxK7{bQ`{=)JIADLZbTgnq(kYUzl!Ye%UlydkT|Jv5Ys9CSSBP-1gK_ z(5s(Be9oXL`2O2n3(FP|Fju*O2^~A97L?Oh=815Y=WyO{$HS)EjKH+V^1(?*-3n8_ zXhqOVAUKY|S=eMsi$uP}lslLJFx4f$V9vCRjmi-S-OCglcj_?c)wdY|G_uf*jc5+t z8yb7`#wgKEVkVwDK?$mQ%T+mva7j$Q9H8hZlVRmj3+w8i@4FxVaLcW(`?J!30dUc; ze+Aoay;UUltrOROEtXbIi|KMM*z2>{AzW9P)!+v}3 zRZuqGO{ZUBVk3UK$tLJ~yaud{K8my{T(+zkreXBqkN)>R_z=gy2aBHTr<-gHH~jV* zm%nhn!CZRP)$r8Q&p01%x%p;nB3n#XNjERL{0eyf#lLlGx)1s+Z;3vzI`-*@p2fPO;TcWwMx!1~xUpk_@}kmp6F%eLp!vVw z^`HN~#nx*2T6f%7_5;m#HR5-I*Y~oJIdsr_YObqu(A;&e1AgYJnh#`rg%%1&9Cy6y zS*7o^op#tBcHC||_O0)a!IDV63l}Ve*~of+fQMsmi`|%<#U?i zA*b0cwXwl^>%mVp+K}TBG&DBAVqAl1Eqv#__u$jdzwjM*G4SbENdrn+zDo&A>$Sq5 zLx7iFcn&DXeW7dbpC9O&vuUy)R7Z8Wf4}|)oO<>-u4<1wa3A|lhq-ED4-jU&rIrn| zt`_T~RBXi{c<%S#XDI*-DW7I$gPJ*qHDS=@>5DyRAH^nLt4w( z4)#QlHiiH{4jVoE3c!FtGA070Sa;^6#c<;puR$DBG^G(RrV#8BpvHfp1DV`3g5eCm zN9_oUO+c47>l_+e4hWQ2v$7gjX3^OWxc7xqpx+=g$-#LOFy3>^OQ2&h`T>*aIs5M- z=)|$nnD{jVe2ETCApeRx4uW;omB3i^{wc@&2_}Em!g+$}%YmXl(;-wsrAX5L!1TA| z7N(YDBgH@*nf?>b916X9HH#TF=2>oR>H!T+7&r@qb0rW|uSjOm#nv1%s77~OR|!Du zf6yT?edf$gQ>Bd=`Js^s?qCFIJ;3381 z=-=pNVkr>Q%{N?MG-#K1(@r4x`m3)lx(B%W+UwwvC!TaouUC&Aa1tIe{CxlY@|qD+ zFe36VyaUY@O<+Y05gF9$k0! zm25KHh+wYJML_V8#~+8kqOZGVk=I4P+k0;Nldq1K0)pu~;xx=L{RYM%FfaPPB@^u9 zka^ZYn*7H4$)}&epU@)14?rJ!(1GmRT5P{sXg#7e;q;SFhBek$J?|kEjp3RbZh%km zw|UW;`tW`CMGYVu4a@+4X4$4Kqx%$tq4u zK}rEU!c{8JO3VtqMlf5KUI_7)sgRmC9X>kk0?4+o0k1HU2mr~VnOI9=!ngqhV7y7w z;MxJUiV@{b3`UcDemP3C08|sc>PE!;SuX97E9D3T%UGQ57!&8fv#^>1>iJ^&RLV0T zr`ODe5?Gbb`W<`{j5?MAB`6?I5SGWBf!i*B6~1}971Aj@1|U|MKrb=F_(QKHeG&$H za3X<`m?#^tVFs?|O7&Q1#3Z9(_3cj`4}*pv!;0^w2?TF_DWn%QF?iJgnAvI$UL_zt zj=-Jr{ATJ~;HlTnCkW4xjcIbH9(MN;S2)w)*O> z>ni0vJ@U8{I685@i#C?)tW6O@S4UTX(fqT@D#HVr;+bs*U03};@Z0}>t)z98*x-8~ zco6pAXCGu-@sKOTMdQ60gLmC?{{yaCWClp)fcY-JO(#9izd#U33{wyjM&0)RKKX=M zr0?gIzoPHU6}pqG>jm9^Pm3279bBJ*v@z8R|*LBvlv(jnRWth zeu13wX*@lb)IaIF>lwf3LO$3d)AD?|ZwswQhaG%yQ6`!CqbSzDzUUHHL}q$_yKT0H z-(Poa@dwo?QL3)eVeOv#?(gdB?%QsKpKQ2c(f<7cWF2(C{_v~w+-A*18^Qwle1a*O zw>I$)6H6qFuIdAiN?6qdnR~fqimj`D?MH#F^7;guw(j(r*&j5S^kZ+OY~dWj<(%-8 zE8M8-hp{`?rr!iGiZKjPk26qv3iK+sRSE2j6*bh1A^1&X=0eLCk3n+w+fbiw=FgVS zYK3oKo(Apn5YS-=Wi~BVK#tg5VLWp!33fH;T{d4-OfchMMxhKuiQN@!sQi){Q;82P zkJA_+GoQ{x8F{PEje=xptXW?DHjPEK>oCAftCF8^3_7w&XxeRW7)wHnU&TOL*aw+J3+Tn?f!J{Z!ioiEV9);x6U_2pc3pA`ldK3JQ{-v# z3BK#a45`$KT>`%9ZB?AW|8(fEeNZ1ahN@{56iGMe$^hy>4=X>_L+qybq<}5h>!V5c{ z^cPxN=(}RXh*cO6uZbqT>!NA#I5ed!7CAJ?x*8@$QlRy(#6mRI_Vx~p27HvuoRl`N z6pb|B<=u3WtggQ7Qf3KDxrh}$?xd3uRL*j$(^^3JY1hLDxB0Fhn|4!I39KE2b6tWg zxW2|B`*zo#ZejE5Fna*}cc2Ong=b$yu!Lt%7Pn-fzirM_tH zU(WMn)+KXmip*`gH4Gg*816*iHexu%SP6H1_|eC3(&=Xa9qj3gqDMdZ=))M)av;mb zF9wYt2tEzj-y;t@B-DPD*z!Y6TmrQPj&tArbZy5%YN+a{j;8F*=QtT?W#Q;(_tw62>j;6@c zk_MQ~gvk$;e13TdiXCO3s{%RmbclHgw27Mr^gdus*7HCQI|Y%znDYLwAf zA!7u<8DvJ&gI0l!F1QR5>ue;})o%V+fULsv)aneB!R^=n4HnGmfK)rOz-XE&WH`x| zOvR!(dJa#>ZHK2bnvcTjQOpI^>8D`OS z3xtcUE8S&Xr2|Y#fkUjPpLuk#dFszs8#4yBM|NQQ?Y0F1Q2DMx>uRllU>ZBg<&npq z#3-t{Jg@}f$UHmW<=u21k0y^4%%+^{n{U5`LykJe<@-o}&40fAw!F;-0l{YFtFOBr z=lX>6)&TUgBk(~!%lZnl2OvM;BM=D7;kjJDM&{)}WMHDYDhY!181v~Wu~O!aO1Vtl;o;Nshud; zpm|+z{<-KT5$>4|%6{s8XrH~)p5uWSU47;A-OeXR^07WClS&tHWGDK(N_f zci97kkwFw?tBI`wfne{X%s>US3D>sn`b$usI7UHLMQ#RAbxx3Aq@fcnX zhGgJ`fqh~Np!xL+p-0Os2Fh^)lmt)(=SmF%rN{)&pS%QS{%;;Eo6`=7G*OfIe;iLA z5j0EATmgMzN-X}x>@SQy#pp^5t>{xaVB4Kxl^u42-pC*&Fbxm0lGKf30xdkM2Bmt; zYA}jD&S7oWeOEwPGr0^=Ir6c9Obw)w&V&r655m~e65NY>69FmQtA?Y!c~yT5xbYA` zfnRQ4S8$kXvrf)T+Y!F%DTe0Q(z68c64F?)&$>+>kBpl{N};UCbC>0g<4}p0oUxzx z3k1RMEkxjpsgcMZm{?#mjphR_q>}r@nqkM@lVOKm)1Xfl&EC=cnHh2%Lxw|43vkb{ z$vECGoM^{BhruEY_)v%b!IUbgj@e-H50+F*_6jF~T3=V`5cKVL-$k>xSKxK@W22mm zrCwx4d(4rC!!}#`=ReK2uD&U>d8Ru983fBs`qZ*EU;i1vmZfx=vH876=X-yM+eY zT|qF7{Te*9dDu9#`OUA+hdp=Qtz=y-rjucwCyF3^!YS_P$>*GLIvkFv(#pLqy6g&g z2GhRji`*+-#2oM1-NUP^QLjfk?lIo=yTal;{5OI@9BrAv zmDuNEQO@nlRWQ8}0bva)lh87w1!jCW4eF2`){LN-M^hRlWQ-LPOg6*_nPKt3VX(pP zABA*7F9cbV7Knf|hj}tUpNvqNq};^nCI5EtreJIZx%DRw3eDkZr*h7mnpkZ93z=^6 zt)-m3aRr3UVaRI@j1}C}HrnKatOjkCBSfjVU#G4npjkFtk3JHAVYfdtK~NRE%O#H- zNGH}lgA8p#nUgy+XL)4dm#5wfpS-hxeS(?!MRVweIHpO$d$(o7w{S$iub>H*;us_k zA|DDUGiyFLpmwnB3bv0R}Vh?2$+EpboE8% z?i3u$dsPbrmy&*_JA+_vbo-rm*a5D+>WYf(SHnC{7h=xhXP(DE5u^%L^}pzx_Rzcb9U3-*)p&#j3eJ538$3 zVB88bn)mKI?+jO8Q9K})cTjX7M+bA}_28fHMz@l2fyZAi2-Y2yv#tgnY&R%a4Qy2w z2=>a52He`(j`=0$z^qx{!{EV#V8klH{QU7GhnT7vn?>YdTD7x-V z@;V*qBGRm&pS_|Wiu$YAd+#5Ly^9Td_p^7giv@cHJ67zyAYuiPE+CIr^Ph8PC)wns z?B*q}=#D&`5NZcF)eqh5d-FNNS^Ad?D!+$p9UY;(XnjJ34%EvFm%zT z!?#SRHUVNfRo6m+U{>Jf+isWJpuTJqeXw7j*f5k4fA_O!Kjy@fl=-(QlW2_JvC6V( zifGeOM;wtd1WhjYJwfoWZ4%>s9zS}t#!)Rqa*x&HPdP!BELjpe4MS%!gjRBDDiEB> zR6Si=v}O=YbNhV{IwaxJE;#pWVMs2U{EpR3W9D)wB)iq(H`!<-x%#q88yv!ZU|i@$ zixwG$Sbhcv1zR}*N|JTPXwZNtd2Pk!g_zsisfxA2)^Ow zTjb7r?v0g4MePRxB>f~mV|6MvVE5QBvF*m)b_>GXt?lQOns?z}f60jLc1YMj;CSJ< z@tX1lf|Jje&#~(DT3SlJLSw7EfnY;jGfrkbCjX^a^!$aGavfok(B7AWeM@P0zx5#d zJ$K#$sj04&E?qjRj6PZL77GL{KyiSV1&In<2n>IFK_Xw>1u_smu3&v58t&HtS&omZ z9)siS7@7wnQAEn&`eLa8TUcBV1nk5IreM>;?-oeq&tMwyd$hI+WkzIP$K_?R&NdLIR->pwRaEW@o*0AQZ+c@Y3_ z-EpT%RU0tDV1`Q=G6{@+IHnZcEZy^uIq5%PUgaF|&3E6)%dfsBPd)o=g722?C<>X3 zzh_(nA(G^I^~#n*oWvu92#_G+t-=SfXY$9Wt9BVe$o0%YZ!_9{!98Okj z|9$q(waARe*|9nw>wx_aJ2)XP<5d6mutOUh-&7!&C-y5&+L}Qyub0A8pMCy$LYtGB zWO%pr)>&Hx-SV|w<^A+HLYCRI8DcfxaLv^X`kR(AJMK=sk9eYL^+4z)181! zYg2i7xxDk*D+zwScB~!_5v-Xr<6-a`3xXLRo2u6~QTu_a+J2MQv3k*ESIA>eJP|9N zagLvU)Vm;7a=p$x=RA2~;>6h3^wp+77S+YQq(Xq;T;^3Tb!{zq3XQEA1%iz!v;n@{ zktgWms};iHXRiU~TT6$et7q~}YvWegc4={7*o8MOXmWUA_>6+l|KM_IGv`BqRwtIN z186DaWXzxqY_`Hv>gS7Z)Q=W`IA+cZ6WthFxu9O=e~xe-)go1huiNE{@lxM?MP(gL zyx&5=!qz^r{MX;vqcD34YFi$alaIJVzWZX4lz;*5SYIh;cbqD{zyw3?+k{4<$QDUt zfZ!rZLu;&HW14QLas1Cta!ln7;~!OX_R2#?$&%i^G-OftMo>$+SGDSumn}46+Uw{8yo`2y*`Q)?D zda19K5!?>l%sVPCQ z-|#c79RyGR=_eImOLZ@^A9_I4ZN(M)NUvVKq<637rB9#U(z8cTwc=#>;3e` zXJjDHwHf!D^$%M}EB8LQl=+5?0i&n?wCQvJ6oSF!F;|5O5pBv+DRu0 z<1Twi`2xZJZ%KU-RUH0}EX}joqkh{kBS23!BU;Dwlw`{N) zd*P^ZbT;adH6a~Txg7JqBCmw#M zeE;QN$^xHM`n3!$nJY!bV0()xYzJj%Y zS|KRXe92*O6Dr^ikwg$&E6d(IMJg6S-I5Hjb+mQZU-g}}fY_E}L2nEMJG`!v#TH1D zNrY(H+^{TJ<7g=#2LBxO1Li5bvA}HWx8HqN-g^5TnfS`9X?Jbo>*tT1k~!cc(V;}5?JOz;BPpnisos+fUt zYr)pyUIYj(R`AQ%z*Kt0djMh$y`*fgc9EJ#>l-3#2LS871#acpgV&eZop&(eSTu(& z0|X03ZNKL_t(cspi#GAoyLV zG3PR`Qo!Zh3on9@BTQ5Bn3@v=Co7!N50(C?$;s=Y{fBAOWcPjZ=dYNpnY)9XoAlf> z*|K^1y(vMk9jjdTY`4=cG86HeZQ?c2ES*+yb#;krfTje&_MY+@DycPtVE4RQh5MVP z$`4PNkRTlAX%Hb3{aVjB>7xVdwtif5{{1%rIGLCCW;LQDVM?pPIRtk%rTm%aXa zmi~L>4#(i3wEI?~}NuMyg&rP0APlXvB&wtEiPV=C#K3+2t9_d>Wz0ly80` zI~)&>#NWeEAFfB(r1~9hlll(J!>^Q91le1G3)O?+? z@^7V6=x_M%A~X`&UVvD&epWVE!!*Mj+L%F8D2sh#!7$CARrOhI*V)+^2RLZ%s%uK^ zp1Xlnwjj8zhGGf@AUI{W2J@-e&$u{ zH>YBEu0)@~ZAOfcL94AMJuoy~Wl&r1(?tRVhvE*!iU)Uxws?!CxVyVUgS7=pTii=q zplE`-1d0bJ?he7BxWk*@JM;f?=gwp%AND@a?%Cb5XLa;D^DCcmEQ&N`3!V|*gzxF! z>?G^>l8sb!?(zSWR0Jv04BwuOg8g+8{7^7*Td zfwk9~n%Yu6mS%8!or@6FY`i&}88bR*x4jcBEXb0LpHOei!eZ*htOHbbiy%71THPFz zSLM2dkEM4*+kKkfMETeJufYAO^od*0Ew22;yn<(aP^z1b)_Y?4N0s*OFqwzq{H-e* z;b-eE#V#I|Gb0Q>FCnlrY3R&dNmJ(PW{_y|8w>vZsZhwOrp*PaiI^Uhbnj8W!0OTA zLv-=OV3h*kKv!16&1hM6zLYrxt}7HpgS)HeC1i>QTnc5Cm(tDs&~)9FACQ@Mf98oZ z>tZcEHkTbQRdue}eG1D{ zC9bA01(M{1j&!dQ1|Cbnl!~yo9}Kq~?cU>lW+>cQhauht`IRiV5P$6KC;?PKXgIhmA!H$J z8Af_Ze{ILuF}~M~O7PX+WXVA7h2k!ypx?q4f=1iO%3t?Sn+31kvl}C^%kEF}=*!0IyG46)@-x{-f!&sq-Ncm= zP%^8%wKUBpW8obMG-L}fRJP1q%3%IpR@9wn_@DfqqdEt*fID_ijE9X}_ie6KVq#?4 z&2P)5dhp&Q0O-D8(2XYk zYPn?x#;~~Z3%Kn&;a2dVR|FN=HOAu0YsOIv3=5lQZnKsKAN`}N9PuhR#_*zZ1AB}~ zQ$9yIK&zW4kLy~ZhX&Wk5=hhvDL(6XJ~AH6Ro1XSjx>p67ztk?j_wZP-l%&ei+#c| z^L_*;%H|I?_r~kM!s>rz8$sJnIIy5%emj2^8Dk+%(7Y0xJNssgTiQn^gvEcK|6c>} zRoxXj4*TR5#fxlzR7``j|1z$%2-%{TKN@gBGtXZrJ_Uc+rVsaA4?4iTmm$M%!*;|Y zIcPVJ?U#J|_6H`hUw*;Vba%NhPE;^g<1hrg_G-~%QG_l1dNUWtixLh)gS!wg@)9Qu zg(+tn64m;@c7=L5H?7SKb4`HF&|)9+?wC^U7(+qu@(k-h;*|(!@!f9kli36_lPK^d zhg-1B6zJ(@!Z8vzI7nVIaUf8|L9)0!5Mmis{M@vMU;xGA%!D zylNfPkdCY7Nh`%1K$#3pELcnG{4YIN|S)zmIPD=J;=P$ z&1GGn?F>tRtjaq)qI%mYRLRSlR9k(Mv0Jmbr0rMTzmW5=8#(^;+)w&`pu;ymxff!v zy4^`!zqs7f;p?L(Sne6$+;ffl@9Nw6(L_ySe?WyBqPT-rqqK|!P-;P)O@%y2;hSi# zf4h+k0SW!mHc^SoLeIzGg};nhQGrx2QF-NE*c+#~rv*d)UWl|sNr?ii;y5xqY%BcF zs?F~>O)db_@x9?)Y%o!f`bZI6t$hG(Tv*q-(aJ>6gAj8S3m*1T3>R zFmHa*0(1c2CAvbuW#5g&&3PWEW)rr=VR?-mYPjRiCp8>EMge;TdKLy?L9~-80+ABd ziP4hkJjb}35x9_15(<$lhT_WW3k*OdMTQVa2ZzyYViL{wFcTcD(;J!7&eL7ot&%4iuBlqA!UXWh04RqOI1m!zBRu;>af&$Jv-Q*Kx`d{ojj z&K{2$Jq=SFK_|z^J}*UY)7-CYOG`inyOe3sa0M8jz(lZUKC{FUcnh0DT*&Rmm*?Ho zet+!k<@CH4{(Apw;$$2}#Xc;EQwhki&VcTM_d>{UX@=2~XM)xoW`OCl(@XH2j&?xc z`5*FZ7+>EG}& zlraHu-Rw`?B(4GcH?UKev~;(7(Y{u7&;^QZ+E0;gO7P@$T*)|B+4CSBa2{u+xTC%3 zwi1yaX1#X#ZRiXWa#-bW&JHWWSNAqunK2J$Da$lz-bc-%WZ2l^fHd7BR%NY>!znd~ zlF1e}AQ}ScocZBWmt-4RMb?!W?;j^nnkCvwg1eeOvTe$5ceC|$WLP}BAcwS;C*OL! zcYgmQ)AxT@ToLQRVq}rlPrx}NN&#%gL7bFY(zm&O*v5dgMdw?|o}oi%x>Ku6-K<}K zZ&<52FrXI+GS6+WY{yG#(yL^i-3M!-8kvp6glO{6SlCV z%4hc z7XYnZ-;D7$ffkzP<;)2&Do$Nz%5_>L;MhgrMl;wsA{_$RV%1BP7T401a_u(oKd1eu zKTOc^RKvPYK!*ga%1gZS;UnWGq9k|L+E__s(<4J2B&nn2yUpfo_i1NBIOY@H2Ohf` zvHrqrJwBnM)*FtS(JYsuI)Xtgz(Vth;`I=;1I{FIB+&QxLqnyqq%d-IvxgJ9-7f7h zQ$I<=cqS;GbqH>|&w3gl(+R?apW`pv_vMn!@}z}~9yV~e8jJUVhbKK^>>)Qfw+~mD zzzaWnh?@NVpNw(+2lmc^l<^W}X!{;_Gs{Td3o5tW{`aN|Fsw8VxzJllDJEtK3gMSu zI>ZovCJHsroVk5=P`~C^1taIS2l12FU1BC!yz8$Ru^s0xN|{JAhFc zo3xdyHgs>Q+tDJIntX~;J_nWI9tBN(HgFF%^*i*dy4|GZoHY~M=94zmODy(kSXzHK z1lPeFwSXxok2Hx=#=6&Mnnw7^@amm{b5GY^c`pv!V8O$ColEzHuR>=>e7z@Vo>p30U|8J*y$P?Z8#v>}@XwvP-Q)h^xBjqh_Ch^*);P%bs@SefbS15_ zjpekU%Ia$pq*HzSlv=1UCE7kSjRonTOu_9!!0y;y+L#tzTt5YhdkOx9*{8-A3bA?b zXlBszSd_h48FI!X*13e#k-deT?=Of$m;RbEXHY3xed(J3DopcoA6~UW~9?+?Z-hr@f$yf>(@RhoFxZN-jc-M^BZ_N`~O@ zo7OrZo4KP{>eTpj-jAtsWO7Y9U6ZhKf}(RLwvA+}FNmwTlq;E;`0cH(-rRo8ty1z8 zFp29FOx8l-Q^G{Vt=eS_7eBmIi(nfLW8Cd6%~zEkYTY;r+3YoO*OItX#5oY)WC+nb zXenYWo0~8H!klsS*mA7%RgmPbS9X21b`HLK`_X&~#CE`Mg!1{oWquvMTAqV9I^3{~ z+2r@H(8$%Gv+bdOZVeiZ2Zs$yFZr9kv-oV=nTH+4P;Hf0ee6SGKpqmNHnimoP;*%o zv!b&wo1=@ptr=5Rvb;c{G|pr@EMbPg>#wJhe;QnWT&z3TJN?kUbs zsRUX$J^Wm9L4)r7H6J;2H*yDvV0!>&xvP4X&ba6O;{N`?!e9K?uk-ZhH26aJL^n{Q z_@4Sv zD(Uap*Y%%flsd}gA2ZldD%Lrnms>`sSdWVXc&eLpjUt>t27%&4>I)E4A7|`%|C6FrAjB3@f?hlC57UC{N-WA%G8zpLYdpk2=k_Bxa3<> zM>eY}9bsA`RN*yWZA1xc!i5ed+`S+sG+Ww%c1KGV+J4!a?Y);#L;K?A>9W*Kqm5mI zng6A)h5g_khRdhVaz%;>eG``T4Snt{c9U_h*}%iYJiNJNw7i zW=a6a(YcIy0*Q!%R7#sgN;+^lj5zI8WmUlOuplUX8P0|!QEd+9%W|t}vI*7gTprd2 z9YFZ*UKSx>VT0Fk!=XXVg`YXYE^xOjG}1E9r9+uG8T!4^m8_3*cz4FshA=KuaQ*un za>|M1@50mHZZfeDu)P$?J^U5ZkoZbCE6!m@M3k1Oz|3g1Aa@B7kjGd z7A)j1Yq;oukLyDM6u|xYAvOKq9b|MyVZm1;VzqSlk0-_XgZ~wlNsdYw#0v8}i>#$6 zGh#N$05z?)@hMY=W(KM_bjhw3!^K?pBP|@j)ZA!?am5cVroYdR?v97v_T_$gbB_|@ zK3VA|(x8znCiyRFUyNg;*Q>j-3qxPN5~Br}B%^iFK-(GTq!8oN(|`5KFqX8Ca7J(@pICg&#ZPX=?R6cYc5H{%~Z;zEY&sEl`>fK8Poc z+W7cvp5^H^z^8cbmPoi>K&#+m-G1q(Uz=});AUt=|6<~`>^qRc6CP6uC8LPzlm+v_%B9R1QZF8iJw9qOrV4)?D zyDg)I>J>e5M2w)HMGJ7pdOY9H2}p5QN-?DN+ljycYK!?f@69d`i$dEUk+ucY&un}+ zIZIm@&W_k3oA=n$o&s%edUo*G(0? z(sp%valff_Oa5W?%aVUF=H=3>VIJWoc2vOP&8H&)Eav=N+UN%h9aQuvJLNczx<*l?2|LN+@3 z7@^r_%5el=@ke6VQ)=EK9n1^o8y4IwvCt+RIArE6yAMzhG`X*e%UVy21QGhwvc~b^ z4X1G{U&Ere_goBBKlXl5z6Gj5hPC#9I62a$N|M$2U7!C^l~)94?zd&I+1_&WPZY`# zfGVgGq^iY}XMYfV@j-PaN{Kx$q{Yl1v*h&E0XaE+D6Xq#sbIDT$$>+8uv=8`NSXQQ zhPZ`~Rat9>vbf=hl$lMP2wn#X=J>I~fM~}%uoTCDF{;?t%Mf#6vIBo^l-n9IB!0Sq z839o(?_x7%{d!x7rV(FdS=MD;OvzTT@e1*co`kTxkhkh_8#II$3um4wLx=> zi$c;4G57AQN!T=?XG_R+_V26_w?)iw91bxJ-x+5cEBg*{p!5E+GIj1xtB71J!gkJy z(Z8>0@dn;LO@G}0Pxx3wJ@eZANZIsy7R=ylI`B=_3~w|U&Lk=?tFMW zrNFdxZ(dm1LG?y|%HdRos6wd&?(pbD?vNQeV~gXMbs~et`^F@>8*;jmkCduM_n}3m zc>k(V%G*Irbv8lw5X+G7i5!Z0*I`6b5^Fi;3NW)FTfEd10TM(H-v*~}bh>n1#qUo0 zbHVC~{;y7|1!*LVzA+;H8?=~&1Baz=VtsZa7DQ(2W!BB8PfU; zQRMd0mEFiR^egmk*v0;eb~O)&@yo*Z)?;n*)}Q~(ya&aB?jxd+GxdY7+L3<@gV5pO zTP+V_S-Jm87;_UZ&P?j_@68P;9#ZD?gX)&Z8@Q$X9(8kbNs6_dk+GZYZ5Ap0Ct7RsCulk8I9_?bp^lWwHovpVV{kD zablC0$8DXsdPRGBX}z?2Lq!gbPp_-=fY#W^4Jw&FLv?~UQG9*a_MVU6%Q};6)Li#$ zXyE3TpLXzH0fiqrsj{B|xK5WD}k8%6IL}N&^+fuEb zN^W>vt3`t-;Q3V!VW!^u`*q!Li|jxwK+Kx+Jl);g3X04#Dp?L4pfDQzWwgE~rc0<& z&B{Ya&m3mB!|JwBKZfN-5xH&(6C?2I?V*Lcl&Vl(Vn^1uqvhwUw6SFsk7*9){yuGI zpe*LW%xQqHXEEDzXvWCjUX$4cLZb)kq!T5tWP%M%IH2h4Y-rs?)qd*ng7Bh$8R)e=gV)d0yKc$$03>Gk%%Pnc(i&<3 z7=;pO^?viGPxU&pCuiOdIp8Fzb%1YR;rb+>u*TWKq(j}vW@(#{;C$9N>+Wv3ql=I&h#(y+lmPU zAG-YVF%RU#K(~xF9q02-87gR&>O(we(YTO>b;X%eMVMVCZ+9n-kH)NK6~mG)a!Q<| zgZ(LLR;^hzz4(3RbF$RpQRy>+$jK2Y=|I22g6{~$SNG!VKn(+`+XeFg1JkkOpvG$% z#v+9NnP&PR=|~|pny(=BkpA~%%ZT&etW)Jos|5=(^Wu$N14S#?ssgrkwrprNH9xCz+Gbt9aw`c zKRX*VKuIwWgc@qLsyn1j(_0SHjiq#n5Waw ziAr5wmtRP2Ghy53cdl@J5|O+66J4H7FgHK3k0RfZ>3nNg4iYbD)So9tc`rUY!Y>sJ zbZ0FyRr47>wo>(D%(Fy4OqE%0nm~DF&CM@y+E>7T!bg(1J?e2@+6;|eoeVI8d&<{o z2}X7kMl08xD{zGeOm)Mr2|91bXRkJs(y0^(Bru*)CxAM2fG@!BVVIQ^%Titt!UflG z{V|>ktk`d$4Z?kwHeMouRGSsK*FOr$O`L&{EBQ?j?3EWwqUn6>50W;PEYW9(5pC%s zU~H)yf6uj4(HrJj0qMu0vBu zqKj>c*~RIMyKfc$1C{jSS{(eZ0!qfl$qv^0^Rt9f{h~E^Iwr7r0z}@|lWwt#3oOQf z^ES}NSJAn*t5W69QNjlJSO~`Ct-hmfrA#`M2z|=KBNs%CW6{B zaDb&0fDiqs;H~3IIp#snM}zS{EN*VOebzGh!BwbK}k#5}97L$DflOE@BqIiRb+`V<`6&7h*C`%e>t?;{AQ5 z%J}!0I4wXtPS{6}CnxA6pGzNS%h(-3JVKiJw$*ttFn81X(@pXtiBY&AbNT)E{zLJ+*c}rNe`?^0A-T3td{n}-`!sG*j?bp+8oH?{rU*f%rjbaquZ^$X@2%T z!hqU~H=cy55pX;-Mc=$72)EA@3U8klFOj?tmGxs5s@n`o<*pF<8cvLiwdl4L%!TIN z88`WKuxR$zuh`SQb2zNax#{{-IlP&kQPTDz&1a*cfgJ=GxM}K~C;K#E%3P#jYjsQ~ zZ*JZz+VlWSKJ!@y2jte-t+ZY0$CDN5E5yse+tQD7y?=^P0E;r&$%bS5OOK8a+SWP2!G zA#L+)nRnrl13pDsbnYLB7)5~LO;5#x+XNOVe0I(GtqBGua{CuZ6A#wvo--wdR9^qB z%2(2eSISmfT{lrmbt8{F{pbID?s8&gvCCow~4Oy}VrVA(kXWKRz3Nq<98cx$2DazPJz%bSA#y zFS!Nq)OaXBKUusznG<{?j%6&i?CP0eE`oh9ZM1M+cVimoT@-fmwU>-2z0;OlcbpV$ zP4^lj-JsSee>KgL=upg0x5uS#RD9*(s6;Q+-kI-gui9>C^3@^LV%gc6aw~b!XY%%+ zTwX2yZgw~3ZJnPgf42t=a9Nyjht>an95K43KV3v6#Zi_Lu6^<+~l)eGUviY`GEo5{`YG09ybqus=-+*L{tHp=6feW>0K^n zZ(b-0pMmk-gdqtM(hHkU6wL5%ABl{^E^@>Ih3fG7_AE$b?rzd8Y_U~Fe}}*bZqa*Y zd0mLpI>gTj4K3UZ!tzH`hQNhrE0a$0gTAgG-X=$0*xva9hB}0J+fX@Ows#b(#hJ4l zRNmxWg;lwIOKj*<-jEL)lV87GIWl-T4P;1%1u==_Yv6yKfoI3K^vs{zo5qsfv{}JN zC6OEhb=4o%82hGHWA17snB_o1CZ9?|YqHIzx;jS$goYaYE!lc`q1!m@#-y#cQ*Eo@=_99iOGwqlh8J}mgZyTlX)HE|4i8(x13K!a0K zt`AQ_YO_b1sd8ly;=vgpAz^P)iefW71sIWr;_i zmY_}u%KCdqg5FZ6bW3x$^Fu>a2e*ngVG2TA{fkTl4?v~fzTm-1@?s3}l^7nHEm0qx zi`Q|e*s7;PV(Qv8+n8xdbw&3|Nf3?B;qf5J3r+R8#0YlptaY(>nq)n2D3bptzboHQ z1D-6ralAo-k_4c%6IsB=S4Z`))K%3w+`e(k4_EBSZ;3fLX*R_G;HWJo<#=O(YCnnO zH9te3xpLPh#cL%ZZ?_gQU<={Z4?EQLEuR9e{O$vh&UTro;Z%N4>SCie5etJ982XOD-N zA`q%Ilk$1je1DUjY2R(?iZ&y>`7Mk+E|tYsP68nq7D&OoJM-qe+eLJKHd^?3j?m+; zG*e$HI!*=#%8WVsXWt;2>~E+IpY&q)opzq(cz(Q)_;(-A50M|mXHF$!ZcQ)h&vMAF zh#f+;O}~lerxT!TBfjF_vKR~gX#T8+_QiastpeF2)Yzf*X@)O5IZZ{qB8ENzGwh>DYH_O@uf2gqu| z`?pppeKkSQ`tKwEz!WWx8|12~UcxvteO+=*!w-QSf;v8NtEYiZG&NW@qD&RDwRQj- z(Uv5Sf)F+^G}vX$vK-rHYT@;OtP#pidi?=+O(H|zXH{eKZS=O>)QAJ+XP#lgNqS)a zdWFIWy==cJq)9z~Q;a?4e|(_xfZiX{1vyXam)tvjPT`M~3Lreu&4uVH3yn9-RK;_2 zcD?T%n(WPvnG>dNelZt(U+>jHu{CIR)f>XNeK<&6bNsP5FV^DVV(@ZHxa|qKA4Dq6 z#Rgn;lEV`$-?ftq6CEoW{dXKv(EVyk-v&cwUM zXC<;EFbyg7|1#k89(8}(l;Lv1sM>Ax-zn>Bjt14mW$!lT7R3eH(DAlQ1(0D|z5dV; z>cAlnlP%l!+8&~+_S!1&zMkdF82X@acqaSB&)#(R&f3lWGok)eil|xT#rX`DZ}gpI zniljwQF2*YwpuUPKXLM*U(cQOU2R6)#?UIUVXT@|!(RRnPJ6w1%#HhgHxlpj&-7?; zC+`Y|{&TCmxK8!m*O(c~en5?=6>~Y;l=BL-NL}Py{_%_bQ=$|y8j~dSBPw`Aqu_2W zSyKALP}S*20TL9(mt85{@k=9Juh50`0}9Sh61qBagvnBa~yG(qJkdC+Jn{< zNT~Q%J=5$GeWeEauegI0?Q9fcg<O|y#saTG6r)M*j-~pE<{>wcAFqK zy3?Ss_(e2zm?$)E8)lajWvh@)gl68$J1;=upM(WbDV6DzrS zJ9XKO%TQ<ijIw=cyQIWoPipTm&xQ2Y z6q5nzonpaWsVb$U$7Bi;(T({Z3T#fv0MbNVv5v8ztCbb|qlH;QU|Wk}dtdW9-Xj^v<- z0O{puOh`V-xn|?9&jj$3ra{1(x+W|*B^pnwmOt<_DV(3l#4dV&D{;QVc4lQcS&Db_ z`R8QlSB)P{wU|Y38N6Byr_9cv&bGA?bq`;SH(QZUJ zo1yCRf)}eJ_C{0={#mm2$bi}t5f=ZZ7JSL*Sy20x-x=F%c^dcYBmr|{wRa|j@Dou` z(`cBeE14}3a*D&z)`8JCJLa@4mk!s|Pq^PI;Lt%{bYszG>IWaDf$=9Z)sb=uBR(;_ zib8FW;X|#fdyvT)E%Qi9PX#fgYR`ina8}xJIVc(cGW2n4y7q#D-9qVtxmdi)r;`Zy zjA5PW<6pwQG!%i@%!hwwXJOepWDp4=xGWAK0~!uRLu58R^j^=qYftGbS$Tn<+i1UN zMD4sv8~MWO5TTx;lKTs+PW^(YMdQq#k{(-_{+%)58t*mX42Yh1kX0IyEQPOiOF-3q ze^a*>qPDW`&87V_q31SfHvHG^ee(n#$i& zL@m_tm2AUGmZy~1SnJK%=9xfy%3Ys)j-ElV?>;wKen>sM>KwQIu7qrBDBmI-)MZcc z9*Zan{d1Ig)=NFU_!Xygx_P7bF!Voofw(ETjU$xguM}~P=dMDX=ngBrAUwQ z05gC_GX|KMrq>rJ^CH7YRxBmXwFGH^?@!o&(YqHcVW5<@DJK$73m#Z~RJ&9~p}m!9 zH`B-IT5Mpi^TzFbm@f#5gz`lNiAK0(mi|Jy1!!1U!W2Vj)avw}fD1ObqH<><^A*)6 zEPr8Q_xx&o{OZu?5zi<~Op4(SY(Pt<#npEoK+V6YWP^x)#Tq&6osTa*)FB67-l{e! z@FBqJWLRgyT7@S>U7&(e;|JDj17RmTo3|3!9qE%Xn^OfXub+N+@9-Cjaoyt)?1abB zXI*}_Y^mrtlHx|2D)e#Kooj2+M`^>4c06))+~1ak{u}GdJ1+7Wk14DpreSd~ z*BAYDW^^-UO64;gt7+DqbBU?aCEY78_{z;K^@5s6RQUtjRZO-d9!o*a^%|cR0lUEy z&ROYGOV?;?7Jk`&!%KI{S;lMxHfK6bfahc-#*zsI}5k9`d3r?*XY zUROSxL*gAB=su3sP3O2`R^Rl28dC)*o)*OXrFgadUtH*j;RlL7C5!Yazi(z~Osrc4 z{<@}ymCTI*?y+G~PKl`=pYrUxHto#Dw1ak1L|KW)N}34NKFe}kR$izIesl_{%9=RO zolty=6-B`yEquV4GYE?95}8w^wt`dF8#E;jtQXrim1w~BXEzg=Ukb|dH9?9_x$Bi~ zY#b$sEmZ+seda{|+0m6-jDB zkX**!!JCenazvF`0&BFy(&(TM7V|Ea5sP>0TqM20OQgL*$iKFcHx8<>-_IEQqG7yr zwoyC~d@? zioH0$`V^{Ktx2ZJ!Sln_71pwdx^i|>BgXymVT2?J20x>^?u5Y5-tNYC!f%)EwF@Ht ze#={+??#~|KW>+|G{y_9dvt&X-;yBtpKz@;GJ=VKp<77@d!};vccxsmguzGZ*6>?^ zJZP67a@C0N+OFJ^;*YMH;|rAu2I@|*GRs)d7zi#BWk}}qiq!ahRr|IWE_iDGQmFb) zjihIfO%)Wu|D4QJo1>9%kQ1owwwLGQu(jKnwi8c-D6=P^)ySL{gce~`?)nPx(jnBw zl0=n2hG)JL#azgh|G#KM^C`o2`ZzXqYr)SmjC^R+V&scN6Af0F8{f#)#2lwhI;?7m z1RP=9to2zGx@CLQNPJH^Vw{i3NdH1TY!Cq5PQ*NC({rT!UfI^$F!QMV7x0=*L%FWH zN5`W-V9ic&eAZqVIp#}LSLeA5_HlfmjW;%k@rMab6|nr$hx}IeD3{SU#7phQ5+wx) zn74w(7M%BE)u+t`reC#l_R7DuOXrGhNiB82Eju1QE*u7uT0cMv_?{4KNDj9)QN z`%tP(r{~CQWarO{7s?fF2VMr1qXA>JOf98?rIBNwk_x>9Ic4u%RE#cssx@ zeB-yIyJ1BFOfbLjsfzuRRv_E9uzCC%*}Y+hl@PP(yaGe;{m-NUJ0r8)j(8ot@st4% zg%>}0q1#T}B&hcMtDvozZ5#XhIev^cI=vlUm7yp5Y!|pibWyixn1JN4pOUqBRp7V0 zJPAG8`XE=tniK!9O0v@>GM4>rP@O%SyG&ET%-EEBi=>B}1IW*>=ebDxY#W{RM@-|) z@TxdHqO8IyaSWqrYPQT!k?HQKHPX4$wIg zH^l}jdP3gUA;GP-A59}BhEK1Pb<`Ma2)6|fTf2$8FEfkpgw)Q1ZCx20bhvmXx4JLbxqQY!rONY-bNiuPi%`oM-^8i#6^#wxD|0J`r{e4ycgW?UtZ zrlsZyZ>YP;%Dehww72Dsk{Ncu-)nhXJbdZnrx?`Kn5=flmCckIG&0&JLu}<^z z>zV1eWdfO zPB5@wZWN9Fx4Pb0-C8d2o(|48#|@d+k2h}l4hx!XngX76AJfz{pjf+_;&FCS3~IbF zznsSpzBKQh?Rz%dH)D4O+e5oNG4*C+N|Z$>zkdpJ|1frO&17{AYG-hq)22`Y_%lYPv_-_^AG1xaRHxyqGG zlxKYUcCAD6jvl*Ge~F; zZa6j^C+_^%$c=%;A>d~6?j6@k*i~EW&4~1AA5#R-;MX=H6CW8^g|L9Vk*f9JJY1+t zXZ%33Sm;9a&S6;8ZU>pImd)-vv&J}g7U4%O0cf%F+R5aOHP?vB87jNk*h!& zlUhl%vX8_FB2>oC`>Y~^Z&ei9+b%o3rH?;zyjN&r<}p_};iSt;A{nJ70{7rT6lm}P zwaGBbNGiYv1{IX_H-PfArVZ0h$|Cg58Oof!83R58_6wkLioXUf-;jZLzjkrSDJR-WGoL$%F#vcQQR*}uu!}Tu& z@p9{$(Jp@;y!!ypG|5EG(qQgP_RgIU*B_&29T}g-=SV&AWQ>oS&Vk?nIcy*&x|!ji z1VQ#MD3Pak%1^$1&4IP&8QbkTBm_I;Rv&}IuS<~rUNO?8jP#AMaX%geGA2M7@HC^L zl$lZf-xI_5%bd@NJHp$~HAs%p!FJB0-nbL9TIYU|K${)Yi+1)LD|Lqg9YL5o6J(ND6!}-p_yuFtqd*Cz+ zL~A~)EUXRGaZSO;Dw)WqViK={ar+r^%;OA(HugpQiF&k-} zNO+JTXR_+DfwiBir%3By31q+LVV!5=8iP;(dl%WH&(#m#s`6>AQ&wilVdCxCy zF)Lcw6zfeuRTBrg8pzXwRY6Dv6rli#}eVLSsAOyZ;cz z#OF+P)Mae-lZjgGCD0TwqZM}&Q5`K11J_K{ww?=o{S3q z<%j^43e(v{dMnJp_0YFCo;5w^Mw>N`6lhGhUGFygz^k>K{?yjuX#U&mJOq~@T^=Dj z1$qFP78kiciQ!i}#x@H}ZOOTGY<}JAcva@}q$3KngoS!_`!J1Yy80S=4`h5%5_x%_)EI zZOv~DXN;^j4M{LV6OSc4)tfOr%erMp0UZ|JWb#r8>Uv81YC4?=wW3(7$4ZX6Uh?@= z;m7GMLwX)wY=~ZlR(E+Lwd?-fL!8FS3zgDIdSe%)imo@}_ggS{?45PBpP2o?a$@oY z?K%A|w9WcqnmSZET_srWJt+EzNbz_FN0MslNC+dDPv*s}pgYmrBv+p9$nU%( zfuv#5>b}KRYW>=Za+B6rUKu3ZpH{gPjTyL8uA`lu-7+4^du` zTz5!sGk;*wIk-|7G`d9XXIR}OvmC8oKSLjG;_^vJyqc~mbry%bf$<<73cHBH1l3h`NxarwEJk2 z`mI0D_AZC`TYr6-#x2;C-GAq(Rvu-rIKB6$60>evYOQ=kbU`aBt~f`)VpLGmlT`Bu zS8SmxY&oux$?Z34>m6QXZe?$oI~K_cm;6RF!3<0Dl|5Bf+lOy$Q{>GAKfpbKi3(vF zsm0kWTN{d58g)zI-HW^kF(y>Lcx&iBaOP}tHyk#FI(?khnL}Z_TNx31{~7i%UlATW zHN=qoBm)Pd3UML&qEoaAivP-Kgn#NAXl<_`uh6YJD+OJUAs8UK>~!RC6CQZ$sa}}< zwyk|L7;MF-oyRBI4$Cgl26PkN^l_v8AcO;SIDz%6vk*y9CvA81_%2g~!26PQO`{tk zNCI>1NJ?s~#*>r~T%<%4i<>TCqx7Vb$P$d6YX@V{79%BTS!Js+&KfspYn*Ga_l$(1 zce=YG#KtD7h`&~3eAlTN)1NnoHEH{30roh;z4^i`djp|%nl=V+#V)3A8_}easv|ye z*5&b=&l3(VEv-8n-uXQb7ayD|Y;4%^s4&6advY6e2;Pap-^_0MK&DB`docBvZ9Y~> z$Q5RTH@vLyq(`Eu_0z^0Oi68$>X=f7Ciy%H4uBffOOqEQa{CHu7AVvDEIj?nOA1+( z(?nG#b& zs3_C+fOyLZ_a*-Y-?<1*N&>^|+aIkP{WM-G35W{(Of0`y}(^X)bC zETS3!`-J_bRL{!|IRc+$tU8Ov+1n2lq2BieiFh?${QV&&j;KB7%2=JJy|GNKusM{_fbNn@}MtbZYkw z4ZjG9CuT^tz`-Jmj%$xlo>#yP?$e6vpZ)m~lN__oMfe{*HhGOKFdUkFUA-v2<@OG5 z>)f$VHx&26u9zR8;Z+*QL(S~IcOc~IKR+vVW{kZ67NsL|x3gwIX1Y=$sLOqW53S z0zO193>f!F_Z!r#1KrmLho!u}6>s8Yx!Ms|?8O4+xtO0734E3V7l&LogIaV8( zLtFngR>;QObcaT2PABU^4cTmqQNQQ44^%SVY{Qn398egmj0?QFsbOTRc9`HF)g0OZ zzvSQ)1QAYC*J!A@MRgI z5docnt|XfnwLxnwvls)rXji3E>A7p_reHn6Fq)v1X1u1}G4P4cs+(+C+ZaVlb7+Vh zefb3NA;3C7!s5A1N^2B5E^tWH*I|6iUBCWo>)Ger#$P$2N zr+k`sTcN6iW^#5Fl6%E~?PL>br{+!@n-@pS%K@d3vo>bj5FP7LS}d=fa0=SlVVRL< z!snOE=YKu}&Q2mn$Z*Q66v#AW2>C?_^e}f{vQ&$=PZ%AGbFm*ks?EO%UWj2vDysRW-A)Z zt694&YX(2_YUt+UM1J_ljN_{&)1)kG`Cc+)9jjgnNy-zuz9>I1F0KQRjWCuAvc-UN4DlMUN!F6r?`n8s!fZ|ut`EzgN|A|! zx0SM5<1t%{Q@lW9ewWNv8^K{nO^bcMbI!~BhA zz*-N3(^S0)AkN@i{!75>5TwAWs18xM9*fH1{Pj}&(PL5!AkO0>DCp5kFP1fX_E3Nv zM)`FBho8>+Q}(+5c9d8ybw%)F#(zs!>nzc39i`}pc~Z2bDsFNeW6MpW7=bOc3eIaN zUDIa91KMf4c(Xd+8R0OkJFzKMyIr7IS!cEqzKm2y<=COa<%G32#5s@|_v?>KrpP_- zpNxAK;}Jf=1i^Gs(DsX1AAN0J2l$%0nkKgZ*i_E4#6{sw(!OY*tXVQlRw~;_eS(V| zL9CWAFBIaz>SaF3lqZ;1)3;9O>O(|+|K48{cjzk7u}}LuCdb^?JiAE6W4jr@Qbs^^XVXm%l!(akZqBa9i+k%~Zbl`B=APT=xCp^*k55ABy9(zfm zWD&y%Q>8Q|fUmxXNt1@{Db{*e08FNl@r)Jx@<08JwYC1m2Ivx;nrOLXF6qQdHrKGa zdO1pVvL*z;1b6_EA3Y?Fn=Fot$ad?jA=e#!v;l|A3v_(!laI)Yzx@h847F<%T?g=7 zJ)omh_rxNC{<+f@NceA1-3}O6-(+VGfpC?PkxlCxb8sft7K0wApq+JO)itYu^2Qn0 zY#>;_WutnH?*XjCV4r(LN@em9$4e>%dWtHWhUIo$-AnR4nC1E68$1tIO)88%p1@HNgUxD+_FV{u8byAGfLRGMd}p zGF^p(c{O#*|0O&#Scdvr##6)tbr(f{m$3tznF?$mW2`2lCES z`{t#XLWC(vRWWPRPH;dl-1JPDQTJ^qisb^V4sIb6yy*`w00e{KbXZe^;9REBWHAjY zG(gW5u4NcTIBd<1jp7tkp+hpNT^~8S+hBxABA}|58vM5Im`h|K7}XGcNhwQ36PpNj z^%eMn2?je{PY|skd&uPSB$f$wuFElpR+y^HZ`=%8&7@<#&E`6^nq+`YP6f6KBLNn} zAB>kGFs4j6y9`=kd6_WgEWI8cOJCS+@3~37ucU;R0i~fL+#mfqN@e$s0Mlf=aqP5t zU}fPiPxo7}&UoiEmuWPbnww;#!4wK>pkl&g2S)Ov19lxu9An$fp~hzzH>Y#FIW7Y5 z`{W)6%YWK+a_StC-M4vd7ZV)aY)ZO$a;aW#dmZD2oL8G-F%^u}tlgcEA@tK1BG->H-#O2pXtzEhXFlw!pe9)ZxPW5y z=v$>|z#0Wx19%>*3uZ~^!3#uS79AaNh{(n}dTzIbvD!jF@V|0it*epHX~XgShuc*i zK(HME>DH_H2Em@ks^^i}Fk>*UHlpzwacGmwtEgXNu~kNMXo_WVVPS*>jPfy&H&5EE ztY#xRCizg?QM#~if)GdUi8@~~m%TPe!!St}Y8l4SrWydDAwN7X-vTUI#?&q}Vm`N) zS=J&9Bgv#6*2e-0R?+4k1m`^v3b zjx_$h$X1K+NY8wCnS8n61qJyLwjlw#61UtuFbdGRgt*+VZaP|OnBceRqOF9>? zDm_b9l>wz|NSBfoaQ~q1)Lh*)n7j_o0_AJ!`#alZ*m$JDyxOp(5}4rQ;cC!#aJJ@* z{a)yKwUBIuy@+6}dhTwM5dbdq(M#t2Mk7Vue^%c{kG?@xz(zlvPCw;A_&1i`j_ljqfZgWx6~t4*-R&o=S= zTgPg)c4_SIxvl|Hg5YFT!Q?>l<}*cSDEyRKfv>R_)Kteehx5EWC)<#V;idrJY|of- zveUTM95>e11{nh6iER1Z3-T#Z9L-@J1Y`iM{l_uO)k7RJSqso?fsXSntc;}#fZ$83 zZ!as<&|KF5*1uu4yY}hlOI1l{U|j=(>%js?;a5r!Y{an`Z`SzxQY1@RMg?q!gRR&1 zPF!Jgkp?tcAjUdrUi!uwlk6A(Wj&P9Hu=fa7QqBO@*zMl06J3`U~~25d&m=KoT)5l z7y!5ih;p<0ZkFHbX)bO7B3{V^FV{}5jrC%gjENlnZJ~tmYE75TPJyFJt;*A;{j?@d zh+k!R9p2dZ`f{(qVXjdpN^hw_HIKC*SXpEPw)tH#%&{l#cewN~Zl}4~byX#`au?X( z`L$mw2#z>ysoRz2Q&OBYFKESSq0xST*_ zD!SJg30--BIe6`@BzhniPLHWc)&NOtX>^5E|2bpzrQ4bn1pk}o)zCNZirjIEj`Tu+ z;N*F=;_lNVH0@(^zD5dT1@mfH2}Y8QRy{euRvstqG}&@l12h1^W>*wU9T)Jpk-n0!@D-i8D?4*40ci)A74jYHtkH2A>pUzTS=%cuxyjT1A^;MQX++*3hDd1d# z8x7#(zmagQ6u);rKqpO?4d`66M^Bk>+8GKXdHPx?K@S;!yZly%`-Eq<8wLG3$kL7# zT3_R%Y#J1Vx)jZTk8m}Gwd$k{C#}LyRd76}HL}JVX4zT~VpwBJZpdH##{BOv$%deI zm|=o=rLm1!G{G`Ka1mK*n4d5A%}?_7*sI{TOdo0j=8!BYnlHD0a0CRs<`}bRhvDXX z!vLE`)8(wfAU&$9~6KIcDFUhDw*K$kDr+HH4+2|^QtlB zB?zWIixpeU_neS@1}sdDCYe{$RNYS-HUPot9GTO7Z%@{;!U1{j)aL9cTT8neL;yjP z^FjfMm^pL|s1n{dAj@GLjahM2o|rpb4*&CGse_-VA~gb`m_oBcHZu`Ae_E23%Rfb_ z0DmEA12A^az%6965I`>RDcM(mw8uaHN=|v`S&5cmp+YlSFu@WoRaNME2xJ*`X!-#I zSZT;4!vOP@%&w`YLrp3eCR=IFZ@(u~S_+VO!rDFMz=7SQ5@2!ko8QZnzl@f07$(~E z3npt@@AwSE;9p7zg24zY%ZmR7Lm7I)NvElp6#uJ%YWAiN0|W!m@{|g;2}1jHlw}>; zn6`0%xz-2m*Jeqr4473VR}bG&2Ez1v5m@9azL+de&i|FrTk62V5(FFHVC%z7S04gm zDnVNY8})TAl`aZ;8uizAPDw;e)|tog+P?f&P8+fv)S|aDklq2pi%aLq9UqTEtmC-~ zf_V-rf~7vePIEi^9F8fpx&HESPw8B;nk-*DSi02?kQF-&R8#1dB8Zjh?r&~}Etprc z&&l}$!2&-y`QSy7FWwNDF;zlK7mJitNVMw;B7=sAY_hXRMf=nhnskqZUc4OwGXt@x zyiXS?_1{gAqSqdf(99py_g=d8HsVH9l=GUfP}K!10opzYOSA6QX^-Ssjehx-6hC+# zcHC+tx;vPjO?OSqKMP_|?>;RdhAUY(8}~e}8KOqf{%eV>|9>JYub;AfH6NxQD5s57 z<>GrCtCdTo^xSPtzSTAsIr3`rJ?0eky>>#SL^t14>UTO$YO1QF=p(pUOo6!4oZoa4 zGql!liSBWl*B0`XFLc?yB7gpD6rsoBob1nco{-Rlt4y7DfRN#q5Y5VvV%M8*Xm>*RAPZ9+eV-hEP{pT1&_tp!8fxrfM_TS#;Z)OFI` z>DkgBKaN4R93-;CQF`B-0fguAhc8MLCibCO zKbijI{NZIRpnjn#&xw5fwy7Wcq#Wy;errOs4eiBxrbt>xKBEu57~^J`NG0a2S0HwU z>kKXYQ&rFFw>?~H1`U;xabRTs!hOGRj@C70LK)FRE{XjVGiBcDAc=1OUvrHgO%#~| zHv(Q`HAs);mY3*STZm9x4$&TxliM7+>XKKb7)tq}_n|8O@gxb^zVL9*#Mt|3A4>R> zmnHPm=OT;e>-;Ftf{3ny`HS;(w-r-go4sesVR<(O8UWnznmJ7bbF9vZi{{}zK${O- zTcTUSLZtU94OrKNf)~SW?d``!$gI!%18fP}qCLjcK)6+GzDL9RF5}FS<~DN8pY9w1 zw#uO~Js#o(TP1+tOb+CkelrwwO)MyKt}0y~uPd+Fl1*vyTDZ@`OdEnJEGzSQq?hal zwpyHO+1tb;4eLvybbho(hP^OOX7ud=Wct?qtXE( zknR{bL^cNljH%K&f4%&IkXu`vdznNldPsdq1+1RQ`j&yIEybY#!dxf<1cy|;m~60P z2Cd+ijIag3WGWp~XhowAn8k5`($W^!aOYO5$&hvs-NJtazH`yW>pcGhAg(cyrUkG9 zd2Jk6KL7-my>~C(8t+KOT*r0Tu)X}w0m0VP znRR!}rkRI+!3x(YHpZ*rZ~Pu(sdy>Md-rphc)^u201piHSJusls4NKmDGz*gB0xPJ zrs!XqdRt*www0)nxym%GoD5J5z`gav7IZvfFXhc?V%K``gGtKXLTHy@S=SiFP; za1%Y}iLBR?kYOHF*)Il=;ynys{pcB3fTu}%-(Pp6gty*Taa?$`uwdTui^M~ zi(lTcgEke}45&!$yT@^CF+6Y`iH-sjb^m!1`uz2Tb454U zPGq06{k4;q+&_K_&^X%EZ5?bT95B`#MesorX}g#|3!4tkJe;c77zoBfxn`GBq~w8f zp)`&0lOjd?tsycB%yUVKXEWpN(j=8YB30s|e))kC`uZJH=VWzgyP(H!HKVTA4cXGW z&%kvcmY^#|&&8PQ1Ym7bW5>D|5bWXF>Y+#+CU{77ZC?7*PabTrgl;)r1fpK)Qgpp- zrEZVYr3TNzvNCMqBPqb7;3PmKH)z7}V@^^DMdmgVg%*J<*Gobe&+_Hu)TbbrJqlxi z1VM7*1`3(kzyC^qRlA&EHdT_6yN(3&p_`618$GU6j}5e%!Na8V0)YLhrI}kU9SG(< z3wMFgJ-9cgW0NIC(hbAWH;NzxojbWfaLvj0N)hk-*@<8@0gG0pi{_x*Ep83TGTB@hw*>I6peDnE zJNGt?gJ70ndE7WCc1k8d!rMwbFkYJey^MbS38~*;kSqmGH3CUAnWY$&1AxhNIxMQP zjOhDf$RYO!JiKqhNL8W
NaUn*H)R8T>g5uj4=t3JQ@%=ovcPnY^7a_@+>WSxpq15zEfbZS+- z414wqsVT)`hRmze)@qPUCceH#O5X(=L=f!!Hkjtn$DM4LU<-nuyhna_fHI*ct6ATx zy;Qa@kCmw`FhMfvxMfKvd2sn5Dn6wcm_Gu%)&PZ1oIg`e{PuOJ#5L1o+Zc13PEy?K z09%FYYQK%&&_52AR@3bmk|$F|Fs!E06v{%K-}yv3|6M09oPU)p&j&qEt@|2LsVrJ3 z4}UjS<_Ua+RSe9~%-r)(uYITVYTzfDK1GeV;O8IFZq7qDrIrH+j5y8x86 zh~dq-$0GWp2JAncD#p~tXT1LLTPfCwx_bcNN-oD3!=`X1O}huuKQSP&+IVD}mza_b2qWL%bC$*}8SIuU?eqTTyR6pGzp)@7T+ps=``&sNHwT>%Q% zBW)ip)Ul|KrH3w52G6uHz{n~aq%APEpl{m|c`(r}1H%Xa6$QV6mvE;ZNkmKQH$b9~7{Q{NE>OLV&< z6YKujs}j2R9P=GxRd0k18E&31{ql{-8{^~sL9k8s*_C1-c<5ddV!U)(0dNznM?YN% zgkb$qH~MC&>DpH}a`n0%y8`n8<}{A0EauR$@y<5j<{0Noj(1v(;IlHhlOMxao*5s@ z$6~Xi-k+fy{=VypaJv92>@x*x0Pkx6pH1s4J8?>N zbxlmz*_xj#2wpgEUety{vOgr3?$xi(GA?y6HRX+(t~_70FJR{8SQr=ZaxxTcV6Wlz zjG1qo4OTwad}je;aag9$nkkQc{Jz{c`Bf6x3Gim8og?!~x=RQPrFu2B#$==HFU_C{fT;?N^6~Ie z(?Kro2n;#lvoI<}JFKtrp0r4`>?Y0~L2Y`6m&$V^H;``F6?Aw^fWmtDdC?Nt?(_>} z{yN)9b(>BSE~65)0n(-gaQbMqw0ZYlWr^8BJk{#m0fLV`$?>11Fjk#x^6Y&Ig2{L* zTgpW>K=9JG4D;mdBP=67X+4Qf`u;$kqtbttT8?qVr=`x9BNxI$jN;yP(d zULN%|;#$}p57)?ZKi??Rmc5DwSgK-K%8YY_5D@cxyvBMgrk8e&t&Lg&y zj_o?aA`#cjO^bqT-Z&kThnJ>igAHgfA?AX4HG2m(76g+$4gLI;xo7qVP+E7J1}BaF z`YjliV|4Krg=K`CGXV=g3dcFg1%d_ONc9RRvXr!7&3-j0a=0%n3u*uWAOJ~3K~xz` z0>{I#fK8EN3tQZ~HK!w7TX(QBOy9mIq1#V3?+L`If}F(k>iqBkSe{QNnRXz10T#oi zbRf9FSWN+f-D`l7J5UdTU@R8ZR20A?y7w3WhHg4vS%1I0uK@r;Lg!f}>GT*c? zNS+4)DneNF%U^R%z6>CkV~z|T!Eimm1%=+28ifB!8tb+H*)nE{7poh9lrrW7#jJbs zSkDH6^Koq{M|f^uhJN}IA+cb_i&P5`D%fOcFt2jMfSWN`M-c4r8AkEe7zpM!WEKH- zv@e{oDliK!dDJl-<~oFc>Nr?jxHpgp8ZYNqKx|T)-(U0s7bfwGq4_ca6+sw7PQe8u zA-V5gZqOZIz?V(2I&utPoU0id>D6_*UE%B zD$2RaNeLjBY%w3g@EZkd-{791@ZAk? z5un=#`-z)*m}6qeeV_A7f>+LSNiHg(hfzP8do%5LjMQUOF~$Zj`wP}Ndzt$K?0@v+ zdm7HCJkF}n6G)$fjiq$1H15uH-Un*{*M>ui_Gyl!clk(gnL7C_DEa2u79cE9W)QKTukZo4vsUWy)%6%$e zrE3{{H@I7OnQ)8&!G;M22!8%Pnc?^Zo6P{s`90dovNnkzSo!j3k(5oFEvrnQFKc)2 zCDXp2Dp!sgEdx5k=ft&O`Z2mx_W$4o`L!4iS#BKgG95E>wTyOpN8dZ2RfEi$LGuSt zyle+mmsU^=u#NAE-u*(#X8k1{qs8*vrB_N1E}osT^)dm(znS@=TnLusujo9Oks*8s z06A0TvO1|;R3{6tFJbXEfyKrOlYB^Sji*4sVqM%Us3a8u?_YWjf zI@U2ur9U>!uT%I@YLS^@=_W1clQ(c|o0Iv|MO)HXufu(iEUpu~4A)qfkw;5(xXVvE z69~@n+Uk$LLqdHM8O}W2I>ztxfw5X#9ejJksoWV{CrdEjcg&%6^XOz)EhMFS0Ne06 z+k)!F-19b=(+|l-3hKFf9{kWs{=KOCGsIBA+?d8m@b$9u_&_3wD+e)|I+p z#!akLX5}c;9S1zRI;=B}F#i6U-1iLF-{_tI(y0>7=h5bx25%T$BsVHWeyDx{NnvG17Mi!x3RaznYvZTGMHcM-mt@zvn`8&#fvMerFhbJ68#&d znpF_rTD(ji8#6}zjrBCn#=`E@qLN>T_fdq|NJ%AN$>UuOQlNI#;;mSMgECXUX$D4^E`9W zY^kjzm`VObsXlV&|d14*tAHrtz zGUw%5`*dO#smcrHRnsc}-`;lsN>Wv6pXz=&%$vXr*%>knLsCRRL|7%M7=Bk**FacN z`Bz=VgyLc#>dLxiaRpR41W+9Vbu#b#=^gFr%tee0A z5S%&u{gQmUi9L<$@a_eB^hYJXwkFnLvsCZw7;1&PD zlt5$?D;$#+$BbX}g|bS4;F7jl1_WDM?f&U!CQ_w*^xGnPzNTzzVp{|7-U)CCA}Rpf zNkEw{t7HvJ9Ki+s*x7#oew``=q?g_FGx4qm$map}OyjM2Jo+c`E=24u$BJ%}beAl5 zgapCr!cJG&5{Hdz>;CNzCGlr?Fz|q_r*}VSDhq6{57@d2Gm+i2MCYbK(!9ECFP}rctXX&$kr|!MQ zhj$$|U~UHZWg7y|Rp=XnCx-_{Sg$WqS1y2Hiuj$5@l`kd$wzD;xRSCnT*JHoKiNK2MK^&&ls&r&B`>%EoFmS**f%2GG{7qNK>0IWbb#NpNe?G1wM z5RQ+JALp$f9-fSb$_#LnosD1-Ryd2wl4OP3$!#(UyB)&r+x8TjBiI7mFbyRzTE6CG z*|cdyCyn&jH~{p$P!20$3Ep(pX@V8i{~cUCo#)m;g{+of%V$a@FOS@xTPD26PhS($$(GSZ|)4 zly4uhn+&L66kc`!b~ymZZ(Mn`{OH3?mDNR@ zboay0OV{7mKzS7}nG}HK$e4Wh1INo-4gf2yXqGpeLkgq3oc!R8a$9;Wz&`KCcX!q| zC;vx)YevujUi-IxSvW^iE-_RZzo9oPeaqHJ_sx&Odl4@;u=?kmaI*Z*`M9a!Iifgzaz0Ng(~3r+#O7%sX(w|6{n(B5kSonf9A zdrs6j#m%d}{n`{av_7W1!2+z}!JYkih`rIPh5ehMz=N6)$mp51WmE_K{~m3Y7YPt%tH?*j$K z0Lc1z8Tb1_aUnslR9eup9!~sLG>tY2HZjwKSj<3*mEv0n+Is#!ZkzbJ0tl}4-ctYi zV@dA3s3H0)S>%LfC`0mj6Y`*}`vGr+nla*ncZDi?z;#*2L|vVYM_1?P53de_snE?h zTpZ))`~mO7l*Yr*vBpYCc^P&!jtEXm3t2E>BpG3ez5k+faA!)mXfpy9`uUaVb99#V2n1r1g0?3Wv+5-fC;am zDesobJ>B$gr=&=#)`EI+dzl?!BUVt&^}1R+;`%~W2e{1?ApRvpWEIqe+jr`+Rzbr2!b%xB_OR{}) zq|@sH_@(=?QG-_S%M=%6e)$4Z78qa{FCS0ij?n%=ZQvg5MfPyoR%=p{$5RQ3HvS6kY<0;u=&Q@~K zndiv1vmxZ+pUX`K-j9cvY6b8R5_;&qJJcP#2YpBvXtKclemt;=%bFf6uzl{L?9xVg zRxQAu62n)e5I3(DF~PwFPnZF)ZibxWpz1s&#;mA}AnTkz7jAoq_u|;4uKkJh-fCRr zavw!nqdm(DD}`xR$#alWMum6y2-A&^VlF&_il=migi9n3+6H5MJ1+AXMbW7W zhbj^O6fVoGBOojj1i`s?eMVBRK5lBfDK9Dmf^B;!j8#j%(0bMY>Z0k3)KDxe4+gZ{ z;av^a$!Cyuh4)W4$`YOdb%Wq5&J(!{E}^WWSfH!8VKISVEjD2551n{1HZZzm*Iiyw z7I>DjbuFh72(IzoGN1g3WVhcVb}yU4ygIgC5_}GdRfQo$m8S*(*~NgOv7J|YzKF1i zYD{nd1e2wOL)p~zYFH3V z3l5YQmcAql?)sSwJ$8$EW{Tr{OFhhi=VnrTa-ATU>6pAT-db@EE%{{`H}&ATZVh01 zW4d6g$RN00At|#X%zT46ohVza$Xw6jGx`(M!YjB77Zv~)nrVQ|#*vM(dfggj5IJs) zvE550OE#5~9Mtl9urYPW-h0dEPW%_ybN+m^L0?h+ zeL!3bUI33i2v=&xq+$H}2L@$u)*R`h8e}0qa0_j_hN{D;-A669o}A-uUX2k1|EEbs zQ|a)iBK^V>dP@Erh)7{0jAJl%%>^>>C&LzO`p~)3x#$qxu#MGw2}-}p&VdzH0iMsB z`n+G9A%Z-!RF>6PRzFrw=Un9XodCg;#jZ--=OhpewOM(GVNio0IP*?0%V3pDindh% z!R)657};7tu=aN?Yk)vpUbV3;{$7QBN{En!c84y*1j}V-i^sgeyeF#YmdXFBCo~8I z-~GNHL!G}@-R=cd=BQ&;>im-PDnZbFPyuHe zqhLBBY;5PrFjD0ihn-hz0m15#R&1-x7hZ`8=Ee(Lrma_sHi80KP?)A_x~6XP+gl3= zE?%!TiV0S6EUPkqHgb#mVo{>V2&`8pQ~;>VC@BTN4OIX?h(pg8&2*3}>jyiGRk z^2fXHlUts^t|wUB9P$L`;9A_V{XUX`Qgku_7B+z~X8I!nV*sa|<^neCZ`NmmOP z$#Q~VMZ3l+Iy)O6xCe6ZWTV&`wy9|EfsAlp3T?an2?f9T5xPbL7$Z*j9~Ul?v;O%* zCS905)0mGQNn%=(t$h6QJN*;Uogg^q4t*9D$4pUD;ZUKIwJUW#N}qSL zuOtiS5V}ME?!Wa)GQsJc5731)4=Nqk^Uj;poL`-TbS~HFN6Lu6t=o#PluE^uee5pj zpdvF5q#eqG#jSXMEE{!b`DNUp34)VIu~hP?0D{$<=m(z!2)^HxU&XbuTstGJ0fG!% z)QN_g2UK;1B5v@QB#d=Wt2(bTFYHtIL7^LIsE`6p4^4*y z(K)KS`yjUaGyt85OmI*I+}di#ZBT2!p+tN*>t(u~O98-H50#U-`NR}mR37(_dflOm z*Q<>J!5Xr$25G0bPWz8rC)OB0M5-cR5U=8MA9!X`|4eu2Bb7iAY#?;rYLubJ|M{zu zh4^2^dDSX2^MX%afS7JS-n?EAjN-h{!zRGY=a^#d)XEwQVa&FwtyU?-tpURHa{T8+ z2ElAXT)>foZu2&A5^n`79M`?XKQwJpq7Q-zNLQ_1C1dGP#04Y96oBe0SNxCM_7q|z z{20|F^66v<`oOm4x84Ke3E?FG;4GMw1Oae@EHGW74fD%1NG2T;_&dPO%Es$3NbQ%?EY_I~j9)9X+vU~)BTmZK~Y#M*;0R&Tpn!p<~ zu3>;Ff}^h4_#1#&+XNSBuOllxf4>}MT45}tH-bC#)gS$2fCtxGy>N+6KKO#<;T6H36_tx-bYvHS?UVi#eASeDGA!dYC|=n z9_F^Vf;i@pILa`#Ha+Lnx>6(|X4AvMOYgsmP*czqE(?L3^eI0mC@=?wv4SzdTm+jR zY!+c2Vn|P2>Hn53MlN7q*%)zgdF0zwhKZYfU&ehD0k$0SUMA0Yi@CoF;z`yny{q5? ze8;cN`N4d-0p-{HTM+~K#(-LI(5NebU_I>zpNJF_T<(DkWvdMPfZDa@Xy*NVnX1~` zSAE7kf|VP8X09pWLS8or4v3h^J3l4)!;n+9+))Pzwu@`pAKx|I*L~0A0LGE~$bU+D zmsd@S37%xDBWtDSEC3qz0RaSnMB%6eg6p`q92A(#s#RAVwaF($niGHhZOj3%4c==Y z-jroTjR`IV@Hh@x*i)y!Nj51a81bUI*+5ly#`ID&tAy(Dv;e{MRDn{q_9F$zK4mrq zc~oP93vt+(i#xA{!nTfuQSs;dHuvBy(s_xWOBs2$Gsk|U;=JlHCDn>&jZO?1X{){- z2M9)dIrDfE=w}dHpDZDS7R6j6*=m`B<0wP>e44HSqV#vY=UQ7$r?YPhEsSL=jayOK z`p_FzIFN&{-n$HOeOyKtqN?e6iXu?5odiWWd1=imNz*MFFXYnzf^Yr%Q!0w2tS5z{ zx`vRNmg~C3OMlJ%5F!NK!TzcyRBnwgw3PL_rv995KPK!OrsvFv9%40D@+cl?s4%eih9fnj-hzF)9R^Q-|xy z!4bDQs(1c#a4BwIkom8aCpaLCWtkz` z8-=e5b{4SpJcOY#VA?1;TC8@@>+^rOM3UDVThAPGvLuc=VZv4`f#5ptttIm+01bt+ zbUc`Y7rA(Ou>U$f_Xd1eMIE{*CU{alXgi((kA%z#=Sgxus7~_;+9;kWeYQ#*v4h~N zkn8sjquyLGZ5qC>24HP-E2*oOE2G#}yO80+`yZ&rvt2$2*0~pRQU{;O^q3K?`w|#@ zrpPQYuXZiN+7cpgdO&?%H#hAO2MGQXQko&F0FN}DjgF(uvs}yJ)&Ns`tzEHIiFx&{ zkwI{r42tbK)39{Gjiwo_aJ}vewLC1<-)^Pea;bhDg#Vb(*R)2s6=rk zE+nat?2BI+g4MVi>yH9v{+W<|Rrg2-wbErB$2(f76Y!+WeJZwncqD)eWBmc>a~G#f@!hz9;$%g9MU@3bV#(RQsH7jThF3TQVS28s_;#3gYTUJku#*_gRQ4e zyByjVuz72%FE5eAe|*riw1nb#J@;1cTvl>k<;#_p)!myTC;YoeC*<1$UQ4x))?O0(2igz=Yl~cy9=t40#^jQ1afp` zQP4}!X#p_L^V1y_gs%wfs5DG0OrL1{;VaYk?l%AcAOJ~3K~xnhFy{Ge4;s`DcjbGJ z+Er%zAUFjD<3mn6PgZ8Y%22EcLRfUa_Q3RJ=@P9enfy3p0%5Yz+Aa!mu`Q-u9%692 zmk|V~^sdR8E+P|r@+UMVmYtD84&PVbeuc&a8y4Dpo}U2_+zlXY;iyk$n>UmJqLv)y zDZtXCbS3%766stA)kwNpVsnB1;CFub|H?Lxj-!{ftTSIEy#kC8)di4>4t=^L7)p|iN-R3+9 zx^QvBNrG%le&53--9Jlmo7PMBGe|SU{Hpw(k6x)19YstqQzV74b88FMWi?a=1U`c{ z?=2eyH`4rP%!0P;aT#KX|6*c^=@P8U&&V6Bn~YGQ^~ee#pQ;`#55P<{7%*p(y{4^p z{x8@M-&I;>%#l3UN7-%{2=xIhJ$|uO4*p3PyICI1YWc*DhDyv&@O;Tj**#nOi4=$%37;hQdDBcqQ zi)6Y=*t)fa+|tF;`(0mUyj0q)I`1v^dDXgTL;X2_By1MXw&v1hsr@gapd{#`9n=Vd zx!fq&M$o<)dkg^X@wvVAGRYr;%`WH%*kck1=7;-$#eU6OB|m37Jo|9te)1mia2=K5 zwSDiw=F`D%oAgLb7L&UPzJF$&KE+ncJTq#0Bb%iAhX9kykqVB-uCGK}Ar#1TcT8)x z1m1iU!}7x)vbc}&w<7!kH(r=m;{d^|n_d-6Jx3ykbLc^DhU*_v?@?i#Aerg7D1PUs zi<+cRjmzB{p!Ag4uGp%St=0^JYn|Z2zPmWF@TJX0*A;tJp+ZZG$GM0Ndw=%4ple+t z?=@<>CeM6IY5L5jQDNQ$x&PyT@-w+}4P5Sqc7hx8Ab=9sUDASS#b-3=qcTN4#a#p*b1$ftkGbs9g$7FhTIar+-Uc%D@Gi zpck>o1mhlnq;-EbARHi>alvep<}7BL2*z0tSlq<80l}Ig$pFQD!319k5Nz@Ug9!#u ze)XMK$O^s!;4*C5i3t%*aHb0&nD=73%l~a$qYG)1ln$m_G=G6N2hdDBgk5>W1t&5l z7WkgyPnJb}bzBo()c)uekZwdlIwhnL0cq)m(KWiHVM;SXx=}jDknWIf1O}r^x};0s zo!|HUeSZ7wkNvlM@42U*^W1ZqKQXTy}op13BEwpvZ#c}zXLTS)Fq|LtIE%$xk`OTBBH0}>n z_X_m^oW+ncAZwbTVxHcOXfI3r+2RRg2i`U$3JY zAC5`bDx#%bul72X1_&WEF2@jt=O<7GJRkqd1-~vj(a!sfMZ15K^GG)2#coS+w3~^a15zg))}ca>o|A3XW?upr$QHI>icjC zH55hz=WcvTTWGO9(}B{mX7T(wb{53l9r&eAz3PBhGx&_5?Ruv(d2t}Y@IB^CyAY0a z=_t>{fD4)*!Jy!11!1I&z&7RiL5xWmHu+|BJw2)_s{N(B?wkdrU`z0Zd%Z+;AB`m7 zDa-q-0l)>MiOU`wk$q}b!;csKylRqVCCy<5vAokcPhQhLjEP3eaX&Hvz}JZ#X(IDq z5wY-s38+-}%k+?CFy8badmiSlxfR-oVlz@IhHKL;)KMML9fr1Ma7C1wB$jmQ3i?9q zJ%;nhLwN6T=`&~&+8(0P){1d}7;gt1Ia+ zn(x3{H4;51<9;$j4x;VuAU594$4+>C#Om4>NTy@#wF<>kx`twJQF$#_%}X|BQSBp8-m1Xx=^6OO6GlpShn zgHlBD&h0yPKUUMtF@+5=@IZ0FwX1DpiOj@^c?V&;PTR*@*ykZ|v`-M`S#yt$ahIW- zggF2AIq6WEpHbZy9>$FNi)iwS`6TOHzN6JJ5RWm(IV|Gt%DXihA4YnTMRfaObNe%} z6%&~4vx^aUI+k=<@cgEy@r4fBQr?el;)Pi>Mv-`1rt>)UlsGTg`U*&(U_41@!qy>6 zEKw5w8@g}J`i&2L)e8Nc$OI*j-xt4|T@;rwy=vwnj@51EC%O^Q=!S@o?Gq;1^&)o) zdS7-m%Zq{!!Yh9dhzllmV!msU`u{9e;bcrF6S#Uie9eQX($};_bi%%K z)Nb=(%H}APigYPn2%YLzcQb!l|^RnE8xe5l6$8vbEd2sdL z1hz0I(XH6*u)Qq$(YGXWM=W$E(%J3*Q|vhT>>zPEo)17_z10bv`lb5zW@#yopl0Bh z=wypRr3qh%D2xUN@$r=<_vhWbE)BS@@|^bNG?y>I$9j)<*+gVUaC~sq-no-AyH;c~ z?k~b`YGuOC%-YPMNnk!JbfOeWaH+NMML=uPU=+O+xlN8|51o6DQt|trOLARG>#sL> z0K=8rm&`YUDr}+D20)sViag?r^441WcCeM4yZoz>>TXN~+u(0K)`-Bl7>qGA1@43w zys4E;DQZIp9d{-MiQRaK_`Eu$Y?x@e`qMAV_}?s)mu2jhk99(nf7Hx%EbwQntrQ_2 z+Ej`)0g~@GioP@I%hZ^IalmQ5h!nX3(z*i3{EOZcPXV=ATWhbL5NSlGOwh4FHD>IY z|4a7%;L9omW6p?hDgU|2iKIqDu~GAikLlIZU;COMBED|1iPTX5dcWVKGpmLyR7tKc z+1{2-lEW#vv{?q&|K9uuMptUe_U$lv771(B*IwXNdz0F8;1{uh^C_v+6b`ij*aa|g zq^&E^sSZIn>Xb35YhB^*xm& z8Vm)nZD^>ES}5Ao1u}}gzNx(ci|Ch%F!U?+*qEUkaC$f0lP9-6fp#7 zhI@^U1V0@4zCBonN7A9;#d?VuXnejOtkQI&l4?T^TZ5rOL#C6J6DsRipT^GXnL5>? zwZA?4%tJs|&iyMW)|DrHt+T@oB^`*yGW}uwyag7ZuKSy4M4l*?RM85o%Fgl|&qjqe zRM_O34mzHmJ#Dpl6#TOXh<FQ3rFXTF&k8!OZb-%9w{GY7*x2F3ISHmsUsgT=2-^D}+8=R% z0u^1eO?T9o>4OuzJ>isFJ}l1=s74&TI?`d1YnS-LGoCWxR2Yu933qE!qiGp{?p}mF zwlLjU{mDr5n`x%dTRCwkR+?n7+%O3s35VsTet6RJg>J)wZDBp=r$Wfu*4*0qJ5H*3 zr-V26qd6RUk0S#Qb$#^6rXk->S~O*Nt*c`T1g=ntNU||l1+Vw7vzm4CqM1?agS9+4 z)*A3Hh7qf3*p`=^26$Ts!C#wA8HU4R$RwrKE(ENcTqv9g7(a2NH`$;PU2BYGvL(ej z3Y!e3R9%JEo0aj=J&cMdajabp{Azh$@l&|-jY0Ao)v3{XgWE~Fw17V;F!UQb0Esxd z&TbIVLw(T~`&0s&VsiVo(&M8N6TFwsR%YY0Et($6q`C#U{!SNd+T~8prd$#h1V*u4 z66zRvYu;%RYaghBuPJh%;Q@BpP@#FM3colKLd5E?W1PF|sM2saFH_@&~lQ z24;(j7HQXdIm@vEjjeaB{v&r(9L5|Rpk?X9E=THsVPTDWa4)RCJ!cx1K1CA;MTl z-Uiq=IXdlf9w?V}@l{B2IJC)xy^XPu@W-f; zmvVWY^Dm<17ep*CNAEwzpM`vHWb3-hwa-L#+r)GNz$TRLV|jh8wiQ>dLW|BeW#him z?To&c#|5uZmE$^5&H@GrEkAIHM0it^Dqtr~*MF_>C`itVY3(1YD1sD`otG~sMBdZA z5Pnc;J5ZI}_*)XpeoJ@l-au_0hpelX<-mE3xXOpeDv0sPN*ZFIsc79<@V0%BV5S>+ z&N6p{;V}!fd4*RfQ0Pru;ck6g=5odxkh+&l;)dU$v$pXuygO&ALDNr{L7#yDJ~NNp z@sM6g1EN5Xa(RdiJHUf!Aue6N;#CEq^gnf7jRM*8Zc+i=Rrq2I1>7 z;QfgkLYBlKdYvT~am%?e^PUebvuubHF;br7(}}4iT0J@iTCC z&`DOPuEQV<>0;+gL;(U$zpd~&>IZK1m3Iu*af=K7X5w&79q_FHWW z2?RLU+n;RT{fR2mOxR`)-gui7zB=!4qxchw!g5#sqQTIbH5;nNV8n&lZQO|=>|GE} z7}j}SW{Wh0EB?*|li7mO%ZyDLAO|lJKHER$Ob5essH%qaFMRBcQH6COu}3d%AXDMh z*9LRG(VT$|JQgy;==XD(oq_qoQj>EW{oz}^Cjn-;h{ulx(_-qIpP-91USUG6li1c& zlj~^jnZ0k{O7V9sVA~Rpp1PP02;ifM6Z7CVkRBr^v-F_yb`LY7p_go3+CIHcwI)^= z(Km#kVdBN!=xjb$6-wWq3EQdN1U=G`Ji4rOG1Tl!6I9E(OnuH~%fv`b(-< zig!GTwff-bi=xuR-@O285|FKCM}ymV@Q_@KtfL+UgIrXXzd<*og<5>!pla&G>e=y%2094|>#5N9REWr(f08hFCgA<0fDA1bW3u#? z+sa3{+U}{8_h$iHd1+kM|I%e)4z;R%puZW_vbnmV{U|Gd4&_HpWh_XLvl^AB|E_#E#mkMQ zl;6S-y|@F*D^%55r5fvc_ubtqZ8dXFjPA&9$kx5!HIHCamUK>6Ldp@--XSJ(N_td- zVkON+JFwi$x1ai@Usdu~VsD2Ea$g~15pbfKtbsk{jPrQ)O8xFB~dDDtlwN;yE$aYTu zNmufrYV&spMys7Ouph<8tA`+yv)aoCHkQ6{%s%qU`bUPv`vaBz*I8&HI9V@<3OKw3 zgd3OIaC1>NC!gWoK_h>0U*?M#LB#``1iN}SI^YwKS{>U8xak!#W?Yi}fBKT%gQ(PR zb|6e4I4q%Yq?B(UCjt>9&AEq)2PWrMT$(nYa4lVCs7kfW1Ssv#B&E&566-Awev|V4 zjH#{dTRalv7j>cU;&mf`ir>&D9pmRdNG;Qrwx-hhYcGkcxmNW)x=0!l-#&ygq zU* z+0C`?lrv(BwFdl_^l13Xp(Y|HsxO7o*dj}UE}IWI?h9)5crf{z+ly|rko{dt5^-gc zOmOo?IynO3yDfG9ZSwCQQpQI|Q9PguQT8`> zLCepA6t#N=KXv5*=oO_@8-a=v0_`Nr-&-f!#)}*aPdaR^P(rRx73f|>a2vA*wgZE| z;Vu&ZvOfyj@!w8oVQ|}Sb&Ci;j!|6nLtZx7s@sfFJ181=X6YSeYaJ|+O?W|Fmn&x6 zZ7a6?ZI#W?kfM1UZS{pCy;NoIScTDc8#Nxbb66{|sBHX@7o`{2t;TD79J%4)VpcV6 zwAXxx$Mh-OD_B>Aj1i3YXZW@I&`p(byQcg%&%1LYm!zlWCpUwLn^jT(I*QW*npV_| z=unO+bAg9KPUJ7 z`!f$~LAmNK^dyv2wHdr`m9+bt5?h0qTC_1MhPkC* zSX86XeX#e?S#mKNPs2QHhHwVxIQ&7ikPGm`(R)r;3L&CW%=WivYa1otzy`lDQD48) z=X?Esf9%lX6~YK<*i|K$+7^C4gMBnf_K_1XLZ(8VE-pik0NaX`JZWK=kVkmAaoRs6 zf%fbE2mw~G%G=asbYH^htx?Te_)|&BaL)k?X>7qsmpS7~6Y#r=nQIchZWKn_>N5Hc zORmB!_nQ5!G;8ss)b$_4w|!i}$*WR-ODnOe578Gz&{^C_y82qsR+(OU_-KTT@Z--P zP<&u4E4o|L3#J;M@1@Ez^bmo?A5Q|hYq_xH+arPw-ub%GZm52Y2#@6tVX_E4P3ns` z4}EO`W=kl_9rk=NYe@NWv{Um#BD&8mtp!*RF_-j^@cO2lFsKdy&S2V0XoaORN5WO_ z*uoGh5FA|}JB~VQ|GGEW+`WbzYJ$7zT$EqNB%5}R05_a5*-r9T58J-{ON&vYgDhNM z2kvD!U7s;R!20vtOK8&k_r;SR&mc%H>9|2CA=7ZSob&eajc8nGF>+auRHa#z6O=T4b$D3c%C>w)nzk*o0M^)gPDI);y7!okayqr1=g3^XdtUeu8TTQW1sTaMH zGtc4-N*~P(-pqE9dIT@=Iwmr_JRHDJI=V0b;)U#mD=o8%vez26sL@}4gEj~zz09aVRoH5e_Vo%h+HYAk`|`ogQTTn3C`$f)ODnPI63#Zok4`|>vQ-GN zY)-GOcIdYLTqc;4n+Bx&R%j;FL!LML=lBb&o~(A9?QOUXBxuWTfmw2-VQSvtQ!8R> z7BH?`u^67ES8=T&Fz(u5*q)XH)jcWj8;>MFpL=d*q~23tOmlHr0{miKp-h#gqxbt~ zo`uL!FG!(z=VtuUKt*)kH=zh}M9|9tGJgQMDb z$7#C(T||9nfHQZ1r&S0Q4aoR=hC0O-nQ=G)w(dGB*(oZvsh@-zrJhZ?b1&BDvRYNZ zYE-n?UTRMNgt?CibBvqr*QoDpJAJeyvg6GFYso1$ge6UHpm4k+2$ZN~N=yVkIZKJEn=dyO1Ur zOyN>2cxHpNQiCfHUGG*-`D~~>jc{&z5flZf7!Ab2F!|tcYOk<=Mha2`<=yJX1VdvK zYjw1HmI@_G^xu4ru6}P}d@<#eNn+W``c=Le7M@%2VR+zOSQC6$uy{RFoWBLfZGIEb zgZu)1esmiLL+P+K#2!!B43_wMC}Q}Xhj3ch@Ac;ZJWOhL9QT~OC}kUbU|s%hd*9!# z<+3mH$#!CYV%+aC7<0vFA#0%7AHbJ$l)zG1igX}5YgW1meED3f{g&9LEQ!n%f3sUPs$M7+QFau7@x6D!o-cP?dCnfM46hn16!OrJ zY>jE$zlNKYM{L-*%VBQ5+jv=JWSJ>gOJf!F5XYBQ(PFTG86i<4$bzNT#H!{$W#Cwh z&eA&wPTgSdo-eP3H-XAh-7V0%byE@`jEf87SPU&*2SS4*6|-QRgH&G++q*rD^aa}y zV8{3P_#$wRiQ@I|A3rog%xb!k0_b0|8Em?MYhmkKvc*k0Mnzu{l22%D_OkwtCuvwALuUwFL@@0H-|7X>Dj(HOn!)&aWeTv z#WNzxqKT97$$$Z$g9LwDN{T6mqiSG>v>!~v_q*`Qs8(K0Y(w=%moD#{MNSff#6|v6 z(?lFUs&poRh~;LKz*D(jFZWr4j{mq`rjRs)Gh9fOmb4EDt1XKmi*G*6XGe z%d=l}SK%R^njVi=moKjx8Qz9;qx(!gWE{fErD}ajrUgEVVKlcedfKh`eY!0Dz`f@x6@pxvIdpL(xHQE&P+hCy)O^DG(2mhkor_Uh>8k32Pqw z$n%3i2+(U^935I{E@@Qg5{wkYbESUkMwxen<&dJEmt-_cAJDaVcS^<}X8Bm6^9Y|OmS<}GCt+O8-dwHhN=zdNs?k16;I&4Q*eT9 z!?K!qqJAX$1e=f-f&@_)vu9-&G**NY2ws(fyOLDS4yxzm4CmDC~#&aleD!n*rIgZds| z_cs@a=tG;E9wC{lQP(QdfDn#%<)q`aXaMG~jW5M~ov%MzXYa+565i1ek!KqUeGM7+ zi9eQBVk!nu2b?O-Kdh_{rmg%Xe-WHEvsCYUd*9-9b|SpOWeF3(2WtqBaX!Zua87j? zejlfjQMf;b4)LU#%{L%o7qK_R-qA&B}4LtaAC*q zq%>m|o?|{U`DX|@#UmA|jri_yc2--81m9UwIY4j6LG8N!=Xd&VEj{cMg4sD9(*7z+ z-tX&;{B+v6y_S;~=U8oiP-`xbdhya@dp8$lGiV6)^~@zzmtJ=x*`1~_)XJ5Cv>3~| zNsBx1DWZsiu^ATp@eT_m#2@R2FyN2S(NZ4NiO+O#RXcL6-F%02Ts>u~B&p1C6Uz**G zd42VRGf`!|jqLwUq|+?q*7X+EuQ>3`GKVc3UdzXPySmC_7W8oNJF=ZZk>^YG9cBb6 zw$BU9bT@?6V#%g?*nI4@x5)L8eBZgDZhC_FGoXn$y|bwk1D=zv9~sgkQ=N0!{};Iu zH2c=`P3UtKi5ht|7{)C3x~Wz&rW4>M`3uK|E3ow(|2>o8@HVMy4YhJt3N;Q==N(OZ z{Uj8EXi{tBSfnd*$@Fq24{@jE`^jd;>PQQ`xmK5Avo#KG9jv-nc8-v+Cgp3(Oq!+W z<>wxWY%XGQ@q2%EZOXGe!I^4#y&|XPHzu<$ty*2lJ+m*0UrZWux*GJzVUUY5nAP~P zM(hwb0aB+p80CmCle$90W9SMy=1;D8Da&ddhU$jf1d%T^NzTZfoWv%?*POjL>Ota%A! zmjs2lbFRgi+pnc!vIp$no)m6cV=g(0Q3+R;&jXf3#6AlJ9)zzBAC1g?pwAZ*W^i6r ziMM)HfpTF$yoketiLifOR{A`iJ5jbVgTu^s!oLu!lBb(T##K+aw}%xhsESe@2R>n^ z$3)jtN_<}OFn7>kSjL6)10IF@92JRG{zykaljW}GQubepcQiCs0r6dNV1xhj+q%FC zgp6w|b7upXslTte4yczLF~Qp#&dkE7Ik~RM7M6Kl1F$V9ph5XEkRXKPJT;$ee2?fk zE68$5BcKWyo?nax)dK2vK|}ntnjE-IFudmy*vhL+)Lj;> zQg;7iq7l`o3T5(fiaBjWv+!=LCs79D-H-6^~{kIsCfg_vh!|_j_T4TZ1>)o~>62EWX;YV&ULjoEiAJ|il< zyHjdpo+Rv!qr7*Ra}dVu;FLuOH9^)-fTh4pLaIr817wNw|!N{IwcrT`aY5bLM)^bDNH` zBIV^aLuHuYcBXvab7V3%`YFtpMR@K%nnl&EYBtP4zcGNiqOo?tVz`Plcq$BwN^&+kp@tbCt={(u&-vZkHe8 z2fePBUSek(y>4DJCAjfB?wQt|L?&u9F#0MsU;Id)%sV-WWR792R zq<#CwpuYKWugnjk5d!Ty0q-bO-1bD`Dvh%pE@?yFXY^wGbwq?T|GPCnVM|zTe zT{3i-@9mcO^qe+Yj5)(s*4A?Kkyv+AuDw?qcC{GOf5#XKM4W`s7R6V~+WP-7^&h73UQ}&CLB|Oo zNv{)20>pTlUz4?SIVy1uHd(T3)gF=_-tCcbY^ei!l_T_q%2h3E=-0B|*_i-7%LXpj z04wI*5gqqKKW`V62p8n_Y`7Pwu(AOkix#VqNWFOn&~A?qI+<}vm1Yh01|KTqnJ}qK zeD()ewmNLeQ(>OB(jR^6A~TqmX%ahmm|Xo5 zLJ^R0Rok3@!Ht==_vX%8LI^h~_~ha2kHEyYzZ%u>To8ubfh_saORSTIii;Op8Z~$i z=(DYO%_08xn12GU?e|N^ddR(m3#`Pe=a-SMOMRfqbNxb1z9|!p^O2>Ob_2eGan~64 zJ@XDwU5#7OM$GhG1|$mQ#9Z}Q2LGCaggXcv#m03v2Xv7&97FnEceFW`qQ(uO8R|4W z4jSX3Pmu1+bPKo?3$Hz&Ed7 z9aac}prNj|f&%}w`ywiOQrXzOqPL(fg^DZrTzXz|x#qbGIFS}%@Stw#uDExnB4AR1 z;*H{e%7#&=?J~?;Ea~WwZV=>R0`q-4VxhtpEQ1Bu?!<}oU^Sbjxjmi^Z)S;9 zSOvJ&jyglpsN$(SpmrUXtsSR`wC`*0G*UJmH_CYY*qlwnjyC3FhA|uO+YDj<;{M$U zO$5ghHPBuCtq~OT*16r`u7vI%p#fQU&DhzjgDdiNyS1l7#Ej%Amc}A`EK3Yz68%UG zX^`otBp<3#IMoaC`6&+)8nG7~F*Dleu-JN*Pt1VXRX|nsOKp_P7Kwx<#f?|iN7a8z2c)ljsXWh_vxtrGU} z+=$;ha<-sc_sdaVZ{FL~8tX*c5VXC<3)gT~z!JiL^X!ucYL`~Y@ad^ryG#F5!}R*L z&O$jcbL_nxyv;B^bFa5QvKB6K)D1;Zx-Le>g1XzY6~V5d{J-yI+pCzs`C2V-!9i4msq7e?XffvP<#nkFR#{>t7nSS7K0TkHlgK*Gn=+u^myh;8 zWrTbs9z-7&5<>h22u&_xbx9Hl<|9z8^4PeuEjy;PmD!6iU61gzseBwOBu%1=1P=ul zp?rO~A+>!y0n`^BZr?Pnox_XAQ5%Va+~J#$5lUGri(G`4{MrFjd>lw-QY z`rhnkl=}5}9f?y(@U3_HIEI`BZh`7s=$bDbtnck-{r>a!`w~PjXexSl<o`9&hgPvS$(>_e~$GVvR&feY@fbV!1(J} z{(RQ<-HH8Bz{YF#b6B3?_%`tqO_~3~os}@mTi7cg8vb_^Uoq;eD)Ms?$YG#a5bzEe z(9hOfIX2|9Tsrj6v(J7+8Up__Aw7@|J7+y7cEhrPOMq&D1&}61?K{~q=4r<91y9+V zt_lLq%oSdc)3+s5JaH7sz{mqjjRRAs&b&x5F6mLWVD!W)y3bMW#ky1k7iv!$UOpd} z(2&7vhiZCrPL_FiH&pl)b7kC@K)rggdn4!f|6#5{gfqGYweW>IXl}()o1xJOQr)1d z`^`v}F_=|!+(=5CHovA=*WAD)>+!Y9O9wB3b;zKm_f*#2JGC6cQ&dp)jOaH*GVD~9}? z^?$#OjK-|a;4-`%4LqKYbhAf{(XIOFS+!ek-=;ovbF~^t7w0ElerdM#i90}hVOdInHKiS83R8rq`9rRIP8nVCi&9kk?nqf@9d z#_UwAitMEP=A^?tYFsyKc{Am}qrtEv_`ef`(YrP*I3w8kvA2oB#{%tN+nQ=QE<87) zNO_YrG^|!95#QjWmbNokKYbZ;5Nf~hPb90MwLrb|KmnJxD+=X?@pV=tzH3PzJ}1te zWZqUe$ia{skb^~3OwaHC4np!6#+?n_QvWMkRJQ_i1Ve%3L_#ZNx@o&>aiYsGj^;wa za+0GsxdMxL8o0Aw)xRT}uEj!vjE|e-o~JZ4>O(bKJR^TH>-mEpz4?7A3~)nUlddg3 z1vxlqv^c+?H8QEC}u}fn;0qlm9spT(X>#@^ZDc6&SKdqUf z^yeMZ7wb|uL4xZ^exfTT2Yy|b(rpr5svOR#VZ?&bjoUZMNCe?;Ahli;$)TJsHdwF9 znAvg8>1z%-=(Vf>CZ5AZK=7aHko1$8ke9nui?1MktHXP? zf2$DsSyi55AdGE;k>buMPn^Nu>Sd1sAH841y=rXgp`|e%`?7?*ehURy{U{$qC@{Js zFzB`a)Ca3m{8`_IUsZE7Fr~YQq#H)%&lZ{t-=0*ItqasCSf*{8*iSWNbml% zy>F}f;i`jLCxT<{pI|@v13gd}kh#em_s>+D6(gaNYP~<+$l(F{!phFolO)k0>5RhV zSV^_;{Mkq&v@i7<{zx}hD#3!JN9+cY50D`>;rct$@dc7!MeEB{FZ1oZV@%g-qRw(i zk|z;Qb1!@5F8~pRk*6KY*Y~CTck1F2(rbLDmK*(?VzyF^f>c-fxZIWK@5Zc>mA6Pd z&mF|Qfy#V*_HO|O&VI-VC#N~u<9!{;qHkb3#AMidEi|?jr*U30QwvVWlvZ#bJ5_RZ ztm5>-vc7p_tm5*zwibSOU#*RU3y#o(-qDzz;cY%YuWsF}Oz4_@%<2-sc0Y;5kse# z>Z~6{QxXUwMzk+tnO7e~jGRDvNP_?i&VlyNr4=b5Z@t+Q5|)MWEdJ8%cA`CQuM4;h zi_8!ks$nGIj3B#A9|nKfBhM;;;GxuhdQ&weev?Bsircz|tz}y<&bD&uqAgKnJcm|= zRcuD6UmWL=eY@D}k7+5j+$QQ}Y{UmM^brS}9rTa-eB`1g-Kt@rWX%3`>e5JHiiEbt zc*b=d4;uZd+#CMCMI4@YaB81(Fgj9X@xGcRAPh#eyJ_tjZnKVvwGN*Wcs<=LaWHG<>ZC%gx~BcNhRRDC;YUIPbqV%zz- z_a1XC^sW*_9Y_n2iN9(-$w!Vwf!_b;|pqE~S}`IEs2_pN{`bRV#8KhJJrDC148(Gu&b? z&*b=rkf-cPR=}cgv75 zxB=1{wjY1eSU4W{l34Qtp6{Uu!>FC2aD;7>ic7y{dSn;4gwfqf;?;%@abh1)zNEFy zOXe8)w<;Ti0j-w^a#hq3bbp$5Xx z+vNuK)PaHY2N4l^Yjd;f;rVw4MW#0-Zrbv%IF1Vtc^x7rC0;Lq?R^f=RQsybslsd; z<7Sb%z5F1$YmufiW5PGBSej)Q4FEg(HMA)pC0Zc{@4UF#mPV~zPosB+~!NQql}TL@SjMevpX=E z8sHuy{(=I;kxl`cmV4|>MY-$Z5a9CBl{4;#yLA&ig4Qqp7kkgqq=K`lYF!Vn9nC&U z?YOQ-7--^1=B`Eh-1`DdX6>tktG=pnI%B!@u&!j*$yv`0ts_squOC&F0rjg*0Lo^=T_{jv=f*o1pptmu6qV zXlB7j<9}s|tWc<^ocDf?;KAF)#U$x!)b;iCnA3wVr7TkBUGQlc#85;RUv!uDjF8|) zKtrIFm9`LwHj%r@lknNIH@)?(#)~l~Ei`WNRVqjiUXLXt?E24*)%G?`ZM`)b+ui%Be&hnF2zD|*eOQ|@S9uS>hWRG3R?e|yojjmnJ-8rqN>T2{~r zuhMR)g@a_)xP~d~&X#mxDBqV_YvE<>TmPN9Z@8gvRW1AmMD{qLKrou^t9ANG4W;`E z9k8x-dVLGW5Bc1CK}eb!T~n}Vmssg=RJC=lX~9a4J+0b8Y+EN#&;t~hkeW`3`2$pKR2hR zw2;=wreZ$s`1m$3Fi=^Uz|MeZG)X~T-g__>vW!+&Z&DU>;N{qGOsK*@$}(rc!Bw*` zQkdb(IDayjU`+aJd3eRmtCilalfG1^yAkg5kElp&hotFvFVUFmL0AP2A7(sq|HWOG z2z3FN*FQU$aiyznf;2(3@EAt07cO>>cJpZ|Huy;HU=AiFk~d@=2llSZGXRWaw`owW zZG@{tqy_7zefQI*Jn#iB)&C1ElaE99cstRJjk=b%tzDpo$%eM$FyP4`1YS2CAc6Z)4wYkh*M-t~*%L;G!?S`{>F8I9Xq07T`+L-<25MKt4at`ssxj4F`L@ F{{t>fv=#sW diff --git a/docs/assets/google_play.png b/docs/assets/google_play.png deleted file mode 100644 index 3d0962f1b6fa2227dd9db715f31f936f918ad8eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8331 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 diff --git a/docs/assets/pdai.png b/docs/assets/pdai.png new file mode 100644 index 0000000000000000000000000000000000000000..a12218b9f2c633101a31d0624188754672b963b8 GIT binary patch literal 167207 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

3HtVqCC0d=!WikVRwtN(B18CrP@)2iat z>Bf4SI#;w?IUcw7=W(*!cIA7T0T}%H-(d5sGr?K@xa!=Cp2ugM*Tr}W42O)-7SPIp zT|0qx+ads3TR-rSoX6P2Kt4m@WC{$22>AkhY=6INy?=So=W%o`1Y&Lhn`$@``_b5@ zAO=MO2c%Mea$xf8>j8pyB2@y7H(}VczPi+m8TS*23^XweAvqM}?c%L<4#Wu;l#ZMK zu^F%)M8H{lmhjxCJ(5S15y5(DSWhDZnO^IYJKg%9OyUazSCNR2Yed zitbPlnc*ms)~G?Lqxp^sFa`I%nNueSZjdz{j{~JJULWG!fBGhvYv5oHlMJ^3qsMc& z{$1DNlMnki9{J0Uu>)1(sU(BSZk_SBXp=;UB!iQRy#~jg#fJE#K1&z+}e`v<@A+usY-17nrlp-wl-+4A%&w5zy^h$-mXIguF6V(yuCu z3gnqZ1acRJ%2YsA0^>ex%>GRqx4$eM(RSi58Gsc)m7u-ugK?YP#{%$sVRLBH5C^g; zHf)66n|Pc&UJ`;mgF&EK&xzYrllV3yz8MEsq6-M`j0{0M8^!$+_hc^zg#;lE$aW@y z%sB1TMf}ziFGgi5RFz9l>a&=c3SM?J46yyqU>j%5crJk12~)}mG%kg%WY7p~6p>*j zFEM#<1O_|ai~`}C6k|{kUB9v{2jG*zxNxvaL21QGDe~8qg^ihrDEf)l;Qz)v&9-rn zVRxk_C~>-UOvk6*`Y~Ml?rVbq*^Ju2Fz8R_@WB_qo6oz?xpeORE`X_6Qn9cc*!`z2 z{3l-+4);&A2}1N0iln+`2L!{~I?Fglz&h0^CS%BG12PsNnv@gEtaKDIw2)b#fqHW6 zm{1v;@^(^8pooaHO^d5MjPIDVz^wV~e%{3oKE}UL(S)8f3AuyK>+Ei-PvHQ5_;#|- zsx#dj8-`bmv4ADmm=fR?GHZnT zaEi%vilVgAH)(<~231+w?0t|akYcO_fY3&ce%|Fg(~xZ@wjKbLF{n(1OlQJ)RA_#} z?j$m9A29)Qy*|LqE0Ybq#_LxubozhwxiTDO=41nnbC`*E=7&-&mEuh`8C_%Rebi0-r=xO^~w+nPOfz?%u z46p%|N!0<6)X|{=A$70;NZV_hTb2n4MI5*yc!urR4Euyx;d~RAwaySwdiyMGL7j0B zznh@Lokd1spKAc9#5<+d05x5<6M|iET9@m-GE7cjNYHy@?+u`(v50<-u=Ops zYrw4vx0axQOliNXKyb!;63$O_`=02N3+&@$-h}c+jdqHVB+Njv71%*0;(n@a>A+rm z_AMX9H~;ktEMg}Z?A-k{b&>O))^=RDbT)ZAhfc4JY_4tH{bZPJf(!g(V5SAeqba7- z3Z;)qO4j|dC`%Zw0^v^>eOSZ4j&7sdX%i_GyUB6B%hFoTX!pBgl!z03mK`y}Oa=y| zfNr-7Q&w0VukmWRaoOSN(XGdw{s?^RtheFe-}q^qEVoVho@4;j@4phXzBX6wIqUg2 zzWwbj$rwa@Q z!2H0f3_1$P7wzZe6=1jplpK@$c#i?)p)O$y5RwIH%Zv;sX$JyPM|~d(bU^%=C}3R$ zb=Sb;WcEx-?cM~Dlsg;YwDQE)hWLs`R`JM^jgES3j}zO|x2d`i`RS6Ou=gt{%^<@d z$tq}241tD z9`?5H6@U%~bnyL$_}~Bh9eC28{Vei!D=rt$uFO#5B(qO(z4$SZ@#JFA%DA{9eW1o# zB;{JI7>bqEXM=6X4dWzNV_;Z2Sehf9jf+B*IN>iaqV*W*g(+r9`sztp{7kQSs z2!~SjW0|kAsv^oI)LZTb3Ytl>>Yd6MJJW} z(>;oE+QG)r0Vbnu=yrCQUhf{2${)ak#ZyeLr!ed>Mhk?+C1*IOfVsZ4A6Us?(S^dM z6Zbyn0EDv3?uJsR8W`3Kpmqq`y%*iCA^~C{G}Q=hgAb_5=iww0bwb`-VV5M7klUDtzLNCYTAlMZ%%Ojf$}#NVDVI)E(z!*Glpzzj0R zSgDnL7ga(~>nuziO1F_*qBN)+lV^#)M+2gsKO{j3>J3V!sy-wM7~_d;LKy4wA)j<( z;MFjsuzvFz-tgP6!s^G@uz+pw;f+!<6pcXr!Ea!A&Me^z|M+R_ykHj|^(#N_#?bk) zQ>_+H6vJG)?~$rCS{hXZqOWoRORmO6JyLG4Jn=HjP>NxUwGUuroHi>?di)~?IyK@W zH-A>xk2V@o&mZR|Zi<>{ANgq4pF|K(nA{UE0&Mdm?EmU@c=!K&3)+X~$a*$d3A~4# z=c$Ve=FXrw-62&Pv|1Uu{SI_DkI+AfHaY8mE)2$_DaMnjjlM?)niPy-Ov?g>E4hL~ zs}z714mU$fye*+K8PnlS(RvYTgbG=YBi!G|%YOO|1f(6dA*EX`I)+r!Z){Pk5}g1jVYeV(jvsglfx zQu-Ibi;UJFhEGOMOXe#e86M`3vX+zU6=6D@;N5@rM%?(0y}ZP`$wZ&k0OzL*NKQGU z0;9V%kN5uZd$4rMPTcE54p@Su zg7n{HEMrrH4qv5`eemTcpR3C^)US8RsHd}0b8bkcGGGrpL){^Cc%%rc2ancy>7mnZLu)O1$jL`zj2kKkq(v8GzbgX@1^|^YC{2a=RvStw ztW7sD!u0Z1x3%0UT40=v0dQNF?->R_J^!D;TWj;xspmeI&p!8A*uJZS|#2y)~(8^I1QN&1V4shS_ht?6R`cx~#P^ zd<$=_|6*nE4DinF)>O6v=I4M;2k3QxYSFn3ZaJu5!AHHeX}sWQxQUqp%hDMV&gzw* zL{joc_}+A}tNV_5$%kf~$aUCq#;el{F-5Ys;|hXRjfbd9(m`?xuy0KJCqao|3@FfL zZ#nNH1^UC3z!KR7LS$tKkIH~SgTYXS{m=Gf66%MULqn;8HbCZ*pgRIDB!7x}ViEx+ z<9`!k7u3jg;wb36f70q-2sIKCN7y~j1|NL=`|#!0d=X1#CmCn)pMpBGY&cTBOe074 z<^lfow_eY^L5J@4sC&WGyj4*fpSaZI%v0oUII=tvlnQ;UF=4TdQH?+xqec4pCjf?Q zjKGLHN0iBqi&NhKAz_bas5Oi8vRxuolX}zi%~D7tm14gtW5#Iy3LBSg}tJL!pMVR z8GwondfhHeWpI47f|Y9Z^0}?<_~LW#fs^I7FSmOJp!b}=#qgIO2E667XYlURpU>xA z_;Xm;*1_^Bn~sS8vp?Qy;t9uFU}$_1AoSb&x2AN+y>hnU}4S~`MG!j%IW$^32xXOM#gyplrD8JFhkl05>Y7>aRMb$ zzyHl&uZi)V>LenU7ehI%A{ZYEf+t|wdMbkOK}izQ42B|!P9k{&&hwZ;cEEb^LX8cz z5GCo@XA03yDUtF8@8zS=$hOp9MX|jxT3s{7d~8#c8tc!c5_~%B5h{*HWkVv50pU-u z9A=?8jE}zQL-@!ay&nr(+pQs_t38$3XBlz|t^|w<6*6QfZZ!0!-+V28{vUn?cY5$$ zVO1$JmSj>qF^b2&bM1(4@;r^`Zn9b=Ge}5QRdD$L7ARnnPkARC-KMFdQ@rg;Bfyc1Wy=^I$&oggrBNBkFb4;L+-i(Tz` z5Ez-#-0tSo8nkSj|4cdWU$H5D)W2zka$I6GoS>*GXDG{1TA`?HDqsMR_WyuI9lBWu z{cg{?M^fBpE|pK1FT<77|3}pz#T^!r9{0hp^%hWy&~0}yo=kCkw6c;xf1%fI<8jwL z11HOEUvAgg0Q2AeJDA~Crr&niBXQo{-$eJh_?NJ_*v85-|EcKp!O2fOyX zL{+?ke|rhm{|m%lmf|m;j&lD^#aUNe|5l8*o=(RPeGOY{z}Apa762-1eLFv}s(~yA zRE>WMr;c)F0S4q#2PZ7G_~$>=bJt7D|3o0;_*^|XT@rJ=2H$e>T)d}-5-8^2F(|8H z|2)s81@n>uLg~Q2J}Yl>>1V|J=Qwc-x2Z&fk6$ z21n;n0nV@6qc*XAAHzW<-+>s}ft)J9AV(Y1Z&Y~wvtNa4zHlW#%JHx)Kne#)CF=t2 z&Fs7ZInqJmw66(^8T*YPBVWgtRg(4AfiNgGOuZ$r0&tL}PzTmLl zo1uIB?P6?0{{=P^xEv0B@Y`0wIv-u~%75p}|Mt_^UhP5)3LR*4ps_vc9 zIs#o7pr}xerx=dMD7{fKF_R*&^ZiexbPzIRJZSaM>vWK3nHV!~jOwL-`?so?J&Irx z|M+z+eM~4k>zRnkROoklASfK#yqQ+b`WF@#7mv;N=W(*!KFaNi0cid9%h7)RKjnt? zxkv8%glF;T=l?72a?jtT)6Y7EE5m&B2yo-Iq;J~$&TO>)>pb4P>U~5Q{>jgO$J$W* z#jip=@kdda2VO#(>(8Z?IBOA@Hu*A04u`YwHR%8GIRZK-%_O<}NG)@$raZMJU z@o~nry75-Sm`joh!L|oU$X+s%sz=3r?MaSMs#NA8B{@kiYwfYTNic9rxSY@|N~(5W zQf9?p3aCN-U=M`D5qMILct?iD-|q=-fcF)`4)MO-wPBa;@=`Rsh57bh0%+cxQ@@sc zv_k@_vciYo_-WpMLQb`0D$=WCIz6 z<&?=TfwY?4Z*mgd8ss(07MmB|XXTFQ9 z-vYD(XTFbYW9zz5zbFk*lrYl@qwy4zY31T(Fi6<|RAp&HD?6h}_P+l8c9(kXHZm^(j zI9YBVpRvyUZ(}hx~V5i(H-ZZ{wo8E3d8nA^QCcS!P}PG7a>5 zz-VNdg0gg!(|ZC45ocP)AV4QNpXFgFw28@Sn%ITaQlBRYit5MujMLeFSMoLvVv7$C z>&09SZA?Rn1$zg{2_RV&tlrd_xh6v(_o)fiZI=p;y+*cZhYuP|A~d= zoi1675rm8yQ|y^EuC*(ENWvh6Co5EFp^fR)Q@rL^Uxg>X^k;GZC;VX2_fWG~mdTL7 zFFU^`Ys*(GcR#*9w{u|7 z2ZkeHGIsbj>}Ig20D*{UI09EjK!idUAO1)&+bdnejz@AD1)NP5xuN8J;)L~q=B=jv zMD)noEqHu8(uw3?lLlDvLsOQmfeQkhmUlM&rER~xhedj>T0&4$m2mpr$eYv-D~>5@ z6T&Cp+mIYM@GtVYP# z8@Lk6(G(wl{Ri-w7kq%W9pBC^WY8d9q&}TDe;W1-cG!NG6*8sJZne-G^pFqQpq2tF z66;bhCR5{}e*-f$n2rk+MTN@QAXxht#-yrXstUwJij>VQkhjq5bdY6PRJV!aD1--c z1JB05RF>V!oV|<;Ba*BH7nsN|hiO@$+v>1pZH`S=v*WaR*;YB-H&7j%EVrL>t1$rj z*)IXO>M&35Iow!zET3}f4|8vDm#WiWM88j%TVV7DK)21va%X08jjrpT)LQw!7Q`4csOSiqttL=!{&;PP;DE;3=Gq==qARo11P&Qc3d7}feBj0J!sUPedFrkdA03v%ttXuS82stAe~Xjl_EEm;3_$+t{~NlashpG-S91%$ zY8H3>FwZZXg8rOBtIIY;Z<~W;O=OetOs2qi1Z=DUHy>acZM-4hv+KiEw};|ckG@p~ zXLuGt{pKs6jQLcxx%L*Ut^FqQ9wE2bU|LGp#0 z#3S76MWXt%bxe}$*98U-Ux%z;NE#tQsU%ZKh#QMXnlS<44&8V(NXzgPj^XJ3p6#@i6L1BKh9hbfOavVK)98dYv zpTpVrJWm9@aoky0XPoc`4K^X*{(d5atDHbxQc1hkKe>+TOtDuH)Ig$i6#P6%YEJ>( zlA4~z`~ADQj;vTi(_`1)jCVi(pK;UMugC84ROA4<)WRA4Q}~?4J?QETWl?|_$aIEw z-a==tgVvz!T>V6-s<`18l_UO@0V;;67~^q)$+SSlOi*$EF#EK>V6BNVol&dRaztFT zm{7CLu`eZdP6jsoGAXT?k_1WKK+xSU0xU5Yl`*81MyK7uk*!s_X>#Z$()jRzdU)8i zPr}J^`zha520;JTOToo-enS0U;8S-z2dABJCg!)>q&rGkNk7XFtmVtnvagfE!s^2< zVC6W`>anXSQ?D%!-CR|#_}yD|fXtol3Uk@#OUm>=VSV*S(Ve>!dR@Eo^PJIX+vGt* z5oA6Z23qfdc*dlsGmsuaiS#c{LrKg~yVj8W>l>PCr@lNonG;69{w2)hPonc!=mD%W z-l#%68VSGad_W0g!obufU}hbzZ3M8_xpPeuB4|tPpib%(<1T*SC^@ohljnzc7Oat`ZovjoNC zI~?H_jAMh}O?v5>O->m+H$Qd8qOl&mos8s?6$1wN=7%rG`~T=)dHmT;I+gc8L19-u z;PaQxq}{!3RF(y%(}@lHt24AaEp)pbWWC(R8VM8UI;;Q~X08}iF;Fq6GGI0+o%BC- z*7;JERF)S0*GiGn3awU-EZ5F$*7t#HNQY$pT*4*5XSMW*p41qKrzkm=Dz4D8>3{jq z=w@20)<2{B?Y*5+<7Dvv+gJInc>#2v{a5HtMt$_=|A^1J@I|=uJ6Qiwv!(_xL zOQ0z24)R8UKBTB}Il6t+uA;I=fQHjO=KpIL(MMmt7){YbJep9pkdXz=2LeUpc(1R3 zXFSVk4*6gWEFIDjB?sxs6>ApvgvTP2BV&k@lQ?3`0rEUZXtzi$C^)5>?!Zfa;u?FY zzIIF#5xCeEWruRJiZFtSIUV%eb9k5z0!?ksij%6Hn z@f$UpCi|1lYucPT;^FwTCQmi{YdX)eb&|TBX#QM3?3%STkCsRH@L#_N|N1{(jqEc9 zdw3U?R0nrmID_xM=PtBoZW~Nhz*Hr2CbX1Bx7$K*zH5oUrr3dCb3;H0m&)A1|78U( z8Kz{6#}gahKa73U*_*P0Rti~`L+i}OvG75xgy0bNv@urjHwcnFI~Q5&^yk{+Eg+fW zI6#HXz{W-kR9a)cKZl|yacF#Ovcel58?LR4{^Wr#z{zs^D&G|Zp#3|4jgeY_njC*J z?>_xkaK<@ZEX*^yJ@S^VsMzYqOV~wN2?k&?3DUn>Ti&Y)Z@cnoe}v+-FTB+Uh=1w9 z_U~`Jf~l(B%9~qH!E|~$w6+0)w6;Nkv|?y?cxD>V%5JP_k%}Yo;G^1Uml z*ZtRLW=lGc2;C#(oDX?gqJ-i_cnSwts0+SaZBD5}~1Mh2C<{=c+>L@_Qfo)*?R->vy*e`7#I z$g|9v|Jh(x!8|ptJkMAwzt`*F~xe zb*Nh2S7qu$nd*W*yb~wO?W=rO7=UUrMqX~5R_;3enY`z$9_Hs5{Vr5HhgO8DVi;4| zMPt~xw3L=u7LEbf+61i}haM0Az5TF9@11__vfFl~Du6eKUqgF%3C5$JL%VI;+|odv z+l+xO#V9ftAZR?b>I_+=bRnhl`sw8bTB)Oqf$&qkD}b8G`s{OGG6|AMc?&EKQ_?i< zmWEf%Aux@Py)NtJrn_9^8#s+6FNONx{zmewPGwThIHV*t4uOY?W$YzK+>@xiGOJxw zLS#n>)~jLX|qE ziRIwO>xA&ojA@VShs5U-1qe>L&?K%O00ig50Wa|M%7WhhYj4I^-~S~%=GT4#7u@eo zP?>VE<0HdLJ_Ix%h#dLRYP6PW7XkxB+`Nm@(Fw$v>&g!qr9QGdo{+`$9vRa(N+}<% zwZg{nHGKYGK8~-v_+!ZTX*y4xjh%z-ID2j@@onTs)AzU*#qg@xi2RhT1FCc=_El7Gi| z|1}_$J(9NVzKG`rjCKp{P8)ee(}BA1<z^Pym4AQJ^k>R06AL584GnV&^G?~NI6{`I(xU)O#Vlp;)rQ+)H|SKwoR^InWTwu&>% zDL8ZKH0)m3g?_t>tYRvP0##8GR|Xjr+U*uPy&Ua+8(Aw4UN+%{Vek938~flcAe zuttNK&e6(qY)!^EJU+GtnD^~E(y9Je^*1a`5&WWHOp6#y$EpAr;}K!B0aVkEl}o388Pm~iJx;iq2-!1U0+{mS zJl@*JRe8QO(s4fiN;yVA1MRkD%U3rURn?Tdqcn*o>1o{c@%=@`6f9W-^G`gfVaSDk?3M0*%tC}B8DfIoFTp>XC9{Xk|febNeb@| zYT_p2;ve=T5p9TOU4zGdFkPocX(B`{Dxi@(xT@VLF;(T$IlL-ulk> zT5WU&9b|)+gZ#zv7sr85Zp9uIb%fua0bCdqlM<6jVO{*dPVz^BD*Ew>p|GRwKVf6T zEY>m%l9+pMD?riCz@7~hI^aSmlQ9$mR5NRWUsuTE$(X-~t47tV*CVjLj`)Y*r)kHH5rzv1TY1 zo((F2Aa*xyiTgWBL`nVO#7#utL~LTOR751;iNrGNIug1n+T`jX-{1t_ueJU}(wl2y zf@TPbFjfxGtik2blsY+WTEj;eBBmMil4UKRP90sT0r4(LDii}N2bb~LcYO+%zV?II z_{IhgrrT%%Ef|-|r>QWQwLa1orwWp04JVZGYm9>=?Q{$8=Q_a@*9n9HF96q8_{0l7 zLZ5rnrMTadABc;e^ib?M_jKr7+axvVjE1a_wMfelTtN*9kmvx17WjEeroc1LfvQDG znEir4jW!zh9;f13Us=P|mtKKyyyXkL^@$Zaf9n*SJNFP?*fmdDD>Bm(qu~(6v_Mf+ z$e@vHg)G z`S!IYMyr%AeSR>KRc2(eB!S$xL%_f${>ic&d6r{ZR@gs2SRSL}@7q7wxBA3$ej2zQ zC(G@yd`B4o20+~oGHpt;S#62eLDVxTM;W?DKoKL_`hPWmtWwFzOgK^U%I2T~tH ze-7gxUbwBt2>_t(d@mGNe|4fpTbG%lcnY_>h-Tf&ssXwkivo*64Q{xvdERr#b`YmY5LurmUZ~y*ADQ2}qUwF#t`Y2p}LZ8H#{ug(Ei}<lC0(W`b-T6UJ`XRdD-WQ@X*8v;j_){^5wO2Q^T9R2I+1{{j zU3=Wxn+1wErY>e^3hAjSjEAy$7gldr#et%R|cXjW5P?<9fRM|(D-mKDA&Fz8u|#i>A?_y-vFw5vtx@c#28}B2EAwfFRti<6kUJrx zo@0R=QUCT!0f~0Zq-&mBBBsV4*v-Ts1v1wTvD`G^KD}>;e|8MZ{I%BTWj#bfV!IlN z)8)B43h2MSB)J@4eb-*;-_KOKr~-g24LIv#?e%|G$Y(t99&gh(d5QI12|)zy9pfth z=a_$4*x3Jk!WeBcsp?JQJ6?RR`SahtAi(+Qru;iT3-OEo08~})Bc(Q(c^?4O<>92X z1%gNrrUfG}+lu;}u(KAlKbIl-x6<#TPtM0$-fyAlz^@vi`qV)u!fR0D+~=Kt8m+(E z(;#m@I<|F(bNWjQn#Z8JFn@h=hpnORQ%k}LY9P#Ki%qJbnXzxiWd38~W)y1{)5?9| zQ5~|2E;B}(Bi!-fTkyfZd@pYOyN{#1yW*i*q!sLkf%f`-jfl*H@H^sS4d1j=C1K`V zy1@2kcWCLICmPL%+Z%Ch#<`Bdw!D*|K!OFG0Cy?e`s+8*jeq)KT=9&n@T4z)3Lf=& zkHfx0s}QlUVQj(N^N*tmFKu{Y$VVG1fn(yWo8X#n`IEwVWla*!&qctR@07vx+z97B zd=lsW=}t`EwT7j$Jv<|QB!(*kfCS2_!tU;fs-i@tG>E}c5XC|wNn@nF1W6Plag5)m z)SemF8K5uhT<{(mhEWPtrID8krPB4&BhkS6VNG5;ZoUw7drWNeJaeh$l1-5=pC_RX z3uK1Y7OD`USwEP8vZ^3SAcOPK%YRS)zS zwaDaSpepX*e7cUs#nqa-2?2-*R)sLOP>|9VPxnRDYstRNVZx7&$lhLoTS3mAoQ?+Y@KoH&rjlwZ~0^V-IafZtDp5SJnZR@#kEg*C{_-xAkHGv zwwzr(f19K=_Ug6v8T8Rl|G*gF>ew?NL=C9s{jk2t)*FT#8>gWh!)Wy?g=S5qquTQG=hGusI`PdI8~fI&%|#!bSg7HQT`J4=rfltssOP2Jzod_$X@uf z5UPBqSUYu-URr$$07j(%5^R(FRD`0if`GUC=Q%K)l3YKdL^1t+`PE6UgaEW=?2fDefZ%PaSD|{VrFuP^BN+Ja7lc8&9Ct?B$6V&w zN~+^ARTEsU@vLrq*k^&+T4Qrumf>x*f#w$Cm8ef>dd3YD>FxOqi=^5N9Lg_kt{k)+ z#P8Rv$OOHu;mvT^yQY@#cVki^0t5t`N@KJ+!p_zP`2tILf3xO**;KvV^PA)Ag`Yea9*Peao;w$6JrtE_W>5F5wt;~h zDnRIC05KgxeZ0a)KYjx~^gHjz@aO!iuL*2B6!8F4$TE${= zfYLZZNfmEQwlSWJNtFt03vb^ zo8TR<47k!Tl|fZ06jf!*`hr7wr~&Z2Fc3mUp@pZll!T~?U5_|;aBWn=LjHygl-4lJ z5Zu%%U}j9q94r`Vl0uNcnS4#0Rcr5=i0Oxh=wpvQv*~`x10d4@#)Uo;ub+9f=q>-I z5z!DyWmo;Ov`K$F>|Yix@y~>4{WOcM^KT@H-!y;vdtAQ$)erRe%n%J1kPVaFQ9k_y zD)r17ewGmcCk#{-usf+Mr#TLX7Uu~K$2HR?)GpH@j31seN6Tv^QLi~Fg{yFT-wZ=W zb3ko3q&CRlF4T3TYnpD%1VMj2W?st}jb;~gf#AxFQe!{wv_8|%3qPUes~>OCASYa} zjJAD$)tYIs)p%5)QRNk?X^Fg;Vmg}O?5$^T>XwsOKXn@SzV|q`PHjVPYQ%Yh41KKP zpkw#`shJkjo~K#QJf7C?3v1eK);(KQFqk}qIuLPw`xnyq=Toa%!qF;z-o zW3-ORbb_)hiM3%#5^0nmcG>ijByoQZ?oVTqv26RMc4cjX_e~7d@b+l?*Pc-q`!SlK zO6&NijDe|>S2b8rODwC~?L5^$sqiAaN8g%!e&KO$AG5utgZ@4IPq4+Z?RJe^VEpqhMD}g3gqW6piBqSZ2+03o z_8%NTN=8)z#xRt&%s-z3<1vZNb2;tq{4vS&CCs#5z5Zt&=&_kk3(FYYdygSDXSl2^ zleb}j{;dHfxpe@nwSIpx!Qzu>B=fn@f1vKxn>vehOBM+2;eJ1(?OzZw#z2vuQ35GI zC%a6(Yhw;P$7d`LHuxxXSs=8#Xqz!OeqtSe^4IS}&Jr-XtvxZZO;#qX&BFLPrVd>Y zer%j6!r9`j%)wx-EUYRcl39$E^BdgT-66>YK{n5wfd&kLi~$)}W$pYFJEylWIyJ#$ zXBWDvP>mF#ag3M~M2IoOGNf~)^b2aZjJ6+E1D^**nG5LT|F(eBmZ7@w{VkQRJF_}H z`nM@`5d36k%$D5k_N}=`PXZD>4A3_Vz&gXM8=SuF4Bv&jsEl*O%P}Y+AdWED*T?cD zE9f8YBO9iO(gY-J!J=42*tumLyYD)W=cLcTWrrSuY+s6SoFK$4)0 z#^z`Xl`2tI6{@NP8^Z#UA`wB#gpw#i62-{U7`=WEX_`Vt5>XOCM51NUntdq23mg_e z_+;<9%lOCIz$lHPQYf{Cb^<_SPnaFYdaS7tXxR(iGr%Hs)+KID44c{+U}H6ZZ8X@} z41+?5x|u>(s8}J5QzTK0?di5SQJww7Hg?~U$plLud+5Jwe(li%NB3JXp!~Og9NBmN z{3I%-FBSLPd^6ThyihOhd#FjWgh61VfqV)Y?Ud1Y>kcs;y_T}{r8gk zp)Udbz;A-e>3LSV0&@h`01?;u|Ho5X1E5X-9sDk?x1elh`9YF;hXh~7jEN=b?n>~dfCD2QOgUfj2$M40L{>wdFA|?aj!joN2 zbH}V)@G5-PgAD!Pw-4I0cdwz{6`O@IL`Xc3Xv=fm{E6XN+&Zgk2x#FkXtcqu_8cY4~~k7#Y5#UUE60aITqMoI}XP(`5g&ISz)eYeK?_2+Qj zJv9S@afWsQfe3^rWLM+LBZs-a&?6W|h6p(b<9vcCGlY8|wboF^zLx?(Mk%BeM6ktk z2E88ogA7R&A@&fz6tm{6?yJ{9wn9jZ+>~rh6t)Z(#<)7Z4AwxYG;(ci|E-`P6C?=r zmJc|=caDH&?bw4oDYVteDbl=;>+UYMqZ{aDB(WOSK zf{W=XHsy^Hc&i+*-^o>vCx80O5A>M)n?wXq6yJ!d+y-NROPp2)HvV73YWwchV{W*1 zD0#cR2)X(!$3V-j-_qJc_`map*Lb@_9zw78PC}gUG!vK`YG6LlY8nRb*jQ+8aK439 z@3Rd%y|*!v*7xSJmGv{m;()BZK4f;HEyT18mbGBgj9)X%3>bGa1f(&L#F!phrM}!o zPfKVJDz~_`3*)rA=mVro5U|}be$-<%PXlhB5$0Z-$AZIDNG@w|CjikKQrgCh3(VEI zCWCN4=Jq7Kt63#C$k|x`_S1sqUc>)Cn-ww?Q`$3;ThB!zh6EvP9Z}C&7yud@dW>8Z z=&JzVKp?*!jMB&_Q;f$GdI$BxMBfhHc1SRiV_{%}vo3;)6@ng)!~_?kx>c7zQbP zJ3~%&=%33@UFRKOhA{?}R%G)97z@O?dIih|l~I`LDYB%GUfScSD#Y>P^xA~-x0byO zKe_!1?9pdF-LC=w02F`pivYj}e&V<9y7J4u<+nce8!!GnHJS9%biqW2k4`sU^XK}@ zxBeclC%Uhf`m~UI_1l0CzaIcj(&Flv!TaqVvQm6r0HaA${jX7UEcpeattrrqcHT0k z|2u57t>Nn~H1pcS>@l5FxpfQ8MM6J-FyBy1`*lp)YW=>9PtY1SdNaXQBQV`g1;RqN z&z{kHnIsTe>ap}~vH>aslp34E1mi?dI%T#RWLViO9HG_&qvlfGA!{D+?4xejYpns! zeF|+Gd2<&v{zA>(W`ILMq1}St9zMBw#)f$&h^~b{WW(Y0!+W2DL3P?}MrMBAgGQ%q zL1Wau8*cT=|1*IwaJJgUZRd~Uv2l-8STNe}o;UI`jBLysMJUfn;s}N-1cgLGB$9uoVUUu~Sum8R#V$(kQ0W)AMw$ z+WgQ+=O67M!QWi@yZF+(z8QP;nN9b*0O0BLPkkFs|J1huwj@NWEX0F_`FrBL1XPv7 zm`P)Z2B0)ydkjoVuG4vPz>t83Qv%Hb@X3s%bKyqr>Na~^z=7u>gdbp=VM|STK+}gXJRr=0(3Pf)EvGuo5^VM( zJ~FLb7QXKAwiDoXLH+sKa(GIYg|@HIW@q!Q{XF*<&Fz^8j=9j4LhnjfjL(g%S3<&a+%wwS%O;wa{kjF}AHup>X}?Cuji)hSbAkGKJQ< zj*QQe6pQ@<`okWQzGM0_e1c}SS0S3#weN?+QQufNBH=sQm98yF#hSrvwf~~3P^gNu zO~+LW3f6(I!9y6P!My?qrG6VieZsFZ;X@3)|KYO%T3-XF{kyTX;~}JU=$_r0tDGYe z)KB`%%s82!D@SJX*QFZoKJVzWQJ}ycedd$6?@j!Fi}d$C8?>?n(NA*{IA7NS0BnTA zWMUm0LniM%eCxj!d>z8p0fpLfcOPBgoX)YeD}Wb5yij6L8wWd_Sy1CNZ)5*Wod>+D z8#`5_+uJrHuLTn7H~_fs0+3QN38#7)96JE2yyC_&v%hXPcnQo`;+1PKn5 zJMNs~#hfe1&x=xji!KN8I@7sRf?Bbs{K89O%PGG7^ zl)6F^CrFbRv6M(siQc{*;)Mhhxt{y?Lc`|Zum4apYM6PUH9%d}lu;vFEdvU&;s!}M63YF1Ka$aXn^M$2Qzl(NsY%1m8sk9S(2ctvqhB;=c6Z{xIy3T!x zl?^>qM#DG}nLv;v-IBwoj6z{bibaAfig{e+I90CQy~X3V_M-(n`_$L&Y5xxr+7kdi z1)`-D$O8vP$fviVtQuzQa~rTh!}UYr&e|Mk7r`MjIQ)$I79a~3)I!2`IyT8p<-VpF zA8ORq7COgqy=439AoV%TuCSjWlbL1GY$XnE4Hd?lSE5_K;15T@2yvHp32Zl~AZaO=xckkG3;8#};5_=H>k8yD|y43t*fngq zE@1ZDUhEr1yt}ygQ@JAobV1ip25CVs&Vq!DK4Wo>ZsK#wZX!ZI8gZZD8w<1@1WZPz-U z^XJB)^}FE|q4wH-z|9^nR(1MBVI2W~y#O4aahdFB{xdVDU6UX@!=|5UuHO}2&>E}Y zDRFr3v(JB4eEH--hFu|wJ$t5bB*??#Fm%cAFt79%Ac!D^fE2xyel=0w2DH{SeUkqB)J3=B0h%OeriA3)YqT&B19KBAf$jv&H)AL zL&6>5!qgQcIAEbPa}{?Kw@`wXkkA1Sh&sDA8lrifh)~8tN;5msdJss%)oOVxi6O! zKDVYPH0N&TF?0Vv&249PUNqaNe)97lYP44VqYGymzdKv5Jf@eUfl zh7Pzuer|_dqvk+%^ULz}cGkdV3FwTWLnn+2jnqa3>8rd<-iW$mJwb^IiHMOU87ne; zx;lSqV)FOxnlbk1!9{xlz^6dwe?9|C*Q;PxxN_T-hA1mchB0;)Q$#g0Y@9S2(?HXo zkU@1pZWA0a%ZNiJ+InWScI+10Iozeo0>dlJ*OVI_*pE`fOdGb}HEA^S;X?X%C}e~} z0M9w{LL$lRsJ8piW$d%#-W+G@KhtTiabO)r11x2Iibx=f6ZFy)aS|aLWNmwV_^vSs zCh)JR!}Mkbxw(Pb_8$rf9{+GoE&$k<=M9hmqYa9@LS9s^YB<$0h<~rVEg4v+5}FO;SrW9qcPHB7ywen$kL3qtC3jK>+d09PE~q> zzqtIh_>0S5i#>X9(4GMBDUwhcLi26VdKXe+hH=#t*xcJ%eW18>8CF*l3Doiy1HTX| z&^<0Bnr(-}vlymj`fUpeZ9A!hCxb`;f3H?qX`H`mp`l}y2FQ6gQ|FQ)!=(1@1m#@o z9j$F>1eS0cGgujvk;Li!nM(r{;uFVh7J{*SopR6B9i1?>-qnMgoKwg0C80 z%9)4(F#1^^1fajrhfHKkd~Ajwd?|waZ*869{GuS|IsBIKL&G?xatQkrfOp6MW zqJlEo)v)kBIPPsB1lbMruGcgY@oDt`qQkz9TA|J9|o1F zkaGzMfh^?8?n0ru#@MW41X!2fhK8Uy)s8;6U+<)dvg^O?8E z8}5SrK~-M+J6u${FgDr^Qm}0vcL>jgYdcKt9||LlQVMurf}2AchSkLVGki|)X2GdD z>RlG7(Pr!>TVP*4x1GO_ywVRnuNO{H$TU%(LyI+1s4gdBDvPAr8^SkeU|j zu)9v5yTVH6u>|)!Tda6i>kmbfuHQj$G_?y%w@?MFT9ptg8~r zDD<;Fz#7BlklI>{{uay6>HT z$9$K%C{*3mE@)utZM7@EW4Oi`D5a1WC8mXf((MX=9yM!-!pk*g{6HuTQzgyxyUYB8 zF8k;Mt#r-&yV#H)Wn-+9V96C2Kr9msdjo70+t}8-ABuY7)I!?ZWBw09+7kdiMUq*B zD4`NbvJOE&lCrG`$ju^P*g6}9@0CvwWWpB}odpQNyGz~Uf_1dTDVs*Zwq_PKwA&AB z2@pA_DXUo;=K5A@8@|^b<_R6aWg0M}BVe>Ne6sFu#9ZeHsMp__ak3|d85S9{E1T~G zcLgIWC>X^+p|IPFaL3UB1PIdowRNsG^9yg#Z#SI=5`DuuJx1 zDvhG3FfD9u0^?q;wwyXom}(2f?Tnf=NEiOTVBhMoWI!7O?c)6#!J_Nz%Fr+{E&-5$ zKpe-MqzTTcO`I`X*Nd%q`s4#o#2!8PXiot66iF@&kqrA2l=;0d28bgdmZ%E?0l}IU zoY>kHEa@%Om;>7)cbKMUs64y2hS%tFfYx_zAKa278mBaJh;rit$fy&NT*xpT)I_h@ zcA)lm>zO+T!{!bzXzZq0UK}!yF5(gT3UtPtwLt~Oy+?*HqLVqLvjm5_ewXP|=ab<| z83dl`ZCxr971}MguN6MTaM-wm+0<Y^hm+)RY+uIq40v1(E zFR1ON#(*k?dk+nH^k$_q)hYfP)9L!uVxQlvXhSllKjJ@T8&#~42&@9nxZD8rfI^9ys$=9Zr zAW9(VA-yBGYTxB3iUO1A6tReqW)ZT59t2U7^uBXfZGn8w+@kPcwBMn+C=kKN0EY4d z8v~^@CV7ELQP!}($2n@uqxP3+1R>(EPrlSodkCEe3bj^~W=MmBJ#xoR^Ec2g`A^q< zHJk-r;8M08BLoEcagPdJV58dFI9r^%WvyDr9z8f|PXPE7$qa}1;Wz#>XtcWpr2r{_ zB*t9t^A-jBy3TF&&yH5!dMmryNuY9g6=3GPHq2YM)7loO?VitfmwkU~?Px~`mkkeU z*O}F3#R$wU^q9lYyZjAplSw#kHP_?zIW&9adY@r%rLaAWao4dS$rdC&JM?Y)yw^oT z);=$OAcR$CTkeQ|buFX|+wEK1s6EGM&K0^YcEG$Pex~KlG4pl$Sw<0xLR~RqHi&KZ zx`9<2I$-*`Gsb@8$m#w9gai@xi2*<9(4!Esz;rU@vZ}DWw19M&u}Gp>&A-)+`GRe0 z>U4|i)Y>}-``dydTzH+e`Ipd601==@03ZShcTeQi_3jJeCVbEzqV`M96m+-c=LY;nA%MdRx#Q8+owO-jn+jY5D_S3YkVA zGC65wMeA4w5aLW3F-tS+Z?H&*Dfm2N58%X^b6drRI$XacTu}QOz|4Z?1qU+P`ZEeq zJ0vwW*&4tOl*ph`T!#mHV7dNq0!7Qd%cvK?dPD7a&>cJO#9iY8z7#y?FKAmSm$A{{ z&Px{ALZb<2)Wz+Us~3KD@cV2B$8gVU`( zc%kW5i)TR}=G8htrw8qx2N~rrBpfh;`v_a+wglI@vj3-{>yhjN)D7b&z*P-MATfZ% zI~o>Lrkc^t5g1$Yvll=*`(2t`?>}I@ z{VnW2%?oIkA4Cv=gs|_Iw9H=!0tq|6tltf@F&#lHXuH0bR?Y&y6xgX@UkfKD)P6f| zpQ}3Piw(E6|87o7Yjdoiz+m*E44LflMzw=;y!D~;d}8v7yV5S@hz^R=E33%EAScs56V!#L+)Y^mL38iGH`_IL1ivY4tviaI_3IY%pXbqFvpB{O$RKca|0qA|(6uP@9J|}Q5JXtr zzl=DIW~XeeB)4F$`8Iz>`yFhdZ=U%E?~xNuSu<2#VLX~*l9y1X8QD-VsFU*4ueNWG z7$6RPU)vrba84hgAkK}O3_H_|dyIyey;q8M>3*A-|Mm=Zqs@M{Ge9L2N>{+OpY}-# zf$efMHB5J0Cm)M%+xTJZ(Swur1c3WOnt>>}1=Hy+hzM~4L_W2Gw>@{E?N7q>=>k7m z%$Mh!)KLTK1p&=D^G^4SpPLhE00QodnA_n-$XF930D7wf!09)Ul4)iRivY--@{atIg~cMiY-(;<5c z8DZC7pbM$DMSx~YTZeBmYCoc_2inrGxz%P@D{l=%aKx-GcDba4?A8v3ZCLLmLIHRcE$z*niz3!$6}z1q}lNVUP}>*oaNFvqe&TxFn4|dhpVo z0B|3O)=vXxPMpPL*C7BgBZ)D~ywTXHTQYzb62jl;Z0jC7Ph;_c_n)M*tz73o8$}Kr z55f|{p{=IpC5M~u>t=_FgyoS+&wLW_kV}9#0x1nH4c&IxKAc+35VcgkS^buS40ZD$i;%s~vf$7x(6kY@ z-u>1QCOTmdH0N54)xRsC1ozMyBW@iv&zGUAh0nlBvm4N0N#WKoXM!`Gu&Kd*9pEeT z?9y<+KM+A6g}{=?@YJJ^!)mrfo12@oI~pU6V=Nz71_g5XTuYdrQf^MQ${5indy#^> z3>;dS8M@M#PI64A1xlr@<_&HVYY{o7?@bT_KBcxl&UmQ4D=Y?8HCtGYPp#DzNJ4?Z z_K%G*wG(3aRA%P~!$(|HP*AAAUAuJf@siJ%|IFXKdYpx`i&%(1s|Qp3MUA zJ||wdxQ0;%&0U5efewIgF=%cb#jW-mKLLMM*as7|)n@)((ImWjyNqS~TR2l{q3}Yu zRnRl;%;5T8t>s>bCABjG5F`XrNFE@?4xa=!^C`U5#*WpwLwCGpXk}0p70R+gSt)3CB8-)L!S%b;j9e%TvvF{{dto?0 z@j~RSo&~iW%x-wyXff4jg7^Pp!`|tSlr1&f5$T%m{%LuXOTjqre=Cqh6d@HcpDQ=y zh$c5*ws34G(|auB!AyGyzOHN*BcMg>alq8K6b5AQYn z9f~30eWShbvjK_{W?BH#98emZ#@6bu3{X_K`O0OSI*>YvxYK5EHE;N6+xc+;owcnS z&+60jqOcpJA!sKs_O>$*V(#aRKSHZ4a9h`F&4zmHLqUZ){cDb$h37H%IzGTH4DM?| z&#ocAC#)dhdqlOze+I&1maoR64qij~WQw)T4T51TE)KD@e+k`qKMLk)({l588wbE} z1l(MznSVH+*g5(!RH;x-OB8v9!ZZIMX%^r#f7gE^f|L@Gl=cwAO~Ng}mfdZkVNQYw z`sYQxu3CT=^JnpWRzwT2C;BP>R zlWUi*z*irCA@=CONqgekeIRk<7-WAiGDLT1RXr6%25CYNVjd5%6dKCwk6?kBcYH|o zq1QbyEZ}& z*-mHsL)6_wB!475ztG4wN2pcrW<-q$SaHo5r6QZt9Z`Z2?*8I zk(+N_mfrrq88ff96MWWx%sCUSrM%PYP+zY>>P9o3M_rA+k*3=1HPDK?Hihh^+h%tR z8Wz-Mi*RL~!rxv@49y>1Z6D2yZZZAPT~30KKq3YBn&GANluI51stnGruc0VQ4EjB+ z99%&ZQETe?d3ph(+RPo+J?o-(og!aGIp$wfs4DG>>6rSp3=sp5nn?k~X@W=!D5a?? zHOx%Z3!{lputk2DIEec5C;{Bu;+a>~H{(P8wAQ3_<5p>E^o3xcgXd+dA~4u7e(gj6 z0||+K)Q4fin|e0~iF+=KFUL2Y`hM)ugO~OMfcrqS{}84W6|%_hg;LhJEQxJWp!y)M z?glZ^H9qcsquJG3=Yjf#pRdeQvkJFXNk2}zG!;-@~DM4nK z25AK~=7d1dVF$r(uWx&gs2Q1M2F9(07H;21I5>601li1t#sKR(z_bJ+0&VRAc?FIm zyV_|@RFt^w*di`_$O0aD>kf>&zYs^MZ_Hh5z9FD_GF`9xE_&mU1PXq)_tspL!Wq;a zs96(2(;r__$M>`D5qIZCo5|PwvlF)$O0;c-49zhGMJ9H={j+Q&IEV2evkz83Ke}oN-|)Y^(8RDtjLe%7*UIgOv6J zfcrqSv;rFMz)Z&5C~{j6D3(^!9ETvTS9{U1F~Tpg!D`H*QsfpQxAe~}0NoDFd}*nX zc2^fM2yFojc8e0#T1W#aGPf1zG+C+_UiZe9Wji5QX($|0V4>?yR`8{*W7Q`p+xMkW$0FD+tWX=pP_*TX{A zlfJ&m4kF}xK7$w`;KpuB8VA)^8mdyLN`=zBCv}WHSucBbp@1X^f&|h?B1sd(X#^2T zpkk;>qpEbBkSC125F}bc{49>=1%?nXvu^*)RGSox_N9I;I?-fR^iPGIrN0^PP*n3l zf)%tiUywu=XT+t#SnclKQ`~cA5d-YegPZnz0PX{sVhl1G0(=%)6#y&(;4=cw)7RasEKxUKgIMaYuig-|bg14z_j3y6LxmH-IBGFluFw`112w{C~IxlgZPwiVv+ro1(yJ??_6e}-^18~g#x zfYQLU!1{8A8y>pPDK{4swwPNNZE8F>ntOZ6?jQ-l@l9!-Stz=O&E4stQ6*%#T~K|V z2mgFQ#_yq->vDaYp_c;Yd~5R4)c*Z!J^Z^F6Pw}d7*x3PAQ=D)5Mo3~Ab3^u@VSSd zgd+=waQ@6WtZ!^WkfdIg(V*7@ml~$jU}bD0-lA1MEj!QIgqQVK;`X0E!a0$$VpP)# z`J_OeS17e%4w*k}oIRK!m^c!|kre19NDBIa%15LA?U`YX%!ah zDsj{8r*VE#082@La0I4}F5C~s{E&k1etkncdwkeNh?p1#Dh(Ya zlIcey9K{A=cUVa4xJJvSx|i*zFr)c%gSq$zjoOBe&M0&rzvEv1_>QO$!tKo&p-IQo zN4Fves9jM$P^cTzLmlH`>KVa7V%*RJ!eb{yomQynjd8P>5JMt^#1f_S^n;JbHLF)( z{rp*+JHG}PAWai23zkn0BEoq3M*Q6QyMT648Y2usx+#+LRBeO zHWy%KY6XP4!IdOHk)SvdNRk9eFGiF^j-whFZBUdYDs655rV)dPxPkK>km1w#wSrt4 z^v#XD8)y@tblMowT0?2?!e^)}26kLgDV(<&nmAY(7(gad2ol&;W7_5EC!YI=XYQUn zeiD21;HEtR;64zu0FTGuNS;HbrXV6jl941X62Ob~Z4|O*Z1cj`WU!5crQbUXg`t1m z*}3K7h32yxLf1ke(6O%v{qy=}D{COt%KJ`zpIv`${*plxk{Qe)DO@czdf!lBK3kWItL=r)iX+V(xP zD#0)i0judk@<7OH-4k%Lq$P}X?KlB^(q*d6@f_jhFPQj9Lzi8n5bdsQll(NRF%`BorVq37MKY>$AwMl8$}Va zUWPb}AR^It;~VER=(K+}e)_Rj^@FJqjA}TAI-|znxUt1uwAN6{F@KlsuRF$}IUv;g zo5DXD3`0#!29QM=7~m~E;&t9S{Z}9PTl2h2zX)G_?{{L49=xKd6g9e)H=$!%IYT3$-wUM4YyN$P8f2Z}#uZ5YQul1PK zS8Lj!)`~b^IqnKv_M<_xLtg8?D`g-Gh2uvS@UABu#2k3JTVa3h4SmA!GHP0qnHp2D@mq^DZ_sdvopZ%upO`at@%? zQiumoXHProK12yZ(4Sj95FNxL?2SKHbXsVx;rri&qX`H^kengLG7>y>|0D3|BiGW} z`ExjR?lf2%q%y&F%O zAOlm&)V1~-2%_W+70%#KL`0Dkoc2>B{lq%?1@ovb%u^{;RfR%nXk*Cv4LDif*Ya&U zLe}!P?SZSZ?Q;CWH}4>SZJ@M5RVgT~0-L{m+dRV$8GmgYaQJ~mw~SjsY~legKoAip zG9t~2HqFkKjN}c*F#gNE--JDSaMPXua34u#8KUWEGA+uxpv{vI#XuSpr0f{)93vA1 zKsaXaw0;rTZ7p!4e^{K1>AN13MW4$sr&yUg4K2tZq9Z36Ev zbbhS?5@z`!Ik?sUWd$7xeE3lZY2S8^hu<}Bu`>d2ez}J`o_HDS)uDB0sA8PG(%|Mt ztOC! zMbcK0WU8Z6m;qH(FqO7m_>llf0oGR2XKkF8Z|Y<{F6*9)v?J)?U8)che%mMlrL2Hq zWBpBS(+9j(uWRP7pz8!bsx}2Q#=zQI5RpsXxvP*t{Vt-TOnkNQd!`3rhJo%=X-p5IvvuBFY7+gdpvO;I zeIy=t_z~FI+N9IxPeW;im?HGk3=4}3h+^r4(8lx?%5{br(16wo#^%{|yfuia@DnW% zi2!GP1J%e?Z8mUoG>#*ry#&c1MU=&^c#pe#!!>*lX0T>xrBGHC3SB`N1MPHkQA7Ja zYNip@!s%HfYVNy111@M|ti8YTS^h#_esAx$f1dGIP_Whg6l-WAmu^WoAfZ?gWE@zU~joD3vH3Miu5giux1 zG+@hp+4g-hqV6gmZU`ZBFQkwOj(4@nJGIm6W`k;W9BQ@9HEW*9IORql#A_Oaz}lOeZ5PUM(2gsn4m%3>Q~lH<$NZO(;R!1b zrN5dRtRL%+z zc3ydhI&wmxhy>y^MsK+X*^90DE)WcA4^eHuv$4>8St=A&g;FW#AjbxrIl-G1Jn+); zuc>EfBidQSL!;6fl~T}3q0%ZSpX@<@F8~-+(5Rr1qrwz93Y5@b63(zC5xHc=U;#k{ zz+(vlgnrb66cSS|QIWpu;mMVw%%s3xA;1Sc?Fj()k;XsvUl6_YPXX`=RMiw(^$VZg ztQ>;OT*Oq{x0IQTwOL)h;N{3<$ThPlVhN<*{$1-0xzfHp8hpuEDl zeSN&^@kjBc@4g2sV~ddtm7=Hq<87EuCfHd?(HmEI#I5J>@K5ZzNB|Bz58U$ijqrI&ObmvAQ1@!2^3sn!uj2=nf&qe)%#uoUn~pVx_3i;)$npLa zo%^zajW^b!%T+9CT{GHyk1pb$o_rY3dhaP(oB|qzqiZ?7@-26xj3Pu@BT*G9NGO|J zlLCOPF-r)75E1~0*?PExn)rEejaZQsgs7JxN)tp`0*bu(t{$kiVCM=10f5nr zs#GZQ5@l6E8z!HcLQwN2Q79>gNL>9^GpYs8U6Po$XW9ISUyxH7-uWwUj=%UtXQ9>4nAJniM6XAn98fNn$gnjDXbWE>O3)Gl8kikzE^is6 z)0hIt-!oCJ7u|XR>-5nrp544VS2RTG)j_#py!MG=liaN|BKml;NDsG>qqRG5|( zlyPC8)WH3<`68GfZG%eCe4WTBNc7|2fA7PO`sD~y{1|8ZSC}G)f<_-1A5IQnf3|`| zBvk2&-Pn=l2*zkcGD0d62oQ2zK%rs@K}3YHnW`Akc3-6UZ)d*e-}5r=(PudA2>|zz z)b~FJ(RaQI7;TTKn4V$aDnJ1Jln@K9ZG{ZLXcEQb69UzbsI9F#_i>EzN8a`CzE<_m zzlx=Ae>}F&-tobB_1L!xHTh+A@QUYS*az|)C=6f{yEs-pTu=crv8!6kb{=SijnV;0 zKtzpDV3iT;3(dlQ^`iQ92|+1f_0g zdo(}kj^7txD8YC(#+WWcZ)^PF8PsCTqSbyI{%`g-z6s&=XD#>*X4Ku@^sJH9yxD+i zpxtZzF?xt_C|<&69epev%2sjw#GTmK-a?89v4|)V5`%t^7Z-*UMY5h(g4*It6PHgA zk}PE3Pe74%v?U^tw4=yOK&1hp?QAk!3lm0L<|=y;L>d86Q&4DT;JxjiVRLk7D*za! zq4Eloyuh@qP#InKwXW`0+xHg!=2%y9s{U@M30pKE#Ts??>OxxReaU-;P8U%n|#)zT@rWOq7s(=u`qIQz^#|MvK zaBIlEgt~CH-JspXJ81oUcksw&w{pK(b~?a6F*~4@BFvM z0nx|!_Z{=UqJIQWx#V$3HQ}y%?&5JiAqjy0yG*YB|I5~)8i$}o_ z=B~*J++5v$`Ydl;e^#%3fCyNm#fKfF)z7<9A3c0b9z{=PIG7&5?sOLnMx`|-YC5GD zXAJLo|NUp7y<$KYfoT6xY{pBPceYO2_`SF}Q?-uM&u>6+@V zeiAAfo)pFSdui+Zo1rQ~npx9BmI7JNh9eTWFhLEgLWQ{pe9$G z+h~nR%M`*4RtlV#;Jm~=#}@GBr(cGX`(u*MW4gJ2p1Eq+HLs)7+@5uH>}G2lZ}AI% zI}U?8Oxup04_<7ubq@N}?PI&Y4U_RU|27NrKO0!uGk)vkA0b18CCc!)m51WJhBRwW;u9!xxQ*{wp}kKR2g0Pt#`dQz%d(N686dT#_B8V@pS%NYO{e zHx=(GKKy5Q@`?6U{dNW3)epS zbUa+S&(|a(Jo?+e4>~VTB&zy8vAywTRHb!3%rcu^H_dETLXb5FunUOxnFm9L3Lx|o zZ~OoN8+O%Ru)@E(3YkaDU6X(LPdDKOulx(VXDheNADCVILhpakVdULf1ohXDVb7_Y zSf3YY|E-kAZezDE2(M+^VQOE40P7f76rfRoQ~QSa>t|hso39*zNJF|vYSD}sV=kNR zGF|R4?yex#-tUi@Ev&Y?vj6~q07*naREbCzxW>HexBU;gOnnyqC&1UggLjswg_t_e zfM@ySXo-cVAz8cf}{{s z+s(C_7D5fpMb%w>y3nKd-B+~xbbb)YohSuDurJZn+ zYqsHj+UEGr^AdU0X#VvyB(L=c!kq`6x{rjKvG;|346Fd4w5GDGpp5d*qn_a*n&hGX z90d}@xU_eKFI_syB^14H`=gsT6}P|YyxIJ&$VBgb{=yfHE}I^~+xP!5UiHY|$TPM4 z4o<}XJcYIQoYNc7#8^s~!t}v9*JVBrG1{XCC+(R4E*4P)O0t`gm)n3?MHE@4mqb9N z2>J9p1pV3e%{LhQ)ypo*B|rMSB|PcnAHfIy={0x8i-*34CR;ym_8)sb_xeG&HCcZE z4_69U1b{uvZ4hR~BUTPtwW&c&h%S5mvr(3vceAguVi)L*oe6&LP4CCgzw!Mzm!(!1 z>6!`r0^30Rv*0ZNoK%u3r;jNZ3M=h3;CgLNsjt~|sckF(!jdixegIg=w?Q5RxD~A*8W1R8 z$j?VfA~Ol;E(!xq5P5JXYuoA zey4fN?*b0(AL8uV+D-ke_Y-Tp{d@ay;POG*H@oF7l+sjkRpzFudPwo*r@sSx^x&sG z1mGeOjV7S2ox3P6w!v&O0cNSo2*^abx);*iLowa=iv{$7mp&GF$7{flcMD~{hqkwV zpT?sCQUI~EW{4yKA{P>9eAd7~%c(W!Sw0$S-d)|&x)6iOIOi-P{=mnM|xbVix0vgx=?-#kwDN#wEqzFZN@A>9p>KAjAt?zxsNcbTkG^z--Bzy)}J5c zC@PKjKKcmW_F0$EXdqcSHs~zAj24>>-SoN|c-QjIPR|dI?Uoes5%mPr?sgQk&=eU8 z+YVXxED{pp4B-{g5hI$b`8&47d?M~6!m3!n)Am0WpL_I)%+m_DpS%;BUAcB@v>2jA$W+SV%ybwCR28C)fCJbd5d4rU~&2lU5Klrh!0H zZ=p#3PW}0w@iPO;+Wd8;+sxl*0-c#Rf$@g@yU?)i`ZL6e+<(THI+2j^2t`m{)VH7= z^S7D)D!#OLm=7)N=SW2O!0t`cThu*27adGrw~4LtM~a`tJbK~U%W!aMA9^dni3-*>Yo2tz=2{SG`880}e%MBMeL~HXiNQt#lLC5N;Dgt$;!V%KjP5>~K#+l~0qjOo z@4D5^N+fOY-OLeU{M|+nhyjR1KxJ|+BgD*2h7`Jw`IfuFLbyFJ6QO~&1q4f{@%IqX z01-VTJA&t4`Z;*m(v@`f+!?z2%)Kb83K9`wl33{VacFfF!(qS9IBBgq0#O!0zF8qCl*@pTSzgD1$sNG096* z+A@D%e#iTc2v8d%AwQ)%?wfG$5(4etN1ap^R8>LO5e03#mG7^DLWvSNa;zkabYyst z(m1A1jPAfk@{j*vCG~Gi*T?#&CclDDM*nO3C!w~qE`|QX^Sp8EMCGC%_enFeVME3l z1or4Z2kn^vE)vnoGNOgvNR`EHsMOQZmp~E&ab#?oEp>AArZ=eUnO}6j^`Uyxi;;cB zE4BoypHaKpXO+<}F@xnp05Qlp0aleW1=IlFKp?+L1nOJ`!a6F6dO`IVCTeArnHds* z6p$Ji-MfpoyzK`3(%U|S53P@2Ru+L?G@spsjJdrL!2%sHD?*bL&tusgmNtV1z}oCB z{@Wl8p|^jSWQc&;P}Xn+J{6hV-H(h7nB zNesb)HGty$n0IbkqqA?lm3QBKhRvA?U42=MyRKToS_TGdpGTHpBA{OGsO@0Y6%ss8 zsu9jmPwEN^-E+IpeUSVvB<>vVH9YEY_<85n=LI|*1dwTd<`qzC>}E0E^SGn9i^~o`$AyjZ>XC1fFt(?qt0-gHeVXwUNooDL|;I^w)@t&`KGRj9k1dzb?{sE4h zn&8mMZBz)$?%EsTS|kW-%ZFF#rY>R!6H@TIF+9W&NFX^ygdt+Oa&QEXS$!B5sE>2& z=drfC4rYT05h9jIWrXF01uQHK?X@)58hp}=kuLT?i3{cP4A^+k<^p&|o$r5ERAP@R z7$-kVagy=N713z@On`!%KN}xQbCZp%08dano6BzGzu4oOyZq z$u)mZ&pZDu0DxaEUt&P~7wc-{>#pWwNBVNW1KIEGlS})Ap_6+uz<&Ll3(X5va-u;(|ErMWx9bei;1Rm+AhwQ?JjDP^AriSuZSJ#>_T1 z0W>!&T|fk|kcfmpECr;LECf+i8EkA%v3d6fHr{*_HvjPi=(duVM=1_Q`{>em1&=*$ z=(!s?|G_mQdiS9mlNf*&mRpz^t^(AqaiM!u2a&H8)lds}s6f|&FLe5wVccHb3z%IS z>241~eOjXtH~j`I?#%7q_3;3d0VV~w(m1m(#ao~C5Zra^1|E0QIUL?DQ9-bQ30RtE z&b|j-xS=U0*g(`|jWsfYmJv{BKpIvFk&eATK*Rj~723E@V`}IEDvh{Mi)sV_(s~{Z$%|N4RtQF01uJAV!RsBznCJE5k+fvdpqG!%q7rq=N*> zFaxF1nP!+g6x9a3JI}4=+rFk!cqakO?>Hs_?dp?Z=t@{tyLR|vaH*lo3Pu@BrzNIE zfl_HGqwA4vie?2uM3X(U7HjLGmf@2K`eK;tLPTX*z_3s46J}j(@B#&m0wokQmf{7v zeECvDKiHX0=8qNZG)vP z4UGdq!2NDP_+6Zpg2fk&i34aawls&ax75dZ2t{aMZ<{e{{n&?E8fy}uO^q^3aO1;Q zapICbo^r!kTyxhBrB#?aumSviyP>~8lTpuIBe>?FdpEJ~hT}Ld7(y7j@&OuFu=lK04XHcF<>Gm zbps*P9|)2@zTZDPV?QnPS5TEkk(U@3B`U3;47+?*F1}w-c-c0w^`2>acC>vC7+^L` z>;!*c+jL=Bqv}-5LM&%OSu17qNdJ-?*_oy##`OTBU;?gsT-`$d>f< zT97f=NfP|n@BR~5Gja`Z#V*D=2CWQm&nn@qIpf-`F&@7@!2vPGiAmMDC@{;XCeLxv{8T=<{f-# zxl2)CCk{*zT?rt>ZUY~JMuQgZwmXGr92c?QlmR9=s8ZO>V!ZRom*b90cJQcM&f(a( zDN;pHpxUv@vtJLpbI|+7@vadT4(}*D=WjlSdv83Alz~Uwb{3c@C;&k&f}p#z;y|PA z`y(3XJ_%w0Ns(jzDFlY1hb#L>>7h#x!M(aU7waWHcD` zk;btdVbgfZM@hulLWZap6Gg(N7iu|P2G2V1ZsgW&xPFILqAqbblC6zFgH6Gm+7F;I z(4}HkDw<3yyqLqA+VVO?^`0g@0f;=J6KY?bj@yzCvNrdjB|ZFdODzkCc_gZLw>?&5j*#4z9-4) z-AiM<@4yc39x9B4Aq7xL%vu6qt7Y~yb7~0EfCLLj2(zAOTFW#|QvoW4^N})cy(P3l z41o^%+cLri&SGdgjMYY26DZ^aM1jb`Y=tIvjdZL9ZP~-cs`0Som@2ldAgoFJlo(E?w+a4B7}bSakOA;#k=PMy9N)9DmoK#)X45t1lI zmL$k}8D~*KQVOe01AsOV0OEd%Y~O%HA{c^d!K#%hkI{Bkt;e?g+tyBW8|wnh?jhEI z2e*9$h?*!C_+!w({*^82Qx+xVd4*|FpfbiHJg`ZL$mJ8D3z;2i#42?53lRu7h#xid zUzR0`s;r{{WSa8;cU;r=H2-2kQy&AG};~o zwtt?(OvoYYTw5YYTApuHp?Qxo4%(^DYtVt(qg(_4E(4lji~_Vl5l6W5$RbW0Tfr44 zw(;oOHgWj;gpnIs;uuH7GI}CGr4`1e;9VXghk`^zuHw9d@i~YrATky`aHeMKf?=Pc z&+F*(5;Wcmp#We754cQzf`%f)!E_&AwRkCCIyg){kzzF7<$KSapuEVz8jvJ8jv|WV z2w9XMOB0Uch=demGb37#EF?iD36g%w@nTAdq!r`{wXq!GBk|}y)x{^8$JVg~HP4(o z8v%fQ>Zf4e9A6MNHpaiyD5eF9X^Fh7P*e(80P*!rk0B+FEGp){W95y&u+3%uTqfe-C7`0&0R`n_s`C+@`j6{nZz z>ElISjfRw^J*1)!2&)f~RAeg6Mj04pGN}M3%mjuuhM0h5rE$e(kDs}w@MR}T`kCvt zaQ$k$^m zek?|PGNr=y_Abs&&Y&nuA`oH`BZ?vId(8%4TVxEBuLBvy{lKnfg`bzdji0J0@@P* zE)p>S$OIq$$`?cEX<2Vf5}T91H`vcR8&AW=+6Q_s`wL88_WVz4|Hg0n5%j;}XAu>} zU-M-2je0oz0`6tNWNMjv6Po$hEJ5 zfba+l`Xa-=cmW5pRUFDzX(d}iDiV}Mj>%|*6XOjOWeH_8B1!1SDbhGa5+#VF;5d#c zilgS9KoBG#1R;_VQ5GZWM-W+L{YgTZt*%ehY-f*Av&qnKeRa10FZk&I*h8X5)$i|GO`-+!5z~$cm==W*v}n@QE}xYGluN5da7chtVu(N_1dIa50CVIDqChWW=AOy~y*NWA zGGuXvh$L8R>S49X%P5p(m7`npVWcFdus?jbj4H~t(R?%+1}Cl8i1-W^P2eKWW)(9;UJWB#R5 zZrm6mA_yTt5Ku;0(TObZN33I^4Mvy8EZoU*7;lqC#n7^mR} zMkCjbZP5Te?2k2RTyf}fq>%W;&IxfxaqjPydaG~z8T#M&_O<&~Y1GpJS_Dgq`YIx5 zO_3B>k;B1Kl|Ae3c=L~bP=0&<>5OdJql-^_0>H&0BJgyKU0G!uC5K$KJ+{e!VxZp# zNAcs-&gM}DZhs)Uc<#5q9sRHS6$qu@U6sWelH?HL2x6L#ld61m2J!x~DxXl!TmRyexFm>#IOM@%*?3sc1!Ny+%GJBD=gVvf5OT7Q}e$Zo)@Q50pj35!q6;E^!Prv4{jAA_!psNnl~X6+>u=9(tg@ zA2tC1?DF)H@%7|=NSyFN7ske$mj=`A5hnQ*d0s$k4I<)5O6sKf$e;FCx;x%(5rGL1=O5|l(uCO^-E0}uWtAS0|^K+Jv^=YuV7tX+FvKCP8;dr~v< zbrcD+1$n@gfhiQ!*fRf8RZzx28w=q}DIg;O!vw7iyC9ID2$2)-oJ3-n!EDGl?~5?S zlAm(y;{4fNLn)2CDxg`{uz%n}SkE5!1j#_7a&iC17LQ{8a0O?!*2E3tJ5J@KUtLZo zyFaad`J$~C5h5s~FVBz-nVFdl^+g}6wEVf7dh{qV`U8UZvdKS~Nj}gW_|HP>t$zgi zoc{u5-f#A;ejg7O4?{+FiLVr(HDNp&h@G{Y&BnP8E&h*Jpm_TqecJmOUHc4(veYU` zzMRwS5Hu4eyXX3;+f>y)BgM6dVhJgo2|$3P?EX%(bPV?^) zrT&dYroV`b;v;f8y*nzEhEg%H$XG}TA#J>rvz4T}ji!nKp6%{*t}b`s?M#L2KBfnJ)SpJmj~dg%8uWNCsljakZw?Dgy|dqF@zAd&)cERpnL z#0v?cVM5f8ZJAx46E__5S}2=+22^v^CT1ZdZh1EZES}L~pLN)1OWtr%AccmWRw#CJ ztNAMhWi%TncF0H~jw35K7z53k!Z6i3zd!l<1q9>M0S84iW|B)fXFp>Ml-4NA5?bq) z4`ZYKdq+)%aqxcyg(-4Q;}nm)<$QTJvhas_nxN}HNoQIG7Bj%8ci{-3J{2&cX|=AOz_&vcJZ-& z8Z0dOK%h=ixfW2}T;B&>0M0VaD4=M!9J3tvAQuv_cExU_^Te!N9{NH-l?qxlzW>G; zXl-D$%?r=GdfJ`K!R6_RR#>OwG&7T_;*m_%Z>k^|mcII*UCIZv|-D5hCfAWM6<_h>0~D^l69%9)88S-SdAyg0BDXr}umS9;~#709+&*yz))R zdp$^{zD8ei>GQBKBp5@eswR|92;#C_rKu1M3W!|M#86%A!Z_-%8C?lm5#5yrW zamN$3<-e#$e<45dao+&+dzhpVf8?#-n}7Y|zW>ZWec5-s|Meew_g@Q?e{ZVsy`=I1 z0V|L)7BYg6HmNKd!d61`-hCx*PA7QC@e<410?-7>kxi?s0D!EsK79IENivQoAz>b~ zDG@70H}A`NBH^>R5hyIr8gQB>9;+D`?@2BRcP}eOIiUkv3Szs07%4)NvXGysm1c4`r%;~3b)PHtX*Cy%doxsOH)LWoMWJ4{#rw6QEoXb^oE~S0YE%6tVR`B(Nmh z(>M5FwuSyqiGw=?D3@%Nf?Vr$@)hfyO~i* zX~78tLJ(vu5%m+qiy6nuJrV<}^^*+7&?RLeA80renSmLtzXoNxsg_&*f$q1rtpt)p z{q(r~9HALd3^l1R-Wp@PJF!~5c3L?bM3F$&Pq;tKNC-kvC`_j%D`kk;qc_f|4?9NW z%pW#`pGOHyT?&|uL0MLqOs2?-0$Qskr+=N>pE`qp)^9sQ?3~lkC{aO3!o!a~lq3t> zwsViTxw!q0R^#5U9gQy0-?I7R7j2FB;g#>f`?lW)1$_Bsxb$ldCaWTeV<@9gR3!{E zB9_?ZovTio(|6roee9#p>whucQ+?>7uUC6?|I(fSaFIxS&X++~)le<%`xZWU=pjfF zyUZ!w;KEu1#xQNJm%Ym$_m_IKT}*!Me|*~d_>k}ZBWx8Tu-2bnEiQg7R#sw)V$0l0 zm11Xi>yk3WJSQV;V8}sH~RDdDkZG zKFKBmBqa#euKWSPL1U1E>L@7&=#&ZjLe98lfmEt4*^3*su^pSwBU8sfVPW5i|2N zFKIH#Q7LU_Ow$)Tc|>!6?0j3bv*)w*@T01%kWX_IMFDLToD*s7+ut<`g?s$%85^$2 z2BxAj;;YVAX2uSU>=jrM#1E)p5QdS|POptN;-lLCk% zhXiN<1WNlr6dfry&h{`Eep>wi6iSpuj>MR&I8J+zv4M~TDG6x;3A%1$cWY?UbPE6; z^6kG509ZSJYAY?vpDH&uA6YIfKglE!mxGM;>hg23yY;PKG(Gr>ANsxtsf+&&_aTFmh3lM-MEb2@6@I!ai^n0q#1U zuDcg_-*4$b|Ixa)m~tebvV&<+n*aGP=QjVLOrje;>G%ZM^8N+Db07P2cYk?x@D+bN zyz8&ei1K@_%ttk~_eckBEo_6N92&1nFwV3j#zILq?LK zEP?8kR7?t9o<#V(af;8mL-U#A6>iUR`sm6Ow`CRIlWCkwHFi?aBoRgt6AQc8vt))~ z%U2u!0nRkhuo74rMSQ>v$w)v50WgyaV*Bl4t|6cyNFb(&_CaF5jv!4Bk+5NoOziB` zR+Fy4U{=tTu?$7C^Fr4!42U>F8b!|Y+yx(a=R>NQJ4u_L!FuY~>MPY5>jX8na$mmI zGki)Th(rRB6)s2yRrt_WvRmN0H?p{FkS+hp7AKsm!UwykcE+6b+wA=C+d>CD#ZY;L ze0ze)q=0gD2bc{=5PH1?*)T(rCN^S%4W{FqMmuA!Dwp^N@bG?<#V?3?WFYY5H&B&^ zQVNw;(5`x4@*Du=o003{k^mp-pPW%EMg-1U3ARRb7hm5_$tX4cN%ptI~Lh%%dzcV}lOR^>l_bZ682 zpWl8dzVFX|s6OxbpZqTz`l6piQt-c2MRi^?9Yd5dgfwP(`I5=`_0QjlaKjgT)oY;ZMYiFM6RiQazM1T4?uWw(Q` z909}zDJO_cY=r=4e-=^z2@r_{6br~K<~%P*O$s_x2^<|~_`LB73f43-6>m#Lr&EPf z11&bC=G};qN6Zx&G5|{uCrpT-sb>hs%7h=c+s9$fh@@b_Ox_Ox+-Q7tWja`;w1h^< zy3PzpLO_yWDTqiAgp~xmi-7YRG|bH8lf^K=LI~>%5jBo>-C((zp$BZnGkoD7ZQ+Ci ziX}uUL0M$A{7BS^?dm05v?CZONVZc`sPVVF?;W7yg@f*S=(JHw7znP1R`Q_wQp~OE zz%Wd%P>ga+M^lugvNiI+5JDmwr06g75oazkhZ$OFj7AfT##7c>LkD4lb#4ODr2l31 z{+$L|8`erwRaVw4W3-K|sNMN|-N;%Hs0S&?$N)5MfOQT-KTJO7zk$J0ZxM$V5Ap6~ zOt(z$+So9oUtTNM&wuY@z7;=l!^ITi&9=6F zV>ubTWy%`gcbI0*iwcFPDA%Lq#nS+eLB>ENA=6AkU=@9hXy-qUXMFr!FTul}{L<0G z?%evFdoNkMbED6%9Ip(Xf-D0f0#k~2TvFiorW^S2;~9h$R>#%`k&Yl@>!I!|vN1Ct z1<5o*FBZtM6s4+Al^R+bBuZjM#k9{b9#S&msV{=aOi~~s!G>+A1H+8S6&)l&(1K|c zDQn%X^UpI#*vfsDfl{CVH#TX8^%B=gK{0B_MggL_oIMdU8?a%jlg9f1Jg4zX(P;PW z8uX6QyZCwm07BS&RMOh>t#)s|?NG8NV+9p|wFdEil@hVp=p+ z_k0~FW2{-jn@@bQBJV$-Dh*XuRF)OAYSQwyWTHAfQRChi2KxoK<}&|rE1|H@_g_Il zkiZoOE{E0{_l)kviSo?;RJx70cxGyq7WwuB?4}xWexqiM)6}wDT)C|BPm56%s}C)rx`F*rJX~ZZHt`-=*{w~)L>MOxiU#2NGU-Pfgm7B zl5otGh=^TynAQfWQqVTOn_&wSBBrQ@YHhk=|6SA&e9f!aW^sdO_-yO%)l7g1tO1|d zkBA^e1VLoI^y3K9YxY7QN+U#BWEr}&3?B}G0FkX95IF|#oc(Gh9zyUYNRw-V2f^WS zT@=7lARoB+{)VO1HI`Zoo>~kRUXlU=e}Tp~p4mg_L7&3^4FeUU8kHDtk5T27&8rVa z+DkE99U@uC>=lg$v`x7?+8txGJGBXu47WoL14joER3|br0JLITrne|jRtid2Y{2A` z_lDm5%?R3(kpbgpZc-V!6b0TG&<=J42pS3{6p}dMt1rEli)o2lckV4t=(S({QT+=y z{$}9J2Prb9b{?|O?SMd6$ z{=XX@^T99q->1yz*LNfHa2ZQHb-m9k%6e^UqpeGY3lFsc9so4MYg zBsm1YK!6ZS=fxaJq-hN4G-z9l9e}YmV<|1;hxAE@8Ye#s(F4Zi z0L%i$7zlz(_e;!@0YhZ!)OZ%oCIg>2*51P)M%+uR?LL+ezQ1Aqn{J_j&USBw=z#ex zrQC0AxdC{AhPlbB8y>(wEAt`+J>a0vXa^01wG!-3Z+r)!4Ai(pF)2{w zC8|mT0QZ*r7_9UWB`$ZrwhX8$6m~avF&P!8DqREZAhzZb2e}7zeE_zR0ZMCBg@gN5 zWo`7_hWp9s@0}otjyCTHh#d4`=2tlmNJFDQjzKcOB}+$WeR~79PhQ`^%k^`2Kp9}Lz)0eKYJL0#)nEPJ52fGnY81cuy$^IZFFL*A zWykC9+pqlt01#|SX;RQ&an&5)p{^wJ4}9ob>*HScq~C{3VpQV^78gc%xq3Rj?vk&> zXAP!j;ws6%W#=G2gqNw5noF&q!DNi*cmNx(5EIJEWnFXm*^Sa55F|;YNsNVI4_QA$ zI!F=4F$4<;w%+m(qA9`y8;xyOJGO%{7~t^)|-CWew-ynEmv*wN;@@%DA%{Wj{}#-}^B{gxK%nD9(^ zR}GtchV4r)d+na;gnjJ6huXmqjUYhnj)lFlUV98KG^*VK#kfFaG%BSbV~N31AL&vC z>!{Bz(8gf0JH_tS2zg%BHhhrv=$Aq?ee(C`u51jWswz~aLgmu-8Zymr+q<&DCMXaH z8aG0~w2UYAJZ>gyON3w+Za{oAKnVo~=fD^#RRj*@nGv_{|$sEeJH zV2|!s+7kfoCn{g|Um;)mr@(YNp?nICWAMIJX-?n!_0e;`>kazc={q0jKHeX6+bezo z+trvZ8Ll3a8qXTAd`yqhB_bj9$?fUArpUK3Ui;4M1^4!&{znTGYwx@B-MdRiuiX8@ zzx+}4xexhfe8=SB(ybC z6@V~pKG{Otor9crXmiGN@=(4VA^Xw9)V1;HuD0$~Jw}~KsDS_+v_Wka*&qhp_JbI^ zR!CtB2CyFnKxJSG4K*oIOiL(ZAV^?gF+)5|AyVOT@-wtDm`0G(@vp#(qVI+we#Z#oJ2#7+>!Qub^s+ty zz<4sXMU-GrL9t?GcCZyqD1W;mx^qC;{ocntx_GoF0NhWs_?myg?wxl)C?ipnKq{EB zK6qjAVe;(B|Mt&+^UJUNy#Lli{%0?Jpu2j}=<61~9y>H$xinh&`b)~CZ$2Pbu3Hkr zG$tD#poBt21`3*)xlmQLor~$%GH#_?Oj6S zs^HDZ4vlnWz1=kAWITtal%O)Q?HjINn%8ifQTcA$T<%>hdhb| ziAb=FE674wfupnyS|Pj9LKD04alFH-}LgQ5LhzB0?-{CIk^cZ6=Yr~~5=%D|#M`O#`ujysz1JHsedW7tv z$rV(gAf!NVm>^1Gh=@S3)vJxx$R`EwZjWd(&aK}EQO$LIqUhSB1Jn_g0K*udsuaqy zLRD2Tt~@W1a59P)rdsF-`*;VNwwKvv?lZy22_}GiZK@{gpT}p|jiCK7Fr=UmiG+@= zTw=7+bnDKY`kdZ)-G6<-f4}kXU;h@M{PeuX6f@qp|NZxT&e_lU-BW7)6*5m{&(^=7 zsw!w|N)%jTih{PV6Q88BH!G@sb)V`NuQspy^mKBME(+bhc+&reDf`jiMY4NdP8W~< zn!4he@8l?EY;8cCJxTJO+is(B`qeOeL-dU20stmI@azY=%lC=CdFchvi9E2dgP*&G zFZpj*ic8YfY{e{O0|Eis7_N+hstf_l5(0t*0g5$gXtzqoMj(|5NXKjgy9%t0*J)Sf zTna{Hz&T1W5v3Z7=}t+LoZ0LU$-Bm!-@b*>Hi35fa&1+yjtOLP(pNp9B!cF``65L=rNK z5oNZ@o=74Wnr3Qk6f@r})k-c9*yx?H+o!V)c`jgWFfCm%pAprLismT~xivuQ2 zpT?;TOF|qI_ZN)WfAlIkbNqkH{@^>S_r7yfz5b^k=M?XuMnW?BsnpO;uVQrW+D;R)dNt{p&!^Bz{o~iH66WuxqI|nfal@qAKEF|IZ0%b-GQRGrCy!Ugo92f;@_n{rVVvbW z?Wx&z{oP;uAuRTn=sh3%=j`3b-?!Kk!=tCwxhM1xT{krSr!VLIs}{w=@+vLSQa;aZoVs;k4y-DwDz|W1W`wOua*7oIa~+6 z0qBGs24(;kuMh3K{sq9102#I^m!(ZlTq%umTwt<0MLsQ18ReR?S~^AE1Jd=u!~Vgo zdFEeL3VBh$C{vs9Lu|!H1qhc;n4zFiLZL#50u`nxU`ylZy5tYQ5D<`%6eB{02pJMY zkR)xoD3__RF(cSO)e5OhaAf%)7gd4V$M;URdGagop1$e$*Y5v5d|Fe60{A8UI{aY# zg00PH^T(9pkNp4JyYDzltNMQ6pYJ(Oxpn%?_5!<06+y8OVvI&(Y%#_XO^g}~u>_;2 zh$0Gtphyu7DzPRAMn%+!*kVTnl(v**7q;)tPQAT6?VR)d{qfv8GrO8!XuEe|&zsli zmYI9cbLZ}y^PKZ7Gp6!}EM?X@plrlpP&Kt`lY;A*=szgey6d#)HMlJP+JPOU^@!O8 zz46c*R`9nRw0^nd?DM`jyZCUlKmEpD5BXu^N*jOn z172ASvaeq)m%57zgFH0Qk8CzWoM=Q*+R2V$4WXEfPD`gMR@5{a$|wXTq9(UFMjThE zvAr$TjfSu@^28!9H*hk!g`=y|NRoP2))OB{m^WU$IW1SrSMEL8Exu&QUcdjx^{@Ir zuVM8MP6X1Q$U*00>T6HD{EihPE5(m)`_WL_gvV}9CjMej^*?7o_Z_>)8SWnzMJ^-} z>S2gtK1cb1JhC~z8#Iun?Ew&xhU~GA zN=-;X@Uk8lp#9BC>Y=vni43a{U4cJxa5M_OZ#3f3WUuYosjw{3w5LhCK#w$sAx9evnm5P(kH?BS4 z`6Q0T6yL12LL@#vZl8dn@H$pd0+%X7EVy;XdphAVH79b9y`D1|25N?}2U zUYY{fd98Uq$6qPcc`RmTGZ&DT4xbQljGAtsjwS*`oInwS;lf28S>$961t$wvxa?3` zz)3)mGKv$UDAWBu8+gVRzpgce_gt*a(A%xwSftK z`0gYA8LRF;>43b)twWF90oV_8J_q)e9>v3Be}SP9z>(<>S}6g~2eJu4^)m*1fwy(Xg*F%3;M7pUdM4C9yTBm2Lt}7v=lLl*n*)WqbiXxMssRPt>9ZdiM zLH@q9X%Zz}mbL43R(^DN<#D$+OFPXcH+4##Zn#mu_}KHd`YQb3v|~ns;^6a<%YESI zfAZ|fn|^!7buT=wg&*8=!G6ES*G;?^Nau#~MSbu8Q9hsj*-W!`VmYb(W53G(^(wV= z`Eor*t|r!rrd)qEjSV0`=3Hc@fT#<^L4-I~fYxaYcxP*SE;fJ|l(wqt1PyX$XSx%# z*NI98r4v~c#)zW?Q6ohEvO%~-4{3E8n!mGNc$416^MAKj9{$|KzVL2;;g?ii8hqP8c`4S0fCn1225V%{;Ug$(=v#^(8!HPja6OB`KSU_*J7AD0T;+gkDo6VO@Uc@)IZrbbd&szOYxLTH){hIEp zl73oyxOi0C6(=5X@sHO3a!~I)t^bv{dFqGz{W{kl^JBbi?6p|aw;C(_rDjXKdH3)@ z-%odh(?6e5CD}-thx^*gImUsB6{IU6+%(f$dJ@ui=Zh90%~{up##}0FuR&SSN8gc(!9442SG$POF~Qa>&87U8hma$cMt zL%&~yD;!EVrlx68C8?QeTno!_MVFGY2vjJfNP}66nF0o~{p1TDN+qN@EmR~r?*s$G zgN1%tJUE6x2lV^;Jv-_M&d3;d*Grc_5C2}V=jzt}V;2CAqQWKDA)K0k*sy7l8C!lX zmabTad>)XUjTXb5AATAzI*kY>_z1#P(Wbk9Vxp+5@4KPbm+_Dt=^urPXtW*XlLl1b zD3?7$kfa$1+7Y5SL7XURsgTQY6BXU$DjGCS)77dUoZH_&bg?A2_UYD_|LEg?XU})> zqR|)O`*&q0zpyOM?HTr;op|125hX_)RZV`m-Hof`dw#Lsuk(tTtMHbwe@KJF1h8yu z45Nh+J=LsC77Beo-4*V+ubR{j3*%&|NF3sTVG@;2_+DCN&~aV3URrio3YktuaSYSx zMc-}TOPt2E6T1I(jtpS1AoC8OG+ZF9-e-{O&!^q~_T93dLvwfJ>CHavJ!u12IHNE8 z-?`wrg~fdK4L6uuJna2&-G)a<7>Ep1s1UXyw3`7MjW*grghXo?&FL1s(P>4#PP^SS zz9DVyB%MyygcS1)nD!a%+)2q?CPSykL#N?V8at3ye{`gTW=1)#VUM0h2~{wFKG8?Z zGfQ|?aXFS27Q^>4T#4(nBOEuI!X2|)<6RrJ=pA3%thWBw1kZkBH&0%_CE9hvxSo1o zJekSVRjbb@-yO^jn1NzH<=h;_Nr+e{bGrb(=hO1BWnAzJxT~_!Y>Kyi_UVhC{$H_b z^Gl}wdB4A>twWoQ0eBSUF1Zfjj_nXe|Fv3u#MiL)hyn_E21y{%Ko|mH1hm>fvq5OL zm|6`ulY3aqPM#V4?D`9f|NI^_E_p+*FXbWm_9=JbhhO*@IPX7uZMf*lmAqtGzdOK1 zHwPDzz=ji}sG(ZelazS|WidnLU7;JFyJYdY|7 zRvYVk4mI1Ho1OXZ!^(|!|85xDFW&9rz4x8llh@$$eP`j6mz;->Ui*&2g%a;xjwP=- z++Q)UC_lu7T!!hw_HSVIK~q9EcZh$&X8)4n%-V8aF`=~Qv-Y^j6O(!D}gV4a04+EiXw+Ge*~lXVea$#*uc<4G)>#uyQ-7A zbVoxse;5h%%PCdbc0%#k%1l%;7et>00GwBRHwOJdxuL#sw2yNyTEs)AKPmr&HOCCC zBLGyZmua?D;UH>}6b?oPhp~Kgi77X0;)heezHbWEmpCl8d??xfMSm>I?f^WB+~@ow zl6o1G#4qDzD_@A=QAWlG90w5HwjrGzfJ6aF0vHXU5+TFDmrIv_SJ%p+-gslLFXbWm z#_d<&sRJjYKI-o@t@>nO+E0pgGN`mB#TsoBP$?;6Tu)(=rqztB+z>kI^r7QMuPseY z>dPvhdr;5wrbT~^FB~_}UQt(WBkw;?6$_5aXO3u+IeukbZ=Sm2x?P!LUW3`0n;z8T zJ(?~!@@z~`ZNu)?c%@J*{9-yRZK>&-q@Ctq!*)z9=zju+oISaet zEzFYNcYV;ECHas1#UCac%pbZNp0DN?BuMHZ!g3qUMjK%}q&U$~I-TT=F=VuXR_O$- zv`*s#(An;nGVRmgN=QdSO3^to=>!xK&lmTh`Jr{!A#;@@y8(oqSOLQZvvCzuYL?mv zkVOVdvx{-~z;Y}pj&at_U{5eD?rhy#y|=ybTjOfxLnYa|?4+Zf^>Yoq=M#<320xB| z%{S=Z<2Osci8mHsi8Yy(Sn7`Q9y8uN`m@XK*m?c*oikziq{VV{tk2DXnaP!sq9lgz z`dBiu7@l--d+A=YG1~R1k9_;n-`n`T_4t1L*gFce9((K#z@sGlvF|`=pta#Ph@r9b z%@a>N6RQtrQOE#}1SdhmC>!N|dqgiUjDkgWfymff8dg);^?QaBGw|?{b17BNV^Apn_+H2N7 z2Uo1U0GJMsmJv=J5(BS4I(K+(xH!mu)`1`*t#mrs`|g4wKj}RzOOZy%>rUI_D1izU zOrjCR3AEBMDh*~647k3FOn;7ZBL#9ix!^1x`$YKzd&L0Ee>Z(_?#O`|8l7}OlYVYDjv&zrGjSOeU1I@BMUm&R!U)FthT%FcYEfNm ztBnVn^!6KO^z5fyFZ(lXRCqyn#sB*KziGvMI-DyAZ{Be(jzu4q%OhU@w9IjrpEUHO ztkN-Qt*F$fB9rlX#prUB!sB7IY|Tz4Fjx! zY!=dYF!v?=g@noE*%Sx*S)1b_#D-p9$HVp2;5%SuekwiX zrnN)s)>G78+~*VrL6ie?)nRY^>HQ~^$HP596Ax+f2Y}E1;>~#W^Df03cZECOpVdE& z`ZGsIL=G}8#mh#HG?G3QoA$F;R~qNxINbLy=6rnS-UE{+2movEdT#oQ&Kz}F-v{q= z3(otuwD#<3HRE?4XO0|O#6w)@%R-Pqt<)fB1J`qr8OS5kmrd_(1$El~I*@PylL1Ex zCf3N$ZEvS3Z=7fd&w-P3i5#)_fd1f&p7);D|KRMu`}qsX^e))`@3hX{E5@I?&4Rk0 zlNgv#A!$ZP+6m$$p+u$U`Q3@1O&a|^pUyWwK?@KdDc$|>+_~3dua?Vm#g*nu9(5ND zK)1F+de^T_r9vxqo>M?U&9eY~VFhOxphH=-6cl^>wZ;m(Z}-MCzO z;_DxezErw)<>&D7t#AAPe*gbu*URUAee=p|@VOOd;yZi(2YEO5<4IlKPzf7P&60p7 z1L+F%7yAIkW=nO4YM9o4el-5{_A7@k1xg3(Eo&X(>;m9X5`5rqkv-?@fSU!inlZEn zvq8p{=yN34D1?qkyJeF|Qvy3JUelJdB#43;Vd&x*9aq()sdvfK|YNx;De=u_|Z)DI>2Y#dLo)dlq z0Ql;LZ!}I?b>hYAcijI#)DF*of;sYtWqOh6A1ETV%Z}@i5MrOR ziTShrZjU6BjwMYp?3`2>!)%P9?vaA&T(33;m86c6sz5;Us5?k~`69*&!zg6(ysI@K z?y7FCPMX%vx-uCoYpLu|bsHU9GKdm<$^BVlu#&4;QJo}1k&;P|cO7}%u zE=^2w{0g&}hld8xH#~r5y@7VKjVMSE?k=HOX<}f>5a))ABwdj%1Y|eoz7vJtP3rG< zn(5}+&%J;4t~TF|-k)y^K!5zaf1jc~bFJ(bwiE0=hwkL?hYCp$A#TQLU4lfB>Tc_I zg7ZuoxkzlffqC7(Hy{E@DdGB^>s z6##(k-`LF&;>}gnjFi z1O(iOT5XzxXi0e%aG4=IKRv(H22h&PTBZtM%@jvOakQCR?agrQx8(oQ3H(as37h^o?&gbs+`>)=00lpV+`Q`J9e9E?X_a&;P z{*0M<@#0Yoj1H1;B$4VD6BNOFjOReFgMqFcrL%cQ|1x7Kh{70iIbdXnjE2*!ai%n-GL6c0?H^n?o9iFx^(7qi9IZf6yXBCcGGxHM3(EK~ zt_w&9(#sI{74mVRkc*4?UJn-l@Y;zpamwM(!i|j^Z;LbP?GGfof3~GI!F#4=kQg98 z+=u)?5eAG_6hbo~q(^ZhMpSAcnr*|hlFlUE{n+PB-vE0}_6rvR277-k_WAp6eSrCj zM3@Vw?|dz51_v5REke80LT$EzTCI&nJ48E<5o--)3~8gG!D+ys?gaUzAEcCmF$O|P zWU?9Lb2(%(KBP>$A<|yOhZa^rNb4DLr+z`VcE8c{X@g4Xw3Yx2Sf)jRq9j2zY#>k} zax#x4eT#X~z!>NKB4(q8_(kQ`-M5DuKcroL{Uzb2Z++SFzj{@Ckn&4)O zb-50%*3%4tRugE{Su`7Psud~9GdG&B{h#?4ybI+kPwVw19Q2lC`|;YauR=Px8DRuU zG{_)5hgON5@0%Plk;0fHz-q*R(?&t@)v-|&15KJMPn69Yn! zm-RVU$inko$TV<~(d~=SX?&0tIOO?~0^I<@xg!8{$|CPm+h3cx_<~qPXeLd>CPvXO zVAaqvEFD+`SGc&pz74;q+HNB#S*p^%t3l0qoY^&q9h zWMi79sY!Cj;-1d{R@P#olg=*{j{!D3_8!a+n1Xh}v zG?}15P8j}bB;tu89b88$Pg?(1_{K9nhuQkXX4e<*nc|t7CYsZ7V$T$!Fy?`w0Spcf zLP&`qj!-REF}`CQwMqjl1xPq)Zhe@56Vo}5Uy$qHwXj-Wnr}Cs8n|yGA6~FHFj!Er zPs6klB-Ie@=_aa^b=0d(w1Ws?6eH7s6}TzMV`>HmTk?opQOSz!61+v7ji5 zMY}yC>b3u&#C&R0RPUS}Sc2$_r}ld2j|pc!_e%Vzz5y$=^PAgs`Qv4ccf>;jE6J16 zi=sGNt^YPxuU~R&F$&KP*W&D64|pH#iUM*1n;ZAuyC!?&2X>k9FZ!{&4pZR4{v!JN zi)kmkD1wv{D$$r6pTz96gTdi`3@#die3hMvi%8{-4eZR|7VEgD1(HP!*fnP@3|h&w97QB%6pVl-`aM=R=g*^xF_#J%d!iA z{UrGE8R&cc*}OD2`{O-RmEUEcPt;NCi4+@;TyK)S+|7xOw;O?Q`?tUR$e-{K(sT@- zF?1AuwfmOj>8k(V*2~II8%gyqJ;zxrOYyc58&Vo=^wLRfEOXz?&I z16fGXnc+LN1Be&i`FAI1n$Ov%xtnUR)}0C8q(z5R+9*fI8gZB)3S%U3(z(;04?awj z2)g&=^JVwC83sh%-2HT2A_ReigcJl4`_%7W(6^V_q;-7u2|%2WZKO_H-?WXc?$i`u zp5Nrqo$7#oE{FbnA97w6V8a{A+v(0=)5b|N{h_BVdgAwH+U5A|m5=QAZ}soiT#NtS z@&n|Y?9qKPTO?-PP%Wxa^vjk}_vJ;lhi^pdP-iOvT90|$EmgbdyMPD*5NPsMy&l$s z@`ZtOkuPTC%uMw|D{1MOtK=eSV5mP^oU8QLiJni(02_wuIPhEt`TjgIg$!KJVUmI% z($cvEO7G~6*(=C@t}%{DOA;HEmfvN~Fq)x~1aX`o4ihAaMjFg#=2Hi|1$nv=`U{E@ z?bT8k0LktGU_rfMk=FB{yYrVsLJ$*C_w0W@)xQ&gI3J>r{)ORmtn(fH(qA*DF$P8e zp68;F%Om6XXeS|WsBTgBhTDE@d~?oUt~~knTPE(pJ8S11knitT2R{zsIbNkw{`_-C zpZWTt%$r+kcen0nZu}>QoNqsK*;DcC9e>};x1eP-6R6zbtl@gEl5G{CeP;CwNk^v?*CRxd>Q z97I4mCo}2JLp9Qm+zdY&$B`)lLZ1$S|yXAjPXVRY!Hte?b&15{} zvKe^NcQrQEcE!`5Z#nTLyV_f3&idO+ani?LdBDEEn;Sb2aXfsKzxKp}EO0$) ziYZmv)ONz(`0V!j?Pne0>;k~DdPx(8a|3uw^}{P*JU7)T;;r#FBbC2(B{!JP_u#-v;KN@|;k52gw*WtZ(e0FzevOm@0s?}l6I_=T2cphbD6L5;&FJ1r3b^3I+)ak|0Vu5(yHVRvk9P z3>HkC-G7OqUqIf^LCS6v0L?Wp+^a`XXMDz_&3&}d&`Kjw3M{~W#z#JrqnwxFL>a!P zaX&V;x80=4y#I{&q8q=R`y5`@erTn99}Pbk{ybjrj#KcZ3(oua$zxAFy&&@R^O;+w zcADKUlaM!kFuJriZ#K*7usZ;jbr2Zz20@P8)=;%O+a_FIaECb75ee{IBz*TQznlKA zO-57|*yM*g zRgTf!n&|x6z$gu^6i5J>Y?cbS9I}p&X4InJ*YArSh<04#dfrFQY+bzdTPv=>%XYoB zC*RWzwfk|)xo;mn#$WU2!``6SQr(FuRlc+AH15f<4gRxw&n^Hg>mcybl`qC=_r1S) zq&(ubM5q@FDbl<4?isoffFKCwbh5AAl$Y2crb5`NZ4KAVFp z9G+~>(5;QT%X>`uliCxPgH;UxUeTk;9{@BABsnJxV?p#p?I(g7MzUUU@D zlP(pOHP0>pEbAb!;)5sQq}QK_7J>-Gh;@=SvPsXpiCM8Q1VIikms;0}suu*qW-b_# zsGALd^m94=TZXaxfU2!iirkk4dUYl8!`)ei41u^St%Fc6;to%>G&)QunPdoIw*YRt!F|G zc-~+gM@VHLeL#|fz(g=cv(g%#onjx?)&=Lh?* zs^5b(9nNBRG`V!OyZA4MWIyeU_8_8g69MB6*#fNA!ND#7EbAapNh*L5PZ-0%bA8Id zaU_B;fYBPUO5i#!JkJ9e1`%<$We*WS3IXbD>vwhrm}tJ54t44TrS*c+uk6+fFx{Ad zP9(kKxNuz;Qb;fxj-rIC^*YV8$}}66c~3G^t|axHO%84j5p78%-!PHP?0oXj6KbEF zxg-pqvlZE&uSuUc1W=v3#P;R>2YyCbzI9hTab~WSd*@SzkM}(C(Mfec9IN@714!!_ zD5b${n4EM=!&s2kyg(Xf=ECa1QBaHjigCe@PX$YQ)}rF* zS^;UwQI%TU`t9xd#`??0UJp$7dX$!Bvj8ls=Pv3$6YfBttdEahas)5?*CTRkQSfr8 zw`xdK0wDwn*+M!gD-94skYFJsxlX6VZs#}vVs2%SE($so{D{ywE)eK097qZ{o&)JR zaD)Uwzyyk$aX_V@it*MIW}|9QO&ZgIiPqOl>-TW!SD^_uow(@uawVwhH_e{;kgoO9 znbW~!hJ2m9@=ph!@}d>}V=P=kqBUk`%TOx4(>K~cDFr5;DaZBl5EDJ`Sv&vois+D2|9Oi z6a>e0ARP%7fOI5;=++M4G)F*+^f4IS+WaJhV51pP6rtRz&}3s4yMrlRPO6oLYV8RS z-ynVe7USdQes6H%tbaJawd2NHvHG^B0=pjiwLWmnkD$T`Ki_^!*(+qOnu)5X|Q3EBwzr-Niz|$UIr0IxTAI#?}+yNqCwHQ@zCfmy?PBF4L;fHZ{uE! z(eU6rWy~9SMo#8Tsa4^cZq5dj+!OJ^)1A_?>;k~DdgPi_pT%uEevYGaE1o#02hM+z zfApd}TrRa{2>`Ng4q#@HrofRD1S!Q_4!-M2WHTA~84uERAfy0EVj;wWvU+JD0n!3s zVv`t(q6n3s#b3D$vS#&U&c+up+*F9532?WIPi=D9-4Ew`KjG|i7q^hak zadz_Q+La?015vL>X;~?|0I;kB>=XI-Bl2D6g3r9`MJwgvkF3qCeuASU*WxN9fwEo} zzUPtaNw}^D-}fk!&mx=4rf2pp2NgMvfG8vFifmrbf=EL(ufj`Rv4ffHK-ES zxoR5CrfSW$b-1CV>gzR`J+ABA5+U5ZZt0rJeu*0{Xms z!Ixgf^Ib3lNum%$Aspdw&d*YdLwcaTxxFpfeXa5M+>ZvI-~5%K3-E@?hZb~rpzvvo z^FH}D_>TXK#opqVj`)MDI6+GVh&X8$WnqiU4xoEIQp=iW7XX%Z0G#WdijRHuUH+53 zr#y22h0~5K9{!wT`_?)pQINhv*?fk)YzB_&Fgi_cpqZfntr;rONa7gHW|JCW1J$HO zHQm%D(Ja@K#%#p;u5wbn$M@yEc{h8)R2Lk?%%yx9{?i}meIJFBL7Q8rV&QZO0-4%*2d z06z1XGcb@T_WRoT*OkuV#e!klQAlx|Ampf_N#Cb!0HAe{u?qmp+K)b&eLsB9_v@|t zllt7;DN8eBe{*c#5krgeLo6IY(iISn;I!9|Ar1}L7*<*%iX+q-buPDSRE-)`Pnz+J zu1<%XY;AFHM;pNo$8+wONJ)>J+0G9PA`^M;{ zIHG?YuG{&;e!+aAABlfBwr|}F*9{)NXmMtk9Z4))!Hy%-$UVcPwdOF6(QHXW4j^Y{0^C4JJ_^#5|-Jhs=D|G(OB z>@V=md%ucdZ|qr1vZF8UcZ(dhLTWZ!m<=k}5Ihi1^6b^panC&`_|%RcEdK&txcih| z5Bq=h+tuGdvr)nCOLyT?JKaXLl<6)TsG27sj3qqeMhb^%~n z55sN8d~2`YKRNeu(5-~8XFi#ksZAfgtGfGnqu$tyS7jERu(oj6;G)8)kwRz)Bcv-q zL`V|F?RG%Z%@R$vW>JkAwMjKS)8Jr3RX5i=j(@in>i0`?i%YL~;me!b?%#^%{O(l% zfREgCS+8G$hwNuteuS)(U%VtccE;L)HH%cDOs!SNj^+eyY;UR7Mf0+}pZko=ZsiM3%)3@epTBWTiO zvrH3lDVfl-yDO@8M@iT281M#eE1S~2{e^t_10TDrb^BF6z=<~;99#E~#O|YhiJxr# zISg@j(CNGMgt6n^ytHo_RjL&{P~XM3h8xBk-1x{dMvlFDJeZANU-@9Khy0*?Ci_9i zLeABt>PJ?}6{oMvuNJOMOEAYup%Dd`RW;s(Ew{|d(u;le%jd^e^m^EqHOKA%Sk{B^ zrQwgG-|v%m&fYr^pj8~Dp_R!@bW~iDhpiPWPwo?iqek-sgJbz2cepUfSwG7JGGu_T z)keMDqN(<*mJ{x@ef%4E){U=~5 ziw2zj!mvA7T#^}f3vL!!Kg$`iKmNe^ zt8DWObEu~rD82yGQ$ zR@bpnJn-9w+kA;@-15ic-ghdrtS-9)U_Gw!>mESn%5^xe?;SZ(&gxL<zB;$R14-W<92wiPW&DQdYwLdndcxy>?fu36v*E1~ z`0RaWz2w;bqc3^V@NtWq&4#{X`d-=)K5)Hp@s7#%)*X0${V_B71Hi?1oeR$?EY520 z!>gPXYlgBz#&KN;FcQr$M#I2>nVCS$AW7s9k?i%*Eo(22|DQtEA?rh#HzR?{`^tNE zf%C8HH-)F=ksWi$%lPC|M)>g9Wij{9fS}oM+CEpLEpmlK*3BZ5@!`21T*o0nfYKUT z8O}(D*)S5N(MSS}CsVXN9-o@k^0voVE#|W;2UpXY{pstY9|tnR5jB48 zy8N2+)(os$8U$^=y>zd-OK-ZKB)@la|k!+lVGv-0cs>BMi4^>X>J z-MHu|aoC%W%&w7zT#g*q0c(SH6rdeNXeA*+m7vLixt;F0XHt~^GQ-}?XU)~Uz6{Hn zV|M_o$DMz4UWjkHzd#bJlLt)k)IlD6{-_uk=yUR%6FxcQu#^%Y0viT{nHj_|(5#7s zfaAFEJQu#_!*v{h2*xOcaR?P_=rpN|0)Sg_KvPK>d(7ncZl3z@KqOyNuDH_}9b6uK z1=!u|SLDF@RPiiqPRj0BJNJgC4Lsq3b$x4x>g@*KTDlAC)#mSqUi2;)+Vy#S51)UG zO#U~nyaw0o{5~$jf8uog`d1xJEB(j35 z3D0riNC8I>h&p#@+?n_R7*7A60T^Qt#W8fJ8lOru3>#2-*bfGCsAHPZWgI zCrt)F6B^-(!%qMJ{07(H8Czf3>zCz#`h5072&4MIkT?9Eb;ZN~Wo_T;{#wv5cg=3( zZEE8CoS}C)4ZZ8kFJJPQoBTH&`3s!2=^QMf#ecm-jvYDT4QW5)iEPe;>pL*a5DE~T zwIu*BrP~04q!@Arvsx?L3&1+4*ad*~xbWi5Z^Q-eX;_|l^75fLclJ7O&GO;Qp!S6z z*LC2zj&K~OJAuO(PP@-34b2Q@gG4DrDnb$`P+Gwl28hyF0CGSiI5C=Qx=s^%YPyQ% z8?qj=$S}D$d*b_>SuTW4=&455tQO!|v^OA2B5R&N{Y#-78lWS9(Dd z;lAoNvmI0agABcMra7_m9e@5_&>J6HlRp65GVvR{cI@Sud&(P5UW8%KaRhrA3D0*S zB|&QjfzVw>G5`aHfq`Ulv+!~XqSu#US$nYy0PAt#mxo`CpKtvca;EU2#bV@%!~USo zXEK!aT=IMeuIoa`G~7=c17*@wJ);eb)`*e>K@=j4BN)@UO{266AAz9QAXEX(m}%a_ z(>FH|oGXUBpC&D(0pRbpAAG&(4}?p-_n{QkvaKz5{q>^k(3vNU9CzHx!ZI|27B*G4 z(#B}VrqER%E;Z^qKl<0F!M*P2UJvE7~=XH~A;zogBN43)hzrt^^5!;03q# zo!up7h6WQ67=YGLxO(ifc+K?Ndwn^U1;8!Xa*soC_D$*(JyPv6?!IC;$retk$x{x`0h zZ+P^pJvU*vxKxzN+mC9t%KtEofmbhc7ag{$xP%6Beau2pthH>nL$jr|6BB0k>w^RR zUyUd4#0SF*dwnU7Sg0AHiJ~D^i82bz1XctcDX=41>olGuN)m)dA>bGx#b{ESnrPp? z2&1K#VvtR|vJN740bupSo4wazQift}lzYW;Irg3$=SGy#Tf}gGl`;r}-8X~;7SqoYpQ=jYgWjrbdyb;7g*Hz5-H+5@W zk|@@ip%g$yK^ucGju9pa5|bc?LWqc_P^vW$UfYV}_$%-GCg{RL7V*1E|V-wSyc~vKyO>u4#Nfv|MbG;XXA|BA9+xZ7l{N4W-3RSskRB1 zwxf_+Z5N()(qJrQV6;J^6{0vnqBV3n@xydJ6l=snAwfcI4tNT)rcAZ3Mj}2V%h}mW zlCSjoWjkOl&YcDbWK=>=Z?vMn@8kX#49lUVOPx{C=M~_%9zzgV60|XBH`^$;tJtb` zsadN2$0h2E_g#=b15mxbl1ImhBPZaSd%oFR?ymUZjIKOyWfI9aNytcoVS^-5XoV3X zlOSS+fFqtkNz9^rUFgI=%V^I|{?&BPO5eFO=rBg=+j>N6^ZZQq2 z|6qn^OHCDUBMQ)HwWuA02;&5CqM#CuL}?@@LBa}wQQYE)TL`&ei(p5Pw2=-KMPl6W!{ z^nj=3i=~o&QwO|9Pm4Wbrq+<{E1pJA+^{IS1V3#5^#6RkZ`ZHK%L~uPbZZJ(Kew}` z!y*_@&vHf>10-5gY!qUn5UUuGjuDy!fr(HzEp8z|3vDrt5>JYm-_=D*-gn~w01L}W zL_t*ZjOG1@T^Xn-xHvjA+P7YudoO&i=(k$+_l=q153lnMU$QK}h=+>(RLEwL@!hmU zvXh<~Mp2Ahpn#-y~V~SI{UKhyE>_?fbq;V!UJaj0gRAl7JHyKMA)_+#N&ECw7|2Or(=H zkLsafhBEAsgn)oxf@Y0`6SO%*otmObjikoSO-*WF6Fd4#Z#v-(yS}~QJGdykqSr6e z0r9!Pk6~lw78Ik=m#r{k?_TGwDURkxxKPMZHsb)D(#eJyDp62IqZNe+lNb>v2suUt zbu=mX?lV{ZbC;yDKTpJUc?JeiuFMCpntS^1Bt zcxFdG`k1b=Xa3f~&Avmeo_T}+YG~3~PkYZaIyr_MvA!=e_}fTF;b&W4e#npa^(CJH z0NgZtE3$5`;3|Gy!DLR!bMA1#qS$Hjn+9z`=@3z=PK`U8qWwLR&JPaDAF*RLnl|UP z4xP5W0C2kd21FtmUXl!b>o{@5GY>1S!qDI#WpXYg0mf)(t&u2$FpN-Zwoq%e5GE1Y z6mt_TY{vH4vfFqm8NTUL>hXPKa(V7-#2hbQ<}AKu883PI9yQh6qbJYshjX9TjaZ-B zdT@cOmep%^0bo5YeRT8;3>HVl_{0MviBcz)RPA_z7${1&kU&*6Fx}@AZ_-9=`kU2% zU%#_-3;wnA{$3BeC*JG)6Cz4p_yo1?suMFu_pey8n2Li1kQ7Lw2r5=k%Ag%aXtmmC z1_7FJh_;RpQf#I~Np7QE*T8dLFEj-gMUUT|lTZ5Z!-dhO>B7v1&pIl53VycpX9#6{>YtmZUGl`@I(O-^QRMn^02omiA&L^T+Ywr=0PQeBkVI%FAsXC5 z6QS8E#@jPgdL3)?-OqjVYS7<3{(h|dWJ$Usb??+h#7GW*V&RzYt<9`Cc73pM@&Uc| zRYK9P-*?t0Kp%emUAy)8Wn%!WL&96ePwW2DU~{iWa}Xh*i56Vr=K&!UG{-6-Uul2{ zi8ctL7_A^c7{^FVS~w|2f&dX$P!~1Se=B|G=TQ8(ocsX*%(!#V)*(y?fnhlcU;29jN}@<7s5jcE)>>#b1GJg} zTI~>VqDZkp!kR;l(BcSfL^MsMk`n4OGwqrBYuCKI*O#;3Ja6(%a0TIlTi>y6i9hz5 zqRhL~(QMq%t)DE5m$X**ukQ5_E$bn(3joVHguQ6n>rtl`0+HN0A!eppI;3_On?^I> zdbN#qGenXoB*w62MxYg%CPs(^b5hD@4<|kbw}mU zzb>ZH6Y9+dX5vzfq`ZS2;I)&dJ@O~9tOLv*0a(@{E_M=3$kOI~?0;zA3%dpq$AzIeMVs`*6>k#*)@S8X;UY&r<<=e35#@+FRm<`HQ3aV%% zEi_e#R?Aac?oY*!?;Z)KdmmuHV_%*&mxotSGE#TvYw{;N~a)7=Lod^Lsta{qBAA z8Z;;#TWp3dT`LcN^(uck2|-9SBi4#TjyOib5(4J&((~9lvaG$lbmv=pJ%pZl54{eC^w^LYy5wkQ?cW{duSCZ6SP01)hBO;8%!UEs z!5g~tJzv6qeCgs|58JXH7P|njEXx9LmV5(1Jm#zHWvglVt5&;9k#l^wQj!59Nfclh z1Qs47IqV$&q03L}BZGRc$8K2yY)k*;}w^Xo;5<*}oW*!nkvSw>tOLDI<;#{_jYJ9#)yQeZj2VqiQa%)?547Ow~o zk1@{-4wmULfliV>W_$;#-fWBn1@WeuglN$ECoH$)bv3o>B}R4Q-BxIJXK02p>GxFxi@E@|RymIJKG$=SS_6)4qLE{rF)%pJbYO5pXX2kU>)Jf&&3-EZv#}1ieD8=Ca(6xMFT4XcE;B z%N)_~2r6u@DRw7LD0JVT`Riqg_qx41{C~RdP&0m{JwJA#LhIp9Ly?VcM}W1!4i{C! z?n|YL$HUK@@%vmq>pjE;3*-0?Y|>eM{hnTYE7#Q{GbH~lH%x z&#y*2lbKfDW4`Nz{HxC=KP$;zJsqQYP&n1-!RlMrzgDf7mKsSAT~j;^tQCRE*jYFF zS4$=D)_E7cO>zPeItdz0Ck0=||}%+1hvp1_sp<*NBpo#FA92o9T3Q(!Ss58aG&KFX>I&4L q0k@$fGdH!kBr&%DSr5<>6B8>VQ;43-cirJYJq(_%elF{r5}E)}ZC!i- literal 0 HcmV?d00001 diff --git a/docs/assets/sdai.png b/docs/assets/sdai.png deleted file mode 100644 index 810dd09209914db90a236c317bde8246b295b01a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32165 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 diff --git a/docs/assets/tlogo_1024.png b/docs/assets/tlogo_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..ab7f9073f6629b2d9989e9fa65c2165c18f81fdf GIT binary patch literal 1395441 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

*)mw{(pHyQh8o;vM)LSM>*|(esx=rkL>ypv$ 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

Q!7mK8-dR8mE+i=tNLAL#cfW45i2I6h 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%0A_pWzN>k~>BGTA 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%0Ayha5_e!KcE!PG@wf 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

    Otf}3 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�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
    IBE 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%0D}lb7bx8g+&ZG=`$&aA}Ip#Kr~` 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

    dOJsuKE^~f!=3-_56-o`! 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 literal 0 HcmV?d00001 diff --git a/docs/assets/wlogo_1024.png b/docs/assets/wlogo_1024.png new file mode 100644 index 0000000000000000000000000000000000000000..40e6b5c0e88f450d9cbdb3b5820733a850d4d9d9 GIT binary patch literal 571081 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 z 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 - - - - - SDAI Android App - - - - - - - - - - - - - - - - - - - + +

      +
      + +
      +
      - - - -
      -
      -
      -
      - - assets/sdai.png - - -
      -
      - -

      - Stable Diffusion AI for your Android smartphone.

      - +
      +
      + Pocket Diffusion -

      Generate Stable Diffusion AI - assets on your own Automatic1111 instance.

      +

      Pocket Diffusion AI

      -

      - Stable Diffusion AI is highly customizable and adaptable, allowing you to - connect to any user-defined automatic WebUI server and adjust the settings to - meet your specific needs. With its fast and reliable image generation - capabilities, Stable Diffusion AI is the perfect tool for developers, designers, - and anyone who needs to quickly generate images on the go. -

      - Try Stable Diffusion AI today and experience the power and convenience of mobile - image generation at your fingertips! -

      +

      Generate stunning AI images directly on your Android device. Connect to Automatic1111, ComfyUI, or generate locally with on-device models.

      -
      + + Download APK + - - - +
      +
      +
      🎨
      +

      Text to Image

      +

      Create images from text prompts using Stable Diffusion models

      +
      +
      +
      🖼️
      +

      Image to Image

      +

      Transform existing images with AI-powered editing

      +
      - - - +
      +
      📱
      +

      On-Device Generation

      +

      Run models locally on your phone with MediaPipe

      +
      +
      +
      🔗
      +

      Multiple Backends

      +

      Connect to A1111, ComfyUI, SwarmUI, and more

      -
      -
      - - - - - + diff --git a/docs/mediapipe.json b/docs/mediapipe.json index 501b3424e..90fa8f969 100644 --- a/docs/mediapipe.json +++ b/docs/mediapipe.json @@ -5,8 +5,7 @@ "size": "1.9 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-MediaPipe/releases/download/patch-26082024/stable-diffusion-v1-5.zip", - "https://share.moroz.cc/SDAI/MediaPipe/stable-diffusion-v1-5.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-MediaPipe/releases/download/patch-26082024/stable-diffusion-v1-5.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-MediaPipe/releases/download/patch-26082024/stable-diffusion-v1-5.zip" ], "metadata": { "src": "https://huggingface.co/runwayml/stable-diffusion-v1-5/blob/main/v1-5-pruned-emaonly.ckpt" @@ -18,8 +17,7 @@ "size": "1.82 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-MediaPipe/releases/download/patch-28082024/minisd.zip", - "https://share.moroz.cc/SDAI/MediaPipe/minisd.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-MediaPipe/releases/download/patch-28082024/minisd.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-MediaPipe/releases/download/patch-28082024/minisd.zip" ], "metadata": { "src": "https://huggingface.co/justinpinkney/miniSD/blob/main/miniSD.ckpt" @@ -31,8 +29,7 @@ "size": "1.82 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-MediaPipe/releases/download/patch-28082024/waifu-diffusion-v1-4.zip", - "https://share.moroz.cc/SDAI/MediaPipe/waifu-diffusion-v1-4.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-MediaPipe/releases/download/patch-28082024/waifu-diffusion-v1-4.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-MediaPipe/releases/download/patch-28082024/waifu-diffusion-v1-4.zip" ], "metadata": { "src": "https://huggingface.co/hakurei/waifu-diffusion-v1-4/blob/main/models/wd-1-3-penultimate-ucg-cont.ckpt" @@ -44,8 +41,7 @@ "size": "1.79 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-MediaPipe/releases/download/patch-19092024/aniverse_v50.zip", - "https://share.moroz.cc/SDAI/MediaPipe/aniverse_v50.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-MediaPipe/releases/download/patch-19092024/aniverse_v50.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-MediaPipe/releases/download/patch-19092024/aniverse_v50.zip" ], "metadata": { "src": "https://civitai.com/models/107842/aniverse" diff --git a/docs/models.json b/docs/models.json index 1755e9594..96288645f 100644 --- a/docs/models.json +++ b/docs/models.json @@ -5,8 +5,7 @@ "size": "1.2 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-14022024/chilloutmix.zip", - "https://share.moroz.cc/SDAI/ONNX/chilloutmix.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-14022024/chilloutmix.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-14022024/chilloutmix.zip" ] }, { @@ -15,8 +14,7 @@ "size": "1.01 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-14022024/majicmix.zip", - "https://share.moroz.cc/SDAI/ONNX/majicmix.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-14022024/majicmix.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-14022024/majicmix.zip" ] }, { @@ -25,8 +23,7 @@ "size": "1.8 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-14022024/realvision.zip", - "https://share.moroz.cc/SDAI/ONNX/realvision.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-14022024/realvision.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-14022024/realvision.zip" ] }, { @@ -35,8 +32,7 @@ "size": "1.0 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/analogMadness.zip", - "https://share.moroz.cc/SDAI/ONNX/analogMadness.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/analogMadness.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/analogMadness.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/miena%2Clyriel%2Ccetus%2Canalogmadness/analogMadness*" @@ -48,8 +44,7 @@ "size": "1.0 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/aniflatmix.zip", - "https://share.moroz.cc/SDAI/ONNX/aniflatmix.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/aniflatmix.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/aniflatmix.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/landscape_modelsfp32noslicing/aniflatmix*" @@ -61,8 +56,7 @@ "size": "1.1 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/beautifulRealistic_v60.zip", - "https://share.moroz.cc/SDAI/ONNX/beautifulRealistic_v60.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/beautifulRealistic_v60.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/beautifulRealistic_v60.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/beautifulrealv6%2Cmajicmix%2Ccyberreal%2Cepicrealism%2C/beautifulRealistic_v60" @@ -74,8 +68,7 @@ "size": "1.0 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/cetusMix.zip", - "https://share.moroz.cc/SDAI/ONNX/cetusMix.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/cetusMix.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/cetusMix.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/miena%2Clyriel%2Ccetus%2Canalogmadness/cetusMix*" @@ -87,8 +80,7 @@ "size": "1.0 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/counterfit-v3.0.zip", - "https://share.moroz.cc/SDAI/ONNX/counterfit-v3.0.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/counterfit-v3.0.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/counterfit-v3.0.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/Counterfeit-V3.0%2CA-ZovyaRPGArtistTools%2CBabes%2CDreamlikeDiffusion/counterfeit*" @@ -100,8 +92,7 @@ "size": "1.0 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/counterfit-v3.0-babes.zip", - "https://share.moroz.cc/SDAI/ONNX/counterfit-v3.0-babes.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/counterfit-v3.0-babes.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/counterfit-v3.0-babes.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/Counterfeit-V3.0%2CA-ZovyaRPGArtistTools%2CBabes%2CDreamlikeDiffusion/babes*" @@ -113,8 +104,7 @@ "size": "1.0 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/counterfit-v3.0-zovyarpg.zip", - "https://share.moroz.cc/SDAI/ONNX/counterfit-v3.0-zovyarpg.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/counterfit-v3.0-zovyarpg.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/counterfit-v3.0-zovyarpg.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/Counterfeit-V3.0%2CA-ZovyaRPGArtistTools%2CBabes%2CDreamlikeDiffusion/zovyarpg*" @@ -126,8 +116,7 @@ "size": "1.1 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/cyberrealistic_v32.zip", - "https://share.moroz.cc/SDAI/ONNX/cyberrealistic_v32.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/cyberrealistic_v32.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/cyberrealistic_v32.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/beautifulrealv6%2Cmajicmix%2Ccyberreal%2Cepicrealism%2C/cyberrealistic_v32" @@ -139,8 +128,7 @@ "size": "1.0 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/darkjunglemix.zip", - "https://share.moroz.cc/SDAI/ONNX/darkjunglemix.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/darkjunglemix.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/darkjunglemix.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/Realisticfantasy%2CdarkjungleMix%2CRestlessExistence%2CJucy666/darkjunglemix*" @@ -152,8 +140,7 @@ "size": "1.1 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/deliberate.zip", - "https://share.moroz.cc/SDAI/ONNX/deliberate.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/deliberate.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/deliberate.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/deliberate%2Cdreamshaper/deliberate*" @@ -165,8 +152,7 @@ "size": "1.1 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/dreamshaper.zip", - "https://share.moroz.cc/SDAI/ONNX/dreamshaper.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/dreamshaper.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/dreamshaper.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/deliberate%2Cdreamshaper/dreamshaper*" @@ -178,8 +164,7 @@ "size": "1.1 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/dreamlikep_r_2.zip", - "https://share.moroz.cc/SDAI/ONNX/dreamlikep_r_2.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/dreamlikep_r_2.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/dreamlikep_r_2.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/dreamlikep_r_2" @@ -191,8 +176,7 @@ "size": "1.1 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/epicrealism_pureEvolutionV4.zip", - "https://share.moroz.cc/SDAI/ONNX/epicrealism_pureEvolutionV4.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/epicrealism_pureEvolutionV4.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/epicrealism_pureEvolutionV4.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/beautifulrealv6%2Cmajicmix%2Ccyberreal%2Cepicrealism%2C/epicrealism_pureEvolutionV4" @@ -204,8 +188,7 @@ "size": "1.0 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/fantasticmix.zip", - "https://share.moroz.cc/SDAI/ONNX/fantasticmix.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/fantasticmix.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/fantasticmix.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/othermodels1/fantasticmix*" @@ -217,8 +200,7 @@ "size": "1.1 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/ICBINP.zip", - "https://share.moroz.cc/SDAI/ONNX/ICBINP.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/ICBINP.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/ICBINP.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/ICBINP" @@ -230,8 +212,7 @@ "size": "1.0 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/Jucy666.zip", - "https://share.moroz.cc/SDAI/ONNX/Jucy666.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/Jucy666.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/Jucy666.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/Realisticfantasy%2CdarkjungleMix%2CRestlessExistence%2CJucy666/Jucy666*" @@ -243,8 +224,7 @@ "size": "1.0 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/landscape.zip", - "https://share.moroz.cc/SDAI/ONNX/landscape.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/landscape.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/landscape.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/landscape_modelsfp32noslicing/landscape*" @@ -256,8 +236,7 @@ "size": "1.1 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/lyriel.zip", - "https://share.moroz.cc/SDAI/ONNX/lyriel.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/lyriel.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/lyriel.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/miena%2Clyriel%2Ccetus%2Canalogmadness/lyriel*" @@ -269,8 +248,7 @@ "size": "1.1 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/majicmixRealistic_betterV2V25.zip", - "https://share.moroz.cc/SDAI/ONNX/majicmixRealistic_betterV2V25.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/majicmixRealistic_betterV2V25.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/majicmixRealistic_betterV2V25.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/beautifulrealv6%2Cmajicmix%2Ccyberreal%2Cepicrealism%2C/majicmixRealistic_betterV2V25" @@ -282,8 +260,7 @@ "size": "1.0 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/meinamix.zip", - "https://share.moroz.cc/SDAI/ONNX/meinamix.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/meinamix.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/meinamix.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/miena%2Clyriel%2Ccetus%2Canalogmadness/meinamix*" @@ -295,8 +272,7 @@ "size": "1.0 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/meinaunreal.zip", - "https://share.moroz.cc/SDAI/ONNX/meinaunreal.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/meinaunreal.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/meinaunreal.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/othermodels1/meinaunreal*" @@ -308,8 +284,7 @@ "size": "1.0 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/mixreal.zip", - "https://share.moroz.cc/SDAI/ONNX/mixreal.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/mixreal.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/mixreal.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/landscape_modelsfp32noslicing/mixreal*" @@ -321,8 +296,7 @@ "size": "1.1 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/NED.zip", - "https://share.moroz.cc/SDAI/ONNX/NED.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/NED.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/NED.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/Never-ending-dream(NED(vae))" @@ -334,8 +308,7 @@ "size": "1.0 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/realexistence.zip", - "https://share.moroz.cc/SDAI/ONNX/realexistence.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/realexistence.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/realexistence.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/Realisticfantasy%2CdarkjungleMix%2CRestlessExistence%2CJucy666/realexistence*" @@ -347,8 +320,7 @@ "size": "1.0 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/realisticfantasy.zip", - "https://share.moroz.cc/SDAI/ONNX/realisticfantasy.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/realisticfantasy.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/realisticfantasy.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/Realisticfantasy%2CdarkjungleMix%2CRestlessExistence%2CJucy666/realisticfantasy*" @@ -360,8 +332,7 @@ "size": "1.0 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/sunshinemix.zip", - "https://share.moroz.cc/SDAI/ONNX/sunshinemix.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/sunshinemix.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/sunshinemix.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/othermodels1/sunshinemix*" @@ -373,8 +344,7 @@ "size": "1.0 Gb", "sources": [ "https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/universestable.zip", - "https://share.moroz.cc/SDAI/ONNX/universestable.zip", - "https://gh-proxy.ygxz.in/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/universestable.zip" + "https://gh.llkk.cc/https://github.com/ShiftHackZ/Local-Diffusion-Models-SDAI-ONXX/releases/download/patch-25022024/universestable.zip" ], "metadata": { "src": "https://huggingface.co/Androidonnxfork/test/tree/main/fp16fullonnxsdquantized_in_ort/othermodels1/universestable*" diff --git a/docs/motd.json b/docs/motd.json index 7b18951ea..6a0901cca 100644 --- a/docs/motd.json +++ b/docs/motd.json @@ -1,7 +1,5 @@ { - "display": true, - "title_old": "Cloud maintenance", - "subtitle_old": "SDAI cloud is now under maintenance. We are working hard to get online as soon as possible, come and check later.", - "title": "SDAI Cloud unavailable", - "subtitle": "SDAI cloud temporary unavailable due to technical maintenance, it will be available in November 2023." + "display": false, + "title": "Welcome to PDAI", + "subtitle": "Thank you for using Pocket Diffusion!" } diff --git a/docs/policy.html b/docs/policy.html index a77614aba..8cdcd442e 100644 --- a/docs/policy.html +++ b/docs/policy.html @@ -1,109 +1,103 @@ - - - - - Privacy Policy - - - - Privacy Policy

      - Dmitriy Moroz built the Stable Diffusion AI app as - an Ad Supported app. This SERVICE is provided by - Dmitriy Moroz at no cost and is intended for use as - is. -

      - This page is used to inform visitors regarding my - policies with the collection, use, and disclosure of Personal - Information if anyone decided to use my Service. -

      - If you choose to use my Service, then you agree to - the collection and use of information in relation to this - policy. The Personal Information that I collect is - used for providing and improving the Service. I will not use or share your information with - anyone except as described in this Privacy Policy. -

      - The terms used in this Privacy Policy have the same meanings - as in our Terms and Conditions, which are accessible at - Stable Diffusion AI unless otherwise defined in this Privacy Policy. -

      Information Collection and Use

      - For a better experience, while using our Service, I - may require you to provide us with certain personally - identifiable information. The information that - I request will be retained on your device and is not collected by me in any way. -

      - The app does use third-party services that may collect - information used to identify you. -

      - Link to the privacy policy of third-party service providers used - by the app -

      Log Data

      - I want to inform you that whenever you - use my Service, in a case of an error in the app - I collect data and information (through third-party - products) on your phone called Log Data. This Log Data may - include information such as your device Internet Protocol - (“IP”) address, device name, operating system version, the - configuration of the app when utilizing my Service, - the time and date of your use of the Service, and other - statistics. -

      Cookies

      - Cookies are files with a small amount of data that are - commonly used as anonymous unique identifiers. These are sent - to your browser from the websites that you visit and are - stored on your device's internal memory. -

      - This Service does not use these “cookies” explicitly. However, - the app may use third-party code and libraries that use - “cookies” to collect information and improve their services. - You have the option to either accept or refuse these cookies - and know when a cookie is being sent to your device. If you - choose to refuse our cookies, you may not be able to use some - portions of this Service. -

      Service Providers

      - I may employ third-party companies and - individuals due to the following reasons: -

      • To facilitate our Service;
      • To provide the Service on our behalf;
      • To perform Service-related services; or
      • To assist us in analyzing how our Service is used.

      - I want to inform users of this Service - that these third parties have access to their Personal - Information. The reason is to perform the tasks assigned to - them on our behalf. However, they are obligated not to - disclose or use the information for any other purpose. -

      Security

      - I value your trust in providing us your - Personal Information, thus we are striving to use commercially - acceptable means of protecting it. But remember that no method - of transmission over the internet, or method of electronic - storage is 100% secure and reliable, and I cannot - guarantee its absolute security. -

      Links to Other Sites

      - This Service may contain links to other sites. If you click on - a third-party link, you will be directed to that site. Note - that these external sites are not operated by me. - Therefore, I strongly advise you to review the - Privacy Policy of these websites. I have - no control over and assume no responsibility for the content, - privacy policies, or practices of any third-party sites or - services. -

      Children’s Privacy

      - These Services do not address anyone under the age of 13. - I do not knowingly collect personally - identifiable information from children under 13 years of age. In the case - I discover that a child under 13 has provided - me with personal information, I immediately - delete this from our servers. If you are a parent or guardian - and you are aware that your child has provided us with - personal information, please contact me so that - I will be able to do the necessary actions. -

      Changes to This Privacy Policy

      - I may update our Privacy Policy from - time to time. Thus, you are advised to review this page - periodically for any changes. I will - notify you of any changes by posting the new Privacy Policy on - this page. -

      This policy is effective as of 2023-03-12

      Contact Us

      - If you have any questions or suggestions about my - Privacy Policy, do not hesitate to contact me at sdai@moroz.cc. - - - + + + + + Privacy Policy - Pocket Diffusion + + + +

      Privacy Policy

      + +

      + crims0n built the Pocket Diffusion app as a Free and Open Source app. + This SERVICE is provided at no cost and is intended for use as is. +

      + +

      + This page is used to inform visitors regarding policies with the collection, + use, and disclosure of Personal Information if anyone decided to use this Service. +

      + +

      Information Collection and Use

      + +

      + Pocket Diffusion does not collect any personal information. All image generation + happens either on your device locally or on servers you configure yourself. + We do not have access to your prompts, images, or any other data. +

      + +

      + The app may connect to third-party servers (such as Automatic1111, ComfyUI, etc.) + that you configure. The privacy policies of those services apply to data sent to them. +

      + +

      On-Device Generation

      + +

      + When using on-device generation (MediaPipe), all processing happens locally on your + Android device. No data is sent to any external servers. +

      + +

      Log Data

      + +

      + The app may create local log files on your device for debugging purposes. + These logs are stored only on your device and are not transmitted anywhere. +

      + +

      Third-Party Services

      + +

      + The FOSS version of the app does not include any third-party analytics or tracking services. +

      + +

      Links to Other Sites

      + +

      + This Service may contain links to other sites. If you click on a third-party link, + you will be directed to that site. Note that these external sites are not operated by us. + Therefore, we strongly advise you to review the Privacy Policy of these websites. +

      + +

      Children's Privacy

      + +

      + These Services do not address anyone under the age of 13. We do not knowingly collect + personally identifiable information from children under 13 years of age. +

      + +

      Changes to This Privacy Policy

      + +

      + We may update our Privacy Policy from time to time. Thus, you are advised to review + this page periodically for any changes. +

      + +

      This policy is effective as of 2026-01-01

      + +

      Contact Us

      + +

      + If you have any questions or suggestions about this Privacy Policy, + do not hesitate to contact us at crims0n@minios.dev. +

      + +

      + ← Back to Home +

      + + + diff --git a/docs/qnn.json b/docs/qnn.json index 6db5a0c86..a3c8aa6d0 100644 --- a/docs/qnn.json +++ b/docs/qnn.json @@ -2,9 +2,9 @@ { "id": "qnn-anything-v5-8gen2", "name": "Anything V5 (8Gen2/3/4)", - "size": "850 MB", + "size": "1.06 GB", "sources": [ - "https://huggingface.co/xororz/sd-qnn/resolve/main/AnythingV5_8gen2.zip" + "https://huggingface.co/xororz/sd-qnn/resolve/main/AnythingV5_qnn2.28_8gen2.zip" ], "metadata": { "src": "https://huggingface.co/xororz/sd-qnn", @@ -15,9 +15,9 @@ { "id": "qnn-anything-v5-8gen1", "name": "Anything V5 (8Gen1)", - "size": "850 MB", + "size": "1.06 GB", "sources": [ - "https://huggingface.co/xororz/sd-qnn/resolve/main/AnythingV5_8gen1.zip" + "https://huggingface.co/xororz/sd-qnn/resolve/main/AnythingV5_qnn2.28_8gen1.zip" ], "metadata": { "src": "https://huggingface.co/xororz/sd-qnn", @@ -25,12 +25,25 @@ "type": "npu" } }, + { + "id": "qnn-anything-v5-min", + "name": "Anything V5 (Other Snapdragon)", + "size": "995 MB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/AnythingV5_qnn2.28_min.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "min", + "type": "npu" + } + }, { "id": "qnn-qteamix-8gen2", "name": "QteaMix (8Gen2/3/4)", - "size": "850 MB", + "size": "1.06 GB", "sources": [ - "https://huggingface.co/xororz/sd-qnn/resolve/main/QteaMix_8gen2.zip" + "https://huggingface.co/xororz/sd-qnn/resolve/main/QteaMix_qnn2.28_8gen2.zip" ], "metadata": { "src": "https://huggingface.co/xororz/sd-qnn", @@ -41,9 +54,9 @@ { "id": "qnn-qteamix-8gen1", "name": "QteaMix (8Gen1)", - "size": "850 MB", + "size": "1.06 GB", "sources": [ - "https://huggingface.co/xororz/sd-qnn/resolve/main/QteaMix_8gen1.zip" + "https://huggingface.co/xororz/sd-qnn/resolve/main/QteaMix_qnn2.28_8gen1.zip" ], "metadata": { "src": "https://huggingface.co/xororz/sd-qnn", @@ -51,12 +64,25 @@ "type": "npu" } }, + { + "id": "qnn-qteamix-min", + "name": "QteaMix (Other Snapdragon)", + "size": "995 MB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/QteaMix_qnn2.28_min.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "min", + "type": "npu" + } + }, { "id": "qnn-cuteyukimix-8gen2", "name": "CuteYukiMix (8Gen2/3/4)", - "size": "850 MB", + "size": "1.06 GB", "sources": [ - "https://huggingface.co/xororz/sd-qnn/resolve/main/CuteYukiMix_8gen2.zip" + "https://huggingface.co/xororz/sd-qnn/resolve/main/CuteYukiMix_qnn2.28_8gen2.zip" ], "metadata": { "src": "https://huggingface.co/xororz/sd-qnn", @@ -67,9 +93,9 @@ { "id": "qnn-cuteyukimix-8gen1", "name": "CuteYukiMix (8Gen1)", - "size": "850 MB", + "size": "1.06 GB", "sources": [ - "https://huggingface.co/xororz/sd-qnn/resolve/main/CuteYukiMix_8gen1.zip" + "https://huggingface.co/xororz/sd-qnn/resolve/main/CuteYukiMix_qnn2.28_8gen1.zip" ], "metadata": { "src": "https://huggingface.co/xororz/sd-qnn", @@ -77,12 +103,25 @@ "type": "npu" } }, + { + "id": "qnn-cuteyukimix-min", + "name": "CuteYukiMix (Other Snapdragon)", + "size": "994 MB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/CuteYukiMix_qnn2.28_min.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "min", + "type": "npu" + } + }, { "id": "qnn-absolutereality-8gen2", "name": "Absolute Reality (8Gen2/3/4)", - "size": "850 MB", + "size": "1.05 GB", "sources": [ - "https://huggingface.co/xororz/sd-qnn/resolve/main/AbsoluteReality_8gen2.zip" + "https://huggingface.co/xororz/sd-qnn/resolve/main/AbsoluteReality_qnn2.28_8gen2.zip" ], "metadata": { "src": "https://huggingface.co/xororz/sd-qnn", @@ -93,9 +132,9 @@ { "id": "qnn-absolutereality-8gen1", "name": "Absolute Reality (8Gen1)", - "size": "850 MB", + "size": "1.06 GB", "sources": [ - "https://huggingface.co/xororz/sd-qnn/resolve/main/AbsoluteReality_8gen1.zip" + "https://huggingface.co/xororz/sd-qnn/resolve/main/AbsoluteReality_qnn2.28_8gen1.zip" ], "metadata": { "src": "https://huggingface.co/xororz/sd-qnn", @@ -103,12 +142,25 @@ "type": "npu" } }, + { + "id": "qnn-absolutereality-min", + "name": "Absolute Reality (Other Snapdragon)", + "size": "993 MB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/AbsoluteReality_qnn2.28_min.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "min", + "type": "npu" + } + }, { "id": "qnn-chilloutmix-8gen2", "name": "ChilloutMix (8Gen2/3/4)", - "size": "850 MB", + "size": "1.07 GB", "sources": [ - "https://huggingface.co/xororz/sd-qnn/resolve/main/ChilloutMix_8gen2.zip" + "https://huggingface.co/xororz/sd-qnn/resolve/main/ChilloutMix_qnn2.28_8gen2.zip" ], "metadata": { "src": "https://huggingface.co/xororz/sd-qnn", @@ -119,9 +171,477 @@ { "id": "qnn-chilloutmix-8gen1", "name": "ChilloutMix (8Gen1)", - "size": "850 MB", + "size": "1.07 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/ChilloutMix_qnn2.28_8gen1.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "8gen1", + "type": "npu" + } + }, + { + "id": "qnn-chilloutmix-min", + "name": "ChilloutMix (Other Snapdragon)", + "size": "1.01 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/ChilloutMix_qnn2.28_min.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "min", + "type": "npu" + } + }, + { + "id": "qnn-crosskemono-8gen2", + "name": "Cross Kemono 2.5 (8Gen2/3/4)", + "size": "1.07 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/CrossKemono2.5_qnn2.28_8gen2.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "8gen2", + "type": "npu" + } + }, + { + "id": "qnn-crosskemono-8gen1", + "name": "Cross Kemono 2.5 (8Gen1)", + "size": "1.07 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/CrossKemono2.5_qnn2.28_8gen1.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "8gen1", + "type": "npu" + } + }, + { + "id": "qnn-crosskemono-min", + "name": "Cross Kemono 2.5 (Other Snapdragon)", + "size": "1.01 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/CrossKemono2.5_qnn2.28_min.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "min", + "type": "npu" + } + }, + { + "id": "qnn-darksushiv4-8gen2", + "name": "Dark Sushi V4 (8Gen2/3/4)", + "size": "1.03 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/DarkSushiV4_qnn2.28_8gen2.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "8gen2", + "type": "npu" + } + }, + { + "id": "qnn-darksushiv4-8gen1", + "name": "Dark Sushi V4 (8Gen1)", + "size": "1.03 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/DarkSushiV4_qnn2.28_8gen1.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "8gen1", + "type": "npu" + } + }, + { + "id": "qnn-darksushiv4-min", + "name": "Dark Sushi V4 (Other Snapdragon)", + "size": "1.16 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/DarkSushiV4_qnn2.28_min.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "min", + "type": "npu" + } + }, + { + "id": "qnn-dreamshaperv8-8gen2", + "name": "DreamShaper V8 (8Gen2/3/4)", + "size": "1.03 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/DreamShaperV8_qnn2.28_8gen2.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "8gen2", + "type": "npu" + } + }, + { + "id": "qnn-dreamshaperv8-8gen1", + "name": "DreamShaper V8 (8Gen1)", + "size": "1.03 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/DreamShaperV8_qnn2.28_8gen1.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "8gen1", + "type": "npu" + } + }, + { + "id": "qnn-dreamshaperv8-min", + "name": "DreamShaper V8 (Other Snapdragon)", + "size": "1.15 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/DreamShaperV8_qnn2.28_min.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "min", + "type": "npu" + } + }, + { + "id": "qnn-hyperspirev5-8gen2", + "name": "HyperSpire V5 (8Gen2/3/4)", + "size": "1.07 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/HyperSpireV5_qnn2.28_8gen2.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "8gen2", + "type": "npu" + } + }, + { + "id": "qnn-hyperspirev5-8gen1", + "name": "HyperSpire V5 (8Gen1)", + "size": "1.07 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/HyperSpireV5_qnn2.28_8gen1.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "8gen1", + "type": "npu" + } + }, + { + "id": "qnn-hyperspirev5-min", + "name": "HyperSpire V5 (Other Snapdragon)", + "size": "1.01 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/HyperSpireV5_qnn2.28_min.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "min", + "type": "npu" + } + }, + { + "id": "qnn-majicmixrealisticv7-8gen2", + "name": "MajicMix Realistic V7 (8Gen2/3/4)", + "size": "1.06 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/MajicmixRealisticV7_qnn2.28_8gen2.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "8gen2", + "type": "npu" + } + }, + { + "id": "qnn-majicmixrealisticv7-8gen1", + "name": "MajicMix Realistic V7 (8Gen1)", + "size": "1.06 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/MajicmixRealisticV7_qnn2.28_8gen1.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "8gen1", + "type": "npu" + } + }, + { + "id": "qnn-majicmixrealisticv7-min", + "name": "MajicMix Realistic V7 (Other Snapdragon)", + "size": "993 MB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/MajicmixRealisticV7_qnn2.28_min.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "min", + "type": "npu" + } + }, + { + "id": "qnn-meinamixv12-8gen2", + "name": "MeinaMix V12 (8Gen2/3/4)", + "size": "1.03 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/MeinaMixV12_qnn2.28_8gen2.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "8gen2", + "type": "npu" + } + }, + { + "id": "qnn-meinamixv12-8gen1", + "name": "MeinaMix V12 (8Gen1)", + "size": "1.03 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/MeinaMixV12_qnn2.28_8gen1.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "8gen1", + "type": "npu" + } + }, + { + "id": "qnn-meinamixv12-min", + "name": "MeinaMix V12 (Other Snapdragon)", + "size": "1.16 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/MeinaMixV12_qnn2.28_min.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "min", + "type": "npu" + } + }, + { + "id": "qnn-mistoonanimev3-8gen2", + "name": "Mistoon Anime V3 (8Gen2/3/4)", + "size": "1.05 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/MistoonAnimeV3_qnn2.28_8gen2.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "8gen2", + "type": "npu" + } + }, + { + "id": "qnn-mistoonanimev3-8gen1", + "name": "Mistoon Anime V3 (8Gen1)", + "size": "1.06 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/MistoonAnimeV3_qnn2.28_8gen1.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "8gen1", + "type": "npu" + } + }, + { + "id": "qnn-mistoonanimev3-min", + "name": "Mistoon Anime V3 (Other Snapdragon)", + "size": "991 MB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/MistoonAnimeV3_qnn2.28_min.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "min", + "type": "npu" + } + }, + { + "id": "qnn-naianimev2-8gen2", + "name": "NAI Anime V2 (8Gen2/3/4)", + "size": "1.05 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/NaiAnimeV2_qnn2.28_8gen2.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "8gen2", + "type": "npu" + } + }, + { + "id": "qnn-naianimev2-8gen1", + "name": "NAI Anime V2 (8Gen1)", + "size": "1.06 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/NaiAnimeV2_qnn2.28_8gen1.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "8gen1", + "type": "npu" + } + }, + { + "id": "qnn-naianimev2-min", + "name": "NAI Anime V2 (Other Snapdragon)", + "size": "990 MB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/NaiAnimeV2_qnn2.28_min.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "min", + "type": "npu" + } + }, + { + "id": "qnn-neverendingdreamv122-8gen2", + "name": "NeverEnding Dream V1.22 (8Gen2/3/4)", + "size": "1.03 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/NeverEndingDreamV122_qnn2.28_8gen2.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "8gen2", + "type": "npu" + } + }, + { + "id": "qnn-neverendingdreamv122-8gen1", + "name": "NeverEnding Dream V1.22 (8Gen1)", + "size": "1.03 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/NeverEndingDreamV122_qnn2.28_8gen1.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "8gen1", + "type": "npu" + } + }, + { + "id": "qnn-neverendingdreamv122-min", + "name": "NeverEnding Dream V1.22 (Other Snapdragon)", + "size": "1.16 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/NeverEndingDreamV122_qnn2.28_min.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "min", + "type": "npu" + } + }, + { + "id": "qnn-realisianv6-8gen2", + "name": "Realisian V6 (8Gen2/3/4)", + "size": "1.04 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/RealisianV6_qnn2.28_8gen2.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "8gen2", + "type": "npu" + } + }, + { + "id": "qnn-realisianv6-8gen1", + "name": "Realisian V6 (8Gen1)", + "size": "1.04 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/RealisianV6_qnn2.28_8gen1.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "8gen1", + "type": "npu" + } + }, + { + "id": "qnn-realisianv6-min", + "name": "Realisian V6 (Other Snapdragon)", + "size": "1.17 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/RealisianV6_qnn2.28_min.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "min", + "type": "npu" + } + }, + { + "id": "qnn-realisticvisionhyper-8gen2", + "name": "Realistic Vision Hyper (8Gen2/3/4)", + "size": "1.07 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/RealisticVisionHyper_qnn2.28_8gen2.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "8gen2", + "type": "npu" + } + }, + { + "id": "qnn-realisticvisionhyper-8gen1", + "name": "Realistic Vision Hyper (8Gen1)", + "size": "1.07 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/RealisticVisionHyper_qnn2.28_8gen1.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "8gen1", + "type": "npu" + } + }, + { + "id": "qnn-realisticvisionhyper-min", + "name": "Realistic Vision Hyper (Other Snapdragon)", + "size": "1.01 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/RealisticVisionHyper_qnn2.28_min.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "min", + "type": "npu" + } + }, + { + "id": "qnn-sweetmixv22flat-8gen2", + "name": "SweetMix V2.2 Flat (8Gen2/3/4)", + "size": "1.03 GB", + "sources": [ + "https://huggingface.co/xororz/sd-qnn/resolve/main/SweetMixV22Flat_qnn2.28_8gen2.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-qnn", + "chipset": "8gen2", + "type": "npu" + } + }, + { + "id": "qnn-sweetmixv22flat-8gen1", + "name": "SweetMix V2.2 Flat (8Gen1)", + "size": "1.03 GB", "sources": [ - "https://huggingface.co/xororz/sd-qnn/resolve/main/ChilloutMix_8gen1.zip" + "https://huggingface.co/xororz/sd-qnn/resolve/main/SweetMixV22Flat_qnn2.28_8gen1.zip" ], "metadata": { "src": "https://huggingface.co/xororz/sd-qnn", @@ -132,7 +652,7 @@ { "id": "mnn-anything-v5", "name": "Anything V5 (CPU/MNN)", - "size": "1.1 GB", + "size": "1.19 GB", "sources": [ "https://huggingface.co/xororz/sd-mnn/resolve/main/AnythingV5.zip" ], @@ -144,7 +664,7 @@ { "id": "mnn-qteamix", "name": "QteaMix (CPU/MNN)", - "size": "1.1 GB", + "size": "1.19 GB", "sources": [ "https://huggingface.co/xororz/sd-mnn/resolve/main/QteaMix.zip" ], @@ -156,7 +676,7 @@ { "id": "mnn-cuteyukimix", "name": "CuteYukiMix (CPU/MNN)", - "size": "1.1 GB", + "size": "1.19 GB", "sources": [ "https://huggingface.co/xororz/sd-mnn/resolve/main/CuteYukiMix.zip" ], @@ -168,7 +688,7 @@ { "id": "mnn-absolutereality", "name": "Absolute Reality (CPU/MNN)", - "size": "1.1 GB", + "size": "1.19 GB", "sources": [ "https://huggingface.co/xororz/sd-mnn/resolve/main/AbsoluteReality.zip" ], @@ -180,7 +700,7 @@ { "id": "mnn-chilloutmix", "name": "ChilloutMix (CPU/MNN)", - "size": "1.1 GB", + "size": "1.2 GB", "sources": [ "https://huggingface.co/xororz/sd-mnn/resolve/main/ChilloutMix.zip" ], diff --git a/docs/supporters.json b/docs/supporters.json index 995a87d82..fe51488c7 100644 --- a/docs/supporters.json +++ b/docs/supporters.json @@ -1,65 +1 @@ -[ - { - "id": 0, - "name": "Sören", - "date": "2023-06-27", - "amount": "10.00", - "currency": "USD", - "type": "bmc", - "message": "I like your Stable-Diffusion-Android-App! 👍" - }, - { - "id": 1, - "name": "roguelichen", - "date": "2024-02-11", - "amount": "25.00", - "currency": "USD", - "type": "bmc", - "message": "Thank you for SDAI, it's been a great deal of stimulating fun 👍" - }, - { - "id": 2, - "name": "Wyvern Dryke", - "date": "2024-06-12", - "amount": "5.00", - "currency": "USD", - "type": "bmc", - "message": "I don't have much money, but wanted to express my sincere thanks for SDAI. Thanks to you, I can keep creating art even though my illness has worsened. I can now access Automatic1111 remotely from the couch! It means so much to me, that I can keep on creating even though I can no longer sit at the desk to use my powerhouse machine. Now even my crappy tablet can do it, lol. Thank you so much! <3" - }, - { - "id": 3, - "name": "Jacob", - "date": "2024-09-02", - "amount": "5.00", - "currency": "USD", - "type": "bmc", - "message": "" - }, - { - "id": 4, - "name": "Someone", - "date": "2024-10-24", - "amount": "5.00", - "currency": "USD", - "type": "bmc", - "message": "" - }, - { - "id": 5, - "name": "Someone", - "date": "2024-11-05", - "amount": "15.00", - "currency": "USD", - "type": "bmc", - "message": "Hey shifthackz I just wanted to show my appreciation I got a little extra money and wanted to give:)" - }, - { - "id": 6, - "name": "Someone", - "date": "2024-11-22", - "amount": "5.00", - "currency": "USD", - "type": "bmc", - "message": "" - } -] +[] diff --git a/docs/version.json b/docs/version.json index fb3a46ed9..3d1811877 100644 --- a/docs/version.json +++ b/docs/version.json @@ -1,4 +1,3 @@ { - "googleplay": "0.5.3", - "fdroid": "0.4.3" -} + "github": "1.0.0" +} From 08bca0e287ce26dde8afe35b963fe2a4cb326828 Mon Sep 17 00:00:00 2001 From: crim50n Date: Fri, 2 Jan 2026 00:31:14 +0300 Subject: [PATCH 18/42] feat: redesign index and policy pages with improved layout and styling --- docs/css/style.css | 262 ++++++++++++++++++++++++++++++++++++++++++++ docs/index.html | 268 ++++++++++++--------------------------------- docs/policy.html | 237 ++++++++++++++++++++++++--------------- 3 files changed, 480 insertions(+), 287 deletions(-) create mode 100644 docs/css/style.css diff --git a/docs/css/style.css b/docs/css/style.css new file mode 100644 index 000000000..0708a4d63 --- /dev/null +++ b/docs/css/style.css @@ -0,0 +1,262 @@ +:root { + --primary-color: #667eea; + --secondary-color: #764ba2; + --accent-color: #ffd700; + --bg-color: #0f172a; + --text-color: #e2e8f0; + --card-bg: rgba(30, 41, 59, 0.7); + --card-border: rgba(148, 163, 184, 0.1); + --font-main: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif; +} + +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: var(--font-main); + background-color: var(--bg-color); + color: var(--text-color); + line-height: 1.6; + overflow-x: hidden; +} + +/* Background Gradient Animation */ +body::before { + content: ''; + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: radial-gradient(circle at 50% 0%, #2d1b4e 0%, var(--bg-color) 50%); + z-index: -1; +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 0 20px; +} + +/* Header */ +header { + padding: 20px 0; + position: fixed; + width: 100%; + top: 0; + z-index: 100; + backdrop-filter: blur(10px); + background: rgba(15, 23, 42, 0.8); + border-bottom: 1px solid var(--card-border); +} + +nav { + display: flex; + justify-content: space-between; + align-items: center; +} + +.logo { + font-size: 1.5rem; + font-weight: 700; + color: white; + text-decoration: none; + display: flex; + align-items: center; + gap: 10px; +} + +.logo img { + height: 32px; + width: auto; +} + +.nav-links a { + color: var(--text-color); + text-decoration: none; + margin-left: 20px; + font-weight: 500; + transition: color 0.3s; +} + +.nav-links a:hover { + color: var(--primary-color); +} + +.btn-primary { + background: linear-gradient(135deg, var(--primary-color), var(--secondary-color)); + color: white; + padding: 10px 24px; + border-radius: 50px; + text-decoration: none; + font-weight: 600; + transition: transform 0.2s, box-shadow 0.2s; + display: inline-block; +} + +.btn-primary:hover { + transform: translateY(-2px); + box-shadow: 0 4px 12px rgba(118, 75, 162, 0.4); +} + +/* Hero Section */ +.hero { + padding: 160px 0 80px; + text-align: center; + display: flex; + flex-direction: column; + align-items: center; +} + +.hero-icon { + width: 120px; + height: 120px; + border-radius: 24px; + margin-bottom: 30px; + box-shadow: 0 20px 60px rgba(0, 0, 0, 0.3); + animation: float 6s ease-in-out infinite; +} + +@keyframes float { + 0% { transform: translateY(0px); } + 50% { transform: translateY(-10px); } + 100% { transform: translateY(0px); } +} + +.hero h1 { + font-size: 3.5rem; + font-weight: 800; + margin-bottom: 20px; + background: linear-gradient(to right, #fff, #a5b4fc); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; + line-height: 1.2; +} + +.hero p { + font-size: 1.25rem; + color: #94a3b8; + max-width: 600px; + margin: 0 auto 40px; +} + +.hero-buttons { + display: flex; + gap: 20px; + justify-content: center; + margin-bottom: 60px; +} + +.btn-secondary { + background: rgba(255, 255, 255, 0.1); + color: white; + padding: 10px 24px; + border-radius: 50px; + text-decoration: none; + font-weight: 600; + transition: background 0.3s; + border: 1px solid rgba(255, 255, 255, 0.1); +} + +.btn-secondary:hover { + background: rgba(255, 255, 255, 0.2); +} + +.hero-image { + max-width: 100%; + border-radius: 20px; + box-shadow: 0 20px 80px rgba(0, 0, 0, 0.5); + border: 1px solid var(--card-border); + margin-top: 40px; +} + +/* Features Grid */ +.features { + padding: 80px 0; +} + +.section-title { + text-align: center; + font-size: 2.5rem; + margin-bottom: 60px; + color: white; +} + +.features-grid { + display: grid; + grid-template-columns: repeat(auto-fit, minmax(300px, 1fr)); + gap: 30px; +} + +.feature-card { + background: var(--card-bg); + border: 1px solid var(--card-border); + padding: 30px; + border-radius: 20px; + transition: transform 0.3s; +} + +.feature-card:hover { + transform: translateY(-5px); + border-color: var(--primary-color); +} + +.feature-icon { + font-size: 2rem; + margin-bottom: 20px; + background: linear-gradient(135deg, var(--primary-color), var(--secondary-color)); + -webkit-background-clip: text; + -webkit-text-fill-color: transparent; +} + +.feature-card h3 { + font-size: 1.5rem; + margin-bottom: 15px; + color: white; +} + +.feature-card p { + color: #94a3b8; +} + +/* Footer */ +footer { + padding: 60px 0 30px; + border-top: 1px solid var(--card-border); + margin-top: 80px; + text-align: center; + color: #64748b; +} + +.footer-links { + margin-bottom: 30px; +} + +.footer-links a { + color: #94a3b8; + text-decoration: none; + margin: 0 15px; + transition: color 0.3s; +} + +.footer-links a:hover { + color: var(--primary-color); +} + +/* Responsive */ +@media (max-width: 768px) { + .hero h1 { + font-size: 2.5rem; + } + + .hero-buttons { + flex-direction: column; + } + + .nav-links { + display: none; /* Simple mobile menu hide for now */ + } +} diff --git a/docs/index.html b/docs/index.html index 8865500d7..544ea99da 100644 --- a/docs/index.html +++ b/docs/index.html @@ -7,220 +7,94 @@ - - + + +
      - +
      -
      -
      - Pocket Diffusion - -

      Pocket Diffusion AI

      - -

      Generate stunning AI images directly on your Android device. Connect to Automatic1111, ComfyUI, or generate locally with on-device models.

      - - - Download APK - - -
      -
      -
      🎨
      -

      Text to Image

      -

      Create images from text prompts using Stable Diffusion models

      -
      - -
      -
      🖼️
      -

      Image to Image

      -

      Transform existing images with AI-powered editing

      +
      +
      +
      + Pocket Diffusion Icon +

      AI Image Generation
      in your Pocket

      +

      Generate stunning AI art directly on your Android device.
      Connect to powerful backends or run locally with privacy in mind.

      + + -
      -
      📱
      -

      On-Device Generation

      -

      Run models locally on your phone with MediaPipe

      -
      - -
      -
      🔗
      -

      Multiple Backends

      -

      Connect to A1111, ComfyUI, SwarmUI, and more

      + App Screenshot +
      +
      + +
      +
      +

      Why Pocket Diffusion?

      +
      +
      + +

      On-Device Generation

      +

      Run Stable Diffusion models locally on your device using MediaPipe. No internet connection required for generation.

      +
      +
      + +

      Remote Backends

      +

      Connect to your own Automatic1111 or ComfyUI server for unlimited power and model flexibility.

      +
      +
      + +

      Privacy First

      +

      Your prompts and images stay yours. No data collection, no tracking, completely open source.

      +
      +
      + +

      User Friendly

      +

      Clean, modern Material You interface designed for mobile. Easy to use for beginners and pros alike.

      +
      +
      + +

      Open Source

      +

      Fully open source code. Audit, contribute, or build your own version. Community driven development.

      +
      +
      + +

      Fast & Efficient

      +

      Optimized for Android devices. Uses hardware acceleration where available for best performance.

      +
      -
      +
      diff --git a/docs/policy.html b/docs/policy.html index 8cdcd442e..007d0f645 100644 --- a/docs/policy.html +++ b/docs/policy.html @@ -1,103 +1,160 @@ - + - - + + Privacy Policy - Pocket Diffusion + + + - - -

      Privacy Policy

      - -

      - crims0n built the Pocket Diffusion app as a Free and Open Source app. - This SERVICE is provided at no cost and is intended for use as is. -

      - -

      - This page is used to inform visitors regarding policies with the collection, - use, and disclosure of Personal Information if anyone decided to use this Service. -

      - -

      Information Collection and Use

      - -

      - Pocket Diffusion does not collect any personal information. All image generation - happens either on your device locally or on servers you configure yourself. - We do not have access to your prompts, images, or any other data. -

      - -

      - The app may connect to third-party servers (such as Automatic1111, ComfyUI, etc.) - that you configure. The privacy policies of those services apply to data sent to them. -

      - -

      On-Device Generation

      - -

      - When using on-device generation (MediaPipe), all processing happens locally on your - Android device. No data is sent to any external servers. -

      - -

      Log Data

      - -

      - The app may create local log files on your device for debugging purposes. - These logs are stored only on your device and are not transmitted anywhere. -

      - -

      Third-Party Services

      - -

      - The FOSS version of the app does not include any third-party analytics or tracking services. -

      -

      Links to Other Sites

      - -

      - This Service may contain links to other sites. If you click on a third-party link, - you will be directed to that site. Note that these external sites are not operated by us. - Therefore, we strongly advise you to review the Privacy Policy of these websites. -

      - -

      Children's Privacy

      - -

      - These Services do not address anyone under the age of 13. We do not knowingly collect - personally identifiable information from children under 13 years of age. -

      - -

      Changes to This Privacy Policy

      - -

      - We may update our Privacy Policy from time to time. Thus, you are advised to review - this page periodically for any changes. -

      + .policy-content h1 { + color: white; + margin-bottom: 30px; + font-size: 2.5rem; + text-align: center; + } -

      This policy is effective as of 2026-01-01

      + .policy-content h2 { + color: var(--primary-color); + margin-top: 40px; + margin-bottom: 20px; + font-size: 1.5rem; + } -

      Contact Us

      + .policy-content p { + margin-bottom: 20px; + color: #cbd5e1; + } -

      - If you have any questions or suggestions about this Privacy Policy, - do not hesitate to contact us at crims0n@minios.dev. -

      + .policy-content a { + color: var(--primary-color); + text-decoration: none; + } -

      - ← Back to Home -

      + .policy-content a:hover { + text-decoration: underline; + } + + + +
      + +
      + +
      +
      +

      Privacy Policy

      + +

      + crims0n built the Pocket Diffusion app as a Free and Open Source app. + This SERVICE is provided at no cost and is intended for use as is. +

      + +

      + This page is used to inform visitors regarding policies with the collection, + use, and disclosure of Personal Information if anyone decided to use this Service. +

      + +

      Information Collection and Use

      + +

      + Pocket Diffusion does not collect any personal information. All image generation + happens either on your device locally or on servers you configure yourself. + We do not have access to your prompts, images, or any other data. +

      + +

      + The app may connect to third-party servers (such as Automatic1111, ComfyUI, etc.) + that you configure. The privacy policies of those services apply to data sent to them. +

      + +

      On-Device Generation

      + +

      + When using on-device generation (MediaPipe), all processing happens locally on your + Android device. No data is sent to any external servers. +

      + +

      Log Data

      + +

      + The app may create local log files on your device for debugging purposes. + These logs are stored only on your device and are not transmitted anywhere. +

      + +

      Third-Party Services

      + +

      + The FOSS version of the app does not include any third-party analytics or tracking services. +

      + +

      Links to Other Sites

      + +

      + This Service may contain links to other sites. If you click on a third-party link, + you will be directed to that site. Note that these external sites are not operated by us. + Therefore, we strongly advise you to review the Privacy Policy of these websites. +

      + +

      Children's Privacy

      + +

      + These Services do not address anyone under the age of 13. We do not knowingly collect + personally identifiable information from children under 13 years of age. +

      + +

      Changes to This Privacy Policy

      + +

      + We may update our Privacy Policy from time to time. Thus, you are advised to review + this page periodically for any changes. +

      + +

      This policy is effective as of 2026-01-01

      + +

      Contact Us

      + +

      + If you have any questions or suggestions about this Privacy Policy, + do not hesitate to contact us via GitHub Issues. +

      +
      +
      + + From ef3a323931593c3bb75cd4228220c383bf19ca22 Mon Sep 17 00:00:00 2001 From: crim50n Date: Fri, 2 Jan 2026 02:33:26 +0300 Subject: [PATCH 19/42] refactor: rename SDAI to PDAI in code and paths - Rename log tag [SDAI] -> [PDAI] - Rename log file sdaiv1.log -> pdaiv1.log - Update custom model path SDAI -> PDAI - Rename SdaiWorkerFactory -> PdaiWorkerFactory - Update test stubs naming - Add CHANGES.md with 0.7.0 release notes --- .../minios/pdaiv1/app/AiStableDiffusionClientApp.kt | 4 ++-- .../pdaiv1/core/common/file/FileProviderDescriptor.kt | 2 +- .../minios/pdaiv1/core/common/log/FileLoggingTree.kt | 4 ++-- .../core/notification/PushNotificationManagerImpl.kt | 10 +++++----- .../pdaiv1/feature/auth/crypto/CryptoProviderImpl.kt | 2 +- .../dev/minios/pdaiv1/work/di/BackgroundWorkModule.kt | 2 +- .../di/{SdaiWorkerFactory.kt => PdaiWorkerFactory.kt} | 2 +- .../core/CoreGenerationMviViewModelTest.kt | 2 +- .../screen/img2img/ImageToImageViewModelTest.kt | 2 +- .../screen/txt2img/TextToImageViewModelTest.kt | 4 ++-- 10 files changed, 17 insertions(+), 17 deletions(-) rename feature/work/src/main/java/dev/minios/pdaiv1/work/di/{SdaiWorkerFactory.kt => PdaiWorkerFactory.kt} (99%) diff --git a/app/src/main/java/dev/minios/pdaiv1/app/AiStableDiffusionClientApp.kt b/app/src/main/java/dev/minios/pdaiv1/app/AiStableDiffusionClientApp.kt index 9235b0f34..b7182eade 100755 --- a/app/src/main/java/dev/minios/pdaiv1/app/AiStableDiffusionClientApp.kt +++ b/app/src/main/java/dev/minios/pdaiv1/app/AiStableDiffusionClientApp.kt @@ -21,7 +21,7 @@ import dev.minios.pdaiv1.domain.di.domainModule import dev.minios.pdaiv1.network.di.networkModule import dev.minios.pdaiv1.presentation.di.presentationModule import dev.minios.pdaiv1.storage.di.databaseModule -import dev.minios.pdaiv1.work.di.SdaiWorkerFactory +import dev.minios.pdaiv1.work.di.PdaiWorkerFactory import dev.minios.pdaiv1.work.di.backgroundWorkModule import org.koin.android.ext.android.inject import org.koin.android.ext.koin.androidContext @@ -84,7 +84,7 @@ class AiStableDiffusionClientApp : Application() { private fun initializeWorkManager() { try { - val workerFactory: SdaiWorkerFactory by inject() + val workerFactory: PdaiWorkerFactory by inject() val configuration = Configuration.Builder() .setWorkerFactory(workerFactory) .build() diff --git a/core/common/src/main/java/dev/minios/pdaiv1/core/common/file/FileProviderDescriptor.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/file/FileProviderDescriptor.kt index 8655c0ce4..45e907c8b 100644 --- a/core/common/src/main/java/dev/minios/pdaiv1/core/common/file/FileProviderDescriptor.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/file/FileProviderDescriptor.kt @@ -1,6 +1,6 @@ package dev.minios.pdaiv1.core.common.file -const val LOCAL_DIFFUSION_CUSTOM_PATH = "/storage/emulated/0/Download/SDAI/model" +const val LOCAL_DIFFUSION_CUSTOM_PATH = "/storage/emulated/0/Download/PDAI/model" interface FileProviderDescriptor { val providerPath: String diff --git a/core/common/src/main/java/dev/minios/pdaiv1/core/common/log/FileLoggingTree.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/log/FileLoggingTree.kt index dc6a08fff..927671484 100644 --- a/core/common/src/main/java/dev/minios/pdaiv1/core/common/log/FileLoggingTree.kt +++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/log/FileLoggingTree.kt @@ -80,9 +80,9 @@ class FileLoggingTree : Timber.Tree(), KoinComponent { companion object { private const val LOGGER_TIMESTAMP_FORMAT = "dd.MM.yyyy HH:mm:SS" - private const val LOGGER_DEFAULT_TAG = "[SDAI]" + private const val LOGGER_DEFAULT_TAG = "[PDAI]" - const val LOGGER_FILENAME = "sdaiv1.log" + const val LOGGER_FILENAME = "pdaiv1.log" fun clearLog(fileProviderDescriptor: FileProviderDescriptor) { val cacheDirectory = File(fileProviderDescriptor.logsCacheDirPath) diff --git a/core/notification/src/main/java/dev/minios/pdaiv1/core/notification/PushNotificationManagerImpl.kt b/core/notification/src/main/java/dev/minios/pdaiv1/core/notification/PushNotificationManagerImpl.kt index 195361344..4ce83ebb0 100644 --- a/core/notification/src/main/java/dev/minios/pdaiv1/core/notification/PushNotificationManagerImpl.kt +++ b/core/notification/src/main/java/dev/minios/pdaiv1/core/notification/PushNotificationManagerImpl.kt @@ -55,7 +55,7 @@ internal class PushNotificationManagerImpl( body: UiText?, block: NotificationCompat.Builder.() -> Unit ): Notification = with( - NotificationCompat.Builder(context, SDAI_NOTIFICATION_CHANNEL_ID) + NotificationCompat.Builder(context, PDAI_NOTIFICATION_CHANNEL_ID) ) { setSmallIcon(R.drawable.ic_notification) setContentTitle(title.asString(context)) @@ -76,13 +76,13 @@ internal class PushNotificationManagerImpl( override fun createNotificationChannel() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { - if (manager.getNotificationChannel(SDAI_NOTIFICATION_CHANNEL_ID) == null) { + if (manager.getNotificationChannel(PDAI_NOTIFICATION_CHANNEL_ID) == null) { debugLog("Creating notification channel") manager.createNotificationChannel( NotificationChannel( - SDAI_NOTIFICATION_CHANNEL_ID, - "SDAI Notifications", + PDAI_NOTIFICATION_CHANNEL_ID, + "PDAI Notifications", NotificationManager.IMPORTANCE_HIGH, ).also { channel -> channel.lockscreenVisibility = Notification.VISIBILITY_PUBLIC @@ -101,6 +101,6 @@ internal class PushNotificationManagerImpl( } companion object { - private const val SDAI_NOTIFICATION_CHANNEL_ID = "SDAI_NOTIFICATION_CHANNEL" + private const val PDAI_NOTIFICATION_CHANNEL_ID = "PDAI_NOTIFICATION_CHANNEL" } } diff --git a/feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/crypto/CryptoProviderImpl.kt b/feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/crypto/CryptoProviderImpl.kt index 16ab659bc..0245ce4ec 100644 --- a/feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/crypto/CryptoProviderImpl.kt +++ b/feature/auth/src/main/java/dev/minios/pdaiv1/feature/auth/crypto/CryptoProviderImpl.kt @@ -20,6 +20,6 @@ class CryptoProviderImpl(private val context: Context) : CryptoProvider { private fun getMasterKeyAlias() = MasterKeys.getOrCreate(MasterKeys.AES256_GCM_SPEC) companion object { - private const val KEY_PREFERENCE_AUTHORIZATION = "sdai_authorization_preference" + private const val KEY_PREFERENCE_AUTHORIZATION = "pdai_authorization_preference" } } diff --git a/feature/work/src/main/java/dev/minios/pdaiv1/work/di/BackgroundWorkModule.kt b/feature/work/src/main/java/dev/minios/pdaiv1/work/di/BackgroundWorkModule.kt index adad875f2..70862c59e 100644 --- a/feature/work/src/main/java/dev/minios/pdaiv1/work/di/BackgroundWorkModule.kt +++ b/feature/work/src/main/java/dev/minios/pdaiv1/work/di/BackgroundWorkModule.kt @@ -18,7 +18,7 @@ val backgroundWorkModule = module { WorkManagerProvider { WorkManager.getInstance(androidApplication()) } } - factoryOf(::SdaiWorkerFactory) binds arrayOf(SdaiWorkerFactory::class, WorkerFactory::class) + factoryOf(::PdaiWorkerFactory) binds arrayOf(PdaiWorkerFactory::class, WorkerFactory::class) singleOf(::BackgroundWorkObserverImpl) bind BackgroundWorkObserver::class factoryOf(::BackgroundTaskManagerImpl) bind BackgroundTaskManager::class } diff --git a/feature/work/src/main/java/dev/minios/pdaiv1/work/di/SdaiWorkerFactory.kt b/feature/work/src/main/java/dev/minios/pdaiv1/work/di/PdaiWorkerFactory.kt similarity index 99% rename from feature/work/src/main/java/dev/minios/pdaiv1/work/di/SdaiWorkerFactory.kt rename to feature/work/src/main/java/dev/minios/pdaiv1/work/di/PdaiWorkerFactory.kt index 82d6911a7..64400f04e 100644 --- a/feature/work/src/main/java/dev/minios/pdaiv1/work/di/SdaiWorkerFactory.kt +++ b/feature/work/src/main/java/dev/minios/pdaiv1/work/di/PdaiWorkerFactory.kt @@ -19,7 +19,7 @@ import dev.minios.pdaiv1.work.task.FalAiTask import dev.minios.pdaiv1.work.task.ImageToImageTask import dev.minios.pdaiv1.work.task.TextToImageTask -class SdaiWorkerFactory( +class PdaiWorkerFactory( private val backgroundWorkObserver: BackgroundWorkObserver, private val pushNotificationManager: PushNotificationManager, private val preferenceManager: PreferenceManager, diff --git a/presentation/src/test/java/dev/minios/pdaiv1/presentation/core/CoreGenerationMviViewModelTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/core/CoreGenerationMviViewModelTest.kt index 8a0609d4d..6ca9cc999 100644 --- a/presentation/src/test/java/dev/minios/pdaiv1/presentation/core/CoreGenerationMviViewModelTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/core/CoreGenerationMviViewModelTest.kt @@ -49,7 +49,7 @@ abstract class CoreGenerationMviViewModelTest() protected val stubDrawerRouter = mockk() protected val stubDimensionValidator = mockk() - protected val stubSdaiPushNotificationManager = mockk() + protected val stubPdaiPushNotificationManager = mockk() protected val stubAcquireWakelockUseCase = mockk() protected val stubReleaseWakelockUseCase = mockk() diff --git a/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/img2img/ImageToImageViewModelTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/img2img/ImageToImageViewModelTest.kt index e87ec5a17..06b050b0b 100644 --- a/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/img2img/ImageToImageViewModelTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/img2img/ImageToImageViewModelTest.kt @@ -70,7 +70,7 @@ class ImageToImageViewModelTest : CoreGenerationMviViewModelTest Date: Fri, 2 Jan 2026 02:04:32 +0300 Subject: [PATCH 20/42] Update dependencies and add version management plugins - Add gradle-versions-plugin for dependency updates checking - Add version-catalog-update-plugin for automated updates - Update stable dependencies to latest versions: - compileSdk: 35 -> 36 (required by new AndroidX libs) - Compose BOM: 2025.03.01 -> 2025.12.01 - AndroidX core-ktx: 1.15.0 -> 1.17.0 - AndroidX lifecycle: 2.8.7 -> 2.10.0 - AndroidX navigation: 2.8.9 -> 2.9.6 - AndroidX work: 2.10.0 -> 2.11.0 - Koin: 4.0.4 -> 4.1.1 - Retrofit: 2.11.0 -> 3.0.0 - ONNX: 1.21.0 -> 1.23.2 - Material: 1.12.0 -> 1.13.0 - And other library updates - Pin critical versions (paging, agp, kotlin, ksp) to prevent breaking changes - Keep minSdk=24 for Android 7.0+ compatibility --- build.gradle.kts | 37 +++++++ gradle/libs.versions.toml | 218 +++++++++++++++++++------------------- 2 files changed, 146 insertions(+), 109 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index 3ddd7c71e..ac0afd447 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,4 +6,41 @@ plugins { alias(libs.plugins.compose.compiler) apply false alias(libs.plugins.google.ksp) apply false alias(libs.plugins.androidx.room) apply false + id("com.github.ben-manes.versions") version "0.51.0" + id("nl.littlerobots.version-catalog-update") version "0.8.5" +} + +fun isNonStable(version: String): Boolean { + val stableKeyword = listOf("RELEASE", "FINAL", "GA").any { version.uppercase().contains(it) } + val regex = "^[0-9,.v-]+(-r)?$".toRegex() + val isStable = stableKeyword || regex.matches(version) + return isStable.not() +} + +tasks.withType { + rejectVersionIf { + isNonStable(candidate.version) && !isNonStable(currentVersion) + } +} + +versionCatalogUpdate { + keep { + // Keep versions that should not be updated + keepUnusedVersions.set(true) + keepUnusedLibraries.set(true) + keepUnusedPlugins.set(true) + } + pin { + // Pin versions that must not be updated + versions.add("paging") + versions.add("pagingCompose") + versions.add("agp") + versions.add("kotlin") + versions.add("ksp") + versions.add("versionName") + versions.add("versionCode") + versions.add("targetSdk") + versions.add("compileSdk") + versions.add("minSdk") + } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index b2075fe74..2ee53f288 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,128 +1,128 @@ [versions] -versionName = "0.7.0" -versionCode = "191" -targetSdk = "34" -compileSdk = "35" -minSdk = "24" agp = "8.9.1" +apacheStringUtils = "3.20.0" +appcompat = "1.7.1" +catppuccin = "0.1.2" +compileSdk = "36" +composeActivity = "1.12.2" +composeBom = "2025.12.01" +composeCompiler = "1.5.7" +composeGestures = "4.0.0" +composeJunit = "1.10.0" +coreKtx = "1.17.0" +crop = "0.1.1" +crypto = "1.1.0" +dayNightSwitch = "1.0.0" +exif = "1.4.2" +gson = "2.13.2" +junit = "4.13.2" +koin = "4.1.1" +koinCompose = "4.1.1" kotlin = "2.1.20" ksp = "2.1.20-1.0.32" # Should match kotlin version -appcompat = "1.7.0" -composeCompiler = "1.5.7" -composeBom = "2025.03.01" -composeActivity = "1.10.1" -composeJunit = "1.7.8" -lifecycleViewModel = "2.8.7" -navigation = "2.8.9" +lifecycleViewModel = "2.10.0" +material = "1.13.0" +mediaPipeGenerator = "0.10.26.1" +minSdk = "24" +mockito = "2.2.0" +mockk = "1.14.7" +mvi = "1.0.2" +navigation = "2.9.6" +okhttp = "5.0.0-alpha.14" +onnx = "1.23.2" paging = "3.1.1" # Do not upgrade! pagingCompose = "1.0.0-alpha18" # Do not upgrade! -gson = "2.12.1" -retrofit = "2.11.0" -okhttp = "5.0.0-alpha.14" -koin = "4.0.4" -koinCompose = "4.0.4" +preferences = "1.0.1" +retrofit = "3.0.0" +roboelectric = "4.16" +room = "2.6.1" rxAndroidVersion = "3.0.2" -rxJavaVersion = "3.1.10" +rxJavaVersion = "3.1.12" rxKotlinVersion = "3.0.1" rxNetworkVersion = "4.0.0" -material = "1.12.0" -junit = "4.13.2" -mockk = "1.13.17" -mockito = "2.2.0" -coreKtx = "1.15.0" -crypto = "1.0.0" -onnx = "1.21.0" -workManager = "2.10.0" -room = "2.6.1" +serialization = "1.9.0" +targetSdk = "34" +testCoroutines = "1.10.2" timber = "5.0.1" -exif = "1.4.0" -apacheStringUtils = "3.17.0" -composeGestures = "4.0.0" -crop = "0.1.1" -mvi = "1.0.2" -preferences = "1.0.1" -dayNightSwitch = "1.0.0" -catppuccin = "0.1.2" -turbine = "1.2.0" -roboelectric = "4.14.1" -testCoroutines = "1.10.1" -mediaPipeGenerator = "0.10.21" -serialization = "1.8.1" +turbine = "1.2.1" +versionCode = "191" +versionName = "0.7.0" +workManager = "2.11.0" [libraries] -android-tools-build-gradle = { group = "com.android.tools.build", name = "gradle", version.ref = "agp" } -kotlin-gradle-plugin = { group = "org.jetbrains.kotlin", name = "kotlin-gradle-plugin", version.ref = "kotlin" } -apache-stringutils = { group = "org.apache.commons", name = "commons-lang3", version.ref = "apacheStringUtils" } -androidx-core = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" } -androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "appcompat" } -androidx-compose-activity = { group = "androidx.activity", name = "activity-compose", version.ref = "composeActivity" } -androidx-compose-viewmodel = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-compose", version.ref = "lifecycleViewModel" } -androidx-lifecycle-viewmodel = { group = "androidx.lifecycle", name = "lifecycle-viewmodel-ktx", version.ref = "lifecycleViewModel" } -androidx-lifecycle-compose = { group = "androidx.lifecycle", name = "lifecycle-runtime-compose", version.ref = "lifecycleViewModel" } -androidx-compose-navigation = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigation" } -androidx-compose-bom = { group = "androidx.compose", name = "compose-bom", version.ref = "composeBom" } -androidx-compose-runtime = { group = "androidx.compose.runtime", name = "runtime" } -androidx-compose-material3 = { group = "androidx.compose.material3", name = "material3" } -androidx-compose-material-icons = { group = "androidx.compose.material", name = "material-icons-extended" } -androidx-compose-ui-graphics = { group = "androidx.compose.ui", name = "ui-graphics" } -androidx-compose-ui-tooling = { group = "androidx.compose.ui", name = "ui-tooling" } -androidx-compose-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-tooling-preview" } -androidx-exif = { group = "androidx.exifinterface", name = "exifinterface", version.ref = "exif" } -androidx-paging-runtime = { group = "androidx.paging", name = "paging-runtime", version.ref = "paging" } -androidx-paging-rx = { group = "androidx.paging", name = "paging-rxjava3", version.ref = "paging" } -androidx-paging-compose = { group = "androidx.paging", name = "paging-compose", version.ref = "pagingCompose" } -androidx-security-crypto = { group = "androidx.security", name = "security-crypto", version.ref = "crypto" } -androidx-room-runtime = { group = "androidx.room", name = "room-runtime", version.ref = "room" } -androidx-room-compiler = { group = "androidx.room", name = "room-compiler", version.ref = "room" } -androidx-room-rx = { group = "androidx.room", name = "room-rxjava3", version.ref = "room" } -androidx-work-runtime = { group = "androidx.work", name = "work-runtime", version.ref = "workManager" } -google-gson = { group = "com.google.code.gson", name = "gson", version.ref = "gson" } -google-material = { group = "com.google.android.material", name = "material", version.ref = "material" } -google-mediapipe-image-generator = { group = "com.google.mediapipe", name = "tasks-vision-image-generator", version.ref = "mediaPipeGenerator" } -retrofit-core = { group = "com.squareup.retrofit2", name = "retrofit", version.ref = "retrofit" } -retrofit-converter-gson = { group = "com.squareup.retrofit2", name = "converter-gson", version.ref = "retrofit" } -retrofit-adapter-rxjava3 = { group = "com.squareup.retrofit2", name = "adapter-rxjava3", version.ref = "retrofit" } -okhttp-core = { group = "com.squareup.okhttp3", name = "okhttp", version.ref = "okhttp" } -okhttp-logging = { group = "com.squareup.okhttp3", name = "logging-interceptor", version.ref = "okhttp" } -koin-core = { group = "io.insert-koin", name = "koin-core", version.ref = "koin" } -koin-android = { group = "io.insert-koin", name = "koin-android", version.ref = "koin" } -koin-compose = { group = "io.insert-koin", name = "koin-androidx-compose", version.ref = "koinCompose" } -microsoft-onnx-runtime-android = { group = "com.microsoft.onnxruntime", name = "onnxruntime-android", version.ref = "onnx" } -rx-android = { group = "io.reactivex.rxjava3", name = "rxandroid", version.ref = "rxAndroidVersion" } -rx-java = { group = "io.reactivex.rxjava3", name = "rxjava", version.ref = "rxJavaVersion" } -rx-kotlin = { group = "io.reactivex.rxjava3", name = "rxkotlin", version.ref = "rxKotlinVersion" } -rx-network = { group = "io.github.softartdev", name = "reactivenetwork-rx3", version.ref = "rxNetworkVersion" } -timber = { group = "com.jakewharton.timber", name = "timber", version.ref = "timber" } -test-junit = { group = "junit", name = "junit", version.ref = "junit" } -test-mockk = { group = "io.mockk", name = "mockk", version.ref = "mockk" } -test-mockito = { group = "com.nhaarman.mockitokotlin2", name = "mockito-kotlin", version.ref = "mockito" } -test-coroutines = { group = "org.jetbrains.kotlinx", name = "kotlinx-coroutines-test", version.ref = "testCoroutines" } -test-koin = { group = "io.insert-koin", name = "koin-test", version.ref = "koin" } -test-koin-junit = { group = "io.insert-koin", name = "koin-test-junit4", version.ref = "koin" } -test-turbine = { group = "app.cash.turbine", name = "turbine", version.ref = "turbine" } -test-roboelectric = { group = "org.robolectric", name = "robolectric", version.ref = "roboelectric" } -test-compose-junit = { group = "androidx.compose.ui", name = "ui-test-junit4", version.ref = "composeJunit" } -test-compose-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest", version.ref = "composeJunit" } -compose-gestures = { group = "com.github.SmartToolFactory", name = "Compose-Extended-Gestures", version.ref = "composeGestures" } -compose-crop = { group = "io.github.mr0xf00", name = "easycrop", version.ref = "crop" } -shifthackz-mvi = { group = "com.github.ShiftHackZ", name = "AndroidCoreMVI", version.ref = "mvi" } -shifthackz-preferences = { group = "com.github.ShiftHackZ", name = "AndroidPreferences", version.ref = "preferences" } -shifthackz-daynightswitch = { group = "com.github.ShiftHackZ", name = "DayNightSwitch", version.ref = "dayNightSwitch" } -shifthackz-catppuccin-legacy = { group = "com.github.ShiftHackZ.Catppuccin-Android-Library", name = "palette-legacy", version.ref = "catppuccin" } -shifthackz-catppuccin-compose = { group = "com.github.ShiftHackZ.Catppuccin-Android-Library", name = "compose", version.ref = "catppuccin" } -shifthackz-catppuccin-splash = { group = "com.github.ShiftHackZ.Catppuccin-Android-Library", name = "splashscreen", version.ref = "catppuccin" } -kotlinx-serialization-json = { group = "org.jetbrains.kotlinx", name = "kotlinx-serialization-json", version.ref = "serialization" } +android-tools-build-gradle = { module = "com.android.tools.build:gradle", version.ref = "agp" } +androidx-appcompat = { module = "androidx.appcompat:appcompat", version.ref = "appcompat" } +androidx-compose-activity = { module = "androidx.activity:activity-compose", version.ref = "composeActivity" } +androidx-compose-bom = { module = "androidx.compose:compose-bom", version.ref = "composeBom" } +androidx-compose-material-icons = { module = "androidx.compose.material:material-icons-extended" } +androidx-compose-material3 = { module = "androidx.compose.material3:material3" } +androidx-compose-navigation = { module = "androidx.navigation:navigation-compose", version.ref = "navigation" } +androidx-compose-runtime = { module = "androidx.compose.runtime:runtime" } +androidx-compose-ui-graphics = { module = "androidx.compose.ui:ui-graphics" } +androidx-compose-ui-tooling = { module = "androidx.compose.ui:ui-tooling" } +androidx-compose-ui-tooling-preview = { module = "androidx.compose.ui:ui-tooling-preview" } +androidx-compose-viewmodel = { module = "androidx.lifecycle:lifecycle-viewmodel-compose", version.ref = "lifecycleViewModel" } +androidx-core = { module = "androidx.core:core-ktx", version.ref = "coreKtx" } +androidx-exif = { module = "androidx.exifinterface:exifinterface", version.ref = "exif" } +androidx-lifecycle-compose = { module = "androidx.lifecycle:lifecycle-runtime-compose", version.ref = "lifecycleViewModel" } +androidx-lifecycle-viewmodel = { module = "androidx.lifecycle:lifecycle-viewmodel-ktx", version.ref = "lifecycleViewModel" } +androidx-paging-compose = { module = "androidx.paging:paging-compose", version.ref = "pagingCompose" } +androidx-paging-runtime = { module = "androidx.paging:paging-runtime", version.ref = "paging" } +androidx-paging-rx = { module = "androidx.paging:paging-rxjava3", version.ref = "paging" } +androidx-room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" } +androidx-room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" } +androidx-room-rx = { module = "androidx.room:room-rxjava3", version.ref = "room" } +androidx-security-crypto = { module = "androidx.security:security-crypto", version.ref = "crypto" } +androidx-work-runtime = { module = "androidx.work:work-runtime", version.ref = "workManager" } +apache-stringutils = { module = "org.apache.commons:commons-lang3", version.ref = "apacheStringUtils" } +compose-crop = { module = "io.github.mr0xf00:easycrop", version.ref = "crop" } +compose-gestures = { module = "com.github.SmartToolFactory:Compose-Extended-Gestures", version.ref = "composeGestures" } +google-gson = { module = "com.google.code.gson:gson", version.ref = "gson" } +google-material = { module = "com.google.android.material:material", version.ref = "material" } +google-mediapipe-image-generator = { module = "com.google.mediapipe:tasks-vision-image-generator", version.ref = "mediaPipeGenerator" } +koin-android = { module = "io.insert-koin:koin-android", version.ref = "koin" } +koin-compose = { module = "io.insert-koin:koin-androidx-compose", version.ref = "koinCompose" } +koin-core = { module = "io.insert-koin:koin-core", version.ref = "koin" } +kotlin-gradle-plugin = { module = "org.jetbrains.kotlin:kotlin-gradle-plugin", version.ref = "kotlin" } +kotlinx-serialization-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "serialization" } +microsoft-onnx-runtime-android = { module = "com.microsoft.onnxruntime:onnxruntime-android", version.ref = "onnx" } +okhttp-core = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" } +okhttp-logging = { module = "com.squareup.okhttp3:logging-interceptor", version.ref = "okhttp" } +retrofit-adapter-rxjava3 = { module = "com.squareup.retrofit2:adapter-rxjava3", version.ref = "retrofit" } +retrofit-converter-gson = { module = "com.squareup.retrofit2:converter-gson", version.ref = "retrofit" } +retrofit-core = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" } +rx-android = { module = "io.reactivex.rxjava3:rxandroid", version.ref = "rxAndroidVersion" } +rx-java = { module = "io.reactivex.rxjava3:rxjava", version.ref = "rxJavaVersion" } +rx-kotlin = { module = "io.reactivex.rxjava3:rxkotlin", version.ref = "rxKotlinVersion" } +rx-network = { module = "io.github.softartdev:reactivenetwork-rx3", version.ref = "rxNetworkVersion" } +shifthackz-catppuccin-compose = { module = "com.github.ShiftHackZ.Catppuccin-Android-Library:compose", version.ref = "catppuccin" } +shifthackz-catppuccin-legacy = { module = "com.github.ShiftHackZ.Catppuccin-Android-Library:palette-legacy", version.ref = "catppuccin" } +shifthackz-catppuccin-splash = { module = "com.github.ShiftHackZ.Catppuccin-Android-Library:splashscreen", version.ref = "catppuccin" } +shifthackz-daynightswitch = { module = "com.github.ShiftHackZ:DayNightSwitch", version.ref = "dayNightSwitch" } +shifthackz-mvi = { module = "com.github.ShiftHackZ:AndroidCoreMVI", version.ref = "mvi" } +shifthackz-preferences = { module = "com.github.ShiftHackZ:AndroidPreferences", version.ref = "preferences" } +test-compose-junit = { module = "androidx.compose.ui:ui-test-junit4", version.ref = "composeJunit" } +test-compose-manifest = { module = "androidx.compose.ui:ui-test-manifest", version.ref = "composeJunit" } +test-coroutines = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-test", version.ref = "testCoroutines" } +test-junit = { module = "junit:junit", version.ref = "junit" } +test-koin = { module = "io.insert-koin:koin-test", version.ref = "koin" } +test-koin-junit = { module = "io.insert-koin:koin-test-junit4", version.ref = "koin" } +test-mockito = { module = "com.nhaarman.mockitokotlin2:mockito-kotlin", version.ref = "mockito" } +test-mockk = { module = "io.mockk:mockk", version.ref = "mockk" } +test-roboelectric = { module = "org.robolectric:robolectric", version.ref = "roboelectric" } +test-turbine = { module = "app.cash.turbine:turbine", version.ref = "turbine" } +timber = { module = "com.jakewharton.timber:timber", version.ref = "timber" } [plugins] android-application = { id = "com.android.application", version.ref = "agp" } android-library = { id = "com.android.library", version.ref = "agp" } androidx-room = { id = "androidx.room", version.ref = "room" } +compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } +generic-application = "generic.application:unspecified" +generic-baseline-profm = "generic.baseline.profm:unspecified" +generic-compose = "generic.compose:unspecified" +generic-flavors = "generic.flavors:unspecified" +generic-library = "generic.library:unspecified" +google-ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } jetbrains-kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" } jetbrains-kotlin-serialization = { id = "org.jetbrains.kotlin.plugin.serialization", version.ref = "kotlin" } -google-ksp = { id = "com.google.devtools.ksp", version.ref = "ksp" } -generic-flavors = { id = "generic.flavors", version = "unspecified" } -generic-library = { id = "generic.library", version = "unspecified" } -generic-baseline-profm = { id = "generic.baseline.profm", version = "unspecified" } -generic-compose = { id = "generic.compose", version = "unspecified" } -generic-application = { id = "generic.application", version = "unspecified" } -compose-compiler = { id = "org.jetbrains.kotlin.plugin.compose", version.ref = "kotlin" } From 92e0f8418e4454d9f70c47ed5ebf4f14a089b5a2 Mon Sep 17 00:00:00 2001 From: crim50n Date: Fri, 2 Jan 2026 02:22:54 +0300 Subject: [PATCH 21/42] feat: add Yandex.Metrika tracking to index and policy pages --- docs/index.html | 14 ++++++++++++++ docs/policy.html | 15 +++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/docs/index.html b/docs/index.html index 544ea99da..92ffd86d4 100644 --- a/docs/index.html +++ b/docs/index.html @@ -10,6 +10,20 @@ + + + + +
      diff --git a/docs/policy.html b/docs/policy.html index 007d0f645..7aece1e4d 100644 --- a/docs/policy.html +++ b/docs/policy.html @@ -7,6 +7,21 @@ + + + + + + diff --git a/docs/assets/pdai.svg b/docs/assets/pdai.svg new file mode 100644 index 000000000..f0a671fd4 --- /dev/null +++ b/docs/assets/pdai.svg @@ -0,0 +1,549 @@ + + + + From c835f2e142da038fbf75ebba4a1cd7085d9d5198 Mon Sep 17 00:00:00 2001 From: crim50n Date: Tue, 6 Jan 2026 20:30:47 +0300 Subject: [PATCH 38/42] feat(release): add release notes for v0.7.1 --- RELEASE_NOTES_0.7.1.md | 157 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 RELEASE_NOTES_0.7.1.md diff --git a/RELEASE_NOTES_0.7.1.md b/RELEASE_NOTES_0.7.1.md new file mode 100644 index 000000000..6a1da3aeb --- /dev/null +++ b/RELEASE_NOTES_0.7.1.md @@ -0,0 +1,157 @@ +# PDAI v0.7.1 — Release Notes + +## New Features + +### Favorites (Like) + +- "Favorite" button (heart) in image detail view +- Like indicator in gallery grid (red heart in the top right corner) +- Bulk like: "Like" button in selection mode likes all selected images +- "Delete Unliked" function in gallery menu — deletes all images without a like +- Real-time sync of like status between detail view and grid +- Like status persists between sessions + +### Hide Images + +- Bulk hide: "Hide" button in selection mode hides all selected images +- Real-time sync of hide status between detail view and grid +- Fallback for Android < 12: dimming with icon instead of blur + +### Image Editor + +Built-in editor for generated images: + +- Rotate left/right +- Flip horizontally and vertically +- Adjust brightness, contrast, and saturation +- Save changes to original or as a new image + +--- + +### Completely Redesigned Gallery with Improved Performance + +**Smart Loading:** +- Thumbnails load only for visible items +- File-based thumbnail loading (no Base64) — fixed OOM on fast scrolling +- BlurHash placeholders — blurred preview while thumbnail loads +- Shimmer animation for items without BlurHash +- Two-level cache for thumbnails and full images + +**Grid Management:** +- Grid size from 1 to 6 columns (previously 2-5) +- Pinch to resize thumbnails +- Draggable scrollbar for fast navigation + +**Drag Selection:** +- Long press activates selection mode +- Dragging finger selects a range of images +- Dragging back deselects +- Auto-scroll when reaching screen edges +- Smooth animations when opening images + +**Selection Mode Actions:** +- Like (heart) — like all selected +- Hide (eye) — hide all selected +- Delete — delete all selected +- Save to device gallery +- Export + +**Update on Delete:** +- Gallery auto-updates when deleting images from detail view +- Gallery auto-updates after generation completes + +--- + +### UI Improvements + +**Floating Generation Indicator:** +- Global generation status widget over all screens +- Swipe left/right to temporarily hide +- Automatically appears on status change (generation start/result) +- Does not block navigation (drawer opens over widget) + +**Collapsible Header:** +- Top bar hides on scroll down +- Appears on scroll up or when reaching top of list +- Standard NestedScrollConnection pattern (like Google Photos) +- Unified height of 72dp on all screens + +**Swipe Navigation:** +- Swipe between home screen tabs (HorizontalPager) +- Drawer opens only by button (not edge swipe) + +**Image Viewing:** +- Double tap to zoom/reset +- Swipe up/down to show/hide info +- Fixed artifacts when swiping between images + +**Navigation Bar:** +- Smoothly hides in fullscreen view +- Automatically appears when returning to gallery + +**Image Details:** +- "Share" button +- "Save to device gallery" button +- "Favorite" (like) button + +--- + +## Fixes + +### Image Export +- Fixed OOM when exporting many images +- Direct file copy instead of loading into memory (Base64) +- Parallel processing (4 threads) for faster export + +### "Report" Button +- Disabled for Full and FOSS builds (Play Store only) + +### Aspect Ratio +- Aspect ratio now always uses width as the base (not the longer side) + +### Fal AI +- Fixed issue with API keys containing control characters +- `requestId` field in Fal AI response is now optional (fixed crash on fast completion) + +--- + +## Visual Changes + +- Updated notification icon + +--- + +## Technical Changes + +### Dependencies + +- Added BlurHash 0.3.0 for blurred placeholders in gallery + +### Database + +- Migration v10 → v11: added `blur_hash` field to generation results table +- Migration v11 → v12: added `liked` field for favorites feature + +### New Components + +- `ImageEditor` — image editing screen +- `CollapsibleScaffold` — scaffold with collapsible header +- `DraggableScrollbar` — draggable scrollbar +- `DragSelectionState` / `DragSelectionUtils` — drag selection +- `ThumbnailGenerator` — thumbnail generator +- `ImageCacheManager` — image cache manager +- `BlurHashEncoder` / `BlurHashDecoder` — BlurHash encoding/decoding +- `GalleryItemStateEvent` — real-time sync of hide/like states +- `GetThumbnailInfoUseCase` / `GetGalleryItemsRawUseCase` — use cases for file-based thumbnail loading +- `ToggleLikeUseCase` / `DeleteAllUnlikedUseCase` — use cases for favorites feature +- `LikeItemsUseCase` / `HideItemsUseCase` — use cases for bulk operations + +--- + +## Localization + +Added strings: +- Share, Edit, Save to gallery +- Rotate, Settings, Brightness, Contrast, Saturation +- Delete unliked, confirm delete unliked + From e43b46427467c6d3d1a42954a67889a1345a4a54 Mon Sep 17 00:00:00 2001 From: crim50n Date: Wed, 7 Jan 2026 15:54:53 +0300 Subject: [PATCH 39/42] feat: gallery toggle actions, onboarding UI fixes, inpaint overlay Gallery: - Add unlike/unhide toggle logic for bulk selection - If all selected items are liked/hidden, action reverses state - Add unlikeByIds/unhideByIds to DAO and repository layers Onboarding/UI: - Fix CollapsibleScaffold background color (use background instead of surface) - Fix bottom padding in txt2img and settings for onboarding demo mode Img2Img: - Show inpaint mask overlay on source image with 50% opacity Release Notes: - Update v0.7.1 notes with toggle behavior and UI fixes --- RELEASE_NOTES_0.7.1.md | 10 ++++-- .../local/GenerationResultLocalDataSource.kt | 4 +++ .../GenerationResultRepositoryImpl.kt | 4 +++ .../datasource/GenerationResultDataSource.kt | 2 ++ .../minios/pdaiv1/domain/di/DomainModule.kt | 6 ++++ .../repository/GenerationResultRepository.kt | 4 +++ .../usecase/gallery/UnhideItemsUseCase.kt | 7 ++++ .../usecase/gallery/UnhideItemsUseCaseImpl.kt | 10 ++++++ .../usecase/gallery/UnlikeItemsUseCase.kt | 7 ++++ .../usecase/gallery/UnlikeItemsUseCaseImpl.kt | 10 ++++++ .../pdaiv1/presentation/di/ViewModelModule.kt | 2 ++ .../screen/gallery/list/GalleryViewModel.kt | 36 +++++++++++++++---- .../screen/img2img/ImageToImageScreen.kt | 9 +++++ .../screen/settings/SettingsScreen.kt | 1 + .../screen/txt2img/TextToImageScreen.kt | 1 + .../widget/scaffold/CollapsibleScaffold.kt | 6 ++-- .../db/persistent/dao/GenerationResultDao.kt | 6 ++++ 17 files changed, 114 insertions(+), 11 deletions(-) create mode 100644 domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/UnhideItemsUseCase.kt create mode 100644 domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/UnhideItemsUseCaseImpl.kt create mode 100644 domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/UnlikeItemsUseCase.kt create mode 100644 domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/UnlikeItemsUseCaseImpl.kt diff --git a/RELEASE_NOTES_0.7.1.md b/RELEASE_NOTES_0.7.1.md index 6a1da3aeb..081d26a01 100644 --- a/RELEASE_NOTES_0.7.1.md +++ b/RELEASE_NOTES_0.7.1.md @@ -14,6 +14,7 @@ ### Hide Images - Bulk hide: "Hide" button in selection mode hides all selected images +- Bulk unhide: tapping "Hide" when all selected are hidden — reveals them - Real-time sync of hide status between detail view and grid - Fallback for Android < 12: dimming with icon instead of blur @@ -50,8 +51,8 @@ Built-in editor for generated images: - Smooth animations when opening images **Selection Mode Actions:** -- Like (heart) — like all selected -- Hide (eye) — hide all selected +- Like (heart) — like all selected (or unlike if all already liked) +- Hide (eye) — hide all selected (or unhide if all already hidden) - Delete — delete all selected - Save to device gallery - Export @@ -75,6 +76,8 @@ Built-in editor for generated images: - Appears on scroll up or when reaching top of list - Standard NestedScrollConnection pattern (like Google Photos) - Unified height of 72dp on all screens +- Background color unified to `background` (was `surface`) +- Consistent bottom padding accounting for navigation bar across all screens (txt2img, settings) **Swipe Navigation:** - Swipe between home screen tabs (HorizontalPager) @@ -144,7 +147,8 @@ Built-in editor for generated images: - `GalleryItemStateEvent` — real-time sync of hide/like states - `GetThumbnailInfoUseCase` / `GetGalleryItemsRawUseCase` — use cases for file-based thumbnail loading - `ToggleLikeUseCase` / `DeleteAllUnlikedUseCase` — use cases for favorites feature -- `LikeItemsUseCase` / `HideItemsUseCase` — use cases for bulk operations +- `LikeItemsUseCase` / `UnlikeItemsUseCase` — use cases for bulk like/unlike operations +- `HideItemsUseCase` / `UnhideItemsUseCase` — use cases for bulk hide/unhide operations --- diff --git a/data/src/main/java/dev/minios/pdaiv1/data/local/GenerationResultLocalDataSource.kt b/data/src/main/java/dev/minios/pdaiv1/data/local/GenerationResultLocalDataSource.kt index 5a1304bfc..7f8f6ce96 100644 --- a/data/src/main/java/dev/minios/pdaiv1/data/local/GenerationResultLocalDataSource.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/local/GenerationResultLocalDataSource.kt @@ -53,5 +53,9 @@ internal class GenerationResultLocalDataSource( override fun likeByIds(idList: List) = dao.likeByIds(idList) + override fun unlikeByIds(idList: List) = dao.unlikeByIds(idList) + override fun hideByIds(idList: List) = dao.hideByIds(idList) + + override fun unhideByIds(idList: List) = dao.unhideByIds(idList) } diff --git a/data/src/main/java/dev/minios/pdaiv1/data/repository/GenerationResultRepositoryImpl.kt b/data/src/main/java/dev/minios/pdaiv1/data/repository/GenerationResultRepositoryImpl.kt index ae20323bf..df513844a 100644 --- a/data/src/main/java/dev/minios/pdaiv1/data/repository/GenerationResultRepositoryImpl.kt +++ b/data/src/main/java/dev/minios/pdaiv1/data/repository/GenerationResultRepositoryImpl.kt @@ -112,8 +112,12 @@ internal class GenerationResultRepositoryImpl( override fun likeByIds(idList: List): Completable = localDataSource.likeByIds(idList) + override fun unlikeByIds(idList: List): Completable = localDataSource.unlikeByIds(idList) + override fun hideByIds(idList: List): Completable = localDataSource.hideByIds(idList) + override fun unhideByIds(idList: List): Completable = localDataSource.unhideByIds(idList) + override fun migrateBase64ToFiles(): Completable = localDataSource.queryAll() .flatMapCompletable { results -> val needsMigration = results.filter { result -> diff --git a/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/GenerationResultDataSource.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/GenerationResultDataSource.kt index 6956fcf2e..ddf94cdcd 100644 --- a/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/GenerationResultDataSource.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/datasource/GenerationResultDataSource.kt @@ -21,6 +21,8 @@ sealed interface GenerationResultDataSource { fun deleteAll(): Completable fun deleteAllUnliked(): Completable fun likeByIds(idList: List): Completable + fun unlikeByIds(idList: List): Completable fun hideByIds(idList: List): Completable + fun unhideByIds(idList: List): Completable } } diff --git a/domain/src/main/java/dev/minios/pdaiv1/domain/di/DomainModule.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/di/DomainModule.kt index c0ec3a4e2..69e2006f5 100755 --- a/domain/src/main/java/dev/minios/pdaiv1/domain/di/DomainModule.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/di/DomainModule.kt @@ -78,8 +78,12 @@ import dev.minios.pdaiv1.domain.usecase.gallery.DeleteAllUnlikedUseCase import dev.minios.pdaiv1.domain.usecase.gallery.DeleteAllUnlikedUseCaseImpl import dev.minios.pdaiv1.domain.usecase.gallery.LikeItemsUseCase import dev.minios.pdaiv1.domain.usecase.gallery.LikeItemsUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.gallery.UnlikeItemsUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.UnlikeItemsUseCaseImpl import dev.minios.pdaiv1.domain.usecase.gallery.HideItemsUseCase import dev.minios.pdaiv1.domain.usecase.gallery.HideItemsUseCaseImpl +import dev.minios.pdaiv1.domain.usecase.gallery.UnhideItemsUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.UnhideItemsUseCaseImpl import dev.minios.pdaiv1.domain.usecase.generation.FalAiGenerationUseCase import dev.minios.pdaiv1.domain.usecase.generation.FalAiGenerationUseCaseImpl import dev.minios.pdaiv1.domain.usecase.generation.GetGenerationResultPagedUseCase @@ -199,7 +203,9 @@ internal val useCasesModule = module { factoryOf(::ToggleLikeUseCaseImpl) bind ToggleLikeUseCase::class factoryOf(::DeleteAllUnlikedUseCaseImpl) bind DeleteAllUnlikedUseCase::class factoryOf(::LikeItemsUseCaseImpl) bind LikeItemsUseCase::class + factoryOf(::UnlikeItemsUseCaseImpl) bind UnlikeItemsUseCase::class factoryOf(::HideItemsUseCaseImpl) bind HideItemsUseCase::class + factoryOf(::UnhideItemsUseCaseImpl) bind UnhideItemsUseCase::class factoryOf(::GetRandomImageUseCaseImpl) bind GetRandomImageUseCase::class factoryOf(::SaveLastResultToCacheUseCaseImpl) bind SaveLastResultToCacheUseCase::class factoryOf(::GetLastResultFromCacheUseCaseImpl) bind GetLastResultFromCacheUseCase::class diff --git a/domain/src/main/java/dev/minios/pdaiv1/domain/repository/GenerationResultRepository.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/GenerationResultRepository.kt index d7bc05aa3..d185a5f7e 100644 --- a/domain/src/main/java/dev/minios/pdaiv1/domain/repository/GenerationResultRepository.kt +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/repository/GenerationResultRepository.kt @@ -46,8 +46,12 @@ interface GenerationResultRepository { fun likeByIds(idList: List): Completable + fun unlikeByIds(idList: List): Completable + fun hideByIds(idList: List): Completable + fun unhideByIds(idList: List): Completable + /** * Migrates existing gallery items from base64 storage to file-based storage. * This runs in the background at app startup. diff --git a/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/UnhideItemsUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/UnhideItemsUseCase.kt new file mode 100644 index 000000000..9ed8f2467 --- /dev/null +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/UnhideItemsUseCase.kt @@ -0,0 +1,7 @@ +package dev.minios.pdaiv1.domain.usecase.gallery + +import io.reactivex.rxjava3.core.Completable + +interface UnhideItemsUseCase { + operator fun invoke(ids: List): Completable +} diff --git a/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/UnhideItemsUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/UnhideItemsUseCaseImpl.kt new file mode 100644 index 000000000..b91d520fb --- /dev/null +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/UnhideItemsUseCaseImpl.kt @@ -0,0 +1,10 @@ +package dev.minios.pdaiv1.domain.usecase.gallery + +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository + +internal class UnhideItemsUseCaseImpl( + private val generationResultRepository: GenerationResultRepository, +) : UnhideItemsUseCase { + + override fun invoke(ids: List) = generationResultRepository.unhideByIds(ids) +} diff --git a/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/UnlikeItemsUseCase.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/UnlikeItemsUseCase.kt new file mode 100644 index 000000000..af5f76800 --- /dev/null +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/UnlikeItemsUseCase.kt @@ -0,0 +1,7 @@ +package dev.minios.pdaiv1.domain.usecase.gallery + +import io.reactivex.rxjava3.core.Completable + +interface UnlikeItemsUseCase { + operator fun invoke(ids: List): Completable +} diff --git a/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/UnlikeItemsUseCaseImpl.kt b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/UnlikeItemsUseCaseImpl.kt new file mode 100644 index 000000000..069768a69 --- /dev/null +++ b/domain/src/main/java/dev/minios/pdaiv1/domain/usecase/gallery/UnlikeItemsUseCaseImpl.kt @@ -0,0 +1,10 @@ +package dev.minios.pdaiv1.domain.usecase.gallery + +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository + +internal class UnlikeItemsUseCaseImpl( + private val generationResultRepository: GenerationResultRepository, +) : UnlikeItemsUseCase { + + override fun invoke(ids: List) = generationResultRepository.unlikeByIds(ids) +} diff --git a/presentation/src/main/java/dev/minios/pdaiv1/presentation/di/ViewModelModule.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/di/ViewModelModule.kt index bc1d888d0..629087f4e 100755 --- a/presentation/src/main/java/dev/minios/pdaiv1/presentation/di/ViewModelModule.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/di/ViewModelModule.kt @@ -68,7 +68,9 @@ val viewModelModule = module { getAllGalleryUseCase = get(), galleryItemStateEvent = get(), likeItemsUseCase = get(), + unlikeItemsUseCase = get(), hideItemsUseCase = get(), + unhideItemsUseCase = get(), ) } viewModelOf(::ConnectivityViewModel) diff --git a/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryViewModel.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryViewModel.kt index 5dafc3ba8..d1a4d0ebb 100644 --- a/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryViewModel.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryViewModel.kt @@ -26,7 +26,9 @@ import dev.minios.pdaiv1.domain.usecase.gallery.GetGalleryPagedIdsUseCase import dev.minios.pdaiv1.domain.usecase.gallery.GetMediaStoreInfoUseCase import dev.minios.pdaiv1.domain.usecase.gallery.GetThumbnailInfoUseCase import dev.minios.pdaiv1.domain.usecase.gallery.LikeItemsUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.UnlikeItemsUseCase import dev.minios.pdaiv1.domain.usecase.gallery.HideItemsUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.UnhideItemsUseCase import dev.minios.pdaiv1.domain.feature.MediaFileManager import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway import dev.minios.pdaiv1.domain.usecase.generation.GetGenerationResultPagedUseCase @@ -65,7 +67,9 @@ class GalleryViewModel( private val getAllGalleryUseCase: GetAllGalleryUseCase, private val galleryItemStateEvent: GalleryItemStateEvent, private val likeItemsUseCase: LikeItemsUseCase, + private val unlikeItemsUseCase: UnlikeItemsUseCase, private val hideItemsUseCase: HideItemsUseCase, + private val unhideItemsUseCase: UnhideItemsUseCase, ) : MviRxViewModel() { override val initialState = GalleryState() @@ -323,20 +327,30 @@ class GalleryViewModel( GalleryIntent.LikeSelection -> { val selection = currentState.selection if (selection.isNotEmpty()) { - !likeItemsUseCase(selection) + // Toggle logic: if ALL selected are liked -> unlike, otherwise -> like all + val allLiked = selection.all { it in currentState.likedIds } + val useCase = if (allLiked) unlikeItemsUseCase(selection) else likeItemsUseCase(selection) + val newLikedState = !allLiked + + !useCase .subscribeOn(schedulersProvider.io) .subscribeOnMainThread(schedulersProvider) .subscribeBy(::errorLog) { // Update liked state and emit events for real-time sync updateState { state -> + val newLikedIds = if (newLikedState) { + state.likedIds + selection.toSet() + } else { + state.likedIds - selection.toSet() + } state.copy( - likedIds = state.likedIds + selection.toSet(), + likedIds = newLikedIds, selectionMode = false, selection = emptyList(), ) } selection.forEach { id -> - galleryItemStateEvent.emitLikedChange(id, true) + galleryItemStateEvent.emitLikedChange(id, newLikedState) } } } @@ -345,20 +359,30 @@ class GalleryViewModel( GalleryIntent.HideSelection -> { val selection = currentState.selection if (selection.isNotEmpty()) { - !hideItemsUseCase(selection) + // Toggle logic: if ALL selected are hidden -> unhide, otherwise -> hide all + val allHidden = selection.all { it in currentState.hiddenIds } + val useCase = if (allHidden) unhideItemsUseCase(selection) else hideItemsUseCase(selection) + val newHiddenState = !allHidden + + !useCase .subscribeOn(schedulersProvider.io) .subscribeOnMainThread(schedulersProvider) .subscribeBy(::errorLog) { // Update hidden state and emit events for real-time sync updateState { state -> + val newHiddenIds = if (newHiddenState) { + state.hiddenIds + selection.toSet() + } else { + state.hiddenIds - selection.toSet() + } state.copy( - hiddenIds = state.hiddenIds + selection.toSet(), + hiddenIds = newHiddenIds, selectionMode = false, selection = emptyList(), ) } selection.forEach { id -> - galleryItemStateEvent.emitHiddenChange(id, true) + galleryItemStateEvent.emitHiddenChange(id, newHiddenState) } } } diff --git a/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/img2img/ImageToImageScreen.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/img2img/ImageToImageScreen.kt index c42c11332..62b3f5c91 100644 --- a/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/img2img/ImageToImageScreen.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/img2img/ImageToImageScreen.kt @@ -424,6 +424,15 @@ private fun InputImageState( contentScale = ContentScale.Fit, ) } + state.inPaintModel.bitmap?.asImageBitmap()?.let { maskBitmap -> + Image( + modifier = Modifier.fillMaxSize(), + bitmap = maskBitmap, + contentDescription = null, + contentScale = ContentScale.Fit, + alpha = 0.5f, + ) + } } Row( modifier = Modifier diff --git a/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/settings/SettingsScreen.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/settings/SettingsScreen.kt index 40b4bfa00..2dc60be7c 100644 --- a/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/settings/SettingsScreen.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/settings/SettingsScreen.kt @@ -146,6 +146,7 @@ fun SettingsScreenContent( ) { Box(modifier) { CollapsibleScaffold( + bottomNavBarHeight = if (state.onBoardingDemo) 0.dp else 80.dp, topBarContent = { CenterAlignedTopAppBar( navigationIcon = { diff --git a/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/txt2img/TextToImageScreen.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/txt2img/TextToImageScreen.kt index f9b9ce5c3..7e8ac12b3 100755 --- a/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/txt2img/TextToImageScreen.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/screen/txt2img/TextToImageScreen.kt @@ -76,6 +76,7 @@ fun TextToImageScreenContent( CollapsibleScaffold( scrollState = scrollState, bottomToolbarHeight = 150.dp, + bottomNavBarHeight = if (state.onBoardingDemo) 0.dp else 80.dp, topBarContent = { CenterAlignedTopAppBar( navigationIcon = { diff --git a/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/scaffold/CollapsibleScaffold.kt b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/scaffold/CollapsibleScaffold.kt index 735bb3663..ec360a5c6 100644 --- a/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/scaffold/CollapsibleScaffold.kt +++ b/presentation/src/main/java/dev/minios/pdaiv1/presentation/widget/scaffold/CollapsibleScaffold.kt @@ -105,6 +105,7 @@ fun CollapsibleScaffold( Box( modifier = modifier .fillMaxSize() + .background(MaterialTheme.colorScheme.background) .nestedScroll(nestedScrollConnection) ) { // Main content - scrollable Column with internal spacing (like Gallery's contentPadding) @@ -128,7 +129,7 @@ fun CollapsibleScaffold( .graphicsLayer { translationY = -topBarHeightPx * animatedOffset } - .background(MaterialTheme.colorScheme.surface) + .background(MaterialTheme.colorScheme.background) .statusBarsPadding() ) { topBarContent() @@ -200,6 +201,7 @@ fun CollapsibleScaffold( Box( modifier = modifier .fillMaxSize() + .background(MaterialTheme.colorScheme.background) .nestedScroll(nestedScrollConnection) ) { // Content with padding values - content must handle scrolling @@ -218,7 +220,7 @@ fun CollapsibleScaffold( .graphicsLayer { translationY = -topBarHeightPx * animatedOffset } - .background(MaterialTheme.colorScheme.surface) + .background(MaterialTheme.colorScheme.background) .statusBarsPadding() ) { topBarContent() diff --git a/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/dao/GenerationResultDao.kt b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/dao/GenerationResultDao.kt index ab3682d94..e81e217b0 100644 --- a/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/dao/GenerationResultDao.kt +++ b/storage/src/main/java/dev/minios/pdaiv1/storage/db/persistent/dao/GenerationResultDao.kt @@ -56,6 +56,12 @@ interface GenerationResultDao { @Query("UPDATE ${GenerationResultContract.TABLE} SET ${GenerationResultContract.LIKED} = 1 WHERE ${GenerationResultContract.ID} IN (:idList)") fun likeByIds(idList: List): Completable + @Query("UPDATE ${GenerationResultContract.TABLE} SET ${GenerationResultContract.LIKED} = 0 WHERE ${GenerationResultContract.ID} IN (:idList)") + fun unlikeByIds(idList: List): Completable + @Query("UPDATE ${GenerationResultContract.TABLE} SET ${GenerationResultContract.HIDDEN} = 1 WHERE ${GenerationResultContract.ID} IN (:idList)") fun hideByIds(idList: List): Completable + + @Query("UPDATE ${GenerationResultContract.TABLE} SET ${GenerationResultContract.HIDDEN} = 0 WHERE ${GenerationResultContract.ID} IN (:idList)") + fun unhideByIds(idList: List): Completable } From cf2a1986d140a04e01a9c57d848945cc258c80c4 Mon Sep 17 00:00:00 2001 From: crim50n Date: Wed, 7 Jan 2026 17:12:52 +0300 Subject: [PATCH 40/42] test: fix compilation errors in repository and viewmodel tests - Add blurHashEncoder mock to generation repository tests - Add unlikeItemsUseCase/unhideItemsUseCase to GalleryViewModelTest - Fix toggleLike test to return toggled result on second queryById - Add missing liked/blurHash fields to GenerationResultEntityMocks --- .../pdaiv1/data/mocks/GenerationResultEntityMocks.kt | 2 ++ .../data/repository/GenerationResultRepositoryImplTest.kt | 4 +++- .../data/repository/HordeGenerationRepositoryImplTest.kt | 3 +++ .../repository/HuggingFaceGenerationRepositoryImplTest.kt | 5 ++++- .../LocalDiffusionGenerationRepositoryImplTest.kt | 5 ++++- .../repository/MediaPipeGenerationRepositoryImplTest.kt | 5 ++++- .../data/repository/OpenAiGenerationRepositoryImplTest.kt | 3 +++ .../data/repository/QnnGenerationRepositoryImplTest.kt | 7 +++++-- .../repository/StabilityAiGenerationRepositoryImplTest.kt | 7 +++++-- .../StableDiffusionGenerationRepositoryImplTest.kt | 7 +++++-- .../data/repository/SwarmUiGenerationRepositoryImplTest.kt | 7 +++++-- .../screen/gallery/list/GalleryViewModelTest.kt | 6 ++++++ 12 files changed, 49 insertions(+), 12 deletions(-) diff --git a/data/src/test/java/dev/minios/pdaiv1/data/mocks/GenerationResultEntityMocks.kt b/data/src/test/java/dev/minios/pdaiv1/data/mocks/GenerationResultEntityMocks.kt index b7b621c80..b324cd333 100644 --- a/data/src/test/java/dev/minios/pdaiv1/data/mocks/GenerationResultEntityMocks.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/mocks/GenerationResultEntityMocks.kt @@ -23,10 +23,12 @@ val mockGenerationResultEntity = GenerationResultEntity( subSeedStrength = 5598f, denoisingStrength = 1504f, hidden = false, + liked = false, mediaPath = "", inputMediaPath = "", mediaType = "IMAGE", modelName = "MockModel", + blurHash = "", ) val mockGenerationResultEntities = listOf(mockGenerationResultEntity) diff --git a/data/src/test/java/dev/minios/pdaiv1/data/repository/GenerationResultRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/GenerationResultRepositoryImplTest.kt index 112d8984a..9efd62e46 100644 --- a/data/src/test/java/dev/minios/pdaiv1/data/repository/GenerationResultRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/GenerationResultRepositoryImplTest.kt @@ -389,9 +389,11 @@ class GenerationResultRepositoryImplTest { @Test fun `given attempt to toggle like, local returns data, expected boolean value`() { + val toggledResult = mockAiGenerationResult.copy(liked = true) + every { stubLocalDataSource.queryById(any()) - } returns Single.just(mockAiGenerationResult) + } returns Single.just(mockAiGenerationResult) andThen Single.just(toggledResult) every { stubLocalDataSource.insert(any()) diff --git a/data/src/test/java/dev/minios/pdaiv1/data/repository/HordeGenerationRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/HordeGenerationRepositoryImplTest.kt index d0eaad8c9..db0b499e8 100644 --- a/data/src/test/java/dev/minios/pdaiv1/data/repository/HordeGenerationRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/HordeGenerationRepositoryImplTest.kt @@ -1,6 +1,7 @@ package dev.minios.pdaiv1.data.repository import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.core.imageprocessing.blurhash.BlurHashEncoder import dev.minios.pdaiv1.data.mocks.mockAiGenerationResult import dev.minios.pdaiv1.data.mocks.mockImageToImagePayload import dev.minios.pdaiv1.data.mocks.mockTextToImagePayload @@ -33,6 +34,7 @@ class HordeGenerationRepositoryImplTest { private val stubStatusSource = mockk() private val stubBackgroundWorkObserver = mockk() private val stubMediaFileManager = mockk() + private val stubBlurHashEncoder = mockk() private val repository = HordeGenerationRepositoryImpl( mediaStoreGateway = stubMediaStoreGateway, @@ -41,6 +43,7 @@ class HordeGenerationRepositoryImplTest { preferenceManager = stubPreferenceManager, backgroundWorkObserver = stubBackgroundWorkObserver, mediaFileManager = stubMediaFileManager, + blurHashEncoder = stubBlurHashEncoder, remoteDataSource = stubRemoteDataSource, statusSource = stubStatusSource, ) diff --git a/data/src/test/java/dev/minios/pdaiv1/data/repository/HuggingFaceGenerationRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/HuggingFaceGenerationRepositoryImplTest.kt index b4d2b709d..a041eeeb1 100644 --- a/data/src/test/java/dev/minios/pdaiv1/data/repository/HuggingFaceGenerationRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/HuggingFaceGenerationRepositoryImplTest.kt @@ -1,6 +1,7 @@ package dev.minios.pdaiv1.data.repository import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.core.imageprocessing.blurhash.BlurHashEncoder import dev.minios.pdaiv1.data.mocks.mockAiGenerationResult import dev.minios.pdaiv1.data.mocks.mockImageToImagePayload import dev.minios.pdaiv1.data.mocks.mockTextToImagePayload @@ -26,14 +27,16 @@ class HuggingFaceGenerationRepositoryImplTest { private val stubRemoteDataSource = mockk() private val stubBackgroundWorkObserver = mockk() private val stubMediaFileManager = mockk() + private val stubBlurHashEncoder = mockk() private val repository = HuggingFaceGenerationRepositoryImpl( mediaStoreGateway = stubMediaStoreGateway, base64ToBitmapConverter = stubBase64ToBitmapConverter, localDataSource = stubLocalDataSource, - preferenceManager = stubPreferenceManager, backgroundWorkObserver = stubBackgroundWorkObserver, mediaFileManager = stubMediaFileManager, + blurHashEncoder = stubBlurHashEncoder, + preferenceManager = stubPreferenceManager, remoteDataSource = stubRemoteDataSource, ) diff --git a/data/src/test/java/dev/minios/pdaiv1/data/repository/LocalDiffusionGenerationRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/LocalDiffusionGenerationRepositoryImplTest.kt index db2628a08..6852c82f4 100644 --- a/data/src/test/java/dev/minios/pdaiv1/data/repository/LocalDiffusionGenerationRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/LocalDiffusionGenerationRepositoryImplTest.kt @@ -5,6 +5,7 @@ import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider import dev.minios.pdaiv1.core.common.schedulers.SchedulersToken import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter import dev.minios.pdaiv1.core.imageprocessing.BitmapToBase64Converter +import dev.minios.pdaiv1.core.imageprocessing.blurhash.BlurHashEncoder import dev.minios.pdaiv1.data.mocks.mockLocalAiModel import dev.minios.pdaiv1.data.mocks.mockTextToImagePayload import dev.minios.pdaiv1.domain.datasource.DownloadableModelDataSource @@ -43,6 +44,7 @@ class LocalDiffusionGenerationRepositoryImplTest { private val stubDownloadableLocalDataSource = mockk() private val stubBackgroundWorkObserver = mockk() private val stubMediaFileManager = mockk() + private val stubBlurHashEncoder = mockk() private val stubSchedulersProvider = object : SchedulersProvider { override val io: Scheduler = Schedulers.trampoline() @@ -55,9 +57,10 @@ class LocalDiffusionGenerationRepositoryImplTest { mediaStoreGateway = stubMediaStoreGateway, base64ToBitmapConverter = stubBase64ToBitmapConverter, localDataSource = stubLocalDataSource, - preferenceManager = stubPreferenceManager, backgroundWorkObserver = stubBackgroundWorkObserver, mediaFileManager = stubMediaFileManager, + blurHashEncoder = stubBlurHashEncoder, + preferenceManager = stubPreferenceManager, localDiffusion = stubLocalDiffusion, downloadableLocalDataSource = stubDownloadableLocalDataSource, bitmapToBase64Converter = stubBitmapToBase64Converter, diff --git a/data/src/test/java/dev/minios/pdaiv1/data/repository/MediaPipeGenerationRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/MediaPipeGenerationRepositoryImplTest.kt index e3584a39f..652fd51bb 100644 --- a/data/src/test/java/dev/minios/pdaiv1/data/repository/MediaPipeGenerationRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/MediaPipeGenerationRepositoryImplTest.kt @@ -4,6 +4,7 @@ import android.graphics.Bitmap import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter import dev.minios.pdaiv1.core.imageprocessing.BitmapToBase64Converter +import dev.minios.pdaiv1.core.imageprocessing.blurhash.BlurHashEncoder import dev.minios.pdaiv1.domain.datasource.GenerationResultDataSource import dev.minios.pdaiv1.domain.feature.MediaFileManager import dev.minios.pdaiv1.domain.feature.mediapipe.MediaPipe @@ -33,6 +34,7 @@ class MediaPipeGenerationRepositoryImplTest { private val stubMediaPipe = mockk() private val stubBackgroundWorkObserver = mockk() private val stubMediaFileManager = mockk() + private val stubBlurHashEncoder = mockk() private val stubSchedulersProvider = object : SchedulersProvider { override val io: Scheduler = Schedulers.trampoline() @@ -45,9 +47,10 @@ class MediaPipeGenerationRepositoryImplTest { mediaStoreGateway = stubMediaStoreGateway, base64ToBitmapConverter = stubBase64ToBitmapConverter, localDataSource = stubLocalDataSource, - preferenceManager = stubPreferenceManager, backgroundWorkObserver = stubBackgroundWorkObserver, mediaFileManager = stubMediaFileManager, + preferenceManager = stubPreferenceManager, + blurHashEncoder = stubBlurHashEncoder, schedulersProvider = stubSchedulersProvider, mediaPipe = stubMediaPipe, bitmapToBase64Converter = stubBitmapToBase64Converter, diff --git a/data/src/test/java/dev/minios/pdaiv1/data/repository/OpenAiGenerationRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/OpenAiGenerationRepositoryImplTest.kt index 875de8cb0..b6e6072b4 100644 --- a/data/src/test/java/dev/minios/pdaiv1/data/repository/OpenAiGenerationRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/OpenAiGenerationRepositoryImplTest.kt @@ -1,6 +1,7 @@ package dev.minios.pdaiv1.data.repository import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.core.imageprocessing.blurhash.BlurHashEncoder import dev.minios.pdaiv1.data.mocks.mockAiGenerationResult import dev.minios.pdaiv1.data.mocks.mockTextToImagePayload import dev.minios.pdaiv1.domain.datasource.GenerationResultDataSource @@ -25,6 +26,7 @@ class OpenAiGenerationRepositoryImplTest { private val stubRemoteDataSource = mockk() private val stubBackgroundWorkObserver = mockk() private val stubMediaFileManager = mockk() + private val stubBlurHashEncoder = mockk() private val repository = OpenAiGenerationRepositoryImpl( mediaStoreGateway = stubMediaStoreGateway, @@ -33,6 +35,7 @@ class OpenAiGenerationRepositoryImplTest { preferenceManager = stubPreferenceManager, backgroundWorkObserver = stubBackgroundWorkObserver, mediaFileManager = stubMediaFileManager, + blurHashEncoder = stubBlurHashEncoder, remoteDataSource = stubRemoteDataSource, ) diff --git a/data/src/test/java/dev/minios/pdaiv1/data/repository/QnnGenerationRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/QnnGenerationRepositoryImplTest.kt index 798ebbf94..c51591bde 100644 --- a/data/src/test/java/dev/minios/pdaiv1/data/repository/QnnGenerationRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/QnnGenerationRepositoryImplTest.kt @@ -1,8 +1,10 @@ package dev.minios.pdaiv1.data.repository import android.graphics.Bitmap +import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter import dev.minios.pdaiv1.core.imageprocessing.BitmapToBase64Converter +import dev.minios.pdaiv1.core.imageprocessing.blurhash.BlurHashEncoder import dev.minios.pdaiv1.data.mocks.mockImageToImagePayload import dev.minios.pdaiv1.data.mocks.mockTextToImagePayload import dev.minios.pdaiv1.domain.datasource.GenerationResultDataSource @@ -14,7 +16,6 @@ import dev.minios.pdaiv1.domain.feature.qnn.QnnGenerationResult import dev.minios.pdaiv1.domain.feature.work.BackgroundWorkObserver import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway import dev.minios.pdaiv1.domain.preference.PreferenceManager -import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider import io.mockk.every import io.mockk.mockk import io.reactivex.rxjava3.core.Completable @@ -45,14 +46,16 @@ class QnnGenerationRepositoryImplTest { private val stubBackgroundWorkObserver = mockk() private val stubMediaFileManager = mockk() private val stubSchedulersProvider = mockk() + private val stubBlurHashEncoder = mockk() private val repository = QnnGenerationRepositoryImpl( mediaStoreGateway = stubMediaStoreGateway, base64ToBitmapConverter = stubBase64ToBitmapConverter, localDataSource = stubLocalDataSource, - preferenceManager = stubPreferenceManager, backgroundWorkObserver = stubBackgroundWorkObserver, mediaFileManager = stubMediaFileManager, + blurHashEncoder = stubBlurHashEncoder, + preferenceManager = stubPreferenceManager, localQnn = stubLocalQnn, bitmapToBase64Converter = stubBitmapToBase64Converter, schedulersProvider = stubSchedulersProvider, diff --git a/data/src/test/java/dev/minios/pdaiv1/data/repository/StabilityAiGenerationRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/StabilityAiGenerationRepositoryImplTest.kt index 851639ab8..82ac592c0 100644 --- a/data/src/test/java/dev/minios/pdaiv1/data/repository/StabilityAiGenerationRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/StabilityAiGenerationRepositoryImplTest.kt @@ -2,6 +2,7 @@ package dev.minios.pdaiv1.data.repository import android.graphics.Bitmap import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.core.imageprocessing.blurhash.BlurHashEncoder import dev.minios.pdaiv1.data.mocks.mockAiGenerationResult import dev.minios.pdaiv1.data.mocks.mockImageToImagePayload import dev.minios.pdaiv1.data.mocks.mockTextToImagePayload @@ -32,14 +33,16 @@ class StabilityAiGenerationRepositoryImplTest { private val stubCreditsLds = mockk() private val stubBackgroundWorkObserver = mockk() private val stubMediaFileManager = mockk() + private val stubBlurHashEncoder = mockk() private val repository = StabilityAiGenerationRepositoryImpl( mediaStoreGateway = stubMediaStoreGateway, + backgroundWorkObserver = stubBackgroundWorkObserver, base64ToBitmapConverter = stubBase64ToBitmapConverter, localDataSource = stubLocalDataSource, - preferenceManager = stubPreferenceManager, - backgroundWorkObserver = stubBackgroundWorkObserver, mediaFileManager = stubMediaFileManager, + blurHashEncoder = stubBlurHashEncoder, + preferenceManager = stubPreferenceManager, generationRds = stubRemoteDataSource, creditsRds = stubCreditsRds, creditsLds = stubCreditsLds, diff --git a/data/src/test/java/dev/minios/pdaiv1/data/repository/StableDiffusionGenerationRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/StableDiffusionGenerationRepositoryImplTest.kt index e8a1dd1fb..3db21a62b 100644 --- a/data/src/test/java/dev/minios/pdaiv1/data/repository/StableDiffusionGenerationRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/StableDiffusionGenerationRepositoryImplTest.kt @@ -1,6 +1,7 @@ package dev.minios.pdaiv1.data.repository import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.core.imageprocessing.blurhash.BlurHashEncoder import dev.minios.pdaiv1.data.mocks.mockAiGenerationResult import dev.minios.pdaiv1.data.mocks.mockImageToImagePayload import dev.minios.pdaiv1.data.mocks.mockTextToImagePayload @@ -31,15 +32,17 @@ class StableDiffusionGenerationRepositoryImplTest { private val stubImageToImageDemo = mockk() private val stubBackgroundWorkObserver = mockk() private val stubMediaFileManager = mockk() + private val stubBlurHashEncoder = mockk() private val repository = StableDiffusionGenerationRepositoryImpl( mediaStoreGateway = stubMediaStoreGateway, + backgroundWorkObserver = stubBackgroundWorkObserver, base64ToBitmapConverter = stubBase64ToBitmapConverter, localDataSource = stubLocalDataSource, - preferenceManager = stubPreferenceManager, - backgroundWorkObserver = stubBackgroundWorkObserver, mediaFileManager = stubMediaFileManager, + blurHashEncoder = stubBlurHashEncoder, remoteDataSource = stubRemoteDataSource, + preferenceManager = stubPreferenceManager, textToImageDemo = stubTextToImageDemo, imageToImageDemo = stubImageToImageDemo, ) diff --git a/data/src/test/java/dev/minios/pdaiv1/data/repository/SwarmUiGenerationRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/SwarmUiGenerationRepositoryImplTest.kt index 9d6790684..0206fc7dd 100644 --- a/data/src/test/java/dev/minios/pdaiv1/data/repository/SwarmUiGenerationRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/SwarmUiGenerationRepositoryImplTest.kt @@ -1,6 +1,7 @@ package dev.minios.pdaiv1.data.repository import dev.minios.pdaiv1.core.imageprocessing.Base64ToBitmapConverter +import dev.minios.pdaiv1.core.imageprocessing.blurhash.BlurHashEncoder import dev.minios.pdaiv1.data.mocks.mockAiGenerationResult import dev.minios.pdaiv1.data.mocks.mockImageToImagePayload import dev.minios.pdaiv1.data.mocks.mockTextToImagePayload @@ -28,16 +29,18 @@ class SwarmUiGenerationRepositoryImplTest { private val stubPreferenceManager = mockk() private val stubBackgroundWorkObserver = mockk() private val stubMediaFileManager = mockk() + private val stubBlurHashEncoder = mockk() private val repository = SwarmUiGenerationRepositoryImpl( mediaStoreGateway = stubMediaStoreGateway, base64ToBitmapConverter = stubBase64ToBitmapConverter, localDataSource = stubLocalDataSource, - preferenceManager = stubPreferenceManager, backgroundWorkObserver = stubBackgroundWorkObserver, mediaFileManager = stubMediaFileManager, - remoteDataSource = stubRemoteDataSource, + blurHashEncoder = stubBlurHashEncoder, + preferenceManager = stubPreferenceManager, session = stubSession, + remoteDataSource = stubRemoteDataSource, ) @Before diff --git a/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryViewModelTest.kt b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryViewModelTest.kt index d34a88b78..228237cfe 100644 --- a/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryViewModelTest.kt +++ b/presentation/src/test/java/dev/minios/pdaiv1/presentation/screen/gallery/list/GalleryViewModelTest.kt @@ -21,7 +21,9 @@ import dev.minios.pdaiv1.domain.usecase.gallery.GetGalleryPagedIdsUseCase import dev.minios.pdaiv1.domain.usecase.gallery.GetMediaStoreInfoUseCase import dev.minios.pdaiv1.domain.usecase.gallery.GetThumbnailInfoUseCase import dev.minios.pdaiv1.domain.usecase.gallery.LikeItemsUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.UnlikeItemsUseCase import dev.minios.pdaiv1.domain.usecase.gallery.HideItemsUseCase +import dev.minios.pdaiv1.domain.usecase.gallery.UnhideItemsUseCase import dev.minios.pdaiv1.domain.usecase.generation.GetGenerationResultPagedUseCase import dev.minios.pdaiv1.domain.gateway.MediaStoreGateway import dev.minios.pdaiv1.presentation.core.CoreViewModelTest @@ -77,7 +79,9 @@ class GalleryViewModelTest : CoreViewModelTest() { private val stubGetAllGalleryUseCase = mockk() private val stubGalleryItemStateEvent = mockk() private val stubLikeItemsUseCase = mockk() + private val stubUnlikeItemsUseCase = mockk() private val stubHideItemsUseCase = mockk() + private val stubUnhideItemsUseCase = mockk() override fun initializeViewModel() = GalleryViewModel( dispatchersProvider = stubDispatchersProvider, @@ -103,7 +107,9 @@ class GalleryViewModelTest : CoreViewModelTest() { getAllGalleryUseCase = stubGetAllGalleryUseCase, galleryItemStateEvent = stubGalleryItemStateEvent, likeItemsUseCase = stubLikeItemsUseCase, + unlikeItemsUseCase = stubUnlikeItemsUseCase, hideItemsUseCase = stubHideItemsUseCase, + unhideItemsUseCase = stubUnhideItemsUseCase, ) @Before From 91a62d291e394e3b0cfc13639bec23e739ae501a Mon Sep 17 00:00:00 2001 From: crim50n Date: Wed, 7 Jan 2026 17:20:30 +0300 Subject: [PATCH 41/42] test: add unlike/unhide use case tests and repository tests --- .../GenerationResultRepositoryImplTest.kt | 56 +++++++++++++++++++ .../gallery/UnhideItemsUseCaseImplTest.kt | 40 +++++++++++++ .../gallery/UnlikeItemsUseCaseImplTest.kt | 40 +++++++++++++ 3 files changed, 136 insertions(+) create mode 100644 domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/UnhideItemsUseCaseImplTest.kt create mode 100644 domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/UnlikeItemsUseCaseImplTest.kt diff --git a/data/src/test/java/dev/minios/pdaiv1/data/repository/GenerationResultRepositoryImplTest.kt b/data/src/test/java/dev/minios/pdaiv1/data/repository/GenerationResultRepositoryImplTest.kt index 9efd62e46..ffce27585 100644 --- a/data/src/test/java/dev/minios/pdaiv1/data/repository/GenerationResultRepositoryImplTest.kt +++ b/data/src/test/java/dev/minios/pdaiv1/data/repository/GenerationResultRepositoryImplTest.kt @@ -464,6 +464,62 @@ class GenerationResultRepositoryImplTest { .assertNotComplete() } + @Test + fun `given attempt to unlike by ids, local success, expected complete value`() { + every { + stubLocalDataSource.unlikeByIds(any()) + } returns Completable.complete() + + repository + .unlikeByIds(listOf(5598L, 151297L)) + .test() + .assertNoErrors() + .await() + .assertComplete() + } + + @Test + fun `given attempt to unlike by ids, local fails, expected error value`() { + every { + stubLocalDataSource.unlikeByIds(any()) + } returns Completable.error(stubException) + + repository + .unlikeByIds(listOf(5598L, 151297L)) + .test() + .assertError(stubException) + .await() + .assertNotComplete() + } + + @Test + fun `given attempt to unhide by ids, local success, expected complete value`() { + every { + stubLocalDataSource.unhideByIds(any()) + } returns Completable.complete() + + repository + .unhideByIds(listOf(5598L, 151297L)) + .test() + .assertNoErrors() + .await() + .assertComplete() + } + + @Test + fun `given attempt to unhide by ids, local fails, expected error value`() { + every { + stubLocalDataSource.unhideByIds(any()) + } returns Completable.error(stubException) + + repository + .unhideByIds(listOf(5598L, 151297L)) + .test() + .assertError(stubException) + .await() + .assertNotComplete() + } + @Test fun `given attempt to delete all unliked, local success, expected complete value`() { every { diff --git a/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/UnhideItemsUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/UnhideItemsUseCaseImplTest.kt new file mode 100644 index 000000000..f2a848ca1 --- /dev/null +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/UnhideItemsUseCaseImplTest.kt @@ -0,0 +1,40 @@ +package dev.minios.pdaiv1.domain.usecase.gallery + +import com.nhaarman.mockitokotlin2.mock +import com.nhaarman.mockitokotlin2.whenever +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository +import io.reactivex.rxjava3.core.Completable +import org.junit.Test + +class UnhideItemsUseCaseImplTest { + + private val stubRepository = mock() + + private val useCase = UnhideItemsUseCaseImpl(stubRepository) + + @Test + fun `given repository unhid items successfully, expected complete`() { + whenever(stubRepository.unhideByIds(listOf(5598L, 151297L))) + .thenReturn(Completable.complete()) + + useCase(listOf(5598L, 151297L)) + .test() + .assertNoErrors() + .await() + .assertComplete() + } + + @Test + fun `given repository unhid items with fail, expected error`() { + val stubException = Throwable("Database communication error.") + + whenever(stubRepository.unhideByIds(listOf(5598L, 151297L))) + .thenReturn(Completable.error(stubException)) + + useCase(listOf(5598L, 151297L)) + .test() + .assertError(stubException) + .await() + .assertNotComplete() + } +} diff --git a/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/UnlikeItemsUseCaseImplTest.kt b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/UnlikeItemsUseCaseImplTest.kt new file mode 100644 index 000000000..a51f18806 --- /dev/null +++ b/domain/src/test/java/dev/minios/pdaiv1/domain/usecase/gallery/UnlikeItemsUseCaseImplTest.kt @@ -0,0 +1,40 @@ +package dev.minios.pdaiv1.domain.usecase.gallery + +import com.nhaarman.mockitokotlin2.mock +import com.nhaarman.mockitokotlin2.whenever +import dev.minios.pdaiv1.domain.repository.GenerationResultRepository +import io.reactivex.rxjava3.core.Completable +import org.junit.Test + +class UnlikeItemsUseCaseImplTest { + + private val stubRepository = mock() + + private val useCase = UnlikeItemsUseCaseImpl(stubRepository) + + @Test + fun `given repository unliked items successfully, expected complete`() { + whenever(stubRepository.unlikeByIds(listOf(5598L, 151297L))) + .thenReturn(Completable.complete()) + + useCase(listOf(5598L, 151297L)) + .test() + .assertNoErrors() + .await() + .assertComplete() + } + + @Test + fun `given repository unliked items with fail, expected error`() { + val stubException = Throwable("Database communication error.") + + whenever(stubRepository.unlikeByIds(listOf(5598L, 151297L))) + .thenReturn(Completable.error(stubException)) + + useCase(listOf(5598L, 151297L)) + .test() + .assertError(stubException) + .await() + .assertNotComplete() + } +} From 5dc3f84f98b6bb5ef381b9b568ec05381fa8f7f4 Mon Sep 17 00:00:00 2001 From: crim50n Date: Fri, 9 Jan 2026 16:39:38 +0300 Subject: [PATCH 42/42] feat: add MNN model configurations --- docs/mnn.json | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 docs/mnn.json diff --git a/docs/mnn.json b/docs/mnn.json new file mode 100644 index 000000000..e51f47d12 --- /dev/null +++ b/docs/mnn.json @@ -0,0 +1,62 @@ +[ + { + "id": "mnn-anything-v5", + "name": "Anything V5 (CPU/MNN)", + "size": "1.19 GB", + "sources": [ + "https://huggingface.co/xororz/sd-mnn/resolve/main/AnythingV5.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-mnn", + "type": "mnn" + } + }, + { + "id": "mnn-qteamix", + "name": "QteaMix (CPU/MNN)", + "size": "1.19 GB", + "sources": [ + "https://huggingface.co/xororz/sd-mnn/resolve/main/QteaMix.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-mnn", + "type": "mnn" + } + }, + { + "id": "mnn-cuteyukimix", + "name": "CuteYukiMix (CPU/MNN)", + "size": "1.19 GB", + "sources": [ + "https://huggingface.co/xororz/sd-mnn/resolve/main/CuteYukiMix.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-mnn", + "type": "mnn" + } + }, + { + "id": "mnn-absolutereality", + "name": "Absolute Reality (CPU/MNN)", + "size": "1.19 GB", + "sources": [ + "https://huggingface.co/xororz/sd-mnn/resolve/main/AbsoluteReality.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-mnn", + "type": "mnn" + } + }, + { + "id": "mnn-chilloutmix", + "name": "ChilloutMix (CPU/MNN)", + "size": "1.2 GB", + "sources": [ + "https://huggingface.co/xororz/sd-mnn/resolve/main/ChilloutMix.zip" + ], + "metadata": { + "src": "https://huggingface.co/xororz/sd-mnn", + "type": "mnn" + } + } +]

      C&?b}&HLh60h&W|dG&7xtZrC}AT}v%O8B2M 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≪hhtvfJf963?^BD z%w-c&2BaAi=5#T$nlIBfZo`;!i*>ElH4dd%CS}c;+@$o`yur~Dft$H9Q=nDB+|pPG z0HrNf&CE+7mE&e8FnCu?!4{=#O|dUa3KALHcDvbdTUu6&-EAuQcB4~s*Vgj1W|y6` z{;ktZk)#0u^GURm036epajmPjNzY-|Qk&X&L`&DgmXw6a`#TXfw_f4K*vV~kjixwy zk5JySmEw!CytdtL83h8-LZc?NPy1iP6g41Ci&AY{|1CGD>3XKCVUv=J?< zPA(l^y>v933_}Lsw05w-Y!aIPqq$3*UiWB`RC(o;{B_5MV%BJIjLNi2kHB@_U|}5fBgKNZ@=@g^+woQV86+#C{{RHDux;%0W}c;gb=F1pll>k zc~{(jsXP4qzx${;_c*N&hdLbqPV0ZIkSW2TdbW&8f`&8a;^G5e@xA~0zkT;tJkl5V zAytR>9RAqX|L7Zk>J|Oi-N=LU`ly|5mo#%yHrN<7YHnn#1S&T7598hIcmDdT-uV45 zI_Ybj<^FXC2REI2;wOH@Q$F))XKp*Yys)IvjN@uNdEoegH{AcapL_Mof8u3#Y_5A; z-tf4Cn-{s*2Fl z4jU!!Yo=vbWw;Gdk;qUwqo%Pb>kX6qUYTfM6@$shP&F83X`>=fDy<+on^kr+6^Sq@ zQfhplr1{pTi`H>t>V>UI#z9Q(+a~hy27A9Y4@|gqnqZCP*ifD^u|cu*5&(eIjzer} z&|uA<8&FKqyqZFJ(afmVzMz3J%_NWwRSC&hLQPoIpf*8Fonqtki)N^r#;|LC15Q2i zHGYvAXi47qq|IwSIZhjyv?OZ-9Bo6Y+t$BXRvUvx)0xsV6e&e<+HV6jEuoeYAmt_% zku_24kRa20&KAr0axTG(lo`FdHC>C8A&R0RhxKsv@c8J;)p1BG#Y&-|=|DvAM7k+y zB#_o(4v-2nYuR=UizNdilC%`yHH?S|jAM;jBO@|A>yU!v6Jl#R`e^Sznj_)X-chM$ z%uZeNhL|Ka3YI9<24bQ?kxJ20nUp&+N28Nb1%lDe2wFhGL@a7SYgGF=1dYmu6{WZ1 zi%A@&%4~W*NK8MwJbTlb>my^mK0Z7-ymNEso9ny2{oj4>2l_+y;i$j#li&Qep7BjL z`}H%~i4A~_RmHMJ)P*!EM=4BMv$8e|1hSsg;ix-#TYcA``8$7Mabf3?zK_#7t%vG# z064ARR_n;9W3A?6W@a-vdDmmU)P?I`_|liW^U{|+=Irv3zRVAWiZOrm+y29g{?X6h zHk^BEdBXX{nH^uEI*I7gL68|~{bZ924<$+|h2%(O4C8R6Ue>$E)jjp@|M{D5`hQ-lyBgT;E^l7dz)lXQ(IZ@#@Ld)n;>|byYIUiN;J&<3yOO zBx#)o$C{~{VS$EH9Acx*$~IZ^#8)xqYTTS?ILYG?$uV42>((KGAAYutT(SYkV%CF6InZYj7^iB z0HZ}znb7DbsT5S}lrN>CZgdrNlw@HLR5G)c!J`!Gv+JGo>~YQXiYgFtvXSJ~=IoYi zWzzu;8y+4HZPuGGItoxY{fYMc;FLI$b;F-*f4H34YM3?XTui3vkKM@dBD&V ztkpz68f(pns1Z3ftfbX;@@IDK93+yU3K1mR!79hN_e5)c<%hN z>>eLpS#35C#HG82`=9$epf{Nl7utJS*?*H8Mk zf3(%YN`%AL+|{)Ys;4_=ZpXy8exuJGxuX z^V~l7m)<+dvRlwnG$f*>(jro+NtWi_K_A~H_$_>d<@ zak6$Db?Y+c?tK5ub!V@;?)vL*zwt@Wee!irxc=skyVd&NP2?)%7&+wnft4@HgRi~s z?pNP+_v_wu=j-12j@Q5Q>g8jvaQK{y^X2S0-`%%^oyDRn^x)31nNSP*Qi@q&hYT~! z)y@0Ge5doi>${F~_d++L8O#9Dh&oYOCRR?(tdbIAXFz+l3Pdnv_?E*7)d%opxmfn$PSO5wC?0k@d6{!^G%I}+H+ zWTsy>EU0nP++Q0MFeQG`0!gHS(M+0}Qn&!$CV2q}G+EBX5yBQO)b#r8Q5_Rgh=w#F zTD+NR(zahF!g2!hlS}iOKt&V~iMM9f`;hFW zYUXW=MvTRj3y}q=sb<~)=wyOm#n>oA(XxAu%yuxOku{*I8jNgDmgKPaI3#j2Fw;=H zO;`;IN)_7VSa1Jg)BQbUCT}rfY++(hwH&in3_y3o-t|wtH&-ljfH*v@A6ZYy(2O4cexH~pAkfS0QV~!(Yw0cxe>SF!2 z)qS^r(qq2rm;SnSr|SRH`rxY56M)nDZS~T3-a9UqWi|^aQf$KG(q);&Ed9pEzvgYP z`?oKB{TF}yM?BJ3`Y5iW2T#7`lfGf+t^COOM=p=M-EOBZz4!gBo9&hbjfs?yWUvky zb*LD!I%ZxBaCgB{Iam}_6kBvlQz7ZztBSPU^o=NwljD5^Ixd{$7*~(uWVIO&V}0l+$K4R)k>=_1{<_E9{J5t*^|^oWDYriTF=uW+ zYi?y(%HsF-0WxV_wnbR)*8A>m2jJEl9((JjKla*J4)?FGy!leSI^6&2yI=c@ulTK3 zzkYr34Sv$?V|TyXKVNpvmEE}(T1&l!iB^p0WvgMcTCcrW*Z19`@B3~(FJ<04g>HLP zPa&v=m?W(i(vmD)t!qf=F|bVZ?Y{fXv*}RNTQ%n zw%J>gq-X0!FrlL9->>oer$k|G?aPf?*|43B5Zd%X6ZxOpxn=r!G)trrl!3vZB#zNM z5~;8nX@zBas$_(<;ezO-Dky18fxQ_l#!#RRxjs2LIbIK|A(hr9w`k6oNYKLElmf$O z6J>LXMldsL_@PviQ-&JLG&fPE9AK?ot{ItGg#>%5wr~WaLxe?&oa96kG1UkJRcOJ9 zMh{s)sW2#~XBt-JSx9_d# z%M3`Vk;4)ZNWyl?^49a$m#$k4Cv~;ClviGR{N_*o{Lg&!cK-nA{I*wq??3*dfBQAR z`0B@($DN&>bGcO<=TMXr`7|O~2g@TK->o|@t&cwPQ=azaKlfKpyZ_VrAgt39fYbVI z^%?)*KmGD$@Q$a}tPW-!v{~cm#7?es39XKJ@11sd-vdATeapW5FMZu<{T}OIe)Ye4 z{SUn0sq>H8Tkq`nd})i>Y+m|OitX(z8Wt$4YDTD5MU6Vvgb|TVH;@7$GZr(0*p&v9 zQOanepmiNBGKV3Dm1+tZA>wE}9J9*Z1-XwJt0}66zHaJzBh-1F-LSajnNN7e=RNJl zCtvTx{;dbIGqc}@6?zzJ`yNt?#2p;b?UR2aokz z_Pd>h`kD8OZr-K2bww=hCdsV0^xkczto8|34bDP7}_@NUAwVfxlJTFdrdTsr?rO7y& z#))V?;Aje|%tn2kEWg^?kx8MkP&H+OX;KzNwwz`(CQ-{c%hniktAJ{q>;%8Zl+o38 z4Vn<3xt&G`$b>}W&upEi1X|=X9S}2NZ9D*h%*g4zHMWGS#^`LlaVDWi7y-7hIguzp z8ZyU|I;=OF)n>C=Z)$D$A=0JXx?VFyb;fH^X#z=w%;{9XoCu?-anYW~9c+w=glC=wc#}5Yt$u;R2M*n9ZJUMn*;ofjS}trK(6LN5xuEv4(L}jFJ#J z*$6_UNyR;)-JKN_2O;)kQE`-x-jr6&T-=5{f5?ljDH6aul@KZ;Rl_o*Lf&?8^J8v& z9H7IK!{g22iywUT+ZGRe+uh&e%MXQ}<1hWKpZUe_`7itH#W|keD|@74*aTErVY#lu z{qf+vcwm10&Y$|uKld?TewzGsS|6l!Isly3LnYwMH~f?1TR$Rhz6F~N0AygZ=E)Hc z4_#RRTzQ~-=UX3l%Y~PH|JV0^y485E>(1Z0`v?EvUw!=e5!cnT2i%?6vh=gXtn2!| z^kud~t4`)vqmH#k)Ew61m>E$qdZI=o&6)~COLI8r7L_SLH7c^?rSWK^p{~~vLxlpR zc0gyB$BRQ{@7|ehP?d6@Wx-`$+1WYwxX*avXMXFaox9_V_rC+AuMtZXqW@0Az{5Tc z{!S05Ot(1x39DxJ(Uv%E(0yk-Ufa4p$4L}zZLM`)e-g!O@9YVLz#(zcH?t@0b% zzl{h}z;ELPsbO{8P&Ls%Q}C&QWSc|GCo@2!Ax&oGDd|jV=p<`i;qAdlTT%xmMUXOK z38-;)GAgWj4w9Y%n3QTGa>CqGU@;bx5u0JXit+elI3CwA#*i7ADb7q#Hq}u!re~7I zu8l|DCRa>=PnP0xGv&lLN?GG1fm2{_OYj|QCC1gTiILeTuFOnBp(!00bDAz_N`Nsv z*#^m-%1|n0RAN9))C3Z>A}Z@z!y03-8dwD|Bu?9UAemEy-1avKI!bAPFZf)Y!vQ+n z+F=Ajf=|auBm*s8Kuzowm9f?+2(&$)KjAS?JhyXZHJn^Iy!!5=dtPw$Wqn`?#;U zAL+vKh8veR9&a{>vAVQij_b#lWp~TYpZt%XyL-#tBmE@(UTgiXqu==9m;Tfb{ik~` zUcUYKx(j~&&GQRqvA1LMOc81Bi+NE*Z)IMVi+Sl5v)Qt8JI%>qY z8Dc#|AfskQMy+To_Q)UO7K@DuYMXrgQbVWFgyDME@! z_s%t&&z1*!%l#eS?W{})Off~LficBkiAfer;kjzU44cvbxJ~)u1mJI{1Jlla>n$b) zLj(J?zXHqNm1+iWLT{?>tP*(w!r4o!$UD-^mf1mOunrwTgBj>%GkJq9nYzhR47C?O zfJg;vC`Z&8XE&d_@#eEP?(HlN53gL&@XL3-^qprfeaAiD_W}A`_yAU2jSs%*zBm8c z>)-aOx6bDMV?X+i$9?P_dp8~Qd$ZqpOLAJL^}$r91HfrLRG;we|KCgNf{%G34$i0) zG>pb-gVh?F6RbxYHaU)Vd|2+iXR*2Z+JF8xZry)$#JPWv)Wth5ed`@x{jv2a*Ov?D zyWQP>IbZDV%=`JG@4P_FF(P8D<2a5(t#!;XqGHTYq%rG=OoS2@;}|K=2t=qq zVc{@X`n+_Dc~|CTwpc9Yy}M28TM0$u zNgCU(xW)E1@ieOBu;iB1Y0aq(z&fAunFX|DGiA*L;BK>>#r~Pyet$u!EPBp6G0-}} zW-kTPKp0y{lWisS6Xg>Vzuz>uZv#`1aO>Qf(e~PBe;ZwATZ-&VZSe{Z{)>Hlq$ zMkBthXrt=BmUsHUn~F@d}YE7O2xkh|z`2LX2^L77EXbKk@!;Y3a3 zl6_$@dLO0j`yCFTXCc_jVyo8@Oj9m)2D2inLeO>dbC0?1*0Tp^Y7U1-CvUI!{=~a~ z@vpw<+pqtFx4hp!2u|y?PV2p?4+TNqX+11;-|_ktcioF8J_EBk=zyca^$aYg>`~LA zLyGg+c;;N(yZPep|FQr6H^0<*y6X77*6UvUrn9l<%${D#^1w8xHgMKHiVu!4q%$iXZ%z$9~dd-}3?% z2lHn>|7p+s+^4>mGIg^+3a*ta27yhSLKlh8C`3OBXzyF%wvh%Uu z^=TjbU7vRJhD$&Hoj?8Z|NLujzWBB$&2GPKc0*nCHdgCByIie@K$M|GRnHC!nSm8B zp=QF(GKSyQ-)}wQl&fKkY(!BuLqaTr(Ve160jHRZ@&Kpp=kGWyBa@WYnlb zj_Vw%qH;XU;}foqw7!@3ydCd)?8iR!&;9UUdH&!1{4dP;0G7yHUp=~V_4w-5qhT|WPFmx|M%E0ZvO-WIpaeQAG%My^$CUY$ z5YUud?rxmSu?@{SVU3IyKxdHJI|8PrXln4Kkg^Je88Y+c%zzSR1u!t3Kr>DoDI+Bf z7?0xkqORVDi&t=UV67I&RO2%t9hlj2*X9Q}IFEx}KiHe?-8#Q+f4+aPIM|;b?9P@u z^PM^S<$ON(erDaG%xB%sPB+`bat9{p_^rS3x600=82)owr}d#)rvt!g0l>QEm;U1)8J_S= z+dreOhr3{Gi=K!nlr#Z^B&bpEV3DtS<;%Y0v!1g*KmC0FJ=L3D{+9b*@Rl>(`CTq& z?8~f}naM<03#}qE6*V$)+|=4M*fpEPf6T1N$Z;LxIyY;r0tR`j5Ni*0?M*qvaDa8Ih#ZOy-7>bVHgH2CLEHejEOujihOfvXZbS zG#67chndsO&0RJOadh#jk2%}jX-Q^Vl@HaBmSQ$!k4)E^{2;PL2V`?13z!h{ZB!6d zzz}3jDo!KY!nu8wy=OvMO9@D@VgEUqfH5hawmwsX1MOnk1k!B3?XoAdKid$&nC_tY zhZ!krD9|Yot?kxRX^q<>P9PqNZRsBYrL|Ot2mmQ^%sLJlB2q{UqgGefM^}yxk5*OH zR9M{1TI98Agpe76RE0#sN`X7+g-#-2&c@?x^G+$#RRIQTL13hDOZri!gAyBXN=5<7 zXhWoqg<`#ooT} z?v>qTzg%|xvRmxT=kBF*T4xQZ3JS7WaTYJ`PPlp3d*@}*br)s_GtCfVRZUHaYE(`xXt&!tyL)b@pIO%(pB&#iTzv7B-}tnz{6kOv{HJ{YKL$?gv`*{y zTBifRX#v20d&4_^_>Fh_t&fY@9J3h!{6GW0%xM&1NQ^O&`BYg*tj=JYf55D2YfBh`>ce&HC>)nw_r;(&cniYs+#!zd`7!}H>S!<1IS&=n1 z8{|4xE8A=|R?8!;F7f0p-8H*?_q$&9_n!1wAMp@+;&&5g^^5LV&wTv9`-vBBx;bZN zXV2daz35;3%IAFk$2{t00CJm?)qYv*re{CqQ@;MQZh!n^Uhty-_L>LZFj!sMPB(fY zcDjXxI*hqa5;iX=PD66rXS%GI7dLaNMY38F*Pt}l?4~{?(vl#1m}pcx7a*OM?vBz_ zH%Jo&LDoWVJ2t3@5(dDg=8qHU9w~@P2i+-dR%@qq^LcXs(=1(tlY(z$HrO&Ww=j2X z@$_kCsjYk1Qj=$R`ub+gHBO2fIhaIFrgLoV#BGjfG#+mq<&*}6DJ4K#C6O48l-iSu zM)7YGN_!&FP8wQ9^F$#f(6$fPoB@-ypnYW`K?f?NL?#o=tVy;94c0o2M?)QkvF2Fo z$*LY7AFoaZg=|J=N24;OjLbUJP)4-pMJ@iS6a#7A`tb>qL^7=D`VC1b;f?W6wj^g} zYQi-ck#LwAvsX%{qE6=kB5Gu2CW7!OGtJDLAl2tfy1Z}F<=DY z@+D?_*gcE=J>TE+on=|>^}9Q><)U9Myz9JlzHqlfFR-q-)6o^0n5BSL%<0zkZf*rk zE@$)IZg;QW_0a>FCI=iO(GvCAYhdQhdL9s<0Cu~@*}a3^o&CP_o%48g@`_8pb!Yd$ zSG?dG_-OkiIjz(BFsai4;IshX3;)57+;ib}?w!MYj#6OW0OZO*HV2*&n%LXzj2=nZ ztg|ckKXCU+{lm|=r&vy-U7P%Rnk^u>tYaDZoaU6y*#umXl zMvcr-ky+Q$NgSVWz0P4}n`*k~m+s96p8AKM@y);V9XmJfzE{^H;oOaT=Y09Xm%ecg z46{<_yYJi_zxh{R`-h+RjBVu4qo@A23udwN&%E)|zy6PX#792$KmE+lyyePUdi3tp zklyu94w*3ws$|)X;q0tPPnFeMl%J%^41DX`_%7lYv7Rb$N(;2-hXd@#@X6E)Zp+Oy5^z3vJ zpe9KYn`VC-64vxT)<`@ySp}S#FcK7;O3)3aDS6l?WfK6HWNoe8EU-XptEVM6Xp_I1 zPR91w(EqJUVlO0x_nPwMIr}sJR7z!lbAvK-!&crSERno-Vb0KcPs2iEf1u z8(9gIQf&4qKuIOigiI;b1oIvd0y5OZJ~9K%02<7Tc{}=GNJDHMjLQ$=^2l+}P)(^I zZHaytJNw){;NF2P56b?*d}n`oaAtY1Ghg&x%qU|BhMH}N1lBQZ#?88})|=zNP_tGA zWyY3YOs5s^=sxTEz4@-QL}(L1WC3IQuCX@o!9|#J#88Z9b`SQK2g`mwn{}&U^OmDK z|L6L*{?zyUxtpGS+rtkCKCRO_t%svd2Y}PUTP_~{&7b_$@}!T%ViEm}?wFO98H8+h zuSCHVOyHXU^wP@1xLr_WC;sm*{NjK1=Y95Gd-_|y z_0(tF!V$ml@;AH1f_7=`kr)2RH~sPQ zfc^Zd|NHUr@rChV94iR#%#-6LV!i2{={7CJTSr=GfOT#Xs^GK~%$zi%U@_LrhS_W! zcgY~o8>w;Hl~1C7nQ_|lgJx_>ciFV{&NR}w9X=XY2Q7Xo1qRW_xJuxv`=4{LUo!06KSvFg>FbECPR4pTi zlg;XIwYhq{9_o4+rci-)bYo7pL?RSp)Tn{Tsv0AtG&tF4M^svGX4ZiFlzA!SmOUhM zk_OTfVd-uLQwHQylyS>iPRS;OYdbUbgd);qQq5FmieaS~Xfz|d(5<+&w}>{mxjGy^ zs7psY9uXtPB+WQOw}Zt#cXn;}pzK_~yl}(bg$w)VcNe=$pBWID8fzVEt;3Mx5X04a zbkE7X?>@fgzSaE?t{=QKT)Cv9dspwixVf?#R-0iJ5mHvl#M!Ka8Ku&7%WgjFdrzwo z?VPBQt^z11#SBzRq1>D8p4&UK=$GBB6t{OjaL)@*eq-*}dRD{^I6%b#}8)FB0762A5p0fUQo}!=}a%8C2w0Ibs-UU1y%;cm+o%s-UH7 z?c-f>_uc)2fAJrE?Wg>e&v+j%?82=7iJyPfYoB!C%3SjYuFO_>=d16&ZGY#EKXBv2 za^oM+de4S~yawc^@o~?4@~3{uXZ*r{{-rxFzrA+WaXD`4W*n*&RjyBJJy|hOSkS{e z0}XB<-TN}P;-z$bL6d{S=tf0`RG~B~;nt#p)S4ww(gX!1GZ-+o2Dy1@G&Qt9D$SK@ zX5s!Zlrv2oC46^!5)`ovLJw*GOvU*Dw;R98H^{-t{IzRM_WnDg!AXb{l_)M zQ0v+YGur7w^Cu7j+pOC10SH5DhXJ(%2bw?hFi2(7V>21CId>ORL7bbtE2VF@#ulO=dKr^aag{V_@ef)|?X4v&1$RB9ydtBqEEg$w3aKU_y}Avda)`W`&GwQyht) ztO14)5ZQTg7#+ndy~c1fp4>m4T;}DgJl<$iF@SX1JQrtX`#ZKg*g1QlJA32qjR(8u zX7gn!{qbrzjN_9yzA|jC;P~D+zAqkl)A}7R@!xp+*}Lz*=}LZdxBRpVi%+=@&srSa zyt%x$ehc3HTk+Pn#5>*K~_}4tn^(jW@Uf>f4=GMZ@T}=6R$h{ z#Q$CD8-C=k{gsdYOHak)#>`_3*c^wKv72}3OCmREo)RmBtRu2!rt+vBo#ZAhQ?bGN zC{OO?#gj7rt)KtC$9?kS-}kG!{iAODy3csV*ZkUV#glJ4*< zJofDS{`em(m0CP@@4Mdm_g?Y0f9c=+jUT>yeeolA9)FMri<4BhnAMWBVRN`#46|_& zv##urwr!eAZ>Z>Cos}#x`nbu_0Qb#m6=PJ$x`cJbNJ>_S4A3&#BoK5UMPp8_Ed+B} z%NaJN09sm_IV0LaoQ06liO6hQ*8t2Du%@<8z_tBV!n~1ZIQ6DVz(R7eB>`8#ZORgk zgim<=DMM^h`iIPz(S+ZVrFhccSX=2gjbPiAH1I7fx!avr?|t*;9glzJQ?7sRtsm$=-KTY0r}f^{X%N_lZ?)y%&%W+m&--UT zi$Czu*xkX-4rU#^Fo_1lh>9AlqcSjz97CG{!y4m&S}}~!SdNbE_{1K(_ZipkzWDEd z-6MTlkAnKUfBf(2=k9${_rzg6%op7=2qt8&QkzPLPE3>hmw zImGeBxVqXs{`w#NwkQ9QhfSpuH9!5czW?P-_d>H9zZZw&WrK5F@-+jLW3`o(O%*DXq4j4FMZvFmpWm$TBBCPZgVL^ffK zYC;ect8ud$hSkYxQ|mB93`yIWFKNY0Xj^?IK-H*%rDSGJpkE`J(k4ROx^ZKI>BG#F z$}~6gl94b$qVbj|-Nw0LLhdx`K4^xBDap176}YzEpW1h9gS1-U?UY^x0Mc{{pvInW zqW38W3zo>n{`cvF!?)4GnNu8?0=_+nXo0#8geF7mmK8tI{hb*wO=AP1sch8piBXXb zt7;%JRk5;;A!HrK_3;?vI3N<#IK|>Nei5jQ48lf4a}`ShA`^@h5D2PxX#^w|QjoJN zB`K5BSPIoLh;4e{Cgn0@Ge2i)Iw^q~@>FOp04Oz~eMAZYNi{?vvr0L|{t_u8=rbY{ zDUFDeVSTAScm*dT>I!2sn-thC7iYS2d;QL$pY8R#vu;6Sp{+SUxH2BS{nFd-Ef?=T zzW>Nqw?5H@mzqh#c zz4IfT)@hyA2e?iLfDhkF$;i+7hd=gHR|{{wO=k|!FW9*{M?0fVAp>>9W`u-sz`A1G zpv?faVjMA!KCX1->Y|S08(;m7pZEti?mb#5@*l7oPsVS2@?X0B-U~PL#;ln8Y-Y3G zyS~i&XaE?AnV~>zV!e)fcU)a#9c8$r!+Yc6**nhu)t~*F=bw1t;k~ez{^A>+_XGbu zZaT;@S46DWrCxsQJ1@Q9Uw+*!cRb8L>ya#B+R+Lx{MMiSxxe>cZW+%%_24Ppz@7PQ zXSTCg^k(YOb!IlV+0IVsjSh^4P7Giq7%dh6qN-GD9co?2X0=+c*U?gGX@!Mu=1qd1 zH6o=LQ%N8KN@t!NkPJ7UA1uz^bb-Bti895{PM+P?n<4?p z9MRh1=2CzX=2J2*38+Cr)%tUwZU46!U>TE>c&pjjW`iXr=Dh>?(343hNG5_PhQ_CC zhXdTk4z#~+)Mk>_Mz`4@Kq?7ADMLb@DQ0GcvgSJKI1KAy$gGgwf3*aJ(kDU^lmwbrr)5V^7^UqQ zX;y#}iIgIk6;NuTlU5}qB$J}a(t?1Gb+gfMR99DZWyQ^yNoch6#DdG~`m+b!!F=BL zv$8we=`>H|xT#@zv0i%H;hk?je)A<9+x3et{yTs6qrU88touD6cm5Bq+~NN9kAB%d zdHW0Aa9-Dc;=#u}?)*(P(m-#(*FSsZ`p0lS$8s0_+>5Kx z`cPU#Q9GTt275!GO$E{ZnO$Mj>KQXLt~X`pG#Bi5FYo+WpZ!Tc{v$t@WAyCCjAUj- z9Y!Y-3Pe>7bzIl=G1f=98vD&?>$~&5`}4t%cZa_<)?q;%@4fo+|Gpp zU|lgZYCdUBC|0AGRt?R>3u{fBKr<5qy`wAMcm2+Madx?Tu(#M<%=*6T3QS5h0=vPz zGczxpGnAPsMu<{U4w2pxu#8Pk50X}lEny4nO5ZPLi@jyPC?e>MtA7pqzvXj+l93`z zPNvkdyo@cZtEFx=>gM(dx%RIX?3$dG{ns87jrcQJmNi+QCnlI6%PHQ=rd9vsUY@?* zriUk>lnL2d?DmB|#r{SDWJnblYu!{GZ8nFi^~tc>Z0b-aNnA2(B#=`yS7yyrVuUQC zMvATNRw||T6hkls4Q6I(bO%t1nUS5F6CF9yT>&~F)8yW02H$4!H8F^iNm>&G$$&Nr zY5F(Wjs%*Ky8*t01_b5AD+Qq(vL46DqfWCZs@(xfXXq3GVw}nsDp$;bY8AIcYc3oA2po))%DevKlqwA z=DYv$fB)wG>?si9v`*`Ty-o*!59_L_@BEK1*xY=Z?eAf>PF52b0^4-UF@-DpdWQni-*WdK~@BISr{rz!O=H!*}=iYMfVs}|p zU}bLRd$aZ4{!jeOOUHL!{N(36I=Mi@WYc@$Qpfd-4C+)b)P1$YgP6 zQqF?jibce@8KaIZo5_l|zCD_|Hw0vh3J`(bjNa|cyPes5*>{UsH+S#cUG%P)8LiAq zH}Adk)?sVhM$9TH(kGpXHPVb(@nU`7@Azy!@AiA|3fRbz(fImPl5S4m&xcZX1sECI z1mM=ByG_gZY%J03b25Sa0a}|Drk>un58A~4FkQ<5Zu7>ZF|u~Uv#IHsfmCoNPAhI@DT&F;PF2W;G&Q3dxuiKtc>jH4=#= z#Eb|_WSTbuQj^{r=`1pmT`{A3F_3O1($JuwX|gGmtPzP)qzagrPH2!YlSn0+Q@FXg z+j9{T)o4n9+NUOoM6~CLvdDN~efe@89^)if3C!3nFx%1Mrsaj34sJX<-|72qHk&Q_ zonC&pIeKtBymRyJU%&F2SFd09+^_iTulVV2e%hb@*lxcECXey^{>S2RpZ287Z@v7o zSHAehdgJxW3vFbHaZ`mtD~=&*BE58r#r*ui`L64jLGRxF;5%P@_#1b8_A@^IE1&(o zU&d*j)@i-J>(m7NVO>`@WAq(G^>Y?NOgCDgHEn^!CeLlCzrsG1X6`a+@&slnrc%tr zvbcEfJCBFD)1SVte)rnHdH*|J@%=yZH-7RbzV~0xYky;R^B#9Ht0!~J0Wo4&b37W4 zst?0n_i11BCqD1H|Kx0c2K+7&zrVj~G?wRm_8&O^-~Q(VvD16WZ01exFPt0q_rK@m zuY2WRxc{I3KVPf=(jSs)PB@3Z@RA%N-<9MvK#-LiWM$||+BdapQOqq=wijbMcsFuuW*2!$}&1wCgWHGN4 z5~M^2NGn9~mdQph@N9S@K*@9!c%mYWnP_-WIgqfRCaZI%3?TsO$l3@-05YwZsyw4k z=8NgcwwC8$-njxp#)Ioim-)abf^>CroAv1D?Dyuo=l9Qcv#w()-kFuec<)Zn z&9evIc=X0wKkByc`7b{-ziH=xeKWsT^*ersr0D$oANaD@zTnlbzUwz1UvFJv5nZS= zj5TSDGVf=@FcjLnpLL}u($F8SRs4&N_@Dln_wF)I>$Fbm5vtP@fDhAZAN~)n zhQI%dugvRj=5-g+d%3fBnbTm!1V<9cw#3@H0#cC}lTn)uubJ4ajuDkdhtL0%kG)}k z`AFa2qod6EYt7Nmt#ffO^+M^qbiH@w`0(iR zy${qYCoanxAiZ=bHtEJIXv}TP4Kr)L+upn0d|rIf_siZ(X)E{w^WJUN^?g5^b$uz` zIb~vsP#svoj>Ww@=;vql`n{RW%e3&H0QQqouSr!*l#^&s9!y$x14VTtfDFR6Yj{5N zG+g^1FvWm4XcAhI*ChAZ28p#{;M#X$+VO9bb0_7HG?D)?9VaN0jXrv~m zt~R-f@o+V4qK-Li#xaJVi5U{IS#6y_ixkk5eEa=nb}g5r1whfD4CJ81OS62HO2grRAc^|7i<}>MkFi=W=Kl4s09njpb@DM z$zp}UqhWpbaNlKIsnX244rR%m1-fOwJTpIc{>;I$?~C`Pn^Aduc=)ad?|k#&yN|rS zb@v@#@o&H34}ah1m%aXde&_#hzoTg+wwXWn@sIu0fBy?N`uT(98KcEGDuM+9H(7^a zH0Qy=nVo(K(Y<@y;X7V*>6OoV{6h}Hc$4XETF39?B#DSF=S2zCXufFs~>Xo~%g1G06_pUD=&-WJl*Bu<(u)lNNj?dmNf}j6WeZ%K}+<*Jq z|5i7Al;@R8DVQ&%uPt3LT)GaCgiG-E7g{p?_Fv+n8xmygF`efhE{otQ5ci~V^yyF>3$Gc;IO z!%2dGx2!1u09inE@I@)hSw?6zj7#L$6B@^>xOiS;((!1}>ZCR33P0}a% zOoK+XHGd{$x|Y?QTSzE#60by)=vP`-ZRq1Bfl6fK{ z33DO>Rf19pWop{UXJnz%DN>omU1nw0d6W4-EM)1YnZ%KkfZsr5!x%~7Ejz)ionxd( zlgpq?Yhh~>1yn6TS&9_ZAeoVnYNVwFqQxShM;SwRAK&vJE>%{O7n>#MU2*uVo1N(o zt~)rlTnoh-4K@AhXeoV$Ga z%IbKf5rb)cJY2l*;%slWfA;Lo`90s?#jwHHT1hYjn;evkfD=rGv4r;>`r;ubP>4vl zA=ApDGXtbCNy?p;h$ftG?9MG%b2`l<63Q}>blUF%fP+Z^DR^V@PzY=z!6xNTBXmZ~ z32p}8q)`=|gzScFP)=$)dNdEQyz4O^|D+FZtyD`o#z03Qy~_PV3>Q_uDSvv>pvLE9RLwq${OJB4LYS`^Mekoq6ZzX6A+M zoL@3);zx;D_jjQ0}4)9LIEQngdv+V)wbgORxLyf zG=ediR)sciB!M7M;Su6ou|YABLOX$I*55GNaZpgQyubM2xAd5w(VtKxSGNW`q(M8MQ_op%9(k2%${Wq?fLr z6)WA`OXuy~>~spA2vKI!z#=n)z>q=#$cd(Y3S?wTpqrUb84A`L!tJyb*}(^CTBmgF3{ zmmI=?u}O9T$ix=qX`~q%K*TIFC_^O1dh>;|kMwPw*85tY`SDNwFF*I|d2q&1(gn9B z^`N;bWD$#{?cR3L=6~fM|NC<{p8fPc_EC@YB|l8{9?rYu)j8(9Ic137W0{vYF;<%d+xr6_uO;g`s>c!cD?V;VNi}J zNEC1IA<}HZ@C%}m>F85om@N0D?YrS^>~35CmJpXs^3RspWsU0JkUjta29od=PqmHu z;@03BY>zpyZJKvBw`+cQqt&p{fI?=3vE_dmgqD0TgrFmlX#b#-))E+%5`g;{3omfg^6am8&S!kjpYY`e{I6*O!1-t1Q1<$}kM8@(b59Xfilq=acHZsnEIV>D z4o5j&-5mbU&6_^?3qQ3xe~SJ*tYt`a8AT;1kDjK-5oz_i=&z2P2W*f(~xLRK0 zd_qX7HM@=fL)#t?t8LUFCS^ew7)VP?YjMBL>pO{^m_j0La>`0#dSzB=9Am7piMk#$ zGR7Q+8mO7jWJze?P7%bYux2O_JW<&MRhiMa{0dPD3dJpIO*7Fu(7f->SXius2__n; zw&WKQvV^QziD6(UAQuyiW(9yUTePvvM3qEPOr&520|+LRV*r_{Dlsz0(X6vJAt*~4 zfT0dohQlj7amtbiUtqaAUo5-%a@NlmyZilu0n|7~+;e>2D=)t8w>EFP<@THZ(trHF z&pqpg59E9Qe<@q|`Ny1l@Qqh0>(=?5FwW5}mOBtO>rIXIUF*9q#pUPy<1c&!FZHxe z>$H9!bt(b+aIdG{etlkg5H%>*I1cOK@>)jD2nXk#bs!X30~u)a!nQ6hZ7VbOwMKc>^zeR8LR3VHsKrRw&|0JAAN1;HJ2K=0e z|C7Oh+tYydsV)NTFhSDf(*>babL?u8`)~C;76jmc5i}$i#8%M{BOGRG`Df@rS~$>A zjXjjE6ll#G%R;0$3N>_`aWafoPll_j_3?VRvRNOmH|ybKvl&!tY78W@)`&Xh#2qGx z$k3$mZ%*bEXfPT@- zJF~O9x7gX8@9ZvicIWdN83jYeTQ0rhMGwC6)tk3G^ACO8*Z$_WKeF9_tJ|Oa_`|y1 zYKIUSIpipNor^ zVi=)7ttZE;2QM8xc(ehf&aIfwtOL+|cG1Rwgeo%-l}MNyEjL4~*4OPUZ$JO=C)A$S z2e=N-E)5nnv>8bg9mS2_5?&#yDk+=Iy4~e)+buu)>%TP)AIjd3Px#(H@`t|X3-7lF z-xYUWu2(lP-hc7Iqx-Lxo@LQ>vu^MF+5O#p7bQgIIIdTllX=%4?44PyH*b5xo9}t` zTTb5bfHsxAw+_3(bq!Jwqzsr4nMyM-NrMwEFd#ER0a~OCRP*i%RAY2)L7)w310ltB zW&i;NP;TW*E#Nn|>>xly%lZf*b4txsa>DwfS!G2dk&djO=z>DbL}C&wMN-OS4i%fs zp~m5Qyn3>}c)YnftPY3u)p|6nSDRRmwMt`EO3A2ErIrE=6(K4V?b3zJ7J@*jX@)XY zl^P={Rv5@Ko6i=@#cbAl2lEazn&d#|FhNSoB-Oa2VwhSaF$@$6b2{h%Ol&NsW(6hz znL?S7qY|kkGGMH!$jEigQ7~iYGyseUAV<~1)#25+QdtWz_p;Y5&n@=%7CZYp%iY~s z>H4}E%>5`%UVZ6xzjXOUug|x9+4ug1Fa7zi@SP8e!}%vY{YitbSM`Jx`%b}LWoKvK zgw?P@ZbtILNMFX3QcmO75j z81D`pN0!;VRrf=?Jw#~WLh*|Vpxoxb=<7K@Y6rm-`hNz)B516*}OZWayYE8 zzwiv0C6RQRAnRO)j#(M$#JIb7Kz4GtIXM5Jod56BUaxrI7s zLJoEYCo)+jGg2&Vr%s?zb_w&Qr6GWH5V96YtG1D+Cz6d0q$a|LjLoe&#q>^OPqXR# zuGOISmw;;X6_b@Ph{2Zg2cwa6WKaZwB&{v#vGpH|+qnZnWk92{Dr(l%Fs{a$k)y^$ z&CJM=BIU8=3MeB)7c4UfC{pQ!(k3crKo-+Mh9c;YoHX>-cYW`j73*Yaq=5}~3NN0a znvx3>sI&ozn(9B=%#)BI$?Y)2DegdoZ9{wkYn}jOWI~ylRjE+M^sVh_YB>aEzWM*L zcc<}|U1gp4f6uel-shZq?oe}8Dpi@t97qU+1PJpy3L*jx+Bk~{iugwv1#JgJq_G=N z(Z&gB0To4598hGQ0)d1v^Hi0py7Rr~oW1v2&-44g*f)0D;s8|TRx11ZiVuW));hIQ zcRhPOgV}Pmy6WptmgohMsW?41oSE(q`sGwlG?WU8qj$JE{JF)eznre0-M8)4|NB)t zAFy|m9`LVY&jly1<;qg_GL)pM4tm305#hG7wz^u6uCtpidFq48on7;vPUo(t3jpr! zhGl&A#b^GngNM~mj>#JkjZP#@78t`AWpCqG+EmFTOc`bnB?@gy)Z=2j9GV38{%C9m zZhYPozi+cQ)Hw9V8Hr&D3d{vCnq?_MX<6JEC{t5mwUBX@=QexU$J*)7 zz2IrPzW2Aj{f!|{4VtZDI5@um!`AIvtqcfNWN%ux+RE}|ZImrT#3(3qZfN+%61BwP((oxSp`Pf zsH}#Ql3{QWF))H+@Q~>OOAb2S;X;J=%Zn_?h8a%trparzKH@kah%13!Ih>lB8V&|i zy& z$;8QQNDZ3gO%qd+>?8~Kbm-QL&fb5{-mV4E3F6Xo_J8$;1M7XzVp%<7UhNr)oiWS~$ta)YA4+a{q3+>zMjB2nT0JOE7L?I$<^ z$?e!MI$fcJ5DrFUgTqs1CR5Ihr>03MXQQR$6oEBP7#-#k#b^+77dV}yQXOc!h6>G9 zL;I$`9XmpIcQFHl7)W6m%d#xAETXDFBnUxqLg10=0tgLMPy`Oy2ztaQfwU;hs$vd6 zVJ7XpK->POO%j3%s1$Q|4T0viG4$8X+P24ZP-NqZ!j-6LW&mop$|e<3$-+U=FkKF2 zrnb(`PEE-`Vic!1CTy-*zV5^I7uV)Sul>h2ZoBuMO?#&QZT($C1P!5JQx&l+Lm`4D zSIhOvD2)#^N4DH^$Ml(7HhYbl5GJ8C75KD`H`MMWv_EtJa&66K`akN@N)P_0-0q>~p zgd3|S*C`P!)S4PmW@hg$O#t^k>5LbC=%v@kTdw5S)~c~MZ$Etd{NY7!5MmKR?Du*z z)3aqi(%s#2ven7xwu1)`+;~g1Hi>1~AI{8d-CAxN##oqHvpTW$%5!cHy?{d7)O&{l z2yh?(K^YXX@#3FhBO#}K6%X3R&@O2!SJ9sSAui$w0F?^T8ShBaYk#Z=RDd?~r40#0 zT-a9NI+OQXqny&A2J#^a`GETyK&o^!5}yVGHw1CU)n zahSV_L#WO+A7`WVSLk$6RY==wN1O^*!ZJj9{eEva=neWsp;T8D5JAN^()a1Uktx)! z-PQ_N~)#2niw-=xVd_v4t!CYVpIfm(0HI<~JXor+)xi zXm6@i5E6Pt2wDI#PSx^wdEJ+eaPb+x`dyp7#!jd6P3i)G4gmbb;~#LkOqwe{DJyH9 zvZsV5qfV%5RE^h3nk2blUFmot>th*BFq!E3Br?g;e0}8h|M{vPnH_YEAWj?)yyPA; z)tXl|U`UNODKzGm#h?-lP>9k4G}V*oo=i>OZT|EXTQA=AfiEswY1*C|mfR5lB=V&M0;m+(rLjzCQCZ5(CU!P1?C*!qhvR>7xZS9|P zO|#@qz$|BXAY?ZuNx-FT?c-#dpVQ6}6AeV5!no14hi(8|May2l-yig*2fd}juf z){Fk(l@gBMqA6zP+yn+uDPq~{M|WFYUt3S(L*u2r_u9Yv^8K5=#!jd6P3i)G4gi!v zKl%EXoV0eRxb?bXaRK8oCu3A&RE;zhs#=;cs~UB~NhOn!jz^qSq{O8o>F}-3c=Q9G z`>=~PdlQ|bX*evObisMOc^R0m@0#U?mn*bdd)gB`yE4ct$jC714R%4ZR=9o1~u*JUl`i_l{>onc-tei zt$%gWA#EM3K#V~^xnp{Oz!hybPZdOkDG1OZDo%iIluU6)LnN|tR4I>Avoe{iHS5dc z(RjT!Gj}()lv2(nMu;iR1xj<~Od6clwiF`U_w;nONoH_2leTW59rWu6B83Jm`h!8Q z-!FO!w?q>aK&e79JA&OYgBVJfLa3yny_X# z7q|bz&As_wy7J8r`1wcUcyF1&P(?;B%3e_vQiQ6i7T1@@TF-Ok>A%-ie04f^VO;>w z*)ZELuKJ&^JZXI~+6`2FVtwe~(;t4> zZ~geQHhcMI_-!6yeg9~%^l(jKr1GB+^vgp}o>Y_Z zT2oai=a8~z^JJdfvWS_xxx2MJI4K5*7a+pMyLAyl+cIAOP6!mXQCv$BK{RL#A@(%H zpl!s%LI?yA)gXelg_3w1+9=?nu1*I?H*s-Sr_$T;#U#xL5~?cd8^sm^p{o#WWdZ=0 zJ1rA%(%j%q(2!l}IU7to3tb3hwp8Uw(v&5a8fOMGd$#PHotr7N3`JS=`aO?J_3|ec zuYT{sKTVx6{o0%U$J|9bH}U!XPpTFsg%^bsy%>w459;b@{?b7yTkU=Rp^K@Y7$s{pQoNo+%J2wG3VD6Di9}oz2Fp44Y5eM zSz1|ITsTrMSN#%kYA7*E08~Y!Juw+Z2BY41h{IHrNdyvU>*Hk=z}rN;av|xT)9crpk3nO`TI} zj3!_pQF9RFPL;Ozwhfgm&jqzRoM5!yl48*M%*Aldc=r9-5RJER?@<{Oj2)WwW# z83e_otyO5VrmT&%#Ixn>btaWM)$7mAZJF)Q4tu>QTK0-*9ggbpjrqVw4}SV<>ADLa zd)f0o{!==2*SIdb`Tf^i|Ce9B_w0o+pf@PZ^1+qGb*^7q-T2IR{_xD1UCW0~=PpdR zF$uEM`9I$E>973gTi?6t;#1SwA80RddF1BEjpQVCgJ$x*kGbsSPk;EyTZi50|Aa(B z1UdPKKm65K{@S~*9qZc6FwIW0&{D&!Rbku=mlj|B+{ZuXS(gEzQ;zq1hNFrbVE~Qq zdibv$x#Gx$Qx|N-04CYJ1h?^V+ajornBu*DcYX)*{1OWAVu0rSKy9rKmLD$5|V9O&$hL{JEcu|fk^ve9AJA= z2HJw)%y#Hj+wG^#jt|*sg5>U=GFjJ6<%GL=L(f%id}AmUL5*VBrL8JT?9^e8xoLo&)M5~%We%lkQ8-mYa)WD#(b3yT<4I6qpudEwT7YOW~z{inR*=@-5H!FT3E`YrnF?|#Qk@44Zr zyB`xu4m7USlWUi6zIE;98{;i68@*|>SJ&xuz9n4%(E0kZ^SVPzzxKy}`|&HUT+809 z<`{g}_8phq=lmaf;zQ0md3$&6zxy!r4}bEyUwQZ6U3=&tL(wyd3(Z3=IO`=ZeDc22 zySIR#@vRrVcJ$SiOXn`$)y!GI$d;xCgPmJ=sttj>frCPGw$}pgCRAr; z4o-2p7(6qD5T}PTQ~jxa40MzlUDRq@oGg7c-TK+l)qWCx{?q@xf6{Q1pVV*AFP{9u za~99LeD8f{`h{6qove@HA6)$8DbG6paliGn&0bxn)A^Qk0YK+JW=;a}ZuNe*^RJLt zSsYhYs++WX*Ia*CZ1#$dBk4%}#&ch>eX{k!^6V*@ZZN5u@s8ov!Eo4ADL0u)H!D;C zF{d$$0U{16MTs(m?AhFAXQqd9GsUosQ$aO~7(I%%2iJfI2B_&BEj#I?v{^7_aFIX) zWDvJDyP+E>5KYmS{$6%(G{!nRQi3R?CrF^G zy7P{MKLnvr5@PLb1RR;BP>8f;5Cl!2qHYWzMK_YF#N9XMBDAB>2#S$HOHi@wq!|eW zFhiK#+*L`@+M5v6;qDAYm>UfH#Z)LXFfeKW(xf_6FMMX@+N;x-9`X1`J?$^P_jvC1 z^L6Ew=2a*E=wszU7w*2OC^;Ih)t+v(`9C@MfnPlM#{TXTdF*$mb9Zpp$VBXHuFxI* zJAeqbZ0~;Se?3I8v-e%U|D(V6^f%pPx8Flg9hAMMo*Wr3?@%p^9&<7`2;3M{BuKCz z5j3{#_EXBD+M61%Nux=lVGN-qEs8>eNC_I1l1X);hzOw&5E0rGL_=%qgdy#{f@HL5 zKbEXL-PYz5F`8#mgb*_m1%$~7kpzm1xF;he({f{GDOH}~W?38nvtT11NtFUs&_#o` zGs8%c;NqZ|Xb=k69>^&Wx`QsNB5Ec=ibAvvZd@SkgfdrgVRSOk+mw5XSJa@iL!^Q{p8IO&O}U;NZdKKrgKW~XLO zmYw~goFA_(`Rb0@E&Vc7HOx&Eu7HV((n*!}WQ-`u8m)t>6jAFs5z?FLlU5c%oEl+5 zN#e|^psEW4+oqWbbZ@(T#^B-tK#V5LbRpW$61Fq2)MA_NZv@6Ei@+HK8T5@(g_J7K zURe#&oC<&n2hAyw-u90Z5rGR40Kmo276i1Tc||uG7Xi94Jy(_D?M(p~v@HREyHi{= zP$*CpcPB)Q?u`jV3uh7$MJANyCXw{^p9REn(7^Vis0J5-BL=v(WdRVvLLJ-wZ6vKY6jHQ68p&yFMY;Cf7D)zi z0YInI>3qwaPLRHD z92aK!GEk7ov=Rs{$ z)|1Z_|B_5Ma^mVofex993+gsZ^iZ4T6aZpHgBTI5~UsodI{Q|XQK`jf2t{;u;UCPaK zmMLkZe#ZoHs=+O*EVSDPsAtPcGfkA>Uk}9-=+y^BVWHsdoj+@R88BC@HK5*P(Sbz zS5~F~cp;Jhot1qQ(y0f=bf*pToTYPz0b1WMgAT$0; z82LuOX!T)fwf!1bO1`kIxPxTf#qK_w8m~ICMSijRa)Eg9TPx!yI6o*CFWpnCU$(Uc zTb8eR0vh?22`i>4e?A`j9258>6vfGlBNNGJ+(->w?Pw((*>LSrHU zsE7p{Oicy;n@u)}_Tvvh>EVLr$SBv&;fBi5#T!>FYPD^&D+pBiJ5U6+4QGAGf0aDGW<*6RSFegIyuZ%I`^7vD zRcX5KCaMfttH^8r|KBkmmHv3w?Cf`Z&C@|5Z5ctfWQX1G#mGCG582$-m^PT`5R?Kp z0eqCBNTDzN6T+Eqwc)Ei2!*7^X}j8N)>o1ANB2&$1*B8iS^~nBE=n5=z4_EH(Z$;I zP}mnSr9$H>Fd8E~(k#Q3amaAI-RV=pIEZObG#F8FX47zx>eAE|h4UL)K2GKy(yxc8 z07ekn3!8Aqw>2+0ia;bJWyp120#Wbh2zY%Q-Z0Ac?j6y`QD6Ro>U~HBa=(CI!+v%% z7JX6EC~g%sBV{afMm!0pt!dUfOLN$}5(0F9Dy$%Y6BcXpgy{z@-7=12uW<;OJ4HVP zD2UD;ux0s6ok~sP62`oF)gYf|deewhzy=eA}MaAQ_IzccTBxrB6e9A`dv`KCJk zr&XuR$PMj~p|)t?w|wr-VUM_z$jt z06nr?B>Zxy(Dvr%Q+fjp&@o2){ zKb*NjV06hgi@Bs@i?R&@^;~M%{kTkB6b2`v&oEPfM(F-7R*|PnF@aOYxbu<4==|1U zj)m+hu~7jGfN5YI&zNRC#z}ITFM4S7i$3x%nkP$AW35WneCatCrSr+#4=M5;V{L#o zU3nyT9dattaHS?_Oii|_CzESXFQMf2S(CIw9bHFJL_)~%wY2-%I!2ENhp=$m?Ed~n z?Q{QMiGfSDyj9bCG(t$Su!sDkr^jLr4=yi$-b{4<7_1Xt;`C1tR4S_=!eMy5@k2_! z_(*W?SgsG-Mq*Try_#{mkRDnoCB})pP}U9=AnZqnqx*_yV*<0C+h`)t;p$6Ey5T)! z#PmF%h(>SJC>$i~21M|Hx_>+8pyZHhyA{AvrJ6PeRFYj#-E}5q$5GXym7q*7%Zmjy z$K-&q_AKZlD%*4P6uPmbXk=jhUO5!Os~;fQByzKYZA|)DJK5r#NUrV5_V;so_;O4M zbB$DFaGN*?eK#Ii;n6kk>X^PTi1F<(^#{_hRtW_~eDcTz72n|n6>dH@oV1siM`Rt0 z09orn$1;KPr(4He{B4fReZS3emAxHZxVif^N8 zJAaE^FC3P5i{})T;sV5xtp@vKHVTVi#CR7%k3y|ivY3 z41h19yI<;LGJ9J$_JpYN4>DWY?*w5#XOUCqHd83cd3eD%)j20pkcmYE?@s-p+S(ik z6c`+#35{MzLT~NJ<^d z*h+_LWBK9fT*-fK2dAK%1|g0YTkC@Yya6Y?&MohDSY$kvXLmvlNRUg;142FvmVeuy zxcT|X*6+a2#9sn4tD{~E<~f6;KS+2(V?&5I9SFI3MAUEN4}sz)oUE+CR4>9Tqk+E# z%f1gbmNo|I(5fUxGU&Zow*-kQs6a6Q6gYS@^lnr7ea}hD$`v{4Vv`u^J%4<_JCa;& ztdZKK1vs_+w*Edl`K8JAd<7KFBw;oKRRG23(<1$j333r_I=`;Q_+Lb(OQIKss<~yh zWijxx8fIzA7qWq^zwC`_rggktAheN*>o+gp0L|tD3tbB0%v+UgCzdf-Xt|BfvJYBM zTL(wH;T`T1D|I3qC@rY~q9kVrPZKJ9oia?@rDl8gFl0%_ilIUqm@6&0G8}!|l2!%riJVbiLa2Ni{n)pli$Tay_tg zs@~sntcO&M4iD9tpJtDm8^ET;GFt)p(|cYYYmYwXrFt#@VNr-;Brnjyw%sOm;B<@P zF;3vf_lT^D3k1n@gNyK7UwTKugyRM??%#mpZ20~)LQwotjz8nC1 z0@>$v8n9Ed1y&?&J{ML|Lp~)~Vd^T-@DwxElaT;uX!CvX*aZq9hUC+v$jxVE&KUqJ zwu$(TCri)^g=j{5EpvlW6p4#ZCF8Wc$dQ0uBf^j#5|Mj3i94nFYOa;m=8)@0rlHIB z#$_(1DA&QG@hELHj^y6XV zFrvoF3dI8Oir;^a`spmsAX1`^$Kx`nYCI-p7tt=~$P z3t6%cvS~2RsrfvCs~z|_EfU~>tP^YpsG(ZOU-zy#PARj&zgHpFQQK4NMTDGe3jKC* z2AdF2-!kJEgw6!|j>nw}!AC7k#U>=RFP`q*V+3=fWBOaliNHT8PUw~~Qlo;bk|+yt zP@ou5f7t{-?}E80=|MyoARt9-_sbk5Sb&GGgA{PH-y8Z|dYKIYK> zoJBB?MGWAQCHWB+=#?DwJwql2!EdA;M84#e5;<7%EN#hRBu^z}jR- zmXqx`(!$H+^cCO8kQNf(qX+Pl+i(r#Lc*1Ct>U3uOxEi74rO{igCrF!7;|UHBQ8f+ zaQUWU`Qcigs3pMt*mA&J%Z{lVB7W@l3O7IkR;-VW*pTg@+i7wZI#?PAxto%C*pQIn zx2$|8r-Sc{EGYMEX_dQNOc9PnNoBb!DrI#YsBU3mLu@RdVI51x(B|UQ+GbHBV7B*! zJ(b*#{HXqkJn9Rn`)>QA-;>{kRZ}V0HjZ&3C#?%jb>CWkOf7YHT1uK`(fsF;A{17FOX-7^(GIl*WXsU`_EX4JzJ?Ocbox1 zKd~u-VlnwchXA#s+c7CR%=RuOzu3quP0px+n9#BcaAvYpBt7XQ{ZAf_;yA;CA8CTV zsEma=eHi;%tYq7f)Sz;z3D6g4oG7pWs1x@K*9O=f%1Ey(Penu8N><(PuD3HYlfnUY zGVKbgcPlfNOg2bAUnEvydVYzy)#<4fwBIE2xXfzWycK>Veu@9Ex_6Xu$J=!uaeIll z9M8Q;9}nC=PfPfAxvYnIAKnKpBHy-N;Efn4)pBmBV3fPwPWu z1TooIehDzb39q9tJA?Yl%l`64rNN_WB;?||@;P6}DQA~Z(Bks90Lzb9jp?0t?<;un zI-6(0IN_4~f70p$ZwYfl8^)0O*MC8w)n>@){+f)Q7F17MW28b1*Jp$koTH2@VT zBdF$Ho}v+hJg2=C?XfF`X^A^u*I7Ka>(K?g%D#PdpuE|5hTOXQe%kyj?E3K^{aJL zSwn~P?TQj@Uh_*M#NzFB*REp7c`~2msk&v?*%;?=@qOvFT2gkFJG{RIF7J7_IsRV^ zUGv}PYCYnuF)=fHc3~H;M4_RL&$Xi?^^pT-bdE3UJt+eLQvAV%(8vkuVHE2|9+T=| zD9W4sMPqpQw^w&tWfCoF|%n)kmJGJlg5#$p_E4(Z=laQZp`p3>(g)K37ms*>C9(h zA3N^1x_sp%gG^j2WC#4()8|a}s{i{;{^!@7?smU~2iQGNqRhiQ zlBuUq!Qn#b0!DD;8yQ`pPkvI=0A-9qQ322rHmG7M5A}L+6T3WIEgBGpn%~w6&PO$9 z9cauq0LtElS-aU2t%DWwMX_-#b4!4-kXg`hnVh0fB#8N)ty_b_mo|r^(PG*vt^WAY z{dX_L^|^(m#j;u>y%$n&9>XsG z_if5rP7^!3(`-W|1t9XNhGi-G)=j-idO!c__RLsL99&|b`eeI+s9(TkfkaSWIGEX9 z)mD~4N1oYK9wPE4^hPP>nF2H_wza;bi_y^yTghdFgamct*rk}hES5Bg`~H!Vj9&%f zPK3_~DLBwf@l1nXN*Y(slOJr!U!JWGuB)zZN>U$KFXc*6NZur?cb=R%UoVl_o)lkD zQkNv1+zwN8J(=^$SjR^Q3Yn#L7z#QP%X2kk9~T%a%afe~y0IJZU?thFS)|CY<dC!A+mieQWc`C%(eQ==L(8})U^?fcv`MziMc~1^cS#nk4 zeBB@K=TiF_pPjF!kkTCg`;u>Ovr=#$rV}D}RKqDa$NP;5l)2ZouS zUS$A+ZVxRNEq8@km4XO0Y?MXL?tGCK98C#?7HuBqax#HI-orL)w_jmhk6n)CzWc|* zP~*z3yKfb=qTXwak>XIH>0cGmmmb-NonC9UHPuMMN%CL4V*q)l)3+2-|kRmK*oDT>uJ zaB_;b-rc8Xrs4=`JDJ-q$&Eu+i-{$n8Z~a=RiW5e5IN(rH|1T>RYYn?a!OIn!aaaZNJ0m5HN$j77x!RpPf3L zyK{?x>&MNg{V-BH7vzY~p!mFYtL6C0PQb3$vCF>*vJ*Pru?g>bH+v#weJ5w<+F@x^ zD>=>inFTj~^F{KsJKrvTWHPsa-yue8Yb#$Qy$%XFybuSFqA#QwmsD$z`nalJV=;E| z1_(!GODztijicAXw?ZvIj{~k-8G(zj>47a?gp3NC+f>!ZnoyBh`fip;HuloE3y zip(A?=hq7Z`YXYA$FQeff$^ZZsJ=PrkDH`lp7y5Sn8mQk>JZ5x*J48j$kJSh(f)j&c|#V|HL!yVOBrLwePT_KO zhfI#&rvB|#j<#)I*F4niJpR~PPoBQNXLU#xswo<3RO-Ll67&?76)Zy!V`AIO6>}F* zXC#id5|vu!Z>W+Hn9ZZ@2PqEzL9cX3Vxu2nTVyG%K&OoIimi7JqM4&a9?E(3H7TRG zQF3f^(%xZmj&OHs>Ta>Hrq+$u`r0pm?rCNq=d}2IXKa<$wsX}LWhcjM^B!LZyXV(A z7`*_59-CwY)hI7!ZpM90uaHk%{NXhSOELB!WpMG`R{Yg$1&hU!&rqX5(BA|-*tpA8 zu<$6<_338Jf0#-yKrxl$*k00Lm026AGn(xmPAGHibv*XpIHwW}-c^2jkng&F!ouf~ zD3SEjH6Zs$gQq$|i6R;Mb5r3QjNNZlT!3<#!1s?oEJc^av!7i>_ZTWAFb=Ao!x=`a zs)*f6bX6wHP^dxZZduJK;PC~`Wv3!~yVfoL4yOv?cB%efsPDn$Nrg*`c5s0`Mj3Gr~;C@~eC$X~nx zifoxPBe2_Xt?JfQm!OF{+NYzgd()$+(bb{S*PDp@64#)=%kuG7I65zYQrd8MqrVk9 zKB%;n1Pt@+-haA0M#>hhhQ?*9Znxt@-kZwKA-x})ZBh?t0#jMVW7Dzf3A?A4bxV*kdJEdygmp{n_Yu_*wYJXcwd#e_&~)wG~P zEGj0r3V(}@S)_vKSYme2a%PT1eZU5?Xo%;!FyulWwD)B1?e zxnGuBJPcH&RNce03n6`M1=V`V*+0Z#RRN7ISEv%mLO=6wEGM))tynxg(%oF1Z`Idb zWjAW>yh7gIo827zIU*1I1~iG*`-WFSy7g6tQX?&*kTQJ{R~$u!h^PSft*H(WObQ0R z3GgU+X+55AJ>kGUyRe%e=2_ccC1-qg>d_!5V=kIX{%WdOC%#Vc$5}Vb+&^ze+HxmC z>!Zmq!t$B#!Zfebwazr%l^R3QlqGs(t|+a6X7!8ELY=r;O1!%c-Hmm@kkN+*i(Y*9 z>c9o8VE3gUU)L)Z;f#bSi}v;Bgn7XV+Hbh@Bdk5F8zK@)qesQAB|_@ve<3BPf`79V zg3A^$O!sbw?BwoOPt(fvVa7R&Qw8UxsA{7r1$85mH^g|>Eyd_<>3@)8Le&R{#!Z}~ zr;}7^HjzW}fsEC%n=Z^6weN&6XExEB`XMb_rRABn$(cITHCy{`bM11HV40Gv0G^m@BOfx zpwrhpPwP9Ve!gN^lI?@M=5!z>qwm#m6xN0GZaJ4X9j|t%Q<<%-JQGe3ITpj6KmSwk z+2ZSh)1jC60Oa3hYRJ$X1^L=p*?iUWjIOtClT>}|0(cd(_QK@fve_}~9_5U*#xL$( zs853XB9B+CVGZ1f^@&P6o>=rt8>uqA@q;x*pT~Oa{ z$@yX8xyM|`*t?-b8NYF~D~hE6M0v_1w$~jN-_x0u;cx5G)oqnpNX8U(}Pe9^zu@|rP zw8M+SDv$>mPfm9|{~g7kM4I)Hy4Nk?FUPy{orfQGPy0-EKau++9(o@ow7EfCvnF

+jU}Z!Z}6AH!*KVGe}Mv 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