diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index ecce60182..13340f070 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -1 +1 @@
-@ShiftHackZ
+@crim50n
diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml
index 7dcfcb390..52fbcc080 100644
--- a/.github/FUNDING.yml
+++ b/.github/FUNDING.yml
@@ -1,11 +1 @@
-github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
-patreon: # Replace with a single Patreon username
-open_collective: # Replace with a single Open Collective username
-ko_fi: # Replace with a single Ko-fi username
-tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
-community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
-liberapay: # Replace with a single Liberapay username
-issuehunt: # Replace with a single IssueHunt username
-otechie: # Replace with a single Otechie username
-lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
-custom: ['https://www.buymeacoffee.com/shifthackz', 'https://send.monobank.ua/jar/3n2Aj3Hv3g']
+# Funding links removed
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 000000000..8679c5370
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,89 @@
+name: Build Release APKs
+
+on:
+ workflow_dispatch:
+
+jobs:
+ build-release:
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout code
+ uses: actions/checkout@v4.1.0
+
+ - name: Extract version from libs.versions.toml
+ id: version
+ run: |
+ VERSION=$(grep 'versionName = ' gradle/libs.versions.toml | sed 's/versionName = "\(.*\)"/\1/')
+ VERSION_CODE=$(grep 'versionCode = ' gradle/libs.versions.toml | sed 's/versionCode = "\(.*\)"/\1/')
+ echo "name=$VERSION" >> $GITHUB_OUTPUT
+ echo "code=$VERSION_CODE" >> $GITHUB_OUTPUT
+ echo "Building version: $VERSION (code: $VERSION_CODE)"
+
+ - name: Set up JDK 17
+ uses: actions/setup-java@v3.13.0
+ with:
+ distribution: 'adopt'
+ java-version: '17'
+
+ - name: Grant execute permissions for gradlew
+ run: chmod +x ./gradlew
+
+ - name: Prepare QNN libraries
+ run: ./scripts/prepare_qnn_libs.sh
+
+ - name: Decode Keystore
+ env:
+ KEYSTORE_BASE64: ${{ secrets.KEYSTORE_BASE64 }}
+ if: ${{ env.KEYSTORE_BASE64 != '' }}
+ run: |
+ mkdir -p app/keystore
+ echo "${{ secrets.KEYSTORE_BASE64 }}" | base64 -d > app/keystore/release.keystore
+ echo "keystore=keystore/release.keystore" > app/keystore/signing.properties
+ echo "keystore.alias=${{ secrets.KEYSTORE_ALIAS }}" >> app/keystore/signing.properties
+ echo "keystore.password=${{ secrets.KEYSTORE_PASSWORD }}" >> app/keystore/signing.properties
+
+ - name: Build Full Release APK
+ run: ./gradlew :app:assembleFullRelease
+
+ - name: Build FOSS Release APK
+ run: ./gradlew :app:assembleFossRelease
+
+ - name: Rename APKs
+ run: |
+ VERSION="${{ steps.version.outputs.name }}"
+ mkdir -p release-apks
+
+ # Full Release
+ if [ -f app/build/outputs/apk/full/release/app-full-release.apk ]; then
+ cp app/build/outputs/apk/full/release/app-full-release.apk release-apks/pdai-full-release-${VERSION}.apk
+ fi
+
+ # FOSS Release
+ if [ -f app/build/outputs/apk/foss/release/app-foss-release.apk ]; then
+ cp app/build/outputs/apk/foss/release/app-foss-release.apk release-apks/pdai-foss-release-${VERSION}.apk
+ fi
+
+ - name: Upload Release APKs
+ uses: actions/upload-artifact@v4
+ with:
+ name: pdai-release-${{ steps.version.outputs.name }}
+ path: release-apks/*.apk
+ retention-days: 90
+
+ - name: Create GitHub Release
+ env:
+ GH_TOKEN: ${{ github.token }}
+ run: |
+ VERSION="${{ steps.version.outputs.name }}"
+ TAG="v${VERSION}"
+
+ # Create tag if it doesn't exist
+ git tag $TAG || true
+ git push origin $TAG || true
+
+ # Create release with release notes
+ gh release create $TAG \
+ --title "${VERSION}" \
+ --notes-file RELEASE_NOTES_${VERSION}.md \
+ release-apks/*.apk
diff --git a/.gitignore b/.gitignore
index 97794a835..0ae77eab3 100755
--- a/.gitignore
+++ b/.gitignore
@@ -137,3 +137,22 @@ jacoco.exec
# Fastlane
fastlane/report.xml
.kotlin
+
+# QNN proprietary libraries (must be downloaded separately)
+feature/qnn/src/main/jniLibs/
+feature/qnn/src/main/assets/qnnlibs/*.so
+feature/qnn/src/main/assets/cvtbase/*.mnn
+feature/qnn/src/main/assets/cvtbase/*.json
+!feature/qnn/src/main/jniLibs/arm64-v8a/.gitkeep
+!feature/qnn/src/main/assets/qnnlibs/.gitkeep
+!feature/qnn/src/main/assets/cvtbase/.gitkeep
+
+# QNN extracted files
+LocalDream.apk
+qnn-extracted/
+
+# Platform tools
+platform-tools/
+
+# Debug keystore
+debug.keystore
diff --git a/README.md b/README.md
index b0762cb2d..2a220e360 100644
--- a/README.md
+++ b/README.md
@@ -1,16 +1,10 @@
-
+
-# Stable-Diffusion-Android (SDAI)
+# Pocket Diffusion Android (PDAI)
-
-
+[](https://github.com/crim50n/Pocket-Diffusion-Android/releases)
-
-[](https://play.google.com/store/apps/details?id=com.shifthackz.aisdv1.app)
-[](https://f-droid.org/packages/com.shifthackz.aisdv1.app.foss)
-[](https://4pda.to/forum/index.php?showtopic=1082639)
-
-Stable Diffusion AI (SDAI) is an easy-to-use app that:
+Pocket Diffusion (PDAI) is an easy-to-use app that:
- Brings you the power of digital art creativity with Stable Diffusion AI
- Gives you freedom to choose your AI generation provider
@@ -29,7 +23,11 @@ Stable Diffusion AI (SDAI) is an easy-to-use app that:
- Can use server environment powered by [Hugging Face Inference API](https://huggingface.co/docs/api-inference/quicktour).
- Can use server environment powered by [OpenAI](https://platform.openai.com/docs/api-reference/images) (DALL-E-2, DALL-E-3).
- Can use server environment powered by [Stability AI](https://platform.stability.ai/).
+- Can use server environment powered by [Fal.AI](https://fal.ai/).
- Can use local environment powered by LocalDiffusion (Beta)
+ - Microsoft ONNX Runtime (txt2img)
+ - Google AI MediaPipe (txt2img)
+ - Qualcomm QNN with NPU acceleration (txt2img, img2img)
- Supports original Txt2Img, Img2Img modes
- **Positive** and **negative** prompt support
- Support dynamic **size** in range from 64 to 2048 px (for width and height)
@@ -52,9 +50,14 @@ Stable Diffusion AI (SDAI) is an easy-to-use app that:
- Textual inversion picker (for A1111)
- Hypernetworks picker (for A1111)
- SD Model picker (for A1111)
+ - Forge Modules support (for A1111/Forge)
+ - ADetailer (After Detailer) support for enhanced face/hand/body fixing (for A1111/Forge)
+ - Hires.Fix support for high-resolution upscaling (for A1111/Forge)
- In-app Gallery, stored locally, contains all AI generated images
- - Displays generated images grid
- - Image detail view: Zoom, Pinch, Generation Info.
+ - Displays generated images grid with pagination
+ - Image detail view: Advanced zoom/pan controls, Pinch-to-zoom, Generation Info
+ - Navigation between images with swipe gestures
+ - InPaint editor with zoom/pan support for precise mask drawing
- Export all gallery to **.zip** file
- Export single photo to **.zip** file
- Settings
@@ -62,7 +65,8 @@ Stable Diffusion AI (SDAI) is an easy-to-use app that:
- Active SD Model selection
- Server availability monitoring (http-ping method)
- Enable/Disable auto-saving of generated images
- - Enable/Disable saving generated images to `Download/SDAI` android MediaStore folder
+ - Enable/Disable saving generated images to `Download/PDAI` android MediaStore folder
+ - Optimized file-based media storage (faster loading and reduced memory usage)
- Clear gallery / app cache
## Setup instruction
@@ -71,7 +75,7 @@ Stable Diffusion AI (SDAI) is an easy-to-use app that:
This requires you to have the AUTOMATIC1111 WebUI that is running in server mode.
-You can have it running either on your own hardware with modern GPU from Nvidia or AMD, or running it using Google Colab.
+You can have it running either on your own hardware with modern GPU from Nvidia or AMD, or running it using Google Colab.
1. Follow the setup instructions on [Stable-Diffusion-WebUI](https://github.com/AUTOMATIC1111/stable-diffusion-webui) repository.
2. Add the arguments `--api --listen` to the command line arguments of WebUI launch script.
@@ -90,7 +94,7 @@ Please refer to the [SwarmUI documentation](https://github.com/mcmonkeyprojects/
### Option 3: Use AI Horde
-[AI Horde](https://stablehorde.net/) is a crowdsourced distributed cluster of Image generation workers and text generation workers.
+[AI Horde](https://stablehorde.net/) is a crowdsourced distributed cluster of Image generation workers and text generation workers.
AI Horde requires to use API KEY, this mobile app allows to use either default API KEY (which is "0000000000"), or type your own. You can sign up and get your own AI Horde API KEY [here](https://stablehorde.net/register).
@@ -102,7 +106,7 @@ Hugging Face Inference requires to use API KEY, which can be created in [Hugging
### Option 5: OpenAI
-OpenAI provides a service for text to image generation using [DALLE-2](https://openai.com/dall-e-2) or [DALLE-3](https://openai.com/dall-e-3) models. This service is paid.
+OpenAI provides a service for text to image generation using [DALLE-2](https://openai.com/dall-e-2) or [DALLE-3](https://openai.com/dall-e-3) models. This service is paid.
OpenAI requires to use API KEY, which can be created in [OpenAI API Key settings](https://platform.openai.com/api-keys).
@@ -112,19 +116,55 @@ OpenAI requires to use API KEY, which can be created in [OpenAI API Key settings
StabilityAI requires to use API KEY, which can be created in [API Keys page](https://platform.stability.ai/account/keys).
-### Option 7: Local Diffusion Microsoft ONNX Runtime (Beta)
+### Option 7: Fal.AI
+
+[Fal.AI](https://fal.ai/) is a modern AI generation service with support for latest FLUX models family.
+
+**Built-in models:**
+- FLUX.1-dev (high quality, slower)
+- FLUX.1-schnell (fast generation)
+- FLUX-LoRA (custom LoRA support)
+- FLUX-2 (latest generation)
+- FLUX-Kontext (context-aware generation)
+
+**Features:**
+- Import OpenAPI.json from fal.ai to add new models
+- Dynamic form generation based on model parameters
+- Support for custom endpoints
+
+Fal.AI requires to use API KEY, which can be created in [Fal.AI dashboard](https://fal.ai/dashboard/keys).
+
+### Option 8: Local Diffusion Microsoft ONNX Runtime (Beta)
Only **txt2img** mode is supported.
-Allows to use phone resources to generate images.
+Allows to use phone resources to generate images using Microsoft ONNX Runtime.
-### Option 8: Local Diffusion Google AI MediaPipe (Beta)
+### Option 9: Local Diffusion Google AI MediaPipe (Beta)
Available only in **playstore** and **full** flavors.
Only **txt2img** mode is supported.
-Allows to use phone resources to generate images.
+Allows to use phone resources to generate images using Google MediaPipe framework.
+
+### Option 10: Local Diffusion Qualcomm QNN (Beta)
+
+Available only in **playstore** and **full** flavors.
+
+Supports both **txt2img** and **img2img** modes.
+
+Uses Qualcomm QNN SDK with NPU acceleration (HTP) and MNN backend for fast on-device Stable Diffusion generation.
+
+**Requirements:**
+- Snapdragon 8 Gen 1 or newer chipset
+- Supports both NPU-accelerated models (8Gen1, 8Gen2/3/4) and CPU/MNN models
+
+**Features:**
+- Hardware NPU acceleration for faster generation
+- Multiple pre-built models available for download
+- Support for custom models (scan local folders)
+- Lower power consumption compared to CPU-only backends
## Supported languages
@@ -144,14 +184,10 @@ Any contributions to the translations are welcome.
## Difference between build flavors (Google Play, F-Droid, GitHub releases)
-There are some reasons that some of the SDAI app features can not be distributed through different sources (Google Play, F-Droid) because of rules and compliance policies.
-
-The difference between SDAI app flavors are described at the project wiki page [Build flavor difference](https://github.com/ShiftHackZ/Stable-Diffusion-Android/wiki/Build-flavor-difference).
-
-## Donate
+There are some reasons that some of the PDAI app features can not be distributed through different sources (Google Play, F-Droid) because of rules and compliance policies.
-This software is open source, provided with no warranty, and you are welcome to use it for free.
+The difference between PDAI app flavors are described at the project wiki page [Build flavor difference](https://github.com/crim50n/Pocket-Diffusion-Android/wiki/Build-flavor-difference).
-In case you find this software valuable, and you'd like to say thanks and show a little support, here is the button:
+## Credits
-[](https://www.buymeacoffee.com/shifthackz)
+This project is a fork of [Stable Diffusion Android](https://github.com/ShiftHackZ/Stable-Diffusion-Android) by [ShiftHackZ](https://github.com/ShiftHackZ), licensed under GNU AGPL v3.0.
diff --git a/RELEASE_NOTES_0.7.0.md b/RELEASE_NOTES_0.7.0.md
new file mode 100644
index 000000000..2d1d4f854
--- /dev/null
+++ b/RELEASE_NOTES_0.7.0.md
@@ -0,0 +1,148 @@
+# PDAI v0.7.0 — Release Notes
+
+## New Features (compared to [SDAI](https://github.com/ShiftHackZ/Stable-Diffusion-Android) v0.6.8)
+
+### Fal.AI — Cloud Generation with FLUX Models
+
+Full integration with the Fal.AI platform for cloud-based image generation.
+
+**Default models:**
+- FLUX Schnell, FLUX Schnell Redux
+- FLUX Dev, FLUX Dev Redux, FLUX Dev Image-to-Image
+- FLUX 2, FLUX 2 Flash, FLUX 2 Edit, FLUX 2 Flash Edit
+- FLUX Lora, FLUX Lora Image-to-Image, FLUX Lora Inpainting
+- FLUX Kontext Dev
+- (and other models available via custom endpoints)
+
+**Modes:**
+- Text-to-Image, Image-to-Image, Inpainting
+
+**Highlights:**
+- Dynamic parameter form generation based on OpenAPI specifications
+
+---
+
+### Qualcomm QNN — Local Generation on NPU
+
+Image generation on Snapdragon devices using NPU and GPU.
+
+**Supported chipsets:** Snapdragon 8 Gen 1 and newer
+
+**Runtimes:**
+- HTP (NPU) — optimized for neural networks
+- GPU (OpenCL/Adreno) — general-purpose graphics processor
+- CPU — central processor (fallback option)
+
+**Modes:**
+- Text-to-Image, Image-to-Image
+
+**Resolution support:**
+- NPU (HTP): 512×512 to 1024×1024
+- CPU/GPU: 256×256 to 512×512
+
+**Hires.Fix (NPU only):**
+- Generate at 512×512 or 768×768, upscale to larger square resolution, refine with img2img pass
+- Only square resolutions support Hires.Fix (512×512 → 768/1024, 768×768 → 1024)
+- Configurable target resolution, steps, and denoising strength
+
+---
+
+### Local Diffusion Enhancements
+
+Improved support for all local backends (ONNX, MediaPipe, QNN):
+
+- **Custom models scanning** — automatic detection of user-provided models from custom directories
+- **Strict model validation** — each backend validates model structure before loading
+- **Prompt persistence** — last used prompt is saved and restored per backend
+- **Model selection in generation UI** — switch between models directly from the generation screen
+
+---
+
+### ADetailer and Hires.Fix for A1111/Forge
+
+- **ADetailer** — automatic face and hand enhancement
+- **Hires.Fix** — high-resolution generation with upscaling
+- **Forge Modules** — basic support for Forge modules (API endpoint)
+
+---
+
+## UI Improvements
+
+### ZoomableImage
+- Improved scaling and gestures
+- Smoother transition animations
+
+### InPaint
+- Enhanced scaling and canvas panning controls
+- Pinch-to-zoom support
+
+### Gallery
+- Model name displayed in image details
+- Optimized swipe navigation between images
+- Save selected images to device gallery (in selection mode)
+
+### Log Export
+- Log file export function for diagnostics
+
+### Light Theme
+- Support for light status bar in app theme
+
+---
+
+## Optimization
+
+### Image File Storage
+- Migration from Base64 to file-based storage
+- Significantly improved performance and reduced DB size
+- Added `mediaPath`, `inputMediaPath` fields in DB (migration v8)
+
+### Network Requests
+- Requests are sent only to the active generation source
+
+---
+
+## Technical Changes
+
+### Rebranding SDAI → PDAI
+- Log tag: `[PDAI]` instead of `[SDAI]`
+- Log file: `pdaiv1.log` instead of `sdaiv1.log`
+- Model path: `/Download/PDAI/` instead of `/Download/SDAI/`
+- `SdaiWorkerFactory` → `PdaiWorkerFactory`
+- Documentation and website updates
+
+### Dependency Updates
+- Compose BOM → 2025.12.01
+- Lifecycle → 2.10.0
+- Navigation → 2.9.6
+- Work → 2.11.0
+- Koin → 4.1.1
+- Retrofit → 3.0.0
+- ONNX Runtime → 1.23.2
+- Core KTX → 1.17.0
+- Material → 1.13.0
+- RxJava → 3.1.12
+- Apache String Utils → 3.20.0
+- MediaPipe → 0.10.21
+- Serialization → 1.9.0
+- Turbine → 1.2.1
+- Appcompat → 1.7.1
+- Compose Activity → 1.12.2
+- Crypto → 1.1.0
+- EXIF → 1.4.2
+- Gson → 2.13.2
+- compileSdk: 35 → 36
+
+### Database Migration
+- **Schema version: 7 → 9** — two sequential migrations
+- **New fields:** `modelName` (v9), `mediaPath`, `inputMediaPath` (v8)
+- **Automatic migration** of existing data on update
+
+---
+
+## Fixes
+
+- Requests to inactive servers are no longer executed
+- Light status bar works correctly
+- Localization files updated (RU, TR, UK, ZH)
+- Added module tests for Fal.AI and Forge, updated existing tests
+- Removed donate button from settings
diff --git a/RELEASE_NOTES_0.7.1.md b/RELEASE_NOTES_0.7.1.md
new file mode 100644
index 000000000..081d26a01
--- /dev/null
+++ b/RELEASE_NOTES_0.7.1.md
@@ -0,0 +1,161 @@
+# 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
+- 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
+
+### 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 (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
+
+**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
+- 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)
+- 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` / `UnlikeItemsUseCase` — use cases for bulk like/unlike operations
+- `HideItemsUseCase` / `UnhideItemsUseCase` — use cases for bulk hide/unhide operations
+
+---
+
+## Localization
+
+Added strings:
+- Share, Edit, Save to gallery
+- Rotate, Settings, Brightness, Contrast, Saturation
+- Delete unliked, confirm delete unliked
+
diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 0a04367b9..58e1f5dd7 100755
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -8,15 +8,22 @@ plugins {
}
android {
- namespace = "com.shifthackz.aisdv1.app"
+ namespace = "dev.minios.pdaiv1.app"
dependenciesInfo {
includeInApk = false
includeInBundle = false
}
+ packaging {
+ jniLibs {
+ // Required to extract native executable for QNN backend
+ useLegacyPackaging = true
+ }
+ }
+
defaultConfig {
- applicationId = "com.shifthackz.aisdv1.app"
+ applicationId = "dev.minios.pdaiv1.app"
versionName = libs.versions.versionName.get()
versionCode = libs.versions.versionCode.get().toInt()
@@ -26,17 +33,19 @@ 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", "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\"")
- buildConfigField("String", "POLICY_URL", "\"https://sdai.moroz.cc/policy.html\"")
- buildConfigField("String", "DONATE_URL", "\"https://www.buymeacoffee.com/shifthackz\"")
- buildConfigField("String", "GITHUB_SOURCE_URL", "\"https://github.com/ShiftHackZ/Stable-Diffusion-Android\"")
+ buildConfigField("String", "FAL_AI_INFO_URL", "\"https://fal.ai/dashboard/keys\"")
+ buildConfigField("String", "UPDATE_API_URL", "\"https://pdai.minios.dev\"")
+ buildConfigField("String", "REPORT_API_URL", "\"https://pdai.minios.dev\"")
+ buildConfigField("String", "DEMO_MODE_API_URL", "\"https://pdai.minios.dev\"")
+ buildConfigField("String", "POLICY_URL", "\"https://pdai.minios.dev/policy.html\"")
+ buildConfigField("String", "DONATE_URL", "\"\"")
+ buildConfigField("String", "GITHUB_SOURCE_URL", "\"https://github.com/crim50n/Pocket-Diffusion-Android\"")
buildConfigField("String", "SETUP_INSTRUCTIONS_URL", "\"https://github.com/AUTOMATIC1111/stable-diffusion-webui/wiki\"")
buildConfigField("String", "SWARM_UI_INFO_URL", "\"https://github.com/mcmonkeyprojects/SwarmUI/tree/master/docs\"")
@@ -74,6 +83,7 @@ dependencies {
implementation(project(":feature:auth"))
implementation(project(":feature:diffusion"))
implementation(project(":feature:mediapipe"))
+ implementation(project(":feature:qnn"))
implementation(project(":feature:work"))
implementation(project(":data"))
implementation(project(":demo"))
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 857bdb8df..1667a1b8a 100755
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -17,7 +17,7 @@
errorLog(t) }
- initializeKoin()
- initializeLogging()
- initializeCursorSize()
- initializeWorkManager()
- }
-
- /**
- * Overrides the cursor size to prevent Room DB fail with big base64.
- *
- * Reference: https://stackoverflow.com/questions/51959944/sqliteblobtoobigexception-row-too-big-to-fit-into-cursorwindow-requiredpos-0-t
- */
- @SuppressLint("DiscouragedPrivateApi")
- private fun initializeCursorSize() {
- try {
- val field = CursorWindow::class.java.getDeclaredField("sCursorWindowSize")
- field.isAccessible = true
- field.set(null, 100 * 1024 * 1024) // 100 Mb
- } catch (e: Exception) {
- errorLog(e)
- }
- }
-
- private fun initializeKoin() = startKoin {
- androidContext(this@AiStableDiffusionClientApp)
- modules(
- notificationModule,
- demoModule,
- *featureModule,
- preferenceModule,
- providersModule,
- *domainModule,
- *dataModule,
- backgroundWorkModule,
- networkModule,
- databaseModule,
- validatorsModule,
- imageProcessingModule,
- *presentationModule,
- )
- }
-
- private fun initializeLogging() {
- if (BuildConfig.DEBUG) {
- Timber.plant(Timber.DebugTree())
- }
- Timber.plant(FileLoggingTree())
- }
-
- private fun initializeWorkManager() {
- try {
- val workerFactory: SdaiWorkerFactory by inject()
- val configuration = Configuration.Builder()
- .setWorkerFactory(workerFactory)
- .build()
-
- WorkManager.initialize(this, configuration)
- } catch (e: Exception) {
- errorLog(e)
- }
- }
-}
diff --git a/app/src/main/java/com/shifthackz/aisdv1/app/di/FeatureModule.kt b/app/src/main/java/com/shifthackz/aisdv1/app/di/FeatureModule.kt
deleted file mode 100644
index a98cf95fc..000000000
--- a/app/src/main/java/com/shifthackz/aisdv1/app/di/FeatureModule.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package com.shifthackz.aisdv1.app.di
-
-import com.shifthackz.aisdv1.feature.auth.di.authModule
-import com.shifthackz.aisdv1.feature.diffusion.di.diffusionModule
-import com.shifthackz.aisdv1.feature.mediapipe.di.mediaPipeModule
-
-val featureModule = arrayOf(
- authModule,
- diffusionModule,
- mediaPipeModule,
-)
diff --git a/app/src/main/java/com/shifthackz/aisdv1/app/di/PreferenceModule.kt b/app/src/main/java/com/shifthackz/aisdv1/app/di/PreferenceModule.kt
deleted file mode 100644
index 3dcfa0f16..000000000
--- a/app/src/main/java/com/shifthackz/aisdv1/app/di/PreferenceModule.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-package com.shifthackz.aisdv1.app.di
-
-import android.content.Context
-import com.shifthackz.aisdv1.data.preference.PreferenceManagerImpl
-import com.shifthackz.aisdv1.data.preference.SessionPreferenceImpl
-import com.shifthackz.aisdv1.domain.preference.PreferenceManager
-import com.shifthackz.aisdv1.domain.preference.SessionPreference
-import org.koin.android.ext.koin.androidContext
-import org.koin.core.module.dsl.singleOf
-import org.koin.dsl.bind
-import org.koin.dsl.module
-
-private const val KEY_PREFERENCE_MANAGER = "aisdv1_preference_manager"
-
-val preferenceModule = module {
-
- single {
- androidContext()
- .getSharedPreferences(KEY_PREFERENCE_MANAGER, Context.MODE_PRIVATE)
- .let(::PreferenceManagerImpl)
- }
-
- singleOf(::SessionPreferenceImpl) bind SessionPreference::class
-}
diff --git a/app/src/main/java/dev/minios/pdaiv1/app/AiStableDiffusionClientApp.kt b/app/src/main/java/dev/minios/pdaiv1/app/AiStableDiffusionClientApp.kt
new file mode 100755
index 000000000..b7182eade
--- /dev/null
+++ b/app/src/main/java/dev/minios/pdaiv1/app/AiStableDiffusionClientApp.kt
@@ -0,0 +1,97 @@
+package dev.minios.pdaiv1.app
+
+import android.annotation.SuppressLint
+import android.app.Application
+import android.database.CursorWindow
+import android.os.StrictMode
+import android.os.StrictMode.VmPolicy
+import androidx.work.Configuration
+import androidx.work.WorkManager
+import dev.minios.pdaiv1.app.di.featureModule
+import dev.minios.pdaiv1.app.di.preferenceModule
+import dev.minios.pdaiv1.app.di.providersModule
+import dev.minios.pdaiv1.core.common.log.FileLoggingTree
+import dev.minios.pdaiv1.core.common.log.errorLog
+import dev.minios.pdaiv1.core.imageprocessing.di.imageProcessingModule
+import dev.minios.pdaiv1.core.notification.di.notificationModule
+import dev.minios.pdaiv1.core.validation.di.validatorsModule
+import dev.minios.pdaiv1.data.di.dataModule
+import dev.minios.pdaiv1.demo.di.demoModule
+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.PdaiWorkerFactory
+import dev.minios.pdaiv1.work.di.backgroundWorkModule
+import org.koin.android.ext.android.inject
+import org.koin.android.ext.koin.androidContext
+import org.koin.core.context.startKoin
+import timber.log.Timber
+
+class AiStableDiffusionClientApp : Application() {
+
+ override fun onCreate() {
+ super.onCreate()
+ StrictMode.setVmPolicy(VmPolicy.Builder().build())
+ Thread.currentThread().setUncaughtExceptionHandler { _, t -> errorLog(t) }
+ initializeKoin()
+ initializeLogging()
+ initializeCursorSize()
+ initializeWorkManager()
+ }
+
+ /**
+ * Overrides the cursor size to prevent Room DB fail with big base64.
+ *
+ * Reference: https://stackoverflow.com/questions/51959944/sqliteblobtoobigexception-row-too-big-to-fit-into-cursorwindow-requiredpos-0-t
+ */
+ @SuppressLint("DiscouragedPrivateApi")
+ private fun initializeCursorSize() {
+ try {
+ val field = CursorWindow::class.java.getDeclaredField("sCursorWindowSize")
+ field.isAccessible = true
+ field.set(null, 100 * 1024 * 1024) // 100 Mb
+ } catch (e: Exception) {
+ errorLog(e)
+ }
+ }
+
+ private fun initializeKoin() = startKoin {
+ androidContext(this@AiStableDiffusionClientApp)
+ modules(
+ notificationModule,
+ demoModule,
+ *featureModule,
+ preferenceModule,
+ providersModule,
+ *domainModule,
+ *dataModule,
+ backgroundWorkModule,
+ networkModule,
+ databaseModule,
+ validatorsModule,
+ imageProcessingModule,
+ *presentationModule,
+ )
+ }
+
+ private fun initializeLogging() {
+ if (BuildConfig.DEBUG) {
+ Timber.plant(Timber.DebugTree())
+ }
+ Timber.plant(FileLoggingTree())
+ }
+
+ private fun initializeWorkManager() {
+ try {
+ val workerFactory: PdaiWorkerFactory by inject()
+ val configuration = Configuration.Builder()
+ .setWorkerFactory(workerFactory)
+ .build()
+
+ WorkManager.initialize(this, configuration)
+ } catch (e: Exception) {
+ errorLog(e)
+ }
+ }
+}
diff --git a/app/src/main/java/dev/minios/pdaiv1/app/di/FeatureModule.kt b/app/src/main/java/dev/minios/pdaiv1/app/di/FeatureModule.kt
new file mode 100644
index 000000000..0520c8213
--- /dev/null
+++ b/app/src/main/java/dev/minios/pdaiv1/app/di/FeatureModule.kt
@@ -0,0 +1,13 @@
+package dev.minios.pdaiv1.app.di
+
+import dev.minios.pdaiv1.feature.auth.di.authModule
+import dev.minios.pdaiv1.feature.diffusion.di.diffusionModule
+import dev.minios.pdaiv1.feature.mediapipe.di.mediaPipeModule
+import dev.minios.pdaiv1.feature.qnn.di.qnnModule
+
+val featureModule = arrayOf(
+ authModule,
+ diffusionModule,
+ mediaPipeModule,
+ qnnModule,
+)
diff --git a/app/src/main/java/dev/minios/pdaiv1/app/di/PreferenceModule.kt b/app/src/main/java/dev/minios/pdaiv1/app/di/PreferenceModule.kt
new file mode 100644
index 000000000..c426c1c19
--- /dev/null
+++ b/app/src/main/java/dev/minios/pdaiv1/app/di/PreferenceModule.kt
@@ -0,0 +1,24 @@
+package dev.minios.pdaiv1.app.di
+
+import android.content.Context
+import dev.minios.pdaiv1.data.preference.PreferenceManagerImpl
+import dev.minios.pdaiv1.data.preference.SessionPreferenceImpl
+import dev.minios.pdaiv1.domain.preference.PreferenceManager
+import dev.minios.pdaiv1.domain.preference.SessionPreference
+import org.koin.android.ext.koin.androidContext
+import org.koin.core.module.dsl.singleOf
+import org.koin.dsl.bind
+import org.koin.dsl.module
+
+private const val KEY_PREFERENCE_MANAGER = "aisdv1_preference_manager"
+
+val preferenceModule = module {
+
+ single {
+ androidContext()
+ .getSharedPreferences(KEY_PREFERENCE_MANAGER, Context.MODE_PRIVATE)
+ .let(::PreferenceManagerImpl)
+ }
+
+ singleOf(::SessionPreferenceImpl) bind SessionPreference::class
+}
diff --git a/app/src/main/java/com/shifthackz/aisdv1/app/di/ProvidersModule.kt b/app/src/main/java/dev/minios/pdaiv1/app/di/ProvidersModule.kt
similarity index 79%
rename from app/src/main/java/com/shifthackz/aisdv1/app/di/ProvidersModule.kt
rename to app/src/main/java/dev/minios/pdaiv1/app/di/ProvidersModule.kt
index 5aaa0ea2f..50e356967 100755
--- a/app/src/main/java/com/shifthackz/aisdv1/app/di/ProvidersModule.kt
+++ b/app/src/main/java/dev/minios/pdaiv1/app/di/ProvidersModule.kt
@@ -1,29 +1,29 @@
-package com.shifthackz.aisdv1.app.di
+package dev.minios.pdaiv1.app.di
import android.content.Intent
-import com.shifthackz.aisdv1.app.BuildConfig
-import com.shifthackz.aisdv1.core.common.appbuild.ActivityIntentProvider
-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.core.common.file.FileProviderDescriptor
-import com.shifthackz.aisdv1.core.common.links.LinksProvider
-import com.shifthackz.aisdv1.core.common.schedulers.DispatchersProvider
-import com.shifthackz.aisdv1.core.common.schedulers.SchedulersProvider
-import com.shifthackz.aisdv1.core.common.time.TimeProvider
-import com.shifthackz.aisdv1.domain.entity.ServerSource
-import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationCredentials
-import com.shifthackz.aisdv1.domain.feature.auth.AuthorizationStore
-import com.shifthackz.aisdv1.domain.preference.PreferenceManager
-import com.shifthackz.aisdv1.feature.diffusion.entity.LocalDiffusionFlag
-import com.shifthackz.aisdv1.feature.diffusion.environment.DeviceNNAPIFlagProvider
-import com.shifthackz.aisdv1.feature.diffusion.environment.LocalModelIdProvider
-import com.shifthackz.aisdv1.network.qualifiers.ApiKeyProvider
-import com.shifthackz.aisdv1.network.qualifiers.ApiUrlProvider
-import com.shifthackz.aisdv1.network.qualifiers.CredentialsProvider
-import com.shifthackz.aisdv1.network.qualifiers.NetworkHeaders
-import com.shifthackz.aisdv1.network.qualifiers.NetworkPrefixes
-import com.shifthackz.aisdv1.presentation.activity.AiStableDiffusionActivity
+import dev.minios.pdaiv1.app.BuildConfig
+import dev.minios.pdaiv1.core.common.appbuild.ActivityIntentProvider
+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.core.common.file.FileProviderDescriptor
+import dev.minios.pdaiv1.core.common.links.LinksProvider
+import dev.minios.pdaiv1.core.common.schedulers.DispatchersProvider
+import dev.minios.pdaiv1.core.common.schedulers.SchedulersProvider
+import dev.minios.pdaiv1.core.common.time.TimeProvider
+import dev.minios.pdaiv1.domain.entity.ServerSource
+import dev.minios.pdaiv1.domain.feature.auth.AuthorizationCredentials
+import dev.minios.pdaiv1.domain.feature.auth.AuthorizationStore
+import dev.minios.pdaiv1.domain.preference.PreferenceManager
+import dev.minios.pdaiv1.feature.diffusion.entity.LocalDiffusionFlag
+import dev.minios.pdaiv1.feature.diffusion.environment.DeviceNNAPIFlagProvider
+import dev.minios.pdaiv1.feature.diffusion.environment.LocalModelIdProvider
+import dev.minios.pdaiv1.network.qualifiers.ApiKeyProvider
+import dev.minios.pdaiv1.network.qualifiers.ApiUrlProvider
+import dev.minios.pdaiv1.network.qualifiers.CredentialsProvider
+import dev.minios.pdaiv1.network.qualifiers.NetworkHeaders
+import dev.minios.pdaiv1.network.qualifiers.NetworkPrefixes
+import dev.minios.pdaiv1.presentation.activity.AiStableDiffusionActivity
import io.reactivex.rxjava3.android.schedulers.AndroidSchedulers
import io.reactivex.rxjava3.core.Scheduler
import io.reactivex.rxjava3.schedulers.Schedulers
@@ -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/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png b/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png
new file mode 100644
index 000000000..46240c786
Binary files /dev/null and b/app/src/main/res/drawable-hdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png b/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png
new file mode 100644
index 000000000..56cda9d48
Binary files /dev/null and b/app/src/main/res/drawable-mdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png b/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png
new file mode 100644
index 000000000..d313f1eb6
Binary files /dev/null and b/app/src/main/res/drawable-xhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png b/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png
new file mode 100644
index 000000000..e0b6a545d
Binary files /dev/null and b/app/src/main/res/drawable-xxhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png b/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png
new file mode 100644
index 000000000..447ead2f7
Binary files /dev/null and b/app/src/main/res/drawable-xxxhdpi/ic_launcher_foreground.png differ
diff --git a/app/src/main/res/drawable/ic_launcher_foreground.xml b/app/src/main/res/drawable/ic_launcher_foreground.xml
deleted file mode 100644
index d0a4e1dbb..000000000
--- a/app/src/main/res/drawable/ic_launcher_foreground.xml
+++ /dev/null
@@ -1,68 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/drawable/ic_sd_flat.xml b/app/src/main/res/drawable/ic_sd_flat.xml
deleted file mode 100644
index 3d2234f98..000000000
--- a/app/src/main/res/drawable/ic_sd_flat.xml
+++ /dev/null
@@ -1,63 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher.png b/app/src/main/res/mipmap-hdpi/ic_launcher.png
index b62628527..6d7878a37 100644
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher.png and b/app/src/main/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
index 49639a5af..6d7878a37 100644
Binary files a/app/src/main/res/mipmap-hdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-hdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher.png b/app/src/main/res/mipmap-mdpi/ic_launcher.png
index 149588c8f..8f7363827 100644
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher.png and b/app/src/main/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
index 25ef07fa3..8f7363827 100644
Binary files a/app/src/main/res/mipmap-mdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-mdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/app/src/main/res/mipmap-xhdpi/ic_launcher.png
index f78717505..93764d65d 100644
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
index 8afdbdcfb..93764d65d 100644
Binary files a/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
index a422036ba..65e9e159d 100644
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
index 9ceaf5952..65e9e159d 100644
Binary files a/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
index dfb5b55b7..7aeed66d9 100644
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
index 4a0414755..7aeed66d9 100644
Binary files a/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png and b/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png differ
diff --git a/app/src/main/res/values-night/themes.xml b/app/src/main/res/values-night/themes.xml
index 6b5be4e07..45585be97 100755
--- a/app/src/main/res/values-night/themes.xml
+++ b/app/src/main/res/values-night/themes.xml
@@ -11,7 +11,7 @@
diff --git a/app/src/main/res/values/themes.xml b/app/src/main/res/values/themes.xml
index 0997989ef..92a75edf1 100755
--- a/app/src/main/res/values/themes.xml
+++ b/app/src/main/res/values/themes.xml
@@ -8,10 +8,11 @@
- @color/catppuccin_latte_mauve
- @color/catppuccin_latte_base
- @color/catppuccin_latte_mantle
+ - true
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/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/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/appbuild/ActivityIntentProvider.kt b/core/common/src/main/java/com/shifthackz/aisdv1/core/common/appbuild/ActivityIntentProvider.kt
deleted file mode 100644
index 6cc003136..000000000
--- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/appbuild/ActivityIntentProvider.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package com.shifthackz.aisdv1.core.common.appbuild
-
-import android.content.Intent
-
-fun interface ActivityIntentProvider {
- operator fun invoke(): Intent
-}
diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/KotlinExtensions.kt b/core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/KotlinExtensions.kt
deleted file mode 100644
index 837f0fc6c..000000000
--- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/KotlinExtensions.kt
+++ /dev/null
@@ -1,6 +0,0 @@
-package com.shifthackz.aisdv1.core.common.extensions
-
-inline fun T.applyIf(predicate: Boolean, block: T.() -> Unit): T {
- if (!predicate) return this
- return apply(block)
-}
diff --git a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/StringExtensions.kt b/core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/StringExtensions.kt
deleted file mode 100644
index 0fe94bfb0..000000000
--- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/extensions/StringExtensions.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-package com.shifthackz.aisdv1.core.common.extensions
-
-private const val PROTOCOL_DELIMITER = "://"
-private const val PROTOCOL_HOLDER = "[[_PROTOCOL_]]"
-
-fun String.fixUrlSlashes(): String = this
- .replace(PROTOCOL_DELIMITER, PROTOCOL_HOLDER)
- .replace(Regex("/{2,}"), "/")
- .let { str ->
- when {
- str.isEmpty() -> ""
- str.last() == '/' -> str.substring(0, str.lastIndex)
- else -> str
- }
- }
- .replace(PROTOCOL_HOLDER, PROTOCOL_DELIMITER)
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/time/TimeProvider.kt b/core/common/src/main/java/com/shifthackz/aisdv1/core/common/time/TimeProvider.kt
deleted file mode 100644
index 7564bcb1f..000000000
--- a/core/common/src/main/java/com/shifthackz/aisdv1/core/common/time/TimeProvider.kt
+++ /dev/null
@@ -1,9 +0,0 @@
-package com.shifthackz.aisdv1.core.common.time
-
-import java.util.Date
-
-interface TimeProvider {
- fun nanoTime(): Long
- fun currentTimeMillis(): Long
- fun currentDate(): Date
-}
diff --git a/core/common/src/main/java/dev/minios/pdaiv1/core/common/appbuild/ActivityIntentProvider.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/appbuild/ActivityIntentProvider.kt
new file mode 100644
index 000000000..c0eb5ed16
--- /dev/null
+++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/appbuild/ActivityIntentProvider.kt
@@ -0,0 +1,7 @@
+package dev.minios.pdaiv1.core.common.appbuild
+
+import android.content.Intent
+
+fun interface ActivityIntentProvider {
+ operator fun invoke(): 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/dev/minios/pdaiv1/core/common/device/DeviceChipsetDetector.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/device/DeviceChipsetDetector.kt
new file mode 100644
index 000000000..c158c531c
--- /dev/null
+++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/device/DeviceChipsetDetector.kt
@@ -0,0 +1,105 @@
+package dev.minios.pdaiv1.core.common.device
+
+import android.os.Build
+
+/**
+ * Utility for detecting Qualcomm Snapdragon chipset and determining
+ * appropriate QNN model variant suffix.
+ *
+ * QNN models come in three variants:
+ * - 8gen2: For flagship chips (Snapdragon 8 Gen 2, 3, 4)
+ * - 8gen1: For older flagship chips (Snapdragon 8 Gen 1)
+ * - min: For other Snapdragon chips or unknown devices
+ */
+object DeviceChipsetDetector {
+
+ /**
+ * Chipset model suffixes for QNN model compatibility.
+ * Maps SOC_MODEL to appropriate model suffix.
+ */
+ private val chipsetModelSuffixes = mapOf(
+ // Snapdragon 8 Gen 1 family
+ "SM8450" to "8gen1", // Snapdragon 8 Gen 1
+ "SM8475" to "8gen1", // Snapdragon 8+ Gen 1
+
+ // Snapdragon 8 Gen 2+ family (all use 8gen2 suffix)
+ "SM8550" to "8gen2", // Snapdragon 8 Gen 2
+ "SM8550P" to "8gen2",
+ "QCS8550" to "8gen2",
+ "QCM8550" to "8gen2",
+ "SM8650" to "8gen2", // Snapdragon 8 Gen 3
+ "SM8650P" to "8gen2",
+ "SM8750" to "8gen2", // Snapdragon 8 Gen 4
+ "SM8750P" to "8gen2",
+ "SM8850" to "8gen2", // Future chips
+ "SM8850P" to "8gen2",
+ "SM8735" to "8gen2",
+ "SM8845" to "8gen2",
+ )
+
+ /**
+ * Get the device SOC model name.
+ * Returns empty string on older Android versions (< S).
+ */
+ fun getDeviceSoc(): String {
+ return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) {
+ Build.SOC_MODEL
+ } else {
+ ""
+ }
+ }
+
+ /**
+ * Get the chipset suffix for QNN model selection.
+ *
+ * @param soc The SOC model string (usually from Build.SOC_MODEL)
+ * @return One of: "8gen2", "8gen1", or "min"
+ */
+ fun getChipsetSuffix(soc: String = getDeviceSoc()): String {
+ // Direct match in our known chipsets
+ chipsetModelSuffixes[soc]?.let { return it }
+
+ // For unknown SM* chips, default to "min" for safety
+ if (soc.startsWith("SM")) {
+ return "min"
+ }
+
+ // For completely unknown devices, use min
+ return "min"
+ }
+
+ /**
+ * Check if the current device has a known Qualcomm Snapdragon chipset.
+ */
+ fun isQualcommDevice(): Boolean {
+ val soc = getDeviceSoc()
+ return soc.startsWith("SM") || soc.startsWith("QCS") || soc.startsWith("QCM")
+ }
+
+ /**
+ * Check if the current device supports 8gen2 QNN models.
+ */
+ fun supports8Gen2(): Boolean = getChipsetSuffix() == "8gen2"
+
+ /**
+ * Check if the current device supports 8gen1 QNN models.
+ */
+ fun supports8Gen1(): Boolean = getChipsetSuffix() == "8gen1"
+
+ /**
+ * Get recommended QNN model suffix for this device.
+ */
+ fun getRecommendedModelSuffix(): String = getChipsetSuffix()
+
+ /**
+ * Get display name for the chipset suffix.
+ */
+ fun getChipsetDisplayName(suffix: String = getChipsetSuffix()): String {
+ return when (suffix) {
+ "8gen2" -> "Snapdragon 8 Gen 2/3/4"
+ "8gen1" -> "Snapdragon 8 Gen 1/+"
+ "min" -> "Other Snapdragon"
+ else -> "Unknown"
+ }
+ }
+}
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/dev/minios/pdaiv1/core/common/extensions/KotlinExtensions.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/extensions/KotlinExtensions.kt
new file mode 100644
index 000000000..054c3d47b
--- /dev/null
+++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/extensions/KotlinExtensions.kt
@@ -0,0 +1,6 @@
+package dev.minios.pdaiv1.core.common.extensions
+
+inline fun T.applyIf(predicate: Boolean, block: T.() -> Unit): T {
+ if (!predicate) return this
+ return apply(block)
+}
diff --git a/core/common/src/main/java/dev/minios/pdaiv1/core/common/extensions/StringExtensions.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/extensions/StringExtensions.kt
new file mode 100644
index 000000000..8032b86ce
--- /dev/null
+++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/extensions/StringExtensions.kt
@@ -0,0 +1,16 @@
+package dev.minios.pdaiv1.core.common.extensions
+
+private const val PROTOCOL_DELIMITER = "://"
+private const val PROTOCOL_HOLDER = "[[_PROTOCOL_]]"
+
+fun String.fixUrlSlashes(): String = this
+ .replace(PROTOCOL_DELIMITER, PROTOCOL_HOLDER)
+ .replace(Regex("/{2,}"), "/")
+ .let { str ->
+ when {
+ str.isEmpty() -> ""
+ str.last() == '/' -> str.substring(0, str.lastIndex)
+ else -> str
+ }
+ }
+ .replace(PROTOCOL_HOLDER, PROTOCOL_DELIMITER)
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 90%
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 893a57aec..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.*
@@ -47,6 +47,9 @@ fun File.unzip() {
val destinationDir = parentFile ?: return
fun extractFile(inputStream: InputStream, destFilePath: String) {
+ val destFile = File(destFilePath)
+ // Create parent directories if they don't exist
+ destFile.parentFile?.mkdirs()
val bos = BufferedOutputStream(FileOutputStream(destFilePath))
val bytesIn = ByteArray(DEFAULT_BUFFER_SIZE)
var read: Int
@@ -64,7 +67,7 @@ fun File.unzip() {
extractFile(inputStream, filePath)
} else {
val dir = File(filePath)
- dir.mkdir()
+ dir.mkdirs()
}
}
}
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 80%
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..45e907c8b 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,6 +1,6 @@
-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"
+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/com/shifthackz/aisdv1/core/common/links/LinksProvider.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/links/LinksProvider.kt
similarity index 83%
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 ac6670be1..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
@@ -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/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 88%
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..927671484 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
@@ -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/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/dev/minios/pdaiv1/core/common/model/Heptagonal.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/model/Heptagonal.kt
new file mode 100644
index 000000000..5576b7f45
--- /dev/null
+++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/model/Heptagonal.kt
@@ -0,0 +1,16 @@
+package dev.minios.pdaiv1.core.common.model
+
+import java.io.Serializable
+
+data class Heptagonal(
+ val first: A,
+ val second: B,
+ val third: C,
+ val fourth: D,
+ val fifth: E,
+ val sixth: F,
+ val seventh: G,
+) : Serializable {
+
+ override fun toString(): String = "($first, $second, $third, $fourth, $fifth, $sixth, $seventh)"
+}
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/dev/minios/pdaiv1/core/common/model/Octagonal.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/model/Octagonal.kt
new file mode 100644
index 000000000..605f1a9be
--- /dev/null
+++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/model/Octagonal.kt
@@ -0,0 +1,17 @@
+package dev.minios.pdaiv1.core.common.model
+
+import java.io.Serializable
+
+data class Octagonal(
+ val first: A,
+ val second: B,
+ val third: C,
+ val fourth: D,
+ val fifth: E,
+ val sixth: F,
+ val seventh: G,
+ val eighth: H,
+) : Serializable {
+
+ override fun toString(): String = "($first, $second, $third, $fourth, $fifth, $sixth, $seventh, $eighth)"
+}
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/dev/minios/pdaiv1/core/common/time/TimeProvider.kt b/core/common/src/main/java/dev/minios/pdaiv1/core/common/time/TimeProvider.kt
new file mode 100644
index 000000000..929ecd1aa
--- /dev/null
+++ b/core/common/src/main/java/dev/minios/pdaiv1/core/common/time/TimeProvider.kt
@@ -0,0 +1,9 @@
+package dev.minios.pdaiv1.core.common.time
+
+import java.util.Date
+
+interface TimeProvider {
+ fun nanoTime(): Long
+ fun currentTimeMillis(): Long
+ fun currentDate(): 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..4231c7dec 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 {
@@ -11,4 +11,5 @@ dependencies {
implementation(libs.koin.core)
implementation(libs.koin.android)
implementation(libs.rx.kotlin)
+ implementation(libs.blurhash)
}
diff --git a/core/imageprocessing/src/main/java/com/shifthackz/aisdv1/core/imageprocessing/Base64EncodingConverter.kt b/core/imageprocessing/src/main/java/com/shifthackz/aisdv1/core/imageprocessing/Base64EncodingConverter.kt
deleted file mode 100644
index 27542df27..000000000
--- a/core/imageprocessing/src/main/java/com/shifthackz/aisdv1/core/imageprocessing/Base64EncodingConverter.kt
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.shifthackz.aisdv1.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 io.reactivex.rxjava3.core.Scheduler
-import io.reactivex.rxjava3.core.Single
-
-private typealias Base64EncodingProcessor = RxImageProcessor
-
-class Base64EncodingConverter(
- private val processingScheduler: Scheduler,
-) : Base64EncodingProcessor {
-
- override fun invoke(input: Input): Single