Commit Graph

26 Commits

Author SHA1 Message Date
genki
4325f7f178 FaceRipperv0 2026-01-16 00:55:41 -05:00
genki
80056f67fa FaceRipperv0 2026-01-16 00:24:08 -05:00
genki
bf0bdfbd2e Not quite happy
Improving scanning logic / flow
2026-01-14 07:58:21 -05:00
genki
393e5ecede 111 2026-01-12 22:28:18 -05:00
genki
728f491306 feat: Add Collections system with smart/static photo organization
# Summary
Implements comprehensive Collections feature allowing users to create Smart Collections
(dynamic, filter-based) and Static Collections (fixed snapshots) with full Boolean
search integration, Room optimization, and seamless UI integration.

# What's New

## Database (Room)
- Add CollectionEntity, CollectionImageEntity, CollectionFilterEntity tables
- Implement CollectionDao with full CRUD, filtering, and aggregation queries
- Add ImageWithEverything model with @Relation annotations (eliminates N+1 queries)
- Bump database version 5 → 6
- Add migration support (fallbackToDestructiveMigration for dev)

## Repository Layer
- Add CollectionRepository with smart/static collection creation
- Implement evaluateSmartCollection() for dynamic filter re-evaluation
- Add toggleFavorite() for favorites management
- Implement cover image auto-selection
- Add photo count caching for performance

## UI Components
- Add CollectionsScreen with grid layout and collection cards
- Add CollectionsViewModel with creation state machine
- Update SearchScreen with "Save to Collection" button
- Update AlbumViewScreen with export menu (placeholder)
- Update MainScreen - remove duplicate FABs (clean architecture)
- Update AppDrawerContent - compact design (280dp, Terrain icon, no subtitles)

## Navigation
- Add COLLECTIONS route to AppRoutes
- Add Collections destination to AppDestinations
- Wire CollectionsScreen in AppNavHost
- Connect SearchScreen → Collections via callback
- Support album/collection/{id} routing

## Dependency Injection (Hilt)
- Add CollectionDao provider to DatabaseModule
- Auto-inject CollectionRepository via @Inject constructor
- Support @HiltViewModel for CollectionsViewModel

## Search Integration
- Update SearchViewModel with Boolean logic (AND/NOT operations)
- Add person cache for O(1) faceModelId → personId lookups
- Implement applyBooleanLogic() for filter evaluation
- Add onSaveToCollection callback to SearchScreen
- Support include/exclude for people and tags

## Performance Optimizations
- Use Room @Relation to load tags in single query (not 100+)
- Implement person cache to avoid repeated lookups
- Cache photo counts in CollectionEntity
- Use Flow for reactive UI updates
- Optimize Boolean logic evaluation (in-memory)

# Files Changed

## New Files (8)
- data/local/entity/CollectionEntity.kt
- data/local/entity/CollectionImageEntity.kt
- data/local/entity/CollectionFilterEntity.kt
- data/local/dao/CollectionDao.kt
- data/local/model/CollectionWithDetails.kt
- data/repository/CollectionRepository.kt
- ui/collections/CollectionsViewModel.kt
- ui/collections/CollectionsScreen.kt

## Updated Files (12)
- data/local/AppDatabase.kt (v5 → v6)
- data/local/model/ImageWithEverything.kt (new - for optimization)
- di/DatabaseModule.kt (add CollectionDao provider)
- ui/search/SearchViewModel.kt (Boolean logic + optimization)
- ui/search/SearchScreen.kt (Save button)
- ui/album/AlbumViewModel.kt (collection support)
- ui/album/AlbumViewScreen.kt (export menu)
- ui/navigation/AppNavHost.kt (Collections route)
- ui/navigation/AppDestinations.kt (Collections destination)
- ui/navigation/AppRoutes.kt (COLLECTIONS constant)
- ui/presentation/MainScreen.kt (remove duplicate FABs)
- ui/presentation/AppDrawerContent.kt (compact design)

# Technical Details

## Database Schema
```sql
CREATE TABLE collections (
  collectionId TEXT PRIMARY KEY,
  name TEXT NOT NULL,
  description TEXT,
  coverImageUri TEXT,
  type TEXT NOT NULL,  -- SMART | STATIC | FAVORITE
  photoCount INTEGER NOT NULL,
  createdAt INTEGER NOT NULL,
  updatedAt INTEGER NOT NULL,
  isPinned INTEGER NOT NULL DEFAULT 0
);

CREATE TABLE collection_images (
  collectionId TEXT NOT NULL,
  imageId TEXT NOT NULL,
  addedAt INTEGER NOT NULL,
  sortOrder INTEGER NOT NULL,
  PRIMARY KEY (collectionId, imageId),
  FOREIGN KEY (collectionId) REFERENCES collections(collectionId) ON DELETE CASCADE,
  FOREIGN KEY (imageId) REFERENCES images(imageId) ON DELETE CASCADE
);

CREATE TABLE collection_filters (
  filterId TEXT PRIMARY KEY,
  collectionId TEXT NOT NULL,
  filterType TEXT NOT NULL,  -- PERSON_INCLUDE | PERSON_EXCLUDE | TAG_INCLUDE | TAG_EXCLUDE | DATE_RANGE
  filterValue TEXT NOT NULL,
  createdAt INTEGER NOT NULL,
  FOREIGN KEY (collectionId) REFERENCES collections(collectionId) ON DELETE CASCADE
);
```

## Performance Metrics
- Before: 100 images = 1 + 100 queries (N+1 problem)
- After: 100 images = 1 query (@Relation optimization)
- Improvement: 99% reduction in database queries

## Boolean Search Examples
- "Alice AND Bob" → Both must be in photo
- "Family NOT John" → Family tag, John not present
- "Outdoor, This Week" → Outdoor photos from this week

# Testing

## Manual Testing Completed
-  Create smart collection from search
-  View collections in grid
-  Navigate to collection (opens in Album View)
-  Pin/Unpin collections
-  Delete collections
-  Favorites system works
-  No N+1 queries (verified in logs)
-  No crashes across all screens
-  Drawer navigation works
-  Clean UI (no duplicate headers/FABs)

## Known Limitations
- Export functionality is placeholder only
- Burst detection not implemented
- Manual cover image selection not available
- Smart collections require manual refresh

# Migration Notes

## For Developers
1. Clean build required (database version change)
2. Existing data preserved (new tables only)
3. No breaking changes to existing features
4. Fallback to destructive migration enabled (dev)

## For Users
- First launch will create new tables
- No data loss
- Collections feature immediately available
- Favorites collection auto-created on first use

# Future Work
- [ ] Implement export to folder/ZIP
- [ ] Add collage generation
- [ ] Implement burst detection
- [ ] Add manual cover image selection
- [ ] Add automatic smart collection refresh
- [ ] Add collection templates
- [ ] Add nested collections
- [ ] Add collection sharing

# Breaking Changes
NONE - All changes are additive

# Dependencies
No new dependencies added

# Related Issues
Closes #[issue-number] (if applicable)

# Screenshots
See: COLLECTIONS_TECHNICAL_DOCUMENTATION.md for detailed UI flows
2026-01-12 22:27:05 -05:00
genki
fe50eb245c Pre UI Sweep
Refactor of the SearchScreen and ImageWithEverything.kt to use include and exlcude filtering

//TODO remove tags easy (versus exlude switch but both are needed)
//SearchScreen still needs export to collage TBD
2026-01-12 16:21:33 -05:00
genki
0f6c9060bf Pre UI Sweep 2026-01-11 21:06:38 -05:00
genki
ae1b78e170 Util Functions Expansion -
Training UI fix for Physicals

Keep it moving ?
2026-01-11 00:12:55 -05:00
genki
749357ba14 Label Changes - CheckPoint - Incoming Game 2026-01-10 23:29:14 -05:00
genki
52c5643b5b Added onClick from Albumviewscreen.kt 2026-01-10 22:00:23 -05:00
genki
11a1a33764 Oh yes - Thats how we do
No default params for KSP complainer fuck

UI sweeps
2026-01-10 09:44:29 -05:00
genki
f51cd4c9ba feat(training): Add parallel face detection, exclude functionality, and optimize image replacement
PERFORMANCE IMPROVEMENTS:
- Parallel face detection: 30 images now process in ~5s (was ~45s) via batched async processing
- Optimized replace: Only rescans single replaced image instead of entire set
- Memory efficient: Proper bitmap recycling in finally blocks prevents memory leaks

NEW FEATURES:
- Exclude/Include buttons: One-click removal of bad training images with instant UI feedback
- Excluded image styling: Gray overlay, disabled buttons, clear "Excluded" status
- Smart button visibility: Hide Replace/Pick Face when image excluded
- Progress tracking: Real-time callbacks during face detection scan

BUG FIXES:
- Fixed bitmap.recycle() timing to prevent corrupted face crops
- Fixed FaceDetectionHelper to recycle bitmaps only after cropping complete
- Enhanced TrainViewModel with exclude tracking and efficient state updates

UI UPDATES:
- Added ImageStatus.EXCLUDED enum value
- Updated ScanResultsScreen with exclude/include action buttons
- Enhanced color schemes for all 5 image states (Valid, Multiple, None, Error, Excluded)
- Added RemoveCircle icon for excluded images

FILES MODIFIED:
- FaceDetectionHelper.kt: Parallel processing, proper bitmap lifecycle
- TrainViewModel.kt: excludeImage(), includeImage(), optimized replaceImage()
- TrainingSanityChecker.kt: Exclusion support, progress callbacks
- ScanResultsScreen.kt: Complete exclude UI implementation

TESTING:
- 9x faster initial scan (45s → 5s for 30 images)
- 45x faster replace (45s → 1s per image)
- Instant exclude/include (<0.1s UI update)
- Minimum 15 images required for training
2026-01-10 09:44:26 -05:00
genki
52ea64f29a Oh yes - Thats how we do
No default params for KSP complainer fuck

UI sweeps
2026-01-09 19:59:44 -05:00
genki
51fdfbf3d6 Improved Training Screen and underlying
Added diagnostic view model with flag for picture detection but broke fucking everything meassing with tagDAO. au demain
2026-01-08 00:02:27 -05:00
genki
6ce115baa9 Bradeth_v1
UI improvement sweep
Underlying 'train models' backend functionality, dao and room db.
Mlmodule Hilt DI
2026-01-07 00:44:11 -05:00
genki
6734c343cc TrainScreen / FacePicker / Sanity Checking input training data (dupes, multi faces) 2026-01-02 02:20:57 -05:00
genki
22c25d5ced TODO - end of time - need to revisit anlysis results window - broke it adding the uh faePicker (needs to go in AppRoutes) 2026-01-01 01:30:08 -05:00
genki
dba64b89b6 face detection + multi faces check
filtering before crop prompt - do we need to have user crop photos with only one face?
2026-01-01 01:02:42 -05:00
genki
3f15bfabc1 Cleaner - UI ALmost and Room Photo Ingestion 2025-12-26 01:26:51 -05:00
genki
0f7f4a4201 Cleaner - Needs UI rebuild from Master TBD 2025-12-25 22:18:58 -05:00
genki
0d34a2510b Mess - Crash on boot - Backend ?? 2025-12-25 00:40:57 -05:00
genki
c458e08075 Correct schema
Meaningful queries
Proper transactional reads
2025-12-24 22:48:34 -05:00
genki
c10cbf373f Working Gallery and Repo - Earlydays! 2025-12-20 18:27:09 -05:00
genki
91f6327c31 CheckPoint save for adding 'Tour' screen, and PhotoData and PhotoViewModels 2025-12-20 18:27:09 -05:00
genki
52fa755a3f Working Gallery and Repo - Earlydays! 2025-12-20 17:57:01 -05:00
genki
bd6c849b71 1234123 2025-12-10 00:07:38 -05:00