Skip to content

Conversation

@projectdelta6
Copy link
Collaborator

Summary

  • Adds new S3Uploader-Multipart module implementing AWS S3 Multipart Upload API for large file uploads with:
    • Pause, resume, and recovery capabilities
    • Room database persistence for upload state
    • WorkManager integration for background uploads
    • Progress tracking with Flow-based observation
  • Adds BaseRepo-S3Uploader-Multipart extension module for BaseRepo integration
  • Moves SDK and version constants to buildSrc/BuildConfig.kt for centralized version management
  • Shares logging configuration between S3Uploader modules (single init call)

Changes

  • New modules: S3Uploader-Multipart, BaseRepo-S3Uploader-Multipart
  • buildSrc: Added BuildConfig.kt with TOOLBOX_VERSION, Sdk, and MinSdk constants
  • Updated: All build.gradle.kts files to use BuildConfig constants
  • Updated: UpdateReadmeVersions.kt to read version from BuildConfig
  • Updated: BOM to include new modules
  • Updated: READMEs with documentation for new modules

Test plan

  • Verify Gradle sync succeeds
  • Verify JitPack build with tag 1.2.0-beta01
  • Test multipart upload start/pause/resume flow
  • Test app kill and recovery
  • Test WorkManager background uploads

🤖 Generated with Claude Code

projectdelta6 and others added 18 commits January 9, 2026 13:00
Implements AWS S3 Multipart Upload API with:
- Room database persistence for upload state
- WorkManager integration for background uploads
- Pause, resume, and recovery capabilities
- Progress tracking with Flow-based observation

Also adds BaseRepo-S3Uploader-Multipart extension module and updates
BOM, READMEs, and version catalog.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
S3Uploader now stores the custom logger and exposes it via getCustomLogger().
MultipartUploadManager.syncLoggerConfig() syncs the logger configuration
from S3Uploader, called automatically when getInstance() creates the
manager and at the start of WorkManager workers.

This allows apps to call S3Uploader.initS3Uploader() once and have both
modules use the same logger configuration.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Creates BuildConfig.kt in buildSrc with centralized constants for:
- TOOLBOX_VERSION
- Sdk.COMPILE and Sdk.TARGET
- MinSdk constants for each module category

Updates all build.gradle.kts files to use BuildConfig constants instead
of libs.versions references. Updates UpdateReadmeVersions.kt to read
toolbox version from BuildConfig.

This centralizes version management and makes it easier to update values
in one place.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add @ConsistentCopyVisibility to SnackBarVisualsWithType data class
  to fix Kotlin copy() visibility warning (will be error in Kotlin 2.5)
- Configure Room Gradle plugin for S3Uploader-Multipart schema export
- Add foregroundServiceType to S3Uploader-Multipart manifest for WorkManager
- Add Room plugin to version catalog
- Update all README versions to 1.2.0-beta02

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Added NullableEnumAsIntSerializer and NullableEnumAsStringSerializer
…ploader-Multipart

- Support both wrapped and unwrapped JSON response formats in InitiateMultipartResponse,
  PresignPartResponse, and CompleteMultipartResponse
- Add EmptyArrayAsEmptyMapSerializer to handle "headers": [] responses
- Implement parallel part uploads using coroutines with configurable maxConcurrentParts
- Fix race condition in parallel uploads by marking parts as UPLOADING immediately
- Add crash recovery: change IN_PROGRESS sessions to PAUSED before resuming
- Add debug logging for recovery process
- Add "Simulate Crash" button to demo app for testing recovery functionality

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Replace hardcoded email/password with user input fields:
- Add email/password state and setters in ViewModel
- Add OutlinedTextField inputs in AuthSection composable
- Add validation to require both fields before login

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Dependency updates:
- AGP 8.13.2 → 9.0.0
- Kotlin 2.3.0 → 2.2.10
- Compose BOM 2025.12.01 → 2026.01.00
- FlexiLogger 1.36.4 → 2.0.0 (migrated from JitPack to Maven Central)

S3 Multipart improvements:
- Add reset() function to MultipartRetrofitClient for config changes
- Improve logging levels (BODY for verbose, HEADERS for debug)
- Add pretty print JSON when verbose logging enabled

Demo app:
- Add multipart upload screen to navigation
- Consolidate TestBackend network layer
- Add INTERNET permission to manifest

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Expand the Backend Requirements section into a full API specification
that external developers can use to implement the required endpoints.
Includes request/response schemas, JSON examples, authentication details,
error handling, CORS configuration, and a sequence diagram.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add UploadNotificationProvider interface for custom notifications
- Add UploadLifecycleCallbacks interface with hooks:
  - onBeforeUpload (before S3 interaction, can abort)
  - onUploadComplete, onUploadPaused, onUploadResumed
  - onProgressUpdate
- Add DefaultUploadNotificationProvider configurable implementation
- Make MultipartUploadWorker implement UploadLifecycleCallbacks
- Add notificationProvider and lifecycleCallbacks to MultipartUploadConfig
- Add UploadConstraints for per-upload WorkManager constraints
- Update demo app with lifecycle callback examples
- Bump version to 1.2.0-beta05

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Replace fold() with explicit if/else for kotlin.Result conversion
- Handle MultipartUploadResult properly in startMultipartUpload
- Add toUnitAPIResult helper for pause/resume/cancel operations

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@projectdelta6 projectdelta6 self-assigned this Jan 19, 2026
…laiming

- Add claimNextPendingPart() DAO method with @transaction for atomic
  SELECT+UPDATE, preventing potential race conditions
- Remove deprecated scheduleUpload(requiresNetwork, requiresCharging) from
  S3UploadWorkManager - use UploadConstraints parameter instead
- Remove deprecated autoResumeOnNetworkRestore property from
  MultipartUploadConfig - use defaultConstraints.autoResumeWhenSatisfied
- Add scheduleMultipartUploadWork(UploadConstraints) overload to BaseRepo
  extensions for full constraint support
- Update boolean-parameter overload to use UploadConstraints internally
- Bump version to 1.2.0 and update all README version references

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
@projectdelta6 projectdelta6 merged commit 38bd81c into main Jan 20, 2026
@projectdelta6 projectdelta6 deleted the featiure/S3Uploader-pause-resume-recover branch January 20, 2026 09:13
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants